diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 6cb63ed..fae383f 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -333,7 +333,11 @@
       var packageName = file.parent.parent.shortName;
       var content = _readFile(path);
       var errorListener = RecordingErrorListener();
-      var errorReporter = ErrorReporter(errorListener, file.createSource());
+      var errorReporter = ErrorReporter(
+        errorListener,
+        file.createSource(),
+        isNonNullableByDefault: false,
+      );
       var parser = TransformSetParser(errorReporter, packageName);
       parser.parse(content);
       var converter = AnalyzerConverter();
diff --git a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
index 7e1578b..ae25ec1 100644
--- a/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
+++ b/pkg/analysis_server/lib/src/plugin/plugin_manager.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/instrumentation/instrumentation.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
@@ -107,6 +108,13 @@
   String toString() => message;
 }
 
+class PluginFiles {
+  final File execution;
+  final File packages;
+
+  PluginFiles(this.execution, this.packages);
+}
+
 /// Information about a single plugin.
 abstract class PluginInfo {
   /// The object used to manage the receiving and sending of notifications.
@@ -315,9 +323,9 @@
     var isNew = false;
     if (plugin == null) {
       isNew = true;
-      List<String> pluginPaths;
+      PluginFiles pluginFiles;
       try {
-        pluginPaths = pathsFor(path);
+        pluginFiles = filesFor(path);
       } catch (exception, stackTrace) {
         plugin = DiscoveredPluginInfo(
             path, '', '', notificationManager, instrumentationService);
@@ -325,8 +333,12 @@
         _pluginMap[path] = plugin;
         return;
       }
-      plugin = DiscoveredPluginInfo(path, pluginPaths[0], pluginPaths[1],
-          notificationManager, instrumentationService);
+      plugin = DiscoveredPluginInfo(
+          path,
+          pluginFiles.execution.path,
+          pluginFiles.packages.path,
+          notificationManager,
+          instrumentationService);
       _pluginMap[path] = plugin;
       try {
         var session = await plugin.start(byteStorePath, sdkPath);
@@ -413,24 +425,24 @@
     return responses;
   }
 
-  /// Return the execution path and .packages path associated with the plugin at
-  /// the given [path]. Throw a [PluginException] if there is a problem that
-  /// prevents the plugin from being executing.
+  /// Return the files associated with the plugin at the given [pluginPath].
+  /// Throw a [PluginException] if there is a problem that prevents the plugin
+  /// from being executing.
   @visibleForTesting
-  List<String> pathsFor(String pluginPath) {
+  PluginFiles filesFor(String pluginPath) {
     var pluginFolder = resourceProvider.getFolder(pluginPath);
     var pubspecFile = pluginFolder.getChildAssumingFile(file_paths.pubspecYaml);
     if (!pubspecFile.exists) {
       // If there's no pubspec file, then we don't need to copy the package
       // because we won't be running pub.
-      return _computePaths(pluginFolder);
+      return _computeFiles(pluginFolder);
     }
     var workspace = BazelWorkspace.find(resourceProvider, pluginFolder.path) ??
         GnWorkspace.find(resourceProvider, pluginFolder.path);
     if (workspace != null) {
       // Similarly, we won't be running pub if we're in a workspace because
       // there is exactly one version of each package.
-      return _computePaths(pluginFolder, workspace: workspace);
+      return _computeFiles(pluginFolder, workspace: workspace);
     }
     //
     // Copy the plugin directory to a unique subdirectory of the plugin
@@ -447,10 +459,10 @@
     if (parentFolder.exists) {
       var executionFolder =
           parentFolder.getChildAssumingFolder(pluginFolder.shortName);
-      return _computePaths(executionFolder, pubCommand: 'upgrade');
+      return _computeFiles(executionFolder, pubCommand: 'upgrade');
     }
     var executionFolder = pluginFolder.copyTo(parentFolder);
-    return _computePaths(executionFolder, pubCommand: 'get');
+    return _computeFiles(executionFolder, pubCommand: 'get');
   }
 
   /// Return a list of all of the plugins that are currently associated with the
@@ -603,11 +615,11 @@
     }));
   }
 
-  /// Compute the paths to be returned by the enclosing method given that the
+  /// Compute the files to be returned by the enclosing method given that the
   /// plugin should exist in the given [pluginFolder].
   ///
   /// Runs pub if [pubCommand] is provided and not null.
-  List<String> _computePaths(Folder pluginFolder,
+  PluginFiles _computeFiles(Folder pluginFolder,
       {String? pubCommand, Workspace? workspace}) {
     var pluginFile = pluginFolder
         .getChildAssumingFolder('bin')
@@ -616,7 +628,9 @@
       throw PluginException('File "${pluginFile.path}" does not exist.');
     }
     String? reason;
-    File? packagesFile = pluginFolder.getChildAssumingFile('.packages');
+    File? packagesFile = pluginFolder
+        .getChildAssumingFolder(file_paths.dotDartTool)
+        .getChildAssumingFile(file_paths.packageConfigJson);
     if (pubCommand != null) {
       var vmPath = Platform.executable;
       var pubPath = path.join(path.dirname(vmPath), 'pub');
@@ -648,7 +662,8 @@
         packagesFile =
             _createPackagesFile(pluginFolder, workspace.packageUriResolver);
         if (packagesFile == null) {
-          reason = 'Could not create .packages file in workspace $workspace.';
+          var name = file_paths.packageConfigJson;
+          reason = 'Could not create $name file in workspace $workspace.';
         }
       } else {
         reason = 'Could not create "${packagesFile.path}".';
@@ -659,7 +674,7 @@
       reason ??= 'Could not create packages file for an unknown reason.';
       throw PluginException(reason);
     }
-    return <String>[pluginFile.path, packagesFile.path];
+    return PluginFiles(pluginFile, packagesFile);
   }
 
   WatchEventType _convertChangeType(watcher.ChangeType type) {
@@ -679,15 +694,15 @@
     return WatchEvent(_convertChangeType(watchEvent.type), watchEvent.path);
   }
 
-  /// Return a temporary `.packages` file that is appropriate for the plugin in
-  /// the given [pluginFolder]. The [packageUriResolver] is used to determine
-  /// the location of the packages that need to be included in the packages
-  /// file.
+  /// Return a temporary `package_config.json` file that is appropriate for
+  /// the plugin in the given [pluginFolder]. The [packageUriResolver] is
+  /// used to determine the location of the packages that need to be included
+  /// in the packages file.
   File? _createPackagesFile(
       Folder pluginFolder, UriResolver packageUriResolver) {
     var pluginPath = pluginFolder.path;
     var stateFolder = resourceProvider.getStateLocation('.plugin_manager')!;
-    var stateName = _uniqueDirectoryName(pluginPath) + '.packages';
+    var stateName = '${_uniqueDirectoryName(pluginPath)}.packages';
     var packagesFile = stateFolder.getChildAssumingFile(stateName);
     if (!packagesFile.exists) {
       var pluginPubspec =
@@ -697,36 +712,55 @@
       }
 
       try {
-        var visitedPackages = <String, String>{};
+        var visitedPackageNames = <String>{};
+        var packages = <_Package>[];
         var context = resourceProvider.pathContext;
-        visitedPackages[context.basename(pluginPath)] =
-            context.join(pluginFolder.path, 'lib');
+        packages.add(
+          _Package(
+            context.basename(pluginPath),
+            pluginFolder,
+          ),
+        );
         var pubspecFiles = <File>[];
         pubspecFiles.add(pluginPubspec);
         while (pubspecFiles.isNotEmpty) {
           var pubspecFile = pubspecFiles.removeLast();
-          for (var packageName in _readDependecies(pubspecFile)) {
-            if (!visitedPackages.containsKey(packageName)) {
+          for (var packageName in _readDependencies(pubspecFile)) {
+            if (visitedPackageNames.add(packageName)) {
               var uri = Uri.parse('package:$packageName/$packageName.dart');
               var packageSource = packageUriResolver.resolveAbsolute(uri);
               if (packageSource != null) {
-                var libDirPath = context.dirname(packageSource.fullName);
-                visitedPackages[packageName] = libDirPath;
-                var pubspecPath = context.join(
-                    context.dirname(libDirPath), file_paths.pubspecYaml);
-                pubspecFiles.add(resourceProvider.getFile(pubspecPath));
+                var packageRoot = resourceProvider
+                    .getFile(packageSource.fullName)
+                    .parent
+                    .parent;
+                packages.add(
+                  _Package(packageName, packageRoot),
+                );
+                pubspecFiles.add(
+                  packageRoot.getChildAssumingFile(file_paths.pubspecYaml),
+                );
               }
             }
           }
         }
 
-        var buffer = StringBuffer();
-        visitedPackages.forEach((String name, String path) {
-          buffer.write(name);
-          buffer.write(':');
-          buffer.writeln(Uri.file(path));
-        });
-        packagesFile.writeAsStringSync(buffer.toString());
+        packages.sort((a, b) => a.name.compareTo(b.name));
+
+        var packageConfigBuilder = PackageConfigFileBuilder();
+        for (var package in packages) {
+          packageConfigBuilder.add(
+            name: package.name,
+            rootPath: package.root.path,
+          );
+        }
+        packagesFile.writeAsStringSync(
+          packageConfigBuilder.toContent(
+            toUriStr: (path) {
+              return resourceProvider.pathContext.toUri(path).toString();
+            },
+          ),
+        );
       } catch (exception) {
         // If we are not able to produce a .packages file, return null so that
         // callers will not try to load the plugin.
@@ -740,7 +774,7 @@
 
   /// Return the names of packages that are listed as dependencies in the given
   /// [pubspecFile].
-  Iterable<String> _readDependecies(File pubspecFile) {
+  Iterable<String> _readDependencies(File pubspecFile) {
     var document = loadYamlDocument(pubspecFile.readAsStringSync(),
         sourceUrl: pubspecFile.toUri());
     var contents = document.contents;
@@ -985,6 +1019,13 @@
   }
 }
 
+class _Package {
+  final String name;
+  final Folder root;
+
+  _Package(this.name, this.root);
+}
+
 /// Information about a request that has been sent but for which a response has
 /// not yet been received.
 class _PendingRequest {
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 5f286c8..3104866 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -417,8 +417,13 @@
       var configFile = provider.getFile(configFileName);
       try {
         var content = configFile.readAsStringSync();
-        var parser = TransformOverrideSetParser(ErrorReporter(
-            AnalysisErrorListener.NULL_LISTENER, configFile.createSource()));
+        var parser = TransformOverrideSetParser(
+          ErrorReporter(
+            AnalysisErrorListener.NULL_LISTENER,
+            configFile.createSource(),
+            isNonNullableByDefault: false,
+          ),
+        );
         return parser.parse(content);
       } on FileSystemException {
         // Fall through to return null.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
index f21df2a..5f7e010 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_super_parameters.dart
@@ -67,7 +67,8 @@
     var parameterMap = _parameterMap(constructor.parameters);
     List<_ParameterData>? positional = [];
     var named = <_ParameterData>[];
-    var arguments = superInvocation.argumentList.arguments;
+    var argumentList = superInvocation.argumentList;
+    var arguments = argumentList.arguments;
     for (var argumentIndex = 0;
         argumentIndex < arguments.length;
         argumentIndex++) {
@@ -156,18 +157,26 @@
       }
 
       // Remove the corresponding arguments.
-      if (argumentsToDelete.length == arguments.length &&
-          superInvocation.constructorName == null) {
-        var initializers = constructor.initializers;
-        SourceRange initializerRange;
-        if (initializers.length == 1) {
-          initializerRange =
-              range.endEnd(constructor.parameters, superInvocation);
+      if (argumentsToDelete.length == arguments.length) {
+        if (superInvocation.constructorName == null) {
+          // Delete the whole invocation.
+          var initializers = constructor.initializers;
+          SourceRange initializerRange;
+          if (initializers.length == 1) {
+            initializerRange =
+                range.endEnd(constructor.parameters, superInvocation);
+          } else {
+            initializerRange = range.nodeInList(initializers, superInvocation);
+          }
+          builder.addDeletion(initializerRange);
         } else {
-          initializerRange = range.nodeInList(initializers, superInvocation);
+          // Leave the invocation, but remove all of the arguments, including
+          // any trailing comma.
+          builder.addDeletion(range.endStart(
+              argumentList.leftParenthesis, argumentList.rightParenthesis));
         }
-        builder.addDeletion(initializerRange);
       } else {
+        // Remove just the arguments that are no longer needed.
         var ranges = range.nodesInList(arguments, argumentsToDelete);
         for (var range in ranges) {
           builder.addDeletion(range);
@@ -260,16 +269,13 @@
   }
 
   /// Return the parameter corresponding to the [expression], or `null` if the
-  /// expression isn't a simple reference to one of the parameters in the
+  /// expression isn't a simple reference to one of the normal parameters in the
   /// constructor being converted.
   _Parameter? _parameterFor(
       Map<ParameterElement, _Parameter> parameterMap, Expression expression) {
     if (expression is SimpleIdentifier) {
       var element = expression.staticElement;
-      var parameter = parameterMap[element];
-      if (parameter != null) {
-        return parameter;
-      }
+      return parameterMap[element];
     }
     return null;
   }
@@ -278,13 +284,23 @@
   /// elements.
   Map<ParameterElement, _Parameter> _parameterMap(
       FormalParameterList parameterList) {
+    bool validParameter(FormalParameter parameter) {
+      if (parameter is DefaultFormalParameter) {
+        parameter = parameter.parameter;
+      }
+      return parameter is SimpleFormalParameter ||
+          parameter is FunctionTypedFormalParameter;
+    }
+
     var map = <ParameterElement, _Parameter>{};
     var parameters = parameterList.parameters;
     for (var i = 0; i < parameters.length; i++) {
       var parameter = parameters[i];
-      var element = parameter.declaredElement;
-      if (element != null) {
-        map[element] = _Parameter(parameter, element, i);
+      if (validParameter(parameter)) {
+        var element = parameter.declaredElement;
+        if (element != null) {
+          map[element] = _Parameter(parameter, element, i);
+        }
       }
     }
     return map;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
index 38efa60..d971585 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/transform_set_manager.dart
@@ -58,7 +58,10 @@
       var content = file.readAsStringSync();
       var parser = TransformSetParser(
           ErrorReporter(
-              AnalysisErrorListener.NULL_LISTENER, file.createSource()),
+            AnalysisErrorListener.NULL_LISTENER,
+            file.createSource(),
+            isNonNullableByDefault: false,
+          ),
           file.parent.parent.shortName);
       return parser.parse(content);
     } on FileSystemException {
diff --git a/pkg/analysis_server/lib/src/utilities/mocks.dart b/pkg/analysis_server/lib/src/utilities/mocks.dart
index 6ad7371..494b98c 100644
--- a/pkg/analysis_server/lib/src/utilities/mocks.dart
+++ b/pkg/analysis_server/lib/src/utilities/mocks.dart
@@ -207,8 +207,8 @@
   }
 
   @override
-  List<String> pathsFor(String pluginPath) {
-    fail('Unexpected invocation of pathsFor');
+  PluginFiles filesFor(String pluginPath) {
+    fail('Unexpected invocation of filesFor');
   }
 
   @override
diff --git a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
index cbf06cd..ab989d5 100644
--- a/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/lsp_server/integration_tests.dart
@@ -158,6 +158,7 @@
         serverPath = normalize(join(dirname(Platform.resolvedExecutable),
             'dart-sdk', 'bin', 'snapshots', 'analysis_server.dart.snapshot'));
       }
+      // ignore: dead_code
     } else {
       final rootDir =
           findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 3ef73c2..1d0e499 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -639,6 +639,7 @@
             'snapshots',
             'analysis_server.dart.snapshot'));
       }
+      // ignore: dead_code
     } else {
       var rootDir =
           findRoot(Platform.script.toFilePath(windows: Platform.isWindows));
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index 4241eec..e9d809e 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -474,21 +474,20 @@
     expect(manager.notificationManager, notificationManager);
   }
 
-  void test_pathsFor_withPackagesFile() {
+  void test_pathsFor_withPackageConfigJsonFile() {
     //
     // Build the minimal directory structure for a plugin package that includes
-    // a .packages file.
+    // a '.dart_tool/package_config.json' file.
     //
     var pluginDirPath = newFolder('/plugin').path;
-    var pluginFilePath = newFile2('/plugin/bin/plugin.dart', '').path;
-    var packagesFilePath = newDotPackagesFile('/plugin', '').path;
+    var pluginFile = newFile2('/plugin/bin/plugin.dart', '');
+    var packageConfigFile = newPackageConfigJsonFile('/plugin', '');
     //
     // Test path computation.
     //
-    var paths = manager.pathsFor(pluginDirPath);
-    expect(paths, hasLength(2));
-    expect(paths[0], pluginFilePath);
-    expect(paths[1], packagesFilePath);
+    var files = manager.filesFor(pluginDirPath);
+    expect(files.execution, pluginFile);
+    expect(files.packages, packageConfigFile);
   }
 
   void test_pathsFor_withPubspec_inBazelWorkspace() {
@@ -515,30 +514,46 @@
     }
 
     var pluginDirPath = newPackage('plugin', ['b', 'c']);
-    newPackage('b', ['d']);
-    newPackage('c', ['d']);
-    newPackage('d');
-    var pluginFilePath = newFile2('$pluginDirPath/bin/plugin.dart', '').path;
+    var bRootPath = newPackage('b', ['d']);
+    var cRootPath = newPackage('c', ['d']);
+    var dRootPath = newPackage('d');
+    var pluginFile = newFile2('$pluginDirPath/bin/plugin.dart', '');
     //
     // Test path computation.
     //
-    var paths = manager.pathsFor(pluginDirPath);
-    expect(paths, hasLength(2));
-    expect(paths[0], pluginFilePath);
-    var packagesFile = getFile(paths[1]);
+    var files = manager.filesFor(pluginDirPath);
+    expect(files.execution, pluginFile);
+    var packagesFile = files.packages;
     expect(packagesFile.exists, isTrue);
+
     var content = packagesFile.readAsStringSync();
-    var lines = content.split('\n');
-    String asFileUri(String input) => Uri.file(convertPath(input)).toString();
-    expect(
-        lines,
-        unorderedEquals([
-          'plugin:${asFileUri('/workspaceRoot/third_party/dart/plugin/lib')}',
-          'b:${asFileUri('/workspaceRoot/third_party/dart/b/lib')}',
-          'c:${asFileUri('/workspaceRoot/third_party/dart/c/lib')}',
-          'd:${asFileUri('/workspaceRoot/third_party/dart/d/lib')}',
-          ''
-        ]));
+    expect(content, '''
+{
+  "configVersion": 2,
+  "packages": [
+    {
+      "name": "b",
+      "rootUri": "${toUriStr(bRootPath)}",
+      "packageUri": "lib/"
+    },
+    {
+      "name": "c",
+      "rootUri": "${toUriStr(cRootPath)}",
+      "packageUri": "lib/"
+    },
+    {
+      "name": "d",
+      "rootUri": "${toUriStr(dRootPath)}",
+      "packageUri": "lib/"
+    },
+    {
+      "name": "plugin",
+      "rootUri": "${toUriStr(pluginDirPath)}",
+      "packageUri": "lib/"
+    }
+  ]
+}
+''');
   }
 
   void test_pluginsForContextRoot_none() {
diff --git a/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart b/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
index 1923910..1bf7f74 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/convert_to_super_parameters_test.dart
@@ -164,6 +164,39 @@
 ''');
   }
 
+  Future<void> test_functionTypedFormalParameter() async {
+    await resolveTestCode('''
+class A {
+  A(int f(int x));
+}
+class B extends A {
+  B(int f(int x)) : super(f);
+}
+''');
+    await assertHasAssistAt('B(', '''
+class A {
+  A(int f(int x));
+}
+class B extends A {
+  B(super.f);
+}
+''');
+  }
+
+  Future<void> test_invalid_fieldFormalParameter() async {
+    await resolveTestCode('''
+class A {
+  int x;
+  A(this.x);
+}
+class B extends A {
+  int y;
+  B(this.y) : super(y);
+}
+''');
+    await assertNoAssistAt('B(');
+  }
+
   Future<void> test_invalid_namedToPositional() async {
     await resolveTestCode('''
 class A {
@@ -702,4 +735,23 @@
 }
 ''');
   }
+
+  Future<void> test_trailingComma() async {
+    await resolveTestCode('''
+class A {
+  A._(int x, int y);
+}
+class B extends A {
+  B(int x, int y) : super._(x, y,);
+}
+''');
+    await assertHasAssistAt('B(', '''
+class A {
+  A._(int x, int y);
+}
+class B extends A {
+  B(super.x, super.y) : super._();
+}
+''');
+  }
 }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart
index d20113b..8878039 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/code_fragment_parser_test.dart
@@ -68,7 +68,11 @@
 
   CodeFragmentParser _parser(GatheringErrorListener listener,
       {List<String>? variables}) {
-    var errorReporter = ErrorReporter(listener, MockSource());
+    var errorReporter = ErrorReporter(
+      listener,
+      MockSource(),
+      isNonNullableByDefault: false,
+    );
     var map = <String, ValueGenerator>{};
     if (variables != null) {
       for (var variableName in variables) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
index 9d4c388..50fdbb9 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_override_set_parser_test.dart
@@ -56,8 +56,11 @@
 
   void parse(String content) {
     errorListener = GatheringErrorListener();
-    var errorReporter =
-        ErrorReporter(errorListener, MockSource(fullName: 'data.yaml'));
+    var errorReporter = ErrorReporter(
+      errorListener,
+      MockSource(fullName: 'data.yaml'),
+      isNonNullableByDefault: false,
+    );
     var parser = TransformOverrideSetParser(errorReporter);
     result = parser.parse(content);
   }
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test_support.dart
index 66ddafd..5ed5d4e 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/transform_set_parser_test_support.dart
@@ -39,8 +39,11 @@
           expectedContextMessages: contextMessages);
 
   void parse(String content) {
-    var errorReporter =
-        ErrorReporter(errorListener, MockSource(fullName: 'data.yaml'));
+    var errorReporter = ErrorReporter(
+      errorListener,
+      MockSource(fullName: 'data.yaml'),
+      isNonNullableByDefault: false,
+    );
     var parser = TransformSetParser(errorReporter, 'myPackage');
     result = parser.parse(content);
   }
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index a1312a7..1886590 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -12,6 +12,7 @@
 * Changed `CompilationUnitElement.lineInfo` to be non-nullable.
 * Deprecated `ResourceProviderMixin.newFile`, use `newFile2` instead.
 * Deprecated `ResourceProviderMixin.newAnalysisOptionsYamlFile`.
+* Added `AnalysisContext.changeFile` and `AnalysisContext.applyPendingFileChanges`.
 
 ## 3.3.1
 * Report HintCode.OVERRIDE_ON_NON_OVERRIDING_xyz on enum.
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context.dart b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
index 68fb611..2a49b01 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context.dart
@@ -42,8 +42,16 @@
   /// The value is the set of all files that are potentially affected by
   /// the pending changes. This set can be both wider than the set of analyzed
   /// files (because it may include files imported from other packages, and
-  /// which are on the import path from a changed file to an analyze file),
+  /// which are on the import path from a changed file to an analyzed file),
   /// and narrower than the set of analyzed files (because only files that
   /// were previously accessed are considered to be known and affected).
   Future<List<String>> applyPendingFileChanges();
+
+  /// Schedules the file with the [path] to be read before producing new
+  /// analysis results.
+  ///
+  /// The file is expected to be a Dart file, reporting non-Dart files, such
+  /// as configuration files `analysis_options.yaml`, `package_config.json`,
+  /// etc will not re-create analysis contexts.
+  void changeFile(String path);
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index 2f3fd34..266ad41 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/src/dart/analysis/file_content_cache.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/util/sdk.dart';
 
 /// An implementation of [AnalysisContextCollection].
@@ -42,6 +43,7 @@
     AnalysisDriverScheduler? scheduler,
     FileContentCache? fileContentCache,
     void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
+    MacroKernelBuilder? macroKernelBuilder,
   }) : resourceProvider =
             resourceProvider ?? PhysicalResourceProvider.INSTANCE {
     sdkPath ??= getSdkPath();
@@ -74,6 +76,7 @@
         scheduler: scheduler,
         updateAnalysisOptions: updateAnalysisOptions,
         fileContentCache: fileContentCache,
+        macroKernelBuilder: macroKernelBuilder,
       );
       contexts.add(context);
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index 0aa945a..ddb9cc9 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -25,6 +25,7 @@
 import 'package:analyzer/src/hint/sdk_constraint_extractor.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
+import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/summary2/package_bundle_format.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
@@ -58,6 +59,7 @@
     String? sdkSummaryPath,
     void Function(AnalysisOptionsImpl)? updateAnalysisOptions,
     FileContentCache? fileContentCache,
+    MacroKernelBuilder? macroKernelBuilder,
   }) {
     // TODO(scheglov) Remove this, and make `sdkPath` required.
     sdkPath ??= getSdkPath();
@@ -115,6 +117,7 @@
       externalSummaries: summaryData,
       retainDataForTesting: retainDataForTesting,
       fileContentCache: fileContentCache,
+      macroKernelBuilder: macroKernelBuilder,
     );
 
     if (declaredVariables != null) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 562528c..5ab147e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -42,6 +42,7 @@
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
+import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:analyzer/src/util/performance/operation_performance.dart';
 import 'package:meta/meta.dart';
@@ -82,7 +83,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 210;
+  static const int DATA_VERSION = 211;
 
   static const bool _applyFileChangesSynchronously = true;
 
@@ -124,6 +125,8 @@
   /// from file paths.
   SourceFactory _sourceFactory;
 
+  final MacroKernelBuilder? macroKernelBuilder;
+
   /// The declared environment variables.
   DeclaredVariables declaredVariables = DeclaredVariables();
 
@@ -257,6 +260,7 @@
     required SourceFactory sourceFactory,
     required AnalysisOptionsImpl analysisOptions,
     required Packages packages,
+    this.macroKernelBuilder,
     FileContentCache? fileContentCache,
     bool enableIndex = false,
     SummaryDataStore? externalSummaries,
@@ -322,7 +326,9 @@
       analysisOptions: _analysisOptions,
       declaredVariables: declaredVariables,
       sourceFactory: _sourceFactory,
+      macroKernelBuilder: macroKernelBuilder,
       externalSummaries: _externalSummaries,
+      fileSystemState: _fsState,
     );
   }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
index 79b54c0..394b920 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver_based_analysis_context.dart
@@ -58,4 +58,9 @@
   Future<List<String>> applyPendingFileChanges() {
     return driver.applyPendingFileChanges();
   }
+
+  @override
+  void changeFile(String path) {
+    driver.changeFile(path);
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index 2e1c323..9424fd1 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -40,6 +40,7 @@
 import 'package:collection/collection.dart';
 import 'package:convert/convert.dart';
 import 'package:meta/meta.dart';
+import 'package:path/path.dart' as package_path;
 import 'package:pub_semver/pub_semver.dart';
 
 var counterFileStateRefresh = 0;
@@ -599,6 +600,7 @@
     var exports = <UnlinkedNamespaceDirective>[];
     var imports = <UnlinkedNamespaceDirective>[];
     var parts = <String>[];
+    var macroClasses = <MacroClass>[];
     var hasDartCoreImport = false;
     var hasLibraryDirective = false;
     var hasPartOfDirective = false;
@@ -621,6 +623,25 @@
         hasPartOfDirective = true;
       }
     }
+    for (var declaration in unit.declarations) {
+      if (declaration is ClassDeclarationImpl) {
+        if (declaration.macroKeyword != null) {
+          var constructors = declaration.members
+              .whereType<ConstructorDeclaration>()
+              .map((e) => e.name?.name ?? '')
+              .where((e) => !e.startsWith('_'))
+              .toList();
+          if (constructors.isNotEmpty) {
+            macroClasses.add(
+              MacroClass(
+                name: declaration.name.name,
+                constructors: constructors,
+              ),
+            );
+          }
+        }
+      }
+    }
     if (!hasDartCoreImport) {
       imports.add(
         UnlinkedNamespaceDirective(
@@ -637,6 +658,7 @@
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
       lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
+      macroClasses: macroClasses,
       partOfName: null,
       partOfUri: null,
       parts: parts,
@@ -764,6 +786,8 @@
     _testView = FileSystemStateTestView(this);
   }
 
+  package_path.Context get pathContext => _resourceProvider.pathContext;
+
   @visibleForTesting
   FileSystemStateTestView get test => _testView;
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 53cdde8..4610294 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -22,7 +22,9 @@
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/link.dart' as link2;
 import 'package:analyzer/src/summary2/linked_element_factory.dart';
+import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:path/src/context.dart';
 
 var counterLinkedLibraries = 0;
 var counterLoadedLibraries = 0;
@@ -39,6 +41,8 @@
   final LibraryContextTestView testView;
   final PerformanceLog logger;
   final ByteStore byteStore;
+  final FileSystemState fileSystemState;
+  final MacroKernelBuilder? macroKernelBuilder;
   final SummaryDataStore store = SummaryDataStore();
 
   late final AnalysisContextImpl analysisContext;
@@ -49,9 +53,11 @@
     required AnalysisSessionImpl analysisSession,
     required PerformanceLog logger,
     required ByteStore byteStore,
+    required this.fileSystemState,
     required AnalysisOptionsImpl analysisOptions,
     required DeclaredVariables declaredVariables,
     required SourceFactory sourceFactory,
+    this.macroKernelBuilder,
     required SummaryDataStore? externalSummaries,
   })  : logger = logger,
         byteStore = byteStore {
@@ -120,9 +126,28 @@
       cycle.directDependencies.forEach(loadBundle);
 
       var unitsInformativeBytes = <Uri, Uint8List>{};
+      var macroLibraries = <MacroLibrary>[];
       for (var library in cycle.libraries) {
+        var macroClasses = <MacroClass>[];
         for (var file in library.libraryFiles) {
           unitsInformativeBytes[file.uri] = file.unlinked2.informativeBytes;
+          for (var macroClass in file.unlinked2.macroClasses) {
+            macroClasses.add(
+              MacroClass(
+                name: macroClass.name,
+                constructors: macroClass.constructors,
+              ),
+            );
+          }
+        }
+        if (macroClasses.isNotEmpty) {
+          macroLibraries.add(
+            MacroLibrary(
+              uri: library.uri,
+              path: library.path,
+              classes: macroClasses,
+            ),
+          );
         }
       }
 
@@ -206,6 +231,17 @@
           ),
         );
       }
+
+      final macroKernelBuilder = this.macroKernelBuilder;
+      if (macroKernelBuilder != null && macroLibraries.isNotEmpty) {
+        var macroKernelKey = cycle.transitiveSignature + '.macro_kernel';
+        var macroKernelBytes = macroKernelBuilder.build(
+          fileSystem: _MacroFileSystem(fileSystemState),
+          libraries: macroLibraries,
+        );
+        byteStore.put(macroKernelKey, macroKernelBytes);
+        bytesPut += macroKernelBytes.length;
+      }
     }
 
     logger.run('Prepare linked bundles', () {
@@ -259,3 +295,30 @@
 class LibraryContextTestView {
   final List<Set<String>> linkedCycles = [];
 }
+
+class _MacroFileEntry implements MacroFileEntry {
+  final FileState fileState;
+
+  _MacroFileEntry(this.fileState);
+
+  @override
+  String get content => fileState.content;
+
+  @override
+  bool get exists => fileState.exists;
+}
+
+class _MacroFileSystem implements MacroFileSystem {
+  final FileSystemState fileSystemState;
+
+  _MacroFileSystem(this.fileSystemState);
+
+  @override
+  Context get pathContext => fileSystemState.pathContext;
+
+  @override
+  MacroFileEntry getFile(String path) {
+    var fileState = fileSystemState.getFileForPath(path);
+    return _MacroFileEntry(fileState);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
index 5ab1857..88cfdb8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_data.dart
@@ -65,6 +65,31 @@
   }
 }
 
+/// Unlinked information about a `macro` class.
+class MacroClass {
+  final String name;
+  final List<String> constructors;
+
+  MacroClass({
+    required this.name,
+    required this.constructors,
+  });
+
+  factory MacroClass.read(
+    SummaryDataReader reader,
+  ) {
+    return MacroClass(
+      name: reader.readStringUtf8(),
+      constructors: reader.readStringUtf8List(),
+    );
+  }
+
+  void write(BufferedSink sink) {
+    sink.writeStringUtf8(name);
+    sink.writeStringUtf8Iterable(constructors);
+  }
+}
+
 /// Unlinked information about a namespace directive.
 class UnlinkedNamespaceDirective {
   /// The configurations that control which library will actually be used.
@@ -159,6 +184,9 @@
   /// Offsets of the first character of each line in the source code.
   final Uint32List lineStarts;
 
+  /// The list of `macro` classes.
+  final List<MacroClass> macroClasses;
+
   /// The library name of the `part of my.name;` directive.
   final String? partOfName;
 
@@ -176,6 +204,7 @@
     required this.imports,
     required this.informativeBytes,
     required this.lineStarts,
+    required this.macroClasses,
     required this.partOfName,
     required this.partOfUri,
     required this.parts,
@@ -194,6 +223,9 @@
       ),
       informativeBytes: reader.readUint8List(),
       lineStarts: reader.readUInt30List(),
+      macroClasses: reader.readTypedList(
+        () => MacroClass.read(reader),
+      ),
       partOfName: reader.readOptionalStringUtf8(),
       partOfUri: reader.readOptionalStringUtf8(),
       parts: reader.readStringUtf8List(),
@@ -212,6 +244,9 @@
     });
     sink.writeUint8List(informativeBytes);
     sink.writeUint30List(lineStarts);
+    sink.writeList<MacroClass>(macroClasses, (x) {
+      x.write(sink);
+    });
     sink.writeOptionalStringUtf8(partOfName);
     sink.writeOptionalStringUtf8(partOfUri);
     sink.writeStringUtf8Iterable(parts);
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 11e0af2..05beef2 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1617,6 +1617,20 @@
     return null;
   }
 
+  @override
+  EvaluationResultImpl? get evaluationResult {
+    if (constantInitializer != null) {
+      return super.evaluationResult;
+    }
+
+    var superConstructorParameter = this.superConstructorParameter;
+    if (superConstructorParameter is ParameterElementImpl) {
+      return superConstructorParameter.evaluationResult;
+    }
+
+    return null;
+  }
+
   DartObject? get _superConstructorParameterDefaultValue {
     var superDefault = superConstructorParameter?.computeConstantValue();
     var superDefaultType = superDefault?.type;
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index 3953099..1f04dee 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -962,6 +962,7 @@
       imports: imports,
       informativeBytes: writeUnitInformative(unit),
       lineStarts: Uint32List.fromList(unit.lineInfo.lineStarts),
+      macroClasses: [],
       partOfName: partOfName,
       partOfUri: partOfUriStr,
       parts: parts,
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 6b789f1..635bb96 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -119,11 +119,6 @@
   final Set<String> _libraryUris = <String>{};
   final Set<String> _partUris = <String>{};
 
-  SummaryDataStore();
-
-  @Deprecated('Use SummaryDataStore() instead')
-  SummaryDataStore.tmp();
-
   /// Add the given [bundle] loaded from the file with the given [path].
   void addBundle(String? path, PackageBundleReader bundle) {
     bundles.add(bundle);
diff --git a/pkg/analyzer/lib/src/summary2/macro.dart b/pkg/analyzer/lib/src/summary2/macro.dart
new file mode 100644
index 0000000..a3502d0
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/macro.dart
@@ -0,0 +1,50 @@
+// 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 'dart:typed_data';
+
+import 'package:path/path.dart' as package_path;
+
+class MacroClass {
+  final String name;
+  final List<String> constructors;
+
+  MacroClass({
+    required this.name,
+    required this.constructors,
+  });
+}
+
+abstract class MacroFileEntry {
+  String get content;
+
+  /// When CFE searches for `package_config.json` we need to check this.
+  bool get exists;
+}
+
+abstract class MacroFileSystem {
+  /// Used to convert `file:` URIs into paths.
+  package_path.Context get pathContext;
+
+  MacroFileEntry getFile(String path);
+}
+
+abstract class MacroKernelBuilder {
+  Uint8List build({
+    required MacroFileSystem fileSystem,
+    required List<MacroLibrary> libraries,
+  });
+}
+
+class MacroLibrary {
+  final Uri uri;
+  final String path;
+  final List<MacroClass> classes;
+
+  MacroLibrary({
+    required this.uri,
+    required this.path,
+    required this.classes,
+  });
+}
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 993aa69..82cba35 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -140,7 +140,7 @@
 
 class _ConstructorInferenceNode extends _InferenceNode {
   final _InferenceWalker _walker;
-  final ConstructorElement _constructor;
+  final ConstructorElementImpl _constructor;
   final List<_FieldFormalParameter> _fieldParameters = [];
   final List<_SuperFormalParameter> _superParameters = [];
 
@@ -199,11 +199,14 @@
   List<_InferenceNode> computeDependencies() {
     var dependencies = [
       ..._fieldParameters.map((e) => _walker.getNode(e.field)).whereNotNull(),
-      ..._superParameters
-          .map((e) => _walker.getNode(e.superParameter))
-          .whereNotNull(),
     ];
 
+    if (_superParameters.isNotEmpty) {
+      dependencies.addIfNotNull(
+        _walker.getNode(_constructor.superConstructor),
+      );
+    }
+
     dependencies.addIfNotNull(
       _walker.getNode(_baseConstructor?.element),
     );
@@ -224,12 +227,11 @@
     // Update types of a mixin application constructor formal parameters.
     var baseConstructor = _baseConstructor;
     if (baseConstructor != null) {
-      var constructor = _constructor as ConstructorElementImpl;
       var substitution = Substitution.fromInterfaceType(
         baseConstructor.superType,
       );
       forCorrespondingPairs<ParameterElement, ParameterElement>(
-        constructor.parameters,
+        _constructor.parameters,
         baseConstructor.element.parameters,
         (parameter, baseParameter) {
           var type = substitution.substituteType(baseParameter.type);
@@ -239,10 +241,10 @@
       // Update arguments of `SuperConstructorInvocation` to have the types
       // (which we have just set) of the corresponding formal parameters.
       // MixinApp(x, y) : super(x, y);
-      var initializers = constructor.constantInitializers;
+      var initializers = _constructor.constantInitializers;
       var initializer = initializers.single as SuperConstructorInvocation;
       forCorrespondingPairs<ParameterElement, Expression>(
-        constructor.parameters,
+        _constructor.parameters,
         initializer.argumentList.arguments,
         (parameter, argument) {
           (argument as SimpleIdentifierImpl).staticType = parameter.type;
@@ -370,6 +372,7 @@
 
   void _addClassConstructorFieldFormals(ClassElement class_) {
     for (var constructor in class_.constructors) {
+      constructor as ConstructorElementImpl;
       var inferenceNode = _ConstructorInferenceNode(_walker, constructor);
       _walker._nodes[constructor] = inferenceNode;
     }
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 768ae62..24b3c13 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -24,7 +24,13 @@
     path: ../analyzer_utilities
   args: ^2.0.0
   async: ^2.5.0
+  front_end:
+    path: ../front_end
+  kernel:
+    path: ../kernel
   linter: ^1.12.0
   matcher: ^0.12.10
   test: ^1.16.0
   test_reflective_loader: ^0.2.0
+  vm:
+    path: ../vm
diff --git a/pkg/analyzer/test/dart/analysis/analysis_context_test.dart b/pkg/analyzer/test/dart/analysis/analysis_context_test.dart
new file mode 100644
index 0000000..685fa7b
--- /dev/null
+++ b/pkg/analyzer/test/dart/analysis/analysis_context_test.dart
@@ -0,0 +1,74 @@
+// 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:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../src/dart/resolution/context_collection_resolution.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AnalysisContextTest);
+  });
+}
+
+@reflectiveTest
+class AnalysisContextTest extends PubPackageResolutionTest {
+  test_changeFile_imported() async {
+    var a = newFile2('$testPackageLibPath/a.dart', '');
+
+    var b = newFile2('$testPackageLibPath/b.dart', r'''
+import 'a.dart';
+''');
+
+    var c = newFile2('$testPackageLibPath/c.dart', '');
+
+    var analysisContext = contextFor(a.path);
+
+    // Ask for files, so that they are known.
+    var analysisSession = analysisContext.currentSession;
+    await analysisSession.getFile2(a.path);
+    await analysisSession.getFile2(b.path);
+    await analysisSession.getFile2(c.path);
+
+    analysisContext.changeFile(a.path);
+
+    var affected = await analysisContext.applyPendingFileChanges();
+    expect(affected, unorderedEquals([a.path, b.path]));
+
+    expect(analysisContext.currentSession, isNot(analysisSession));
+  }
+
+  test_changeFile_part() async {
+    var a = newFile2('$testPackageLibPath/a.dart', r'''
+part 'b.dart';
+''');
+
+    var b = newFile2('$testPackageLibPath/b.dart', r'''
+part of 'a.dart';
+''');
+
+    var c = newFile2('$testPackageLibPath/c.dart', r'''
+import 'a.dart';
+''');
+
+    var d = newFile2('$testPackageLibPath/d.dart', '');
+
+    var analysisContext = contextFor(a.path);
+
+    // Ask for files, so that they are known.
+    var analysisSession = analysisContext.currentSession;
+    await analysisSession.getFile2(a.path);
+    await analysisSession.getFile2(b.path);
+    await analysisSession.getFile2(c.path);
+    await analysisSession.getFile2(d.path);
+
+    analysisContext.changeFile(b.path);
+
+    var affected = await analysisContext.applyPendingFileChanges();
+    expect(affected, unorderedEquals([a.path, b.path, c.path]));
+
+    expect(analysisContext.currentSession, isNot(analysisSession));
+  }
+}
diff --git a/pkg/analyzer/test/dart/analysis/test_all.dart b/pkg/analyzer/test/dart/analysis/test_all.dart
index 40e2965..13113c5 100644
--- a/pkg/analyzer/test/dart/analysis/test_all.dart
+++ b/pkg/analyzer/test/dart/analysis/test_all.dart
@@ -4,11 +4,13 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'analysis_context_test.dart' as analysis_context;
 import 'from_environment_evaluator_test.dart' as declared_variables;
 import 'utilities_test.dart' as utilities;
 
 void main() {
   defineReflectiveSuite(() {
+    analysis_context.main();
     declared_variables.main();
     utilities.main();
   }, name: 'analysis');
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 45f9fd3..5b9d9a4 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
+import 'package:analyzer/src/summary2/macro.dart';
 import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/package_config_file_builder.dart';
@@ -26,6 +27,7 @@
 import 'package:test/test.dart';
 
 import '../../../generated/test_support.dart';
+import '../../summary/repository_macro_kernel_builder.dart';
 import 'context_collection_resolution_caching.dart';
 import 'resolution.dart';
 
@@ -139,6 +141,8 @@
     _declaredVariables = map;
   }
 
+  MacroKernelBuilder? get macroKernelBuilder => null;
+
   bool get retainDataForTesting => false;
 
   Folder get sdkRoot => newFolder('/sdk');
@@ -246,6 +250,7 @@
       retainDataForTesting: retainDataForTesting,
       sdkPath: sdkRoot.path,
       updateAnalysisOptions: updateAnalysisOptions,
+      macroKernelBuilder: macroKernelBuilder,
     );
 
     verifyCreatedCollection();
@@ -321,6 +326,7 @@
     bool ffi = false,
     bool js = false,
     bool meta = false,
+    MacrosEnvironment? macrosEnvironment,
   }) {
     config = config.copy();
 
@@ -354,6 +360,15 @@
       config.add(name: 'meta', rootPath: metaPath);
     }
 
+    if (macrosEnvironment != null) {
+      var packagesRootFolder = getFolder(packagesRootPath);
+      macrosEnvironment.packageSharedFolder.copyTo(packagesRootFolder);
+      config.add(
+        name: '_fe_analyzer_shared',
+        rootPath: getFolder('$packagesRootPath/_fe_analyzer_shared').path,
+      );
+    }
+
     var path = '$testPackageRootPath/.dart_tool/package_config.json';
     writePackageConfig(path, config);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/macro_test.dart b/pkg/analyzer/test/src/dart/resolution/macro_test.dart
new file mode 100644
index 0000000..2b41573
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/macro_test.dart
@@ -0,0 +1,54 @@
+// 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:analyzer/src/summary2/macro.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../summary/repository_macro_kernel_builder.dart';
+import 'context_collection_resolution.dart';
+
+main() {
+  try {
+    MacrosEnvironment.instance;
+  } catch (_) {
+    print('Cannot initialize environment. Skip macros tests.');
+    return;
+  }
+
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MacroResolutionTest);
+  });
+}
+
+@reflectiveTest
+class MacroResolutionTest extends PubPackageResolutionTest {
+  @override
+  MacroKernelBuilder? get macroKernelBuilder {
+    return DartRepositoryMacroKernelBuilder(
+      MacrosEnvironment.instance.platformDillBytes,
+    );
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+      macrosEnvironment: MacrosEnvironment.instance,
+    );
+  }
+
+  test_0() async {
+    await assertNoErrorsInCode(r'''
+import 'dart:async';
+import 'package:_fe_analyzer_shared/src/macros/api.dart';
+
+macro class EmptyMacro implements ClassTypesMacro {
+  const EmptyMacro();
+  FutureOr<void> buildTypesForClass(clazz, builder) {}
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index 079b416..eb4521e 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -44,6 +44,7 @@
 import 'library_element_test.dart' as library_element;
 import 'local_function_test.dart' as local_function;
 import 'local_variable_test.dart' as local_variable;
+import 'macro_test.dart' as macro;
 import 'metadata_test.dart' as metadata;
 import 'method_declaration_test.dart' as method_declaration;
 import 'method_invocation_test.dart' as method_invocation;
@@ -108,6 +109,7 @@
     library_element.main();
     local_function.main();
     local_variable.main();
+    macro.main();
     metadata.main();
     method_declaration.main();
     method_invocation.main();
diff --git a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
index af72941..67cdfa0 100644
--- a/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_constructor_param_type_mismatch_test.dart
@@ -315,6 +315,34 @@
     ]);
   }
 
+  test_superFormalParameter_explicit() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  const A({int a = 0});
+}
+
+class B extends A {
+  static const f = B();
+
+  const B({super.a = 2});
+}
+''');
+  }
+
+  test_superFormalParameter_inherited() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  const A({int a = 0});
+}
+
+class B extends A {
+  static const f = B();
+
+  const B({super.a});
+}
+''');
+  }
+
   test_unknown_conditionalExpression_unknownCondition() async {
     await assertNoErrorsInCode(r'''
 const bool kIsWeb = identical(0, 0.0);
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index f96b17d..09c0acc 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -1760,6 +1760,53 @@
 ''');
   }
 
+  test_class_constructor_parameters_super_requiredPositional_inferenceOrder() async {
+    // It is important that `C` is declared after `B`, so that we check that
+    // inference happens in order - first `C`, then `B`.
+    var library = await buildLibrary('''
+abstract class A {
+  A(int a);
+}
+
+class B extends C {
+  B(super.a);
+}
+
+class C extends A {
+  C(super.a);
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    classes
+      abstract class A @15
+        constructors
+          @21
+            parameters
+              requiredPositional a @27
+                type: int
+      class B @40
+        supertype: C
+        constructors
+          @56
+            parameters
+              requiredPositional final super.a @64
+                type: int
+                superConstructorParameter: a@101
+            superConstructor: self::@class::C::@constructor::•
+      class C @77
+        supertype: A
+        constructors
+          @93
+            parameters
+              requiredPositional final super.a @101
+                type: int
+                superConstructorParameter: a@27
+            superConstructor: self::@class::A::@constructor::•
+''');
+  }
+
   test_class_constructor_parameters_super_requiredPositional_unresolved() async {
     var library = await buildLibrary('''
 class A {}
diff --git a/pkg/analyzer/test/src/summary/repository_macro_kernel_builder.dart b/pkg/analyzer/test/src/summary/repository_macro_kernel_builder.dart
new file mode 100644
index 0000000..2d0b635
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/repository_macro_kernel_builder.dart
@@ -0,0 +1,210 @@
+// 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.
+
+// ignore: deprecated_member_use
+import 'dart:cli' as cli;
+import 'dart:convert';
+import 'dart:io' as io;
+import 'dart:typed_data';
+
+import 'package:_fe_analyzer_shared/src/macros/bootstrap.dart';
+import 'package:_fe_analyzer_shared/src/macros/executor/serialization.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:analyzer/src/summary2/macro.dart';
+import 'package:analyzer/src/util/uri.dart';
+import 'package:analyzer_utilities/package_root.dart' as package_root;
+import 'package:front_end/src/api_prototype/compiler_options.dart' as fe;
+import 'package:front_end/src/api_prototype/file_system.dart' as fe;
+import 'package:front_end/src/fasta/kernel/utils.dart' as fe;
+import 'package:kernel/target/targets.dart' as fe;
+import 'package:path/path.dart' as package_path;
+import 'package:vm/kernel_front_end.dart' as fe;
+import 'package:vm/target/vm.dart' as fe;
+
+final Uri _platformDillUri = Uri.parse('org-dartlang-sdk://vm.dill');
+
+/// Implementation of [MacroKernelBuilder] that can run in Dart SDK repository.
+///
+/// This is a temporary implementation, to be replaced with a more stable
+/// approach, e.g. a `dart:` API for compilation, shipping `front_end`
+/// with SDK, etc.
+class DartRepositoryMacroKernelBuilder implements MacroKernelBuilder {
+  final Uint8List platformDillBytes;
+
+  DartRepositoryMacroKernelBuilder(this.platformDillBytes);
+
+  @override
+  Uint8List build({
+    required MacroFileSystem fileSystem,
+    required List<MacroLibrary> libraries,
+  }) {
+    var options = fe.CompilerOptions()
+      ..sdkSummary = _platformDillUri
+      ..target = fe.VmTarget(fe.TargetFlags(enableNullSafety: true));
+
+    var macroMainContent = bootstrapMacroIsolate(
+      {
+        for (var library in libraries)
+          library.uri.toString(): {
+            for (var c in library.classes) c.name: c.constructors
+          },
+      },
+      SerializationMode.byteDataClient,
+    );
+
+    var macroMainBytes = utf8.encode(macroMainContent) as Uint8List;
+    var macroMainPath = libraries.first.path + '.macro';
+    var macroMainUri = fileSystem.pathContext.toUri(macroMainPath);
+
+    options
+      ..fileSystem = _FileSystem(
+        fileSystem,
+        platformDillBytes,
+        macroMainUri,
+        macroMainBytes,
+      );
+
+    // TODO(scheglov) For now we convert async into sync.
+    // ignore: deprecated_member_use
+    var compilationResults = cli.waitFor(
+      fe.compileToKernel(
+        macroMainUri,
+        options,
+        environmentDefines: {},
+      ),
+    );
+
+    return fe.serializeComponent(
+      compilationResults.component!,
+      filter: (library) {
+        return !library.importUri.isScheme('dart');
+      },
+      includeSources: false,
+    );
+  }
+}
+
+/// Environment for compiling macros to kernels, expecting that we run
+/// a test in the Dart SDK repository.
+///
+/// Just like [DartRepositoryMacroKernelBuilder], this is a temporary
+/// implementation.
+class MacrosEnvironment {
+  static late final instance = MacrosEnvironment._();
+
+  final _resourceProvider = MemoryResourceProvider(context: package_path.posix);
+  late final Uint8List platformDillBytes;
+
+  MacrosEnvironment._() {
+    var physical = PhysicalResourceProvider.INSTANCE;
+
+    var packageRoot = physical.pathContext.normalize(package_root.packageRoot);
+    physical
+        .getFolder(packageRoot)
+        .getChildAssumingFolder('_fe_analyzer_shared/lib/src/macros')
+        .copyTo(
+          packageSharedFolder.getChildAssumingFolder('lib/src'),
+        );
+
+    platformDillBytes = physical
+        .getFile(io.Platform.resolvedExecutable)
+        .parent
+        .parent
+        .getChildAssumingFolder('lib')
+        .getChildAssumingFolder('_internal')
+        .getChildAssumingFile('vm_platform_strong.dill')
+        .readAsBytesSync();
+  }
+
+  Folder get packageSharedFolder {
+    return _resourceProvider.getFolder('/packages/_fe_analyzer_shared');
+  }
+}
+
+class _BytesFileSystemEntity implements fe.FileSystemEntity {
+  @override
+  final Uri uri;
+
+  final Uint8List bytes;
+
+  _BytesFileSystemEntity(this.uri, this.bytes);
+
+  @override
+  Future<bool> exists() async => true;
+
+  @override
+  Future<bool> existsAsyncIfPossible() => exists();
+
+  @override
+  Future<List<int>> readAsBytes() async => bytes;
+
+  @override
+  Future<List<int>> readAsBytesAsyncIfPossible() => readAsBytes();
+
+  @override
+  Future<String> readAsString() async {
+    var bytes = await readAsBytes();
+    return utf8.decode(bytes);
+  }
+}
+
+class _FileSystem implements fe.FileSystem {
+  final MacroFileSystem fileSystem;
+  final Uint8List platformDillBytes;
+  final Uri macroMainUri;
+  final Uint8List macroMainBytes;
+
+  _FileSystem(
+    this.fileSystem,
+    this.platformDillBytes,
+    this.macroMainUri,
+    this.macroMainBytes,
+  );
+
+  @override
+  fe.FileSystemEntity entityForUri(Uri uri) {
+    if (uri == _platformDillUri) {
+      return _BytesFileSystemEntity(uri, platformDillBytes);
+    } else if (uri == macroMainUri) {
+      return _BytesFileSystemEntity(uri, macroMainBytes);
+    } else if (uri.isScheme('file')) {
+      var path = fileUriToNormalizedPath(fileSystem.pathContext, uri);
+      return _FileSystemEntity(
+        uri,
+        fileSystem.getFile(path),
+      );
+    } else {
+      throw fe.FileSystemException(uri, 'Only supports file: URIs');
+    }
+  }
+}
+
+class _FileSystemEntity implements fe.FileSystemEntity {
+  @override
+  final Uri uri;
+
+  final MacroFileEntry file;
+
+  _FileSystemEntity(this.uri, this.file);
+
+  @override
+  Future<bool> exists() async => file.exists;
+
+  @override
+  Future<bool> existsAsyncIfPossible() => exists();
+
+  @override
+  Future<List<int>> readAsBytes() async {
+    var string = await readAsString();
+    return utf8.encode(string);
+  }
+
+  @override
+  Future<List<int>> readAsBytesAsyncIfPossible() => readAsBytes();
+
+  @override
+  Future<String> readAsString() async => file.content;
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_dart_2_17_test.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_dart_2_17_test.dart
index 644f54d..7efa925 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_dart_2_17_test.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_dart_2_17_test.dart
@@ -216,7 +216,6 @@
 
       enum E2 with M {
         v1, v2, id_string;
-        int get index => 10;
       }
 
       mixin M on Enum {
@@ -297,7 +296,7 @@
       await driver.check(
           breakpointId: 'bp',
           expression: 'E2.v2.mixinMethod()',
-          expectedResult: '1000');
+          expectedResult: '100');
     });
   });
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
index 4f4319e..95a7fb9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.expect
@@ -3,7 +3,9 @@
 import self as self;
 import "dart:core" as core;
 
+@#C1
 import "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart" as self;
+@#C1
 export "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart";
 
 @#C1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect
index 4f4319e..95a7fb9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.modular.expect
@@ -3,7 +3,9 @@
 import self as self;
 import "dart:core" as core;
 
+@#C1
 import "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart" as self;
+@#C1
 export "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart";
 
 @#C1
diff --git a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
index 4f4319e..95a7fb9 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_invocation_metadata.dart.weak.transformed.expect
@@ -3,7 +3,9 @@
 import self as self;
 import "dart:core" as core;
 
+@#C1
 import "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart" as self;
+@#C1
 export "org-dartlang-testcase:///redirecting_factory_invocation_metadata.dart";
 
 @#C1
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart b/pkg/front_end/testcases/macros/multiple_imports.dart
new file mode 100644
index 0000000..71e46d3
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart
@@ -0,0 +1,13 @@
+// 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.
+
+@Const(2)
+import 'dart:async';
+
+@Const(3)
+import augment 'multiple_imports_lib.dart';
+
+FutureOr<void> main() {
+  method();
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.strong.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.strong.expect
new file mode 100644
index 0000000..bb8a142
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.strong.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+import "dart:convert" as con;
+
+@#C2
+@#C4
+import "dart:math";
+@#C6
+@#C8
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void> {
+  self::method();
+}
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic {
+  math::Random::•();
+  #C10.{con::JsonCodec::encoder}{con::JsonEncoder};
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::Const {field:#C1}
+  #C3 = 2
+  #C4 = self::Const {field:#C3}
+  #C5 = 1
+  #C6 = self::Const {field:#C5}
+  #C7 = 3
+  #C8 = self::Const {field:#C7}
+  #C9 = null
+  #C10 = con::JsonCodec {_reviver:#C9, _toEncodable:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///multiple_imports.dart:
+- Const. (from org-dartlang-testcase:///multiple_imports_lib.dart:18:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.strong.transformed.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.strong.transformed.expect
new file mode 100644
index 0000000..bb8a142
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.strong.transformed.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+import "dart:convert" as con;
+
+@#C2
+@#C4
+import "dart:math";
+@#C6
+@#C8
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void> {
+  self::method();
+}
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic {
+  math::Random::•();
+  #C10.{con::JsonCodec::encoder}{con::JsonEncoder};
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::Const {field:#C1}
+  #C3 = 2
+  #C4 = self::Const {field:#C3}
+  #C5 = 1
+  #C6 = self::Const {field:#C5}
+  #C7 = 3
+  #C8 = self::Const {field:#C7}
+  #C9 = null
+  #C10 = con::JsonCodec {_reviver:#C9, _toEncodable:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///multiple_imports.dart:
+- Const. (from org-dartlang-testcase:///multiple_imports_lib.dart:18:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.textual_outline.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.textual_outline.expect
new file mode 100644
index 0000000..bc18faf
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+@Const(2)
+import 'dart:async';
+@Const(3)
+import augment 'multiple_imports_lib.dart';
+FutureOr<void> main() {}
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.weak.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.expect
new file mode 100644
index 0000000..bb8a142
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+import "dart:convert" as con;
+
+@#C2
+@#C4
+import "dart:math";
+@#C6
+@#C8
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void> {
+  self::method();
+}
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic {
+  math::Random::•();
+  #C10.{con::JsonCodec::encoder}{con::JsonEncoder};
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::Const {field:#C1}
+  #C3 = 2
+  #C4 = self::Const {field:#C3}
+  #C5 = 1
+  #C6 = self::Const {field:#C5}
+  #C7 = 3
+  #C8 = self::Const {field:#C7}
+  #C9 = null
+  #C10 = con::JsonCodec {_reviver:#C9, _toEncodable:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///multiple_imports.dart:
+- Const. (from org-dartlang-testcase:///multiple_imports_lib.dart:18:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.weak.modular.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.modular.expect
new file mode 100644
index 0000000..bb8a142
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.modular.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+import "dart:convert" as con;
+
+@#C2
+@#C4
+import "dart:math";
+@#C6
+@#C8
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void> {
+  self::method();
+}
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic {
+  math::Random::•();
+  #C10.{con::JsonCodec::encoder}{con::JsonEncoder};
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::Const {field:#C1}
+  #C3 = 2
+  #C4 = self::Const {field:#C3}
+  #C5 = 1
+  #C6 = self::Const {field:#C5}
+  #C7 = 3
+  #C8 = self::Const {field:#C7}
+  #C9 = null
+  #C10 = con::JsonCodec {_reviver:#C9, _toEncodable:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///multiple_imports.dart:
+- Const. (from org-dartlang-testcase:///multiple_imports_lib.dart:18:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.weak.outline.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.outline.expect
new file mode 100644
index 0000000..bdcb1f0
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.outline.expect
@@ -0,0 +1,19 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+import "dart:math";
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void>
+  ;
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/macros/multiple_imports.dart.weak.transformed.expect b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.transformed.expect
new file mode 100644
index 0000000..bb8a142
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports.dart.weak.transformed.expect
@@ -0,0 +1,47 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+import "dart:math" as math;
+import "dart:convert" as con;
+
+@#C2
+@#C4
+import "dart:math";
+@#C6
+@#C8
+import "dart:convert";
+import "dart:async";
+import "org-dartlang-testcase:///multiple_imports.dart";
+
+class Const extends core::Object /*hasConstConstructor*/  { // from org-dartlang-testcase:///multiple_imports_lib.dart
+  final field core::int field;
+  const constructor •(core::int field) → self::Const
+    : self::Const::field = field, super core::Object::•()
+    ;
+}
+static method main() → FutureOr<void> {
+  self::method();
+}
+static method /* from org-dartlang-testcase:///multiple_imports_lib.dart */ method() → dynamic {
+  math::Random::•();
+  #C10.{con::JsonCodec::encoder}{con::JsonEncoder};
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::Const {field:#C1}
+  #C3 = 2
+  #C4 = self::Const {field:#C3}
+  #C5 = 1
+  #C6 = self::Const {field:#C5}
+  #C7 = 3
+  #C8 = self::Const {field:#C7}
+  #C9 = null
+  #C10 = con::JsonCodec {_reviver:#C9, _toEncodable:#C9}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///multiple_imports.dart:
+- Const. (from org-dartlang-testcase:///multiple_imports_lib.dart:18:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/macros/multiple_imports_lib.dart b/pkg/front_end/testcases/macros/multiple_imports_lib.dart
new file mode 100644
index 0000000..80db5fc
--- /dev/null
+++ b/pkg/front_end/testcases/macros/multiple_imports_lib.dart
@@ -0,0 +1,19 @@
+// 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.
+
+@Const(0)
+import 'dart:math';
+@Const(1)
+import 'dart:convert';
+
+method() {
+  new Random();
+  json.encoder;
+}
+
+class Const {
+  final int field;
+
+  const Const(this.field);
+}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 7c5d010..900255e 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -153,6 +153,7 @@
 macros/class_members: FormatterCrash
 macros/inject_constructor: FormatterCrash
 macros/macro_class: FormatterCrash
+macros/multiple_imports: FormatterCrash
 nnbd/abstract_field_errors: FormatterCrash
 nnbd/covariant_late_field: FormatterCrash
 nnbd/duplicates_instance: FormatterCrash
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 7f0ce5d..dafccc6 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1989,6 +1989,7 @@
 
   @override
   void visitLibraryDependency(LibraryDependency node) {
+    writeAnnotationList(node.annotations);
     writeIndentation();
     writeWord(node.isImport ? 'import' : 'export');
     String uriString;
diff --git a/pkg/smith/lib/configuration.dart b/pkg/smith/lib/configuration.dart
index 9284ec3..3202bf6 100644
--- a/pkg/smith/lib/configuration.dart
+++ b/pkg/smith/lib/configuration.dart
@@ -577,11 +577,9 @@
   static const x64c = Architecture._('x64c');
   static const arm = Architecture._('arm');
   static const arm_x64 = Architecture._('arm_x64');
-  static const armv6 = Architecture._('armv6');
   static const arm64 = Architecture._('arm64');
   static const arm64c = Architecture._('arm64c');
   static const simarm = Architecture._('simarm');
-  static const simarmv6 = Architecture._('simarmv6');
   static const simarm64 = Architecture._('simarm64');
   static const simarm64c = Architecture._('simarm64c');
   static const riscv32 = Architecture._('riscv32');
@@ -596,12 +594,10 @@
     x64,
     x64c,
     arm,
-    armv6,
     arm_x64,
     arm64,
     arm64c,
     simarm,
-    simarmv6,
     simarm64,
     simarm64c,
     riscv32,
diff --git a/pkg/test_runner/lib/src/runtime_configuration.dart b/pkg/test_runner/lib/src/runtime_configuration.dart
index 4cba518..fdaa061 100644
--- a/pkg/test_runner/lib/src/runtime_configuration.dart
+++ b/pkg/test_runner/lib/src/runtime_configuration.dart
@@ -257,8 +257,6 @@
       case Architecture.arm_x64:
       case Architecture.arm64:
       case Architecture.arm64c:
-      case Architecture.simarmv6:
-      case Architecture.armv6:
       case Architecture.simarm64:
       case Architecture.simarm64c:
       case Architecture.simriscv32:
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 1212928..0f08859 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -2298,17 +2298,23 @@
 }
 
 void Assembler::PushRegisters(const RegisterSet& regs) {
-  const intptr_t fpu_regs_count = regs.FpuRegisterCount();
-  if (fpu_regs_count > 0) {
-    // Store fpu registers with the lowest register number at the lowest
-    // address.
-    for (intptr_t i = kNumberOfVRegisters - 1; i >= 0; --i) {
-      VRegister fpu_reg = static_cast<VRegister>(i);
-      if (regs.ContainsFpuRegister(fpu_reg)) {
-        PushQuad(fpu_reg);
+  VRegister vprev = kNoVRegister;
+  // Store fpu registers with the lowest register number at the lowest
+  // address.
+  for (intptr_t i = kNumberOfVRegisters - 1; i >= 0; --i) {
+    VRegister fpu_reg = static_cast<VRegister>(i);
+    if (regs.ContainsFpuRegister(fpu_reg)) {
+      if (vprev != kNoVRegister) {
+        PushQuadPair(/*low=*/fpu_reg, /*high=*/vprev);
+        vprev = kNoVRegister;
+      } else {
+        vprev = fpu_reg;
       }
     }
   }
+  if (vprev != kNoVRegister) {
+    PushQuad(vprev);
+  }
 
   // The order in which the registers are pushed must match the order
   // in which the registers are encoded in the safe point's stack map.
@@ -2350,50 +2356,98 @@
   }
   ASSERT(prev == kNoRegister);
 
-  const intptr_t fpu_regs_count = regs.FpuRegisterCount();
-  if (fpu_regs_count > 0) {
-    // Fpu registers have the lowest register number at the lowest address.
-    for (intptr_t i = 0; i < kNumberOfVRegisters; ++i) {
-      VRegister fpu_reg = static_cast<VRegister>(i);
-      if (regs.ContainsFpuRegister(fpu_reg)) {
+  pop_single = (regs.FpuRegisterCount() & 1) == 1;
+  VRegister vprev = kNoVRegister;
+  // Fpu registers have the lowest register number at the lowest address.
+  for (intptr_t i = 0; i < kNumberOfVRegisters; ++i) {
+    VRegister fpu_reg = static_cast<VRegister>(i);
+    if (regs.ContainsFpuRegister(fpu_reg)) {
+      if (pop_single) {
         PopQuad(fpu_reg);
+        pop_single = false;
+      } else if (vprev != kNoVRegister) {
+        PopQuadPair(/*low=*/vprev, /*high=*/fpu_reg);
+        vprev = kNoVRegister;
+      } else {
+        vprev = fpu_reg;
       }
     }
   }
+  ASSERT(vprev == kNoVRegister);
 }
 
 void Assembler::PushNativeCalleeSavedRegisters() {
   // Save the callee-saved registers.
+  // We use str instead of the Push macro because we will be pushing the PP
+  // register when it is not holding a pool-pointer since we are coming from
+  // C++ code.
+  Register prev = kNoRegister;
   for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
     const Register r = static_cast<Register>(i);
-    // We use str instead of the Push macro because we will be pushing the PP
-    // register when it is not holding a pool-pointer since we are coming from
-    // C++ code.
-    str(r, Address(SP, -1 * target::kWordSize, Address::PreIndex));
+    if (prev != kNoRegister) {
+      stp(/*low=*/r, /*high=*/prev,
+          Address(SP, -2 * target::kWordSize, Address::PairPreIndex));
+      prev = kNoRegister;
+    } else {
+      prev = r;
+    }
+  }
+  if (prev != kNoRegister) {
+    str(prev, Address(SP, -1 * target::kWordSize, Address::PreIndex));
   }
 
   // Save the bottom 64-bits of callee-saved V registers.
+  VRegister vprev = kNoVRegister;
   for (int i = kAbiFirstPreservedFpuReg; i <= kAbiLastPreservedFpuReg; i++) {
     const VRegister r = static_cast<VRegister>(i);
-    PushDouble(r);
+    if (vprev != kNoVRegister) {
+      PushDoublePair(/*low=*/r, /*high=*/vprev);
+      vprev = kNoVRegister;
+    } else {
+      vprev = r;
+    }
+  }
+  if (vprev != kNoVRegister) {
+    PushDouble(vprev);
   }
 }
 
 void Assembler::PopNativeCalleeSavedRegisters() {
   // Restore the bottom 64-bits of callee-saved V registers.
+  bool pop_single = (kAbiPreservedCpuRegCount & 1) == 1;
+  VRegister vprev = kNoVRegister;
   for (int i = kAbiLastPreservedFpuReg; i >= kAbiFirstPreservedFpuReg; i--) {
     const VRegister r = static_cast<VRegister>(i);
-    PopDouble(r);
+    if (pop_single) {
+      PopDouble(r);
+      pop_single = false;
+    } else if (vprev != kNoVRegister) {
+      PopDoublePair(/*low=*/vprev, /*high=*/r);
+      vprev = kNoVRegister;
+    } else {
+      vprev = r;
+    }
   }
 
   // Restore C++ ABI callee-saved registers.
+  // We use ldr instead of the Pop macro because we will be popping the PP
+  // register when it is not holding a pool-pointer since we are returning to
+  // C++ code. We also skip the dart stack pointer SP, since we are still
+  // using it as the stack pointer.
+  pop_single = (kAbiPreservedCpuRegCount & 1) == 1;
+  Register prev = kNoRegister;
   for (int i = kAbiLastPreservedCpuReg; i >= kAbiFirstPreservedCpuReg; i--) {
     Register r = static_cast<Register>(i);
-    // We use ldr instead of the Pop macro because we will be popping the PP
-    // register when it is not holding a pool-pointer since we are returning to
-    // C++ code. We also skip the dart stack pointer SP, since we are still
-    // using it as the stack pointer.
-    ldr(r, Address(SP, 1 * target::kWordSize, Address::PostIndex));
+    if (pop_single) {
+      ldr(r, Address(SP, 1 * target::kWordSize, Address::PostIndex));
+      pop_single = false;
+    } else if (prev != kNoRegister) {
+      ldp(/*low=*/prev, /*high=*/r,
+          Address(SP, 2 * target::kWordSize, Address::PairPostIndex));
+      prev = kNoRegister;
+    } else {
+      prev = r;
+    }
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index a1126ec..812ff3f 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -1129,6 +1129,18 @@
            (a.type() == Address::PairPreIndex));
     EmitLoadStoreRegPair(STP, rt, rt2, a, sz);
   }
+  void fldp(VRegister rt, VRegister rt2, Address a, OperandSize sz) {
+    ASSERT((a.type() == Address::PairOffset) ||
+           (a.type() == Address::PairPostIndex) ||
+           (a.type() == Address::PairPreIndex));
+    EmitLoadStoreVRegPair(FLDP, rt, rt2, a, sz);
+  }
+  void fstp(VRegister rt, VRegister rt2, Address a, OperandSize sz) {
+    ASSERT((a.type() == Address::PairOffset) ||
+           (a.type() == Address::PairPostIndex) ||
+           (a.type() == Address::PairPreIndex));
+    EmitLoadStoreVRegPair(FSTP, rt, rt2, a, sz);
+  }
 
   void ldxr(Register rt, Register rn, OperandSize size = kEightBytes) {
     // rt = value
@@ -1619,6 +1631,22 @@
   void PopQuad(VRegister reg) {
     fldrq(reg, Address(SP, 1 * kQuadSize, Address::PostIndex));
   }
+  void PushDoublePair(VRegister low, VRegister high) {
+    fstp(low, high,
+         Address(SP, -2 * kDoubleSize, Address::PairPreIndex, kDWord), kDWord);
+  }
+  void PopDoublePair(VRegister low, VRegister high) {
+    fldp(low, high,
+         Address(SP, 2 * kDoubleSize, Address::PairPostIndex, kDWord), kDWord);
+  }
+  void PushQuadPair(VRegister low, VRegister high) {
+    fstp(low, high, Address(SP, -2 * kQuadSize, Address::PairPreIndex, kQWord),
+         kQWord);
+  }
+  void PopQuadPair(VRegister low, VRegister high) {
+    fldp(low, high, Address(SP, 2 * kQuadSize, Address::PairPostIndex, kQWord),
+         kQWord);
+  }
   void TagAndPushPP() {
     // Add the heap object tag back to PP before putting it on the stack.
     add(TMP, PP, Operand(kHeapObjectTag));
@@ -2744,6 +2772,35 @@
     Emit(encoding);
   }
 
+  void EmitLoadStoreVRegPair(LoadStoreRegPairOp op,
+                             VRegister rt,
+                             VRegister rt2,
+                             Address a,
+                             OperandSize sz) {
+    ASSERT(op != FLDP || rt != rt2);
+    ASSERT((sz == kSWord) || (sz == kDWord) || (sz == kQWord));
+    ASSERT(a.log2sz_ == -1 || a.log2sz_ == Log2OperandSizeBytes(sz));
+    int32_t opc = 0;
+    switch (sz) {
+      case kSWord:
+        opc = 0;
+        break;
+      case kDWord:
+        opc = B30;
+        break;
+      case kQWord:
+        opc = B31;
+        break;
+      default:
+        UNREACHABLE();
+        break;
+    }
+    const int32_t encoding =
+        opc | op | Arm64Encode::Rt(static_cast<Register>(rt)) |
+        Arm64Encode::Rt2(static_cast<Register>(rt2)) | a.encoding();
+    Emit(encoding);
+  }
+
   void EmitPCRelOp(PCRelOp op, Register rd, const Immediate& imm) {
     ASSERT(Utils::IsInt(21, imm.value()));
     ASSERT((rd != R31) && (rd != CSP));
diff --git a/runtime/vm/compiler/assembler/assembler_arm64_test.cc b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
index 4c40284..cb29a3c 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64_test.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64_test.cc
@@ -861,6 +861,70 @@
       "ret\n");
 }
 
+ASSEMBLER_TEST_GENERATE(LoadStoreDoublePair, assembler) {
+  __ SetupDartSP();
+  __ LoadDImmediate(V1, 3.0);
+  __ LoadDImmediate(V2, 4.0);
+  __ PushDoublePair(V1, V2);
+  __ LoadDImmediate(V1, 0.0);
+  __ LoadDImmediate(V2, 0.0);
+  __ PopDoublePair(V1, V2);
+  __ fsubd(V0, V2, V1);
+  __ RestoreCSP();
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(LoadStoreDoublePair, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov sp, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "fmovd v1, 3.000000\n"
+      "fmovd v2, 4.000000\n"
+      "fstpd v1, v2, [sp, #-16]!\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v2, tmp\n"
+      "fldpd v1, v2, [sp], #16 !\n"
+      "fsubd v0, v2, v1\n"
+      "mov csp, sp\n"
+      "ret\n");
+}
+
+ASSEMBLER_TEST_GENERATE(LoadStoreQuadPair, assembler) {
+  __ SetupDartSP();
+  __ LoadDImmediate(V1, 3.0);
+  __ LoadDImmediate(V2, 4.0);
+  __ PushQuadPair(V1, V2);
+  __ LoadDImmediate(V1, 0.0);
+  __ LoadDImmediate(V2, 0.0);
+  __ PopQuadPair(V1, V2);
+  __ fsubd(V0, V2, V1);
+  __ RestoreCSP();
+  __ ret();
+}
+
+ASSEMBLER_TEST_RUN(LoadStoreQuadPair, test) {
+  typedef double (*DoubleReturn)() DART_UNUSED;
+  EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
+  EXPECT_DISASSEMBLY(
+      "mov sp, csp\n"
+      "sub csp, csp, #0x1000\n"
+      "fmovd v1, 3.000000\n"
+      "fmovd v2, 4.000000\n"
+      "fstpq v1, v2, [sp, #-32]!\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v1, tmp\n"
+      "movz tmp, #0x0\n"
+      "fmovdr v2, tmp\n"
+      "fldpq v1, v2, [sp], #32 !\n"
+      "fsubd v0, v2, v1\n"
+      "mov csp, sp\n"
+      "ret\n");
+}
+
 ASSEMBLER_TEST_GENERATE(Semaphore, assembler) {
   __ SetupDartSP();
   __ movz(R0, Immediate(40), 0);
diff --git a/runtime/vm/compiler/assembler/disassembler_arm64.cc b/runtime/vm/compiler/assembler/disassembler_arm64.cc
index 490569d..e742ef7 100644
--- a/runtime/vm/compiler/assembler/disassembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/disassembler_arm64.cc
@@ -255,7 +255,9 @@
 void ARM64Decoder::PrintPairMemOperand(Instr* instr) {
   const Register rn = instr->RnField();
   const uint32_t simm7 = instr->SImm7Field();
-  const int32_t offset = simm7 << (2 + instr->Bit(31));
+  const intptr_t shift =
+      (instr->Bit(26) == 1) ? 2 + instr->SzField() : 2 + instr->SFField();
+  const int32_t offset = simm7 << shift;
   Print("[");
   PrintRegister(rn, R31IsSP);
   switch (instr->Bits(23, 3)) {
@@ -300,6 +302,11 @@
     PrintRegister(reg, R31IsZR);
     return 2;
   } else if (format[1] == 't') {  // 'rt: Rt register
+    if (format[2] == '2') {
+      int reg = instr->Rt2Field();
+      PrintRegister(reg, R31IsZR);
+      return 3;
+    }
     int reg = instr->RtField();
     PrintRegister(reg, R31IsZR);
     return 2;
@@ -331,6 +338,11 @@
     PrintVRegister(reg);
     return 2;
   } else if (format[1] == 't') {
+    if (format[2] == '2') {
+      int reg = instr->Vt2Field();
+      PrintVRegister(reg);
+      return 3;
+    }
     int reg = instr->VtField();
     PrintVRegister(reg);
     return 2;
@@ -536,6 +548,32 @@
       PrintMemOperand(instr);
       return 5;
     }
+    case 'o': {
+      ASSERT(STRING_STARTS_WITH(format, "opc"));
+      if (instr->Bit(26) == 0) {
+        if (instr->Bit(31) == 0) {
+          Print("w");
+        } else {
+          // 64-bit width is most commonly used, no need to print "x".
+        }
+      } else {
+        switch (instr->Bits(30, 2)) {
+          case 0:
+            Print("s");
+            break;
+          case 1:
+            Print("d");
+            break;
+          case 2:
+            Print("q");
+            break;
+          case 3:
+            Print("?");
+            break;
+        }
+      }
+      return 3;
+    }
     case 'p': {
       if (format[1] == 'c') {
         if (format[2] == 'a') {
@@ -719,12 +757,20 @@
 }
 
 void ARM64Decoder::DecodeLoadStoreRegPair(Instr* instr) {
-  if (instr->Bit(22) == 1) {
-    // Load.
-    Format(instr, "ldp'sf 'rt, 'ra, 'pmemop");
+  if (instr->Bit(26) == 1) {
+    // SIMD or FP src/dst.
+    if (instr->Bit(22) == 1) {
+      Format(instr, "fldp'opc 'vt, 'vt2, 'pmemop");
+    } else {
+      Format(instr, "fstp'opc 'vt, 'vt2, 'pmemop");
+    }
   } else {
-    // Store.
-    Format(instr, "stp'sf 'rt, 'ra, 'pmemop");
+    // Integer src/dst.
+    if (instr->Bit(22) == 1) {
+      Format(instr, "ldp'opc 'rt, 'rt2, 'pmemop");
+    } else {
+      Format(instr, "stp'opc 'rt, 'rt2, 'pmemop");
+    }
   }
 }
 
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index b1ee80e..7dd9e8f 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -128,9 +128,9 @@
 #elif defined(TARGET_ARCH_ARM64)
   static constexpr intptr_t kNativeCallbackTrampolineSize = 12;
 #if defined(DART_COMPRESSED_POINTERS)
-  static constexpr intptr_t kNativeCallbackSharedStubSize = 292;
+  static constexpr intptr_t kNativeCallbackSharedStubSize = 260;
 #else
-  static constexpr intptr_t kNativeCallbackSharedStubSize = 268;
+  static constexpr intptr_t kNativeCallbackSharedStubSize = 236;
 #endif
   static constexpr intptr_t kNativeCallbackTrampolineStackDelta = 2;
 #elif defined(TARGET_ARCH_RISCV32)
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 8977115..0d96c71 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -719,6 +719,8 @@
   LoadStoreRegPairFixed = LoadStoreFixed | B29,
   STP = LoadStoreRegPairFixed,
   LDP = LoadStoreRegPairFixed | B22,
+  FSTP = STP | B26,
+  FLDP = LDP | B26,
 };
 
 // C3.4.1
@@ -1061,6 +1063,8 @@
   kVmBits = 5,
   kVtShift = 0,
   kVtBits = 5,
+  kVt2Shift = 10,
+  kVt2Bits = 5,
 
   // Immediates.
   kImm3Shift = 10,
@@ -1291,6 +1295,9 @@
   inline VRegister VtField() const {
     return static_cast<VRegister>(Bits(kVtShift, kVtBits));
   }
+  inline VRegister Vt2Field() const {
+    return static_cast<VRegister>(Bits(kVt2Shift, kVt2Bits));
+  }
 
   // Immediates
   inline int Imm3Field() const { return Bits(kImm3Shift, kImm3Bits); }
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 056678d..6bb1c20 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -2113,17 +2113,16 @@
 void Simulator::DecodeLoadStoreRegPair(Instr* instr) {
   const int32_t opc = instr->Bits(23, 3);
   const Register rn = instr->RnField();
-  const Register rt = instr->RtField();
-  const Register rt2 = instr->Rt2Field();
   const int64_t rn_val = get_register(rn, R31IsSP);
-  const intptr_t shift = 2 + instr->SFField();
+  const intptr_t shift =
+      (instr->Bit(26) == 1) ? 2 + instr->SzField() : 2 + instr->SFField();
   const intptr_t size = 1 << shift;
   const int32_t offset = (static_cast<uint32_t>(instr->SImm7Field()) << shift);
   uword address = 0;
   uword wb_address = 0;
   bool wb = false;
 
-  if ((instr->Bits(30, 2) == 3) || (instr->Bit(26) != 0)) {
+  if ((instr->Bits(30, 2) == 3)) {
     UnimplementedInstruction(instr);
     return;
   }
@@ -2155,45 +2154,109 @@
   }
 
   // Do access.
-  if (instr->Bit(22)) {
-    // Format(instr, "ldp'sf 'rt, 'ra, 'memop");
-    const bool signd = instr->Bit(30) == 1;
-    int64_t val1 = 0;  // Sign extend into an int64_t.
-    int64_t val2 = 0;
-    if (instr->Bit(31) == 1) {
-      // 64-bit read.
-      val1 = ReadX(address, instr);
-      val2 = ReadX(address + size, instr);
+  if (instr->Bit(26) == 1) {
+    // SIMD/FP.
+    const VRegister vt = instr->VtField();
+    const VRegister vt2 = instr->Vt2Field();
+    if (instr->Bit(22)) {
+      // Format(instr, "ldp 'vt, 'vt2, 'memop");
+      switch (size) {
+        case 4:
+          set_vregisterd(vt, 0, static_cast<int64_t>(ReadWU(address, instr)));
+          set_vregisterd(vt, 1, 0);
+          set_vregisterd(vt2, 0,
+                         static_cast<int64_t>(ReadWU(address + 4, instr)));
+          set_vregisterd(vt2, 1, 0);
+          break;
+        case 8:
+          set_vregisterd(vt, 0, ReadX(address, instr));
+          set_vregisterd(vt, 1, 0);
+          set_vregisterd(vt2, 0, ReadX(address + 8, instr));
+          set_vregisterd(vt2, 1, 0);
+          break;
+        case 16: {
+          simd_value_t val;
+          val.bits.i64[0] = ReadX(address, instr);
+          val.bits.i64[1] = ReadX(address + 8, instr);
+          set_vregister(vt, val);
+          val.bits.i64[0] = ReadX(address + 16, instr);
+          val.bits.i64[1] = ReadX(address + 24, instr);
+          set_vregister(vt2, val);
+          break;
+        }
+        default:
+          UnimplementedInstruction(instr);
+          return;
+      }
     } else {
-      if (signd) {
-        val1 = static_cast<int64_t>(ReadW(address, instr));
-        val2 = static_cast<int64_t>(ReadW(address + size, instr));
-      } else {
-        val1 = static_cast<int64_t>(ReadWU(address, instr));
-        val2 = static_cast<int64_t>(ReadWU(address + size, instr));
+      // Format(instr, "stp 'vt, 'vt2, 'memop");
+      switch (size) {
+        case 4:
+          WriteW(address, get_vregisterd(vt, 0) & kWRegMask, instr);
+          WriteW(address + 4, get_vregisterd(vt2, 0) & kWRegMask, instr);
+          break;
+        case 8:
+          WriteX(address, get_vregisterd(vt, 0), instr);
+          WriteX(address + 8, get_vregisterd(vt2, 0), instr);
+          break;
+        case 16: {
+          simd_value_t val;
+          get_vregister(vt, &val);
+          WriteX(address, val.bits.i64[0], instr);
+          WriteX(address + 8, val.bits.i64[1], instr);
+          get_vregister(vt2, &val);
+          WriteX(address + 16, val.bits.i64[0], instr);
+          WriteX(address + 24, val.bits.i64[1], instr);
+          break;
+        }
+        default:
+          UnimplementedInstruction(instr);
+          return;
       }
     }
-
-    // Write to register.
-    if (instr->Bit(31) == 1) {
-      set_register(instr, rt, val1, R31IsZR);
-      set_register(instr, rt2, val2, R31IsZR);
-    } else {
-      set_wregister(rt, static_cast<int32_t>(val1), R31IsZR);
-      set_wregister(rt2, static_cast<int32_t>(val2), R31IsZR);
-    }
   } else {
-    // Format(instr, "stp'sf 'rt, 'ra, 'memop");
-    if (instr->Bit(31) == 1) {
-      const int64_t val1 = get_register(rt, R31IsZR);
-      const int64_t val2 = get_register(rt2, R31IsZR);
-      WriteX(address, val1, instr);
-      WriteX(address + size, val2, instr);
+    // Integer.
+    const Register rt = instr->RtField();
+    const Register rt2 = instr->Rt2Field();
+    if (instr->Bit(22)) {
+      // Format(instr, "ldp'sf 'rt, 'rt2, 'memop");
+      const bool signd = instr->Bit(30) == 1;
+      int64_t val1 = 0;  // Sign extend into an int64_t.
+      int64_t val2 = 0;
+      if (instr->Bit(31) == 1) {
+        // 64-bit read.
+        val1 = ReadX(address, instr);
+        val2 = ReadX(address + size, instr);
+      } else {
+        if (signd) {
+          val1 = static_cast<int64_t>(ReadW(address, instr));
+          val2 = static_cast<int64_t>(ReadW(address + size, instr));
+        } else {
+          val1 = static_cast<int64_t>(ReadWU(address, instr));
+          val2 = static_cast<int64_t>(ReadWU(address + size, instr));
+        }
+      }
+      // Write to register.
+      if (instr->Bit(31) == 1) {
+        set_register(instr, rt, val1, R31IsZR);
+        set_register(instr, rt2, val2, R31IsZR);
+      } else {
+        set_wregister(rt, static_cast<int32_t>(val1), R31IsZR);
+        set_wregister(rt2, static_cast<int32_t>(val2), R31IsZR);
+      }
     } else {
-      const int32_t val1 = get_wregister(rt, R31IsZR);
-      const int32_t val2 = get_wregister(rt2, R31IsZR);
-      WriteW(address, val1, instr);
-      WriteW(address + size, val2, instr);
+      // Format(instr, "stp'sf 'rt, 'rt2, 'memop");
+      if (instr->Bit(31) == 1) {
+        const int64_t val1 = get_register(rt, R31IsZR);
+        const int64_t val2 = get_register(rt2, R31IsZR);
+        WriteX(address, val1, instr);
+        WriteX(address + size, val2, instr);
+      } else {
+        const int32_t val1 = get_wregister(rt, R31IsZR);
+        const int32_t val2 = get_wregister(rt2, R31IsZR);
+        WriteW(address, val1, instr);
+        WriteW(address + size, val2, instr);
+      }
     }
   }
 
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 29544d8..37e538b 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -386,7 +386,7 @@
   int? get numberOfOutputs native;
 
   @JSName('connect')
-  AudioNode _connect(destination, [int? output, int? input]) native;
+  AudioNode? _connect(destination, [int? output, int? input]) native;
 
   void disconnect([destination_OR_output, int? output, int? input]) native;
 
diff --git a/tools/VERSION b/tools/VERSION
index 1c7d543..fa720fe 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 215
+PRERELEASE 216
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index ac5b337..674af14 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -451,6 +451,15 @@
 };
 
 [DartSupplemental]
+interface AudioNode : EventTarget {
+    [DartSuppress] AudioNode connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);
+    [DartSuppress] void connect(AudioParam destination, optional unsigned long output = 0);
+    AudioNode? connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);
+    // Scripts don't unify return types, so this is changed from void to do so.
+    AudioNode? connect(AudioParam destination, optional unsigned long output = 0);
+};
+
+[DartSupplemental]
 interface HTMLInputElement {
     [DartSuppress] attribute boolean webkitSpeech;
     [DartSuppress] attribute boolean webkitGrammar;
diff --git a/tools/gn.py b/tools/gn.py
index e54c331..f5c01ad 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -97,13 +97,10 @@
     m = platform.machine()
     if m == 'aarch64' or m == 'arm64':
         return 'arm64'
-    if m == 'armv7l' or m == 'armv6l':
+    if m == 'armv7l':
         return 'arm'
 
-    if arch in [
-            'ia32', 'arm', 'armv6', 'simarm', 'simarm_x64', 'riscv32',
-            'simriscv32'
-    ]:
+    if arch in ['ia32', 'arm', 'simarm', 'simarm_x64', 'riscv32', 'simriscv32']:
         return 'x86'
     if arch in [
             'x64', 'arm64', 'simarm64', 'arm_x64', 'x64c', 'arm64c',
@@ -239,11 +236,6 @@
             gn_args['arm_version'] = 7
             gn_args['arm_float_abi'] = floatabi
             gn_args['arm_use_neon'] = True
-        elif gn_args['target_cpu'] == 'armv6':
-            floatabi = 'softfp' if args.arm_float_abi == '' else args.arm_float_abi
-            gn_args['target_cpu'] = 'arm'
-            gn_args['arm_version'] = 6
-            gn_args['arm_float_abi'] = floatabi
 
     gn_args['is_debug'] = mode == 'debug'
     gn_args['is_release'] = mode == 'release'
@@ -389,7 +381,6 @@
                     'x64',
                     'arm',
                     'arm_x64',
-                    'armv6',
                     'arm64',
                     'x64c',
                     'arm64c',
diff --git a/tools/linux_dist_support/create_debian_packages.py b/tools/linux_dist_support/create_debian_packages.py
index 94c0d53..ae3473f 100755
--- a/tools/linux_dist_support/create_debian_packages.py
+++ b/tools/linux_dist_support/create_debian_packages.py
@@ -35,7 +35,7 @@
     result.add_option("-a",
                       "--arch",
                       help='Target architectures (comma-separated).',
-                      metavar='[all,ia32,x64,armel,armhf]',
+                      metavar='[all,ia32,x64,armhf]',
                       default='x64')
     result.add_option("-t",
                       "--toolchain",
@@ -92,12 +92,6 @@
             RunBuildPackage(['-B', '-aarmhf', '-us', '-uc'],
                             join(temp_dir, tarroot), toolchain)
 
-        # Build armel binary package.
-        if 'armel' in arch:
-            print("Building armel package")
-            RunBuildPackage(['-B', '-aarmel', '-us', '-uc'],
-                            join(temp_dir, tarroot), toolchain)
-
         # Copy the Debian package files to the build directory.
         debbase = 'dart_%s' % version
         source_package = [
@@ -108,7 +102,6 @@
         i386_package = ['%s-1_i386.deb' % debbase]
         amd64_package = ['%s-1_amd64.deb' % debbase]
         armhf_package = ['%s-1_armhf.deb' % debbase]
-        armel_package = ['%s-1_armel.deb' % debbase]
 
         for name in source_package:
             copyfile(join(temp_dir, name), join(out_dir, name))
@@ -121,9 +114,6 @@
         if ('armhf' in arch):
             for name in armhf_package:
                 copyfile(join(temp_dir, name), join(out_dir, name))
-        if ('armel' in arch):
-            for name in armel_package:
-                copyfile(join(temp_dir, name), join(out_dir, name))
 
 
 def Main():
diff --git a/tools/sdks/update.sh b/tools/sdks/update.sh
index 8cb5633..09255a7 100755
--- a/tools/sdks/update.sh
+++ b/tools/sdks/update.sh
@@ -34,7 +34,7 @@
 gsutil.py cp "gs://dart-archive/channels/$channel/release/$1/sdk/dartsdk-linux-arm-release.zip" .
 unzip -q dartsdk-linux-arm-release.zip -d sdk
 cipd create \
-  -name dart/dart-sdk/linux-armv6l \
+  -name dart/dart-sdk/linux-arm \
   -in sdk \
   -install-mode copy \
   -tag version:$1 \
diff --git a/tools/utils.py b/tools/utils.py
index 3741a0b..2f42263 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -152,9 +152,7 @@
 # Try to guess the host architecture.
 def GuessArchitecture():
     os_id = platform.machine()
-    if os_id.startswith('armv6'):
-        return 'armv6'
-    elif os_id.startswith('aarch64') or os_id == 'arm64':
+    if os_id.startswith('aarch64') or os_id == 'arm64':
         return 'arm64'
     elif os_id.startswith('arm'):
         return 'arm'
