diff --git a/CHANGELOG.md b/CHANGELOG.md
index d06a699..70414c2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -60,6 +60,9 @@
 - Add a optional `keyLog` parameter to `SecureSocket.connect` and
   `SecureSocket.startConnect`.
 
+- Deprecate `SecureSocket.renegotiate` and `RawSecureSocket.renegotiate`,
+  which were no-ops.
+
 ### Tools
 
 #### Dart command line
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index 1f66fe6..8a99365 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -161,9 +161,10 @@
   {
     var enclosingClassElement = getEnclosingClassElement(node);
     if (enclosingClassElement != null) {
-      var elements = <ClassElement>{};
-      elements.add(enclosingClassElement);
-      elements.addAll(getSuperClasses(enclosingClassElement));
+      var elements = [
+        ...enclosingClassElement.allSupertypes.map((e) => e.element),
+        enclosingClassElement,
+      ];
       for (var classElement in elements) {
         var classMembers = getChildren(classElement);
         for (var classMemberElement in classMembers) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
index 91654f8..4d55c6c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart
@@ -160,9 +160,9 @@
 
   Future<void> _checkHierarchy({
     required bool isRename,
-    required Set<ClassElement> superClasses,
     required Set<ClassElement> subClasses,
   }) async {
+    var superClasses = elementClass.allSupertypes.map((e) => e.element).toSet();
     // check shadowing in the hierarchy
     var declarations = await searchEngine.searchMemberDeclarations(name);
     for (var declaration in declarations) {
@@ -212,19 +212,18 @@
   Future<RefactoringStatus> validate() async {
     _checkClassAlreadyDeclares();
     // do chained computations
-    var superClasses = getSuperClasses(elementClass);
     var subClasses = await searchEngine.searchAllSubtypes(elementClass);
     // check shadowing of class names
     if (elementClass.name == name) {
       result.addError(
-          format("Created {0} has the same name as the declaring class '{1}'.",
-              elementKind.displayName, name),
-          newLocation_fromElement(elementClass));
+        'Created ${elementKind.displayName} has the same name as the '
+        "declaring ${elementClass.kind.displayName} '$name'.",
+        newLocation_fromElement(elementClass),
+      );
     }
     // check shadowing in the hierarchy
     await _checkHierarchy(
       isRename: false,
-      superClasses: superClasses,
       subClasses: subClasses,
     );
     // done
@@ -272,7 +271,6 @@
   Future<RefactoringStatus> validate() async {
     _checkClassAlreadyDeclares();
     // do chained computations
-    var superClasses = getSuperClasses(elementClass);
     await _prepareReferences();
     var subClasses = await searchEngine.searchAllSubtypes(elementClass);
     // check shadowing of class names
@@ -280,11 +278,8 @@
       var enclosingElement = element.enclosingElement;
       if (enclosingElement is ClassElement && enclosingElement.name == name) {
         result.addError(
-          format(
-            "Renamed {0} has the same name as the declaring class '{1}'.",
-            elementKind.displayName,
-            name,
-          ),
+          'Renamed ${elementKind.displayName} has the same name as the '
+          "declaring ${enclosingElement.kind.displayName} '$name'.",
           newLocation_fromElement(element),
         );
       }
@@ -306,7 +301,6 @@
     // check shadowing in the hierarchy
     await _checkHierarchy(
       isRename: true,
-      superClasses: superClasses,
       subClasses: subClasses,
     );
     // visibility
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 05d4116..eda9ad4 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -95,8 +95,10 @@
   // method, field, etc
   if (enclosingElement is ClassElement) {
     var name = member.displayName;
-    var searchClasses = getSuperClasses(enclosingElement);
-    searchClasses.add(enclosingElement);
+    var searchClasses = [
+      ...enclosingElement.allSupertypes.map((e) => e.element),
+      enclosingElement,
+    ];
     for (var superClass in searchClasses) {
       // ignore if super- class does not declare member
       if (getClassMembers(superClass, name).isEmpty) {
@@ -152,49 +154,17 @@
 ///
 /// Excludes: constructors and synthetic elements.
 List<Element> getMembers(ClassElement clazz) {
+  var classElements = [
+    ...clazz.allSupertypes.map((e) => e.element),
+    clazz,
+  ];
   var members = <Element>[];
-  members.addAll(getClassMembers(clazz));
-  var superClasses = getSuperClasses(clazz);
-  for (var superClass in superClasses) {
+  for (var superClass in classElements) {
     members.addAll(getClassMembers(superClass));
   }
   return members;
 }
 
-/// Returns a [Set] with all direct and indirect superclasses of [seed].
-Set<ClassElement> getSuperClasses(ClassElement seed) {
-  Set<ClassElement> result = HashSet<ClassElement>();
-  // prepare queue
-  var queue = <ClassElement>[];
-  queue.add(seed);
-  // process queue
-  while (queue.isNotEmpty) {
-    var current = queue.removeLast();
-    // add if not checked already
-    if (!result.add(current)) {
-      continue;
-    }
-    // append supertype
-    {
-      var superType = current.supertype;
-      if (superType != null) {
-        queue.add(superType.element);
-      }
-    }
-    // append superclass constraints
-    for (var interface in current.superclassConstraints) {
-      queue.add(interface.element);
-    }
-    // append interfaces
-    for (var interface in current.interfaces) {
-      queue.add(interface.element);
-    }
-  }
-  // we don't need "seed" itself
-  result.remove(seed);
-  return result;
-}
-
 /// If the given [element] is a synthetic [PropertyAccessorElement] returns
 /// its variable, otherwise returns [element].
 Element getSyntheticAccessorVariable(Element element) {
diff --git a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
index 27a8207..6d0c321 100644
--- a/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart
@@ -11,12 +11,13 @@
 
 void main() {
   defineReflectiveSuite(() {
-    defineReflectiveTests(RenameClassMemberTest);
+    defineReflectiveTests(RenameClassMemberClassTest);
+    defineReflectiveTests(RenameClassMemberEnumTest);
   });
 }
 
 @reflectiveTest
-class RenameClassMemberTest extends RenameRefactoringTest {
+class RenameClassMemberClassTest extends RenameRefactoringTest {
   Future<void> test_checkFinalConditions_classNameConflict_sameClass() async {
     await indexTestUnit('''
 class NewName {
@@ -1047,3 +1048,573 @@
 ''');
   }
 }
+
+@reflectiveTest
+class RenameClassMemberEnumTest extends RenameRefactoringTest {
+  Future<void> test_checkFinalConditions_classNameConflict_sameClass() async {
+    await indexTestUnit('''
+enum NewName {
+  v;
+  void test() {}
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'NewName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Renamed method has the same name as the declaring enum 'NewName'.",
+        expectedContextSearch: 'test() {}');
+  }
+
+  Future<void> test_checkFinalConditions_classNameConflict_superClass() async {
+    await indexTestUnit('''
+class NewName {
+  void test() {} // 1
+}
+enum E implements NewName {
+  v;
+  void test() {} // 2
+}
+''');
+    createRenameRefactoringAtString('test() {} // 2');
+    // check status
+    refactoring.newName = 'NewName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Renamed method has the same name as the declaring class 'NewName'.",
+        expectedContextSearch: 'test() {} // 1');
+  }
+
+  Future<void> test_checkFinalConditions_hasMember_MethodElement() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  test() {}
+  newName() {} // existing
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Class 'E' already declares method with name 'newName'.",
+        expectedContextSearch: 'newName() {} // existing');
+  }
+
+  Future<void> test_checkFinalConditions_OK_dropSuffix() async {
+    await indexTestUnit(r'''
+abstract class A {
+  void testOld();
+}
+enum E implements A {
+  v;
+  void testOld() {}
+}
+''');
+    createRenameRefactoringAtString('testOld() {}');
+    // check status
+    refactoring.newName = 'test';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatusOK(status);
+  }
+
+  Future<void> test_checkFinalConditions_publicToPrivate_used() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+}
+''');
+    await indexUnit('$testPackageLibPath/lib.dart', '''
+import 'test.dart';
+
+void f(E e) {
+  e.test();
+}
+''');
+    createRenameRefactoringAtString('test()');
+    // check status
+    refactoring.newName = '_newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Renamed method will be invisible in '${convertPath("lib/lib.dart")}'.");
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowed_byLocalFunction_inSameClass() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void f() {
+    newName() {}
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Usage of renamed method will be shadowed by function 'newName'.",
+        expectedContextSearch: 'test(); // marker');
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowed_byLocalVariable_inSameClass() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void f() {
+    var newName;
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Usage of renamed method will be shadowed by local variable 'newName'.",
+        expectedContextSearch: 'test(); // marker');
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowed_byLocalVariable_OK_qualifiedReference() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void f() {
+    var newName;
+    this.test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatusOK(status);
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowed_byLocalVariable_OK_renamedNotUsed() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void f() {
+    var newName;
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatusOK(status);
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowed_byParameter_inSameClass() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void f(newName) {
+    test(); // marker
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage:
+            "Usage of renamed method will be shadowed by parameter 'newName'.",
+        expectedContextSearch: 'test(); // marker');
+  }
+
+  Future<void> test_checkFinalConditions_shadowsSuper_MethodElement() async {
+    await indexTestUnit('''
+mixin M {
+  void newName() {}
+}
+enum E with M {
+  v;
+  void test() {}
+  void f() {
+    newName();
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage: "Renamed method will shadow method 'M.newName'.",
+        expectedContextSearch: 'newName() {}');
+  }
+
+  Future<void>
+      test_checkFinalConditions_shadowsSuper_MethodElement_otherLib() async {
+    var libCode = r'''
+mixin M {
+  void newName() {}
+}
+''';
+    await indexUnit('$testPackageLibPath/lib.dart', libCode);
+    await indexTestUnit('''
+import 'lib.dart';
+enum E with M {
+  v;
+  void test() {}
+  void f() {
+    newName();
+  }
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkFinalConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.ERROR,
+        expectedMessage: "Renamed method will shadow method 'M.newName'.",
+        expectedContextRange:
+            SourceRange(libCode.indexOf('newName() {}'), 'newName'.length));
+  }
+
+  Future<void> test_checkInitialConditions_operator() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  operator -() => this;
+}
+''');
+    createRenameRefactoringAtString('-()');
+    // check status
+    refactoring.newName = 'newName';
+    var status = await refactoring.checkInitialConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+  }
+
+  Future<void> test_checkNewName_FieldElement() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  final int test = 0;
+}
+''');
+    createRenameRefactoringAtString('test = 0;');
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  Future<void> test_checkNewName_MethodElement() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+}
+''');
+    createRenameRefactoringAtString('test() {}');
+    // empty
+    refactoring.newName = '';
+    assertRefactoringStatus(
+        refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
+        expectedMessage: 'Method name must not be empty.');
+    // same
+    refactoring.newName = 'test';
+    assertRefactoringStatus(
+        refactoring.checkNewName(), RefactoringProblemSeverity.FATAL,
+        expectedMessage:
+            'The new name must be different than the current name.');
+    // OK
+    refactoring.newName = 'newName';
+    assertRefactoringStatusOK(refactoring.checkNewName());
+  }
+
+  Future<void> test_createChange_FieldElement() async {
+    verifyNoTestUnitErrors = false;
+    await indexTestUnit('''
+enum E {
+  v;
+  final int test = 0;
+  void f() {
+    test;
+    test = 1;
+    test += 2;
+  }
+}
+void f(E e) {
+  e.test;
+  e.test = 1;
+  e.test += 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test = 0;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.elementKindName, 'field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E {
+  v;
+  final int newName = 0;
+  void f() {
+    newName;
+    newName = 1;
+    newName += 2;
+  }
+}
+void f(E e) {
+  e.newName;
+  e.newName = 1;
+  e.newName += 2;
+}
+''');
+  }
+
+  Future<void>
+      test_createChange_FieldElement_constructorFieldInitializer() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  final int test;
+  const E() : test = 5;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E {
+  v;
+  final int newName;
+  const E() : newName = 5;
+}
+''');
+  }
+
+  Future<void> test_createChange_FieldElement_fieldFormalParameter() async {
+    await indexTestUnit('''
+enum E {
+  v(0);
+  final int test;
+  const E(this.test);
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E {
+  v(0);
+  final int newName;
+  const E(this.newName);
+}
+''');
+  }
+
+  Future<void> test_createChange_MethodElement() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  void test() {}
+  void foo() {
+    test();
+    test;
+  }
+}
+
+void f(E e) {
+  e.test();
+  e.test;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {}');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.elementKindName, 'method');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E {
+  v;
+  void newName() {}
+  void foo() {
+    newName();
+    newName;
+  }
+}
+
+void f(E e) {
+  e.newName();
+  e.newName;
+}
+''');
+  }
+
+  Future<void> test_createChange_MethodElement_fromInterface() async {
+    await indexTestUnit('''
+class A {
+  void test() {} // A
+}
+
+enum E implements A {
+  v;
+  void test() {}
+  void foo() {
+    test();
+  }
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {} // A');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.elementKindName, 'method');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+class A {
+  void newName() {} // A
+}
+
+enum E implements A {
+  v;
+  void newName() {}
+  void foo() {
+    newName();
+  }
+}
+''');
+  }
+
+  Future<void> test_createChange_MethodElement_fromMixin() async {
+    await indexTestUnit('''
+mixin M {
+  void test() {} // M
+}
+
+enum E with M {
+  v;
+  void test() {}
+  void foo() {
+    test();
+  }
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test() {} // M');
+    expect(refactoring.refactoringName, 'Rename Method');
+    expect(refactoring.elementKindName, 'method');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+mixin M {
+  void newName() {} // M
+}
+
+enum E with M {
+  v;
+  void newName() {}
+  void foo() {
+    newName();
+  }
+}
+''');
+  }
+
+  Future<void> test_createChange_PropertyAccessorElement() async {
+    await indexTestUnit('''
+enum E {
+  v;
+  int get test => 0;
+  set test(int _) {}
+  void f() {
+    test;
+    test = 0;
+  }
+}
+void f(E e) {
+  e.test;
+  e.test = 1;
+  e.test += 2;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('test => 0;');
+    expect(refactoring.refactoringName, 'Rename Field');
+    expect(refactoring.oldName, 'test');
+    refactoring.newName = 'newName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E {
+  v;
+  int get newName => 0;
+  set newName(int _) {}
+  void f() {
+    newName;
+    newName = 0;
+  }
+}
+void f(E e) {
+  e.newName;
+  e.newName = 1;
+  e.newName += 2;
+}
+''');
+  }
+
+  Future<void> test_createChange_TypeParameterElement() async {
+    await indexTestUnit('''
+enum E<Test> {
+  v;
+  final Test? field = null;
+  final List<Test> items = const [];
+  Test method(Test a) => a;
+}
+''');
+    // configure refactoring
+    createRenameRefactoringAtString('Test> {');
+    expect(refactoring.refactoringName, 'Rename Type Parameter');
+    expect(refactoring.elementKindName, 'type parameter');
+    expect(refactoring.oldName, 'Test');
+    refactoring.newName = 'NewName';
+    // validate change
+    return assertSuccessfulRefactoring('''
+enum E<NewName> {
+  v;
+  final NewName? field = null;
+  final List<NewName> items = const [];
+  NewName method(NewName a) => a;
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/services/search/hierarchy_test.dart b/pkg/analysis_server/test/services/search/hierarchy_test.dart
index 9ac31f4..17454ea 100644
--- a/pkg/analysis_server/test/services/search/hierarchy_test.dart
+++ b/pkg/analysis_server/test/services/search/hierarchy_test.dart
@@ -391,99 +391,6 @@
     }
   }
 
-  Future<void> test_getSuperClasses() async {
-    await _indexTestUnit('''
-class A {}
-class B extends A {}
-class C extends B {}
-class D extends B implements A {}
-class M {}
-class E extends A with M {}
-class F implements A {}
-''');
-    var classA = findElement.class_('A');
-    var classB = findElement.class_('B');
-    var classC = findElement.class_('C');
-    var classD = findElement.class_('D');
-    var classE = findElement.class_('E');
-    var classF = findElement.class_('F');
-    var objectElement = classA.supertype!.element;
-    // Object
-    {
-      var supers = getSuperClasses(objectElement);
-      expect(supers, isEmpty);
-    }
-    // A
-    {
-      var supers = getSuperClasses(classA);
-      expect(supers, unorderedEquals([objectElement]));
-    }
-    // B
-    {
-      var supers = getSuperClasses(classB);
-      expect(supers, unorderedEquals([objectElement, classA]));
-    }
-    // C
-    {
-      var supers = getSuperClasses(classC);
-      expect(supers, unorderedEquals([objectElement, classA, classB]));
-    }
-    // D
-    {
-      var supers = getSuperClasses(classD);
-      expect(supers, unorderedEquals([objectElement, classA, classB]));
-    }
-    // E
-    {
-      var supers = getSuperClasses(classE);
-      expect(supers, unorderedEquals([objectElement, classA]));
-    }
-    // F
-    {
-      var supers = getSuperClasses(classF);
-      expect(supers, unorderedEquals([objectElement, classA]));
-    }
-  }
-
-  Future<void> test_getSuperClasses_superclassConstraints() async {
-    await _indexTestUnit('''
-class A {}
-class B extends A {}
-class C {}
-
-mixin M1 on A {}
-mixin M2 on B {}
-mixin M3 on M1 {}
-mixin M4 on M2 {}
-mixin M5 on A, C {}
-''');
-    var a = findElement.class_('A');
-    var b = findElement.class_('B');
-    var c = findElement.class_('C');
-    var m1 = findElement.mixin('M1');
-    var m2 = findElement.mixin('M2');
-    var m3 = findElement.mixin('M3');
-    var m4 = findElement.mixin('M4');
-    var m5 = findElement.mixin('M5');
-    var object = a.supertype!.element;
-
-    _assertSuperClasses(object, []);
-    _assertSuperClasses(a, [object]);
-    _assertSuperClasses(b, [object, a]);
-    _assertSuperClasses(c, [object]);
-
-    _assertSuperClasses(m1, [object, a]);
-    _assertSuperClasses(m2, [object, a, b]);
-    _assertSuperClasses(m3, [object, a, m1]);
-    _assertSuperClasses(m4, [object, a, b, m2]);
-    _assertSuperClasses(m5, [object, a, c]);
-  }
-
-  void _assertSuperClasses(ClassElement element, List<ClassElement> expected) {
-    var supers = getSuperClasses(element);
-    expect(supers, unorderedEquals(expected));
-  }
-
   Future<void> _indexTestUnit(String code) async {
     await resolveTestCode(code);
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 3397ab6..6608327 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -1507,15 +1507,18 @@
     // Prepare information about existing imports.
     LibraryDirective? libraryDirective;
     var importDirectives = <ImportDirective>[];
-    PartDirective? partDirective;
+    ExportDirective? firstExportDirective;
+    PartDirective? firstPartDirective;
     var unit = resolvedUnit.unit;
     for (var directive in unit.directives) {
       if (directive is LibraryDirective) {
         libraryDirective = directive;
       } else if (directive is ImportDirective) {
         importDirectives.add(directive);
+      } else if (directive is ExportDirective) {
+        firstExportDirective ??= directive;
       } else if (directive is PartDirective) {
-        partDirective = directive;
+        firstPartDirective ??= directive;
       }
     }
 
@@ -1634,7 +1637,7 @@
                 builder.writeln();
               }
             } else {
-              if (isLastExistingDart || isLastExistingPackage) {
+              if (!isDart && (isLastExistingDart || isLastExistingPackage)) {
                 builder.writeln();
               }
             }
@@ -1662,9 +1665,22 @@
       return;
     }
 
-    // Insert imports: before a part directive.
-    if (partDirective != null) {
-      addInsertion(partDirective.offset, (EditBuilder builder) {
+    // Insert imports: before any export directives.
+    if (firstExportDirective != null) {
+      addInsertion(firstExportDirective.offset, (EditBuilder builder) {
+        for (var i = 0; i < importList.length; i++) {
+          var import = importList[i];
+          writeImport(builder, import);
+          builder.writeln();
+        }
+        builder.writeln();
+      });
+      return;
+    }
+
+    // Insert imports: before any part directives.
+    if (firstPartDirective != null) {
+      addInsertion(firstPartDirective.offset, (EditBuilder builder) {
         for (var i = 0; i < importList.length; i++) {
           var import = importList[i];
           writeImport(builder, import);
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
index bd2700d..ae38afa 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/change_builder_dart_test.dart
@@ -1997,6 +1997,23 @@
 @reflectiveTest
 class ImportLibraryTest extends AbstractContextTest
     with DartChangeBuilderMixin {
+  Future<void> test_dart_afterDart_last() async {
+    await _assertImportLibrary(
+      initialCode: '''
+import 'dart:aaa';
+
+class A {}
+''',
+      uriList: ['dart:bbb'],
+      expectedCode: '''
+import 'dart:aaa';
+import 'dart:bbb';
+
+class A {}
+''',
+    );
+  }
+
   Future<void> test_dart_beforeDart() async {
     await _assertImportLibrary(
       initialCode: '''
@@ -2025,6 +2042,20 @@
     );
   }
 
+  Future<void> test_dart_beforeExport() async {
+    await _assertImportLibrary(
+      initialCode: '''
+export 'dart:aaa';
+''',
+      uriList: ['dart:bbb'],
+      expectedCode: '''
+import 'dart:bbb';
+
+export 'dart:aaa';
+''',
+    );
+  }
+
   Future<void> test_dart_beforePackage() async {
     await _assertImportLibrary(
       initialCode: '''
@@ -2180,6 +2211,7 @@
     await _assertImportLibrary(
       initialCode: '''
 part 'a.dart';
+part 'b.dart';
 ''',
       uriList: ['dart:aaa', 'dart:bbb'],
       expectedCode: '''
@@ -2187,6 +2219,7 @@
 import 'dart:bbb';
 
 part 'a.dart';
+part 'b.dart';
 ''',
     );
   }
diff --git a/pkg/dartdev/test/commands/create_integration_test.dart b/pkg/dartdev/test/commands/create_integration_test.dart
index 19f93d8..05d0bf0 100644
--- a/pkg/dartdev/test/commands/create_integration_test.dart
+++ b/pkg/dartdev/test/commands/create_integration_test.dart
@@ -97,7 +97,10 @@
                 p.pubCacheBinPath,
                 Platform.isWindows ? '${command.first}.bat' : command.first,
               ),
-              command.sublist(1),
+              [
+                ...command.sublist(1),
+                'web:0', // Allow for binding to a random available port.
+              ],
               workingDirectory: workingDir,
               environment: {
                 'PUB_CACHE': p.pubCachePath,
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index ba4c459..6eddb5a 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -131,7 +131,6 @@
   V(SecureSocket_RegisterBadCertificateCallback, 2)                            \
   V(SecureSocket_RegisterKeyLogPort, 2)                                        \
   V(SecureSocket_RegisterHandshakeCompleteCallback, 2)                         \
-  V(SecureSocket_Renegotiate, 4)                                               \
   V(SecurityContext_Allocate, 1)                                               \
   V(SecurityContext_UsePrivateKeyBytes, 3)                                     \
   V(SecurityContext_SetAlpnProtocols, 3)                                       \
diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc
index 43e3a9d..9e1492e 100644
--- a/runtime/bin/secure_socket_filter.cc
+++ b/runtime/bin/secure_socket_filter.cc
@@ -175,17 +175,6 @@
   GetFilter(args)->GetSelectedProtocol(args);
 }
 
-void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) {
-  bool use_session_cache =
-      DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
-  bool request_client_certificate =
-      DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2));
-  bool require_client_certificate =
-      DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
-  GetFilter(args)->Renegotiate(use_session_cache, request_client_certificate,
-                               require_client_certificate);
-}
-
 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)(
     Dart_NativeArguments args) {
   Dart_Handle handshake_complete =
@@ -662,17 +651,6 @@
   }
 }
 
-void SSLFilter::Renegotiate(bool use_session_cache,
-                            bool request_client_certificate,
-                            bool require_client_certificate) {
-  // The SSL_REQUIRE_CERTIFICATE option only takes effect if the
-  // SSL_REQUEST_CERTIFICATE option is also set, so set it.
-  request_client_certificate =
-      request_client_certificate || require_client_certificate;
-  // TODO(24070, 24069): Implement setting the client certificate parameters,
-  //   and triggering rehandshake.
-}
-
 void SSLFilter::FreeResources() {
   if (ssl_ != NULL) {
     SSL_free(ssl_);
diff --git a/runtime/bin/secure_socket_filter.h b/runtime/bin/secure_socket_filter.h
index 56f7f58..fe3b778 100644
--- a/runtime/bin/secure_socket_filter.h
+++ b/runtime/bin/secure_socket_filter.h
@@ -85,9 +85,6 @@
   void MarkAsTrusted(Dart_NativeArguments args);
   int Handshake(Dart_Port reply_port);
   void GetSelectedProtocol(Dart_NativeArguments args);
-  void Renegotiate(bool use_session_cache,
-                   bool request_client_certificate,
-                   bool require_client_certificate);
   void RegisterHandshakeCompleteCallback(Dart_Handle handshake_complete);
   void RegisterBadCertificateCallback(Dart_Handle callback);
   void RegisterKeyLogPort(Dart_Port key_log_port);
diff --git a/runtime/bin/secure_socket_unsupported.cc b/runtime/bin/secure_socket_unsupported.cc
index 37c2972..f64203d 100644
--- a/runtime/bin/secure_socket_unsupported.cc
+++ b/runtime/bin/secure_socket_unsupported.cc
@@ -90,11 +90,6 @@
       "Secure Sockets unsupported on this platform"));
 }
 
-void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) {
-  Dart_ThrowException(DartUtils::NewDartArgumentError(
-      "Secure Sockets unsupported on this platform"));
-}
-
 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) {
   Dart_ThrowException(DartUtils::NewDartArgumentError(
       "Secure Sockets unsupported on this platform"));
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 57239ec..e1830d1 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -871,17 +871,6 @@
               function.token_pos().ToCString(),
               Function::KindToCString(function.kind()));
   }
-  if (function.SourceSize() >= FLAG_huge_method_cutoff_in_tokens) {
-    THR_Print(
-        "Warning: %s from %s is too large. Some optimizations have been "
-        "disabled, and the compiler might run out of memory. "
-        "Consider refactoring this code into smaller components.\n",
-        function.QualifiedUserVisibleNameCString(),
-        String::Handle(
-            Z, Library::Handle(Z, Class::Handle(Z, function.Owner()).library())
-                   .url())
-            .ToCString());
-  }
 
   ASSERT(!function.is_abstract());
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a7966c7..f68063a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -18569,11 +18569,18 @@
     }
   }
   const Instance& stack = Instance::Handle(stacktrace());
-  strtmp = DartLibraryCalls::ToString(stack);
-  const char* stack_str =
-      "<Received error while converting stack trace to string>";
-  if (!strtmp.IsError()) {
-    stack_str = strtmp.ToCString();
+  const char* stack_str;
+  if (stack.IsNull()) {
+    stack_str = "null";
+  } else if (stack.IsStackTrace()) {
+    stack_str = StackTrace::Cast(stack).ToCString();
+  } else {
+    strtmp = DartLibraryCalls::ToString(stack);
+    if (!strtmp.IsError()) {
+      stack_str = strtmp.ToCString();
+    } else {
+      stack_str = "<Received error while converting stack trace to string>";
+    }
   }
   return OS::SCreate(thread->zone(), "Unhandled exception:\n%s\n%s", exc_str,
                      stack_str);
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index f2a1286..b8b855d 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -49,19 +49,40 @@
 
 #define VM_SERVICE_METHOD_CALL_FROM_NATIVE 5
 
-static ArrayPtr MakeServiceControlMessage(Dart_Port port_id,
-                                          intptr_t code,
-                                          const String& name) {
-  const Array& list = Array::Handle(Array::New(4));
-  ASSERT(!list.IsNull());
-  const Integer& code_int = Integer::Handle(Integer::New(code));
-  const Integer& port_int = Integer::Handle(Integer::New(port_id));
-  const SendPort& send_port = SendPort::Handle(SendPort::New(port_id));
-  list.SetAt(0, code_int);
-  list.SetAt(1, port_int);
-  list.SetAt(2, send_port);
-  list.SetAt(3, name);
-  return list.ptr();
+bool ServiceIsolate::SendServiceControlMessage(Thread* thread,
+                                               Dart_Port port_id,
+                                               intptr_t code,
+                                               const char* name) {
+  Dart_CObject ccode;
+  ccode.type = Dart_CObject_kInt32;
+  ccode.value.as_int32 = code;
+
+  Dart_CObject port_int;
+  port_int.type = Dart_CObject_kInt64;
+  port_int.value.as_int64 = port_id;
+
+  Dart_CObject send_port;
+  send_port.type = Dart_CObject_kSendPort;
+  send_port.value.as_send_port.id = port_id;
+  send_port.value.as_send_port.origin_id = port_id;
+
+  Dart_CObject cname;
+  cname.type = Dart_CObject_kString;
+  cname.value.as_string = const_cast<char*>(name);
+
+  Dart_CObject* values[4];
+  values[0] = &ccode;
+  values[1] = &port_int;
+  values[2] = &send_port;
+  values[3] = &cname;
+
+  Dart_CObject message;
+  message.type = Dart_CObject_kArray;
+  message.value.as_array.length = 4;
+  message.value.as_array.values = values;
+
+  return PortMap::PostMessage(WriteApiMessage(thread->zone(), &message, port_,
+                                              Message::kNormalPriority));
 }
 
 static ArrayPtr MakeServerControlMessage(const SendPort& sp,
@@ -217,21 +238,16 @@
   if (Dart::VmIsolateNameEquals(isolate->name())) {
     return false;
   }
-  ASSERT(isolate != NULL);
-  HANDLESCOPE(thread);
-  const String& name = String::Handle(String::New(isolate->name()));
-  ASSERT(!name.IsNull());
-  const Array& list = Array::Handle(MakeServiceControlMessage(
-      Dart_GetMainPortId(), VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID, name));
-  ASSERT(!list.IsNull());
+
+  Dart_Port main_port = Dart_GetMainPortId();
   if (FLAG_trace_service) {
     OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Isolate %s %" Pd64
                                               " registered.\n",
-                 name.ToCString(), Dart_GetMainPortId());
+                 isolate->name(), main_port);
   }
-  bool result = PortMap::PostMessage(WriteMessage(
-      /* can_send_any_object */ false, /* same_group */ false, list, port_,
-      Message::kNormalPriority));
+  bool result = SendServiceControlMessage(thread, main_port,
+                                          VM_SERVICE_ISOLATE_STARTUP_MESSAGE_ID,
+                                          isolate->name());
   isolate->set_is_service_registered(true);
   return result;
 }
@@ -245,21 +261,17 @@
   if (Dart::VmIsolateNameEquals(isolate->name())) {
     return false;
   }
-  ASSERT(isolate != NULL);
-  HANDLESCOPE(thread);
-  const String& name = String::Handle(String::New(isolate->name()));
-  ASSERT(!name.IsNull());
-  const Array& list = Array::Handle(MakeServiceControlMessage(
-      Dart_GetMainPortId(), VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID, name));
-  ASSERT(!list.IsNull());
+
+  Dart_Port main_port = Dart_GetMainPortId();
   if (FLAG_trace_service) {
     OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME ": Isolate %s %" Pd64
                                               " deregistered.\n",
-                 name.ToCString(), Dart_GetMainPortId());
+                 isolate->name(), main_port);
   }
-  return PortMap::PostMessage(WriteMessage(
-      /* can_send_any_object */ false, /* same_group */ false, list, port_,
-      Message::kNormalPriority));
+
+  return SendServiceControlMessage(thread, main_port,
+                                   VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
+                                   isolate->name());
 }
 
 void ServiceIsolate::SendServiceExitMessage() {
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index 0fc018a..4dff100 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -45,6 +45,10 @@
   static void Run();
   static bool SendIsolateStartupMessage();
   static bool SendIsolateShutdownMessage();
+  static bool SendServiceControlMessage(Thread* thread,
+                                        Dart_Port port_id,
+                                        intptr_t code,
+                                        const char* name);
   static void SendServiceExitMessage();
   static void Shutdown();
 
diff --git a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
index a2ce0f3..680adcf 100644
--- a/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
+++ b/sdk/lib/_internal/vm/bin/secure_socket_patch.dart
@@ -33,12 +33,7 @@
   void renegotiate(
       {bool useSessionCache: true,
       bool requestClientCertificate: false,
-      bool requireClientCertificate: false}) {
-    _raw!.renegotiate(
-        useSessionCache: useSessionCache,
-        requestClientCertificate: requestClientCertificate,
-        requireClientCertificate: requireClientCertificate);
-  }
+      bool requireClientCertificate: false}) {}
 
   X509Certificate? get peerCertificate {
     if (_raw == null) {
@@ -165,10 +160,6 @@
   @pragma("vm:external-name", "SecureSocket_GetSelectedProtocol")
   external String? selectedProtocol();
 
-  @pragma("vm:external-name", "SecureSocket_Renegotiate")
-  external void renegotiate(bool useSessionCache, bool requestClientCertificate,
-      bool requireClientCertificate);
-
   @pragma("vm:external-name", "SecureSocket_Init")
   external void init();
 
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index de267bb..7dd311c 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -208,12 +208,11 @@
   /// protocol between client and server.
   String? get selectedProtocol;
 
-  /// Renegotiates an existing secure connection.
+  /// Does nothing.
   ///
-  /// Renews the session keys and possibly changes the connection properties.
-  ///
-  /// This repeats the SSL or TLS handshake, with options that allow clearing
-  /// the session cache and requesting a client certificate.
+  /// The original intent was to allow TLS renegotiation of existing secure
+  /// connections.
+  @Deprecated("Not implemented")
   void renegotiate(
       {bool useSessionCache = true,
       bool requestClientCertificate = false,
@@ -421,11 +420,11 @@
         supportedProtocols: supportedProtocols);
   }
 
-  /// Renegotiate an existing secure connection, renewing the session keys
-  /// and possibly changing the connection properties.
+  /// Does nothing.
   ///
-  /// This repeats the SSL or TLS handshake, with options that allow clearing
-  /// the session cache and requesting a client certificate.
+  /// The original intent was to allow TLS renegotiation of existing secure
+  /// connections.
+  @Deprecated("Not implemented")
   void renegotiate(
       {bool useSessionCache = true,
       bool requestClientCertificate = false,
@@ -924,6 +923,7 @@
     }
   }
 
+  @Deprecated("Not implemented")
   void renegotiate(
       {bool useSessionCache = true,
       bool requestClientCertificate = false,
@@ -932,8 +932,6 @@
       throw new HandshakeException(
           "Called renegotiate on a non-connected socket");
     }
-    _secureFilter!.renegotiate(
-        useSessionCache, requestClientCertificate, requireClientCertificate);
     _status = handshakeStatus;
     _filterStatus.writeEmpty = false;
     _scheduleFilter();
@@ -1342,8 +1340,6 @@
   Future<bool> handshake();
   String? selectedProtocol();
   void rehandshake();
-  void renegotiate(bool useSessionCache, bool requestClientCertificate,
-      bool requireClientCertificate);
   void init();
   X509Certificate? get peerCertificate;
   int processBuffer(int bufferIndex);
diff --git a/tests/standalone/io/secure_socket_renegotiate_client.dart b/tests/standalone/io/secure_socket_renegotiate_client.dart
deleted file mode 100644
index 775891b..0000000
--- a/tests/standalone/io/secure_socket_renegotiate_client.dart
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2013, 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.
-
-// Client for secure_socket_renegotiate_test, that runs in a subprocess.
-// The test verifies that client certificates work, if the client and server
-// are in separate processes, and that connection renegotiation can request
-// a client certificate to be sent.
-
-import "dart:async";
-import "dart:convert";
-import "dart:io";
-
-const HOST_NAME = "localhost";
-String localFile(path) => Platform.script.resolve(path).toFilePath();
-
-SecurityContext clientContext = new SecurityContext()
-  ..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));
-
-class ExpectException implements Exception {
-  ExpectException(this.message);
-  String toString() => message;
-  String message;
-}
-
-void expectEquals(expected, actual) {
-  if (actual != expected) {
-    throw new ExpectException('Expected $expected, found $actual');
-  }
-}
-
-void expect(condition) {
-  if (!condition) {
-    throw new ExpectException('');
-  }
-}
-
-void runClient(int port) {
-  SecureSocket.connect(HOST_NAME, port, context: clientContext)
-      .then((SecureSocket socket) {
-    X509Certificate? certificate = socket.peerCertificate;
-    expect(certificate != null);
-    expectEquals('CN=localhost', certificate!.subject);
-    expectEquals('CN=myauthority', certificate.issuer);
-    StreamIterator<String> input = new StreamIterator(
-        socket.transform(utf8.decoder).transform(new LineSplitter()));
-    socket.writeln('first');
-    input.moveNext().then((success) {
-      expect(success);
-      expectEquals('first reply', input.current);
-      socket.renegotiate();
-      socket.writeln('renegotiated');
-      return input.moveNext();
-    }).then((success) {
-      expect(success);
-      expectEquals('server renegotiated', input.current);
-      X509Certificate? certificate = socket.peerCertificate;
-      expect(certificate != null);
-      expectEquals("CN=localhost", certificate!.subject);
-      expectEquals("CN=myauthority", certificate.issuer);
-      socket.writeln('second');
-      return input.moveNext();
-    }).then((success) {
-      expect(success != true);
-      socket.close();
-    });
-  });
-}
-
-void main(List<String> args) {
-  runClient(int.parse(args[0]));
-}
diff --git a/tests/standalone/io/secure_socket_renegotiate_test.dart b/tests/standalone/io/secure_socket_renegotiate_test.dart
deleted file mode 100644
index 05aa2f1..0000000
--- a/tests/standalone/io/secure_socket_renegotiate_test.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) 2013, 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.
-//
-// OtherResources=certificates/server_chain.pem
-// OtherResources=certificates/server_key.pem
-// OtherResources=secure_socket_renegotiate_client.dart
-
-// This test verifies that client certificates work, if the client and server
-// are in separate processes, and that connection renegotiation works, and
-// can request a client certificate to be sent.
-
-import "dart:async";
-import "dart:convert";
-import "dart:io";
-
-import "package:expect/expect.dart";
-import "package:path/path.dart";
-
-const HOST_NAME = "localhost";
-String localFile(path) => Platform.script.resolve(path).toFilePath();
-
-SecurityContext serverContext = new SecurityContext()
-  ..useCertificateChain(localFile('certificates/server_chain.pem'))
-  ..usePrivateKey(localFile('certificates/server_key.pem'),
-      password: 'dartdart');
-
-Future<SecureServerSocket> runServer() {
-  return SecureServerSocket.bind(HOST_NAME, 0, serverContext)
-      .then((SecureServerSocket server) {
-    server.listen((SecureSocket socket) {
-      Expect.isNull(socket.peerCertificate);
-
-      StreamIterator<String> input = new StreamIterator(
-          utf8.decoder.bind(socket).transform(new LineSplitter()));
-      input.moveNext().then((success) {
-        Expect.isTrue(success);
-        Expect.equals('first', input.current);
-        socket.writeln('first reply');
-        return input.moveNext();
-      }).then((success) {
-        Expect.isTrue(success);
-        Expect.equals('renegotiated', input.current);
-        Expect.isNull(socket.peerCertificate);
-        socket.renegotiate(
-            requestClientCertificate: true,
-            requireClientCertificate: true,
-            useSessionCache: false);
-        socket.writeln('server renegotiated');
-        return input.moveNext();
-      }).then((success) {
-        Expect.isTrue(success);
-        Expect.equals('second', input.current);
-        X509Certificate certificate = socket.peerCertificate!;
-        Expect.equals("CN=localhost", certificate.subject);
-        Expect.equals("CN=myauthority", certificate.issuer);
-        server.close();
-        socket.close();
-      });
-    });
-    return server;
-  });
-}
-
-void main() {
-  runServer().then((SecureServerSocket server) {
-    var clientScript = Platform.script
-        .resolve('secure_socket_renegotiate_client.dart')
-        .toFilePath();
-    Process.run(
-            Platform.executable,
-            []
-              ..addAll(Platform.executableArguments)
-              ..addAll([clientScript, server.port.toString()]))
-        .then((ProcessResult result) {
-      if (result.exitCode != 0) {
-        print("Client failed, stdout:");
-        print(result.stdout);
-        print("  stderr:");
-        print(result.stderr);
-        Expect.fail('Client subprocess exit code: ${result.exitCode}');
-      }
-    });
-  });
-}
diff --git a/tests/standalone/standalone_kernel.status b/tests/standalone/standalone_kernel.status
index 609c61b..41bcfb0 100644
--- a/tests/standalone/standalone_kernel.status
+++ b/tests/standalone/standalone_kernel.status
@@ -97,7 +97,6 @@
 io/secure_multiple_client_server_test: Skip # Flaky.
 io/secure_server_closing_test: Skip # Flaky.
 io/secure_server_socket_test: Skip # Flaky.
-io/secure_socket_renegotiate_test: Crash
 io/socket_many_connections_test: Skip # Flaky
 io/web_socket_error_test: Skip # Flaky
 io/web_socket_ping_test: Skip # Flaky.
diff --git a/tests/standalone_2/io/secure_socket_renegotiate_client.dart b/tests/standalone_2/io/secure_socket_renegotiate_client.dart
deleted file mode 100644
index c8ae0bb..0000000
--- a/tests/standalone_2/io/secure_socket_renegotiate_client.dart
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// Client for secure_socket_renegotiate_test, that runs in a subprocess.
-// The test verifies that client certificates work, if the client and server
-// are in separate processes, and that connection renegotiation can request
-// a client certificate to be sent.
-
-import "dart:async";
-import "dart:convert";
-import "dart:io";
-
-const HOST_NAME = "localhost";
-String localFile(path) => Platform.script.resolve(path).toFilePath();
-
-SecurityContext clientContext = new SecurityContext()
-  ..setTrustedCertificates(localFile('certificates/trusted_certs.pem'));
-
-class ExpectException implements Exception {
-  ExpectException(this.message);
-  String toString() => message;
-  String message;
-}
-
-void expectEquals(expected, actual) {
-  if (actual != expected) {
-    throw new ExpectException('Expected $expected, found $actual');
-  }
-}
-
-void expect(condition) {
-  if (!condition) {
-    throw new ExpectException('');
-  }
-}
-
-void runClient(int port) {
-  SecureSocket
-      .connect(HOST_NAME, port, context: clientContext)
-      .then((SecureSocket socket) {
-    X509Certificate certificate = socket.peerCertificate;
-    expect(certificate != null);
-    expectEquals('CN=localhost', certificate.subject);
-    expectEquals('CN=myauthority', certificate.issuer);
-    StreamIterator<String> input = new StreamIterator(
-        socket.transform(utf8.decoder).transform(new LineSplitter()));
-    socket.writeln('first');
-    input.moveNext().then((success) {
-      expect(success);
-      expectEquals('first reply', input.current);
-      socket.renegotiate();
-      socket.writeln('renegotiated');
-      return input.moveNext();
-    }).then((success) {
-      expect(success);
-      expectEquals('server renegotiated', input.current);
-      X509Certificate certificate = socket.peerCertificate;
-      expect(certificate != null);
-      expectEquals("CN=localhost", certificate.subject);
-      expectEquals("CN=myauthority", certificate.issuer);
-      socket.writeln('second');
-      return input.moveNext();
-    }).then((success) {
-      expect(success != true);
-      socket.close();
-    });
-  });
-}
-
-void main(List<String> args) {
-  runClient(int.parse(args[0]));
-}
diff --git a/tests/standalone_2/io/secure_socket_renegotiate_test.dart b/tests/standalone_2/io/secure_socket_renegotiate_test.dart
deleted file mode 100644
index 36cb3a2..0000000
--- a/tests/standalone_2/io/secure_socket_renegotiate_test.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) 2013, 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.
-//
-// OtherResources=certificates/server_chain.pem
-// OtherResources=certificates/server_key.pem
-// OtherResources=secure_socket_renegotiate_client.dart
-
-// @dart = 2.9
-
-// This test verifies that client certificates work, if the client and server
-// are in separate processes, and that connection renegotiation works, and
-// can request a client certificate to be sent.
-
-import "dart:async";
-import "dart:convert";
-import "dart:io";
-
-import "package:expect/expect.dart";
-import "package:path/path.dart";
-
-const HOST_NAME = "localhost";
-String localFile(path) => Platform.script.resolve(path).toFilePath();
-
-SecurityContext serverContext = new SecurityContext()
-  ..useCertificateChain(localFile('certificates/server_chain.pem'))
-  ..usePrivateKey(localFile('certificates/server_key.pem'),
-      password: 'dartdart');
-
-Future<SecureServerSocket> runServer() {
-  return SecureServerSocket.bind(HOST_NAME, 0, serverContext)
-      .then((SecureServerSocket server) {
-    server.listen((SecureSocket socket) {
-      Expect.isNull(socket.peerCertificate);
-
-      StreamIterator<String> input = new StreamIterator(
-          utf8.decoder.bind(socket).transform(new LineSplitter()));
-      input.moveNext().then((success) {
-        Expect.isTrue(success);
-        Expect.equals('first', input.current);
-        socket.writeln('first reply');
-        return input.moveNext();
-      }).then((success) {
-        Expect.isTrue(success);
-        Expect.equals('renegotiated', input.current);
-        Expect.isNull(socket.peerCertificate);
-        socket.renegotiate(
-            requestClientCertificate: true,
-            requireClientCertificate: true,
-            useSessionCache: false);
-        socket.writeln('server renegotiated');
-        return input.moveNext();
-      }).then((success) {
-        Expect.isTrue(success);
-        Expect.equals('second', input.current);
-        X509Certificate certificate = socket.peerCertificate;
-        Expect.isNotNull(certificate);
-        Expect.equals("CN=localhost", certificate.subject);
-        Expect.equals("CN=myauthority", certificate.issuer);
-        server.close();
-        socket.close();
-      });
-    });
-    return server;
-  });
-}
-
-void main() {
-  runServer().then((SecureServerSocket server) {
-    var clientScript = Platform.script
-        .resolve('secure_socket_renegotiate_client.dart')
-        .toFilePath();
-    Process.run(
-            Platform.executable,
-            []
-              ..addAll(Platform.executableArguments)
-              ..addAll([clientScript, server.port.toString()]))
-        .then((ProcessResult result) {
-      if (result.exitCode != 0) {
-        print("Client failed, stdout:");
-        print(result.stdout);
-        print("  stderr:");
-        print(result.stderr);
-        Expect.fail('Client subprocess exit code: ${result.exitCode}');
-      }
-    });
-  });
-}
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index afb2751..90cc6f4 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -99,7 +99,6 @@
 io/secure_multiple_client_server_test: Skip # Flaky.
 io/secure_server_closing_test: Skip # Flaky.
 io/secure_server_socket_test: Skip # Flaky.
-io/secure_socket_renegotiate_test: Crash
 io/socket_many_connections_test: Skip # Flaky
 io/web_socket_error_test: Skip # Flaky
 io/web_socket_ping_test: Skip # Flaky.
diff --git a/tools/VERSION b/tools/VERSION
index 25a16b1..0a5488c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 164
+PRERELEASE 165
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index b35e47a..8280ab9 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -2948,7 +2948,7 @@
             "language",
             "corelib"
           ],
-          "shards": 6,
+          "shards": 12,
           "fileset": "dart2wasm_hostasserts"
         }
       ]
