diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/local_library_test.dart b/pkg/analysis_server/test/services/completion/dart/declaration/local_library_test.dart
new file mode 100644
index 0000000..3351cee
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/local_library_test.dart
@@ -0,0 +1,364 @@
+// Copyright (c) 2023, 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_reflective_loader/test_reflective_loader.dart';
+
+import '../../../../client/completion_driver_test.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(LocalLibraryTest1);
+    defineReflectiveTests(LocalLibraryTest2);
+  });
+}
+
+@reflectiveTest
+class LocalLibraryTest1 extends AbstractCompletionDriverTest
+    with LocalLibraryTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version1;
+}
+
+@reflectiveTest
+class LocalLibraryTest2 extends AbstractCompletionDriverTest
+    with LocalLibraryTestCases {
+  @override
+  TestingCompletionProtocol get protocol => TestingCompletionProtocol.version2;
+}
+
+mixin LocalLibraryTestCases on AbstractCompletionDriverTest {
+  @override
+  bool get includeKeywords => false;
+
+  Future<void> test_partFile_Constructor() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+library libA;
+import "b.dart";
+part "test.dart";
+class A0 {}
+var m0 = T0;
+''');
+    await computeSuggestions('''
+part of libA;
+class B {
+  B.bar(int x);
+}
+void f() {
+  new ^
+}
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: constructorInvocation
+''');
+  }
+
+  Future<void> test_partFile_Constructor2() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B0;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+class B0 {}
+''');
+    await computeSuggestions('''
+library libA;
+import "b.dart";
+part "a.dart";
+class A0 {
+  A0({String boo: 'hoo'}) {}
+}
+void f() {
+  new ^
+}
+var m0 = T0;
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: constructorInvocation
+  B0
+    kind: constructorInvocation
+''');
+  }
+
+  Future<void> test_partFile_extension() async {
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+extension E0 on int {}
+''');
+    await computeSuggestions('''
+library libA;
+part "a.dart";
+void f() {
+  ^
+}
+''');
+    assertResponse(r'''
+suggestions
+  E0
+    kind: extensionInvocation
+''');
+  }
+
+  Future<void> test_partFile_extension_unnamed() async {
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+extension on int {}
+''');
+    await computeSuggestions('''
+library libA;
+part "a.dart";
+void f() {
+  ^
+}
+''');
+    assertResponse(r'''
+suggestions
+''');
+  }
+
+  Future<void>
+      test_partFile_InstanceCreationExpression_assignment_filter() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B0;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+class A0 {}
+class B0 extends A0 {}
+class C0 implements A0 {}
+class D0 {}
+''');
+    await computeSuggestions('''
+library libA;
+import "b.dart";
+part "a.dart";
+class L0 {}
+void f() {
+  A0 a;
+  // FAIL:
+  a = new ^
+}
+var m0 = T0;
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: constructorInvocation
+  B0
+    kind: constructorInvocation
+  C0
+    kind: constructorInvocation
+  D0
+    kind: constructorInvocation
+  L0
+    kind: constructorInvocation
+''');
+  }
+
+  Future<void>
+      test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B0;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+class A0 {}
+class B0 extends A0 {}
+class C0 implements A0 {}
+class D0 {}
+''');
+    await computeSuggestions('''
+library libA;
+import "b.dart";
+part "a.dart";
+class L0 {}
+void f() {
+  A0 a = new ^
+}
+var m0 = T0;
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: constructorInvocation
+  B0
+    kind: constructorInvocation
+  C0
+    kind: constructorInvocation
+  D0
+    kind: constructorInvocation
+  L0
+    kind: constructorInvocation
+''');
+  }
+
+  Future<void> test_partFile_TypeName() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+library libA;
+import "b.dart";
+part "test.dart";
+class A0 {
+  var a1;
+  a2(){}
+}
+var m0 = T0;
+typedef t0(int blue);
+typedef t1 = void Function(int blue);
+typedef t2 = List<int>;
+int a0() {
+  return 0;
+}
+''');
+    await computeSuggestions('''
+part of libA;
+class B {
+  B.bar(int x);
+}
+void f() {
+  ^
+}
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: class
+  A0
+    kind: constructorInvocation
+  F0
+    kind: functionInvocation
+  T0
+    kind: topLevelVariable
+  a0
+    kind: functionInvocation
+  m0
+    kind: topLevelVariable
+  t0
+    kind: typeAlias
+  t1
+    kind: typeAlias
+  t2
+    kind: typeAlias
+''');
+  }
+
+  Future<void> test_partFile_TypeName2() async {
+    newFile('$testPackageLibPath/b.dart', '''
+library B0;
+int T0 = 0;
+F0() {}
+class X {
+  X.c();
+  X._d0();
+  z0() {}
+}
+void f() {
+  X._d0();
+}
+''');
+    newFile('$testPackageLibPath/a.dart', '''
+part of libA;
+class B0 {
+  var b1;
+  b2(){}
+}
+int b0() => 0;
+typedef t0(int blue);
+var n0;
+''');
+    await computeSuggestions('''
+library libA;
+import "b.dart";
+part "a.dart";
+class A0 {
+  A0({String boo: 'hoo'}) {}
+}
+void f() {
+  ^
+}
+var m0 = T0;
+''');
+    assertResponse(r'''
+suggestions
+  A0
+    kind: class
+  A0
+    kind: constructorInvocation
+  B0
+    kind: class
+  B0
+    kind: constructorInvocation
+  F0
+    kind: functionInvocation
+  T0
+    kind: topLevelVariable
+  b0
+    kind: functionInvocation
+  m0
+    kind: topLevelVariable
+  n0
+    kind: topLevelVariable
+  t0
+    kind: typeAlias
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
index 4236123..80d5f69 100644
--- a/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/declaration/test_all.dart
@@ -14,6 +14,7 @@
 import 'library_member_test.dart' as library_member;
 import 'library_prefix_test.dart' as library_prefix;
 import 'library_test.dart' as library_;
+import 'local_library_test.dart' as local_library;
 import 'pattern_variable_test.dart' as pattern_variable;
 import 'record_type_test.dart' as record_type;
 import 'type_member_test.dart' as type_member;
@@ -33,6 +34,7 @@
     library_member.main();
     library_prefix.main();
     library_.main();
+    local_library.main();
     pattern_variable.main();
     record_type.main();
     type_member.main();
diff --git a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
deleted file mode 100644
index 1875f2b..0000000
--- a/pkg/analysis_server/test/services/completion/dart/local_library_contributor_test.dart
+++ /dev/null
@@ -1,321 +0,0 @@
-// Copyright (c) 2015, 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.
-
-/// This file contains tests written in a deprecated way. Please do not add any
-/// tests to this file. Instead, add tests to the files in `declaration`,
-/// `location`, or `relevance`.
-library;
-
-import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
-import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
-import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'completion_contributor_util.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(LocalLibraryContributorTest);
-  });
-}
-
-@reflectiveTest
-class LocalLibraryContributorTest extends DartCompletionContributorTest {
-  @override
-  DartCompletionContributor createContributor(
-    DartCompletionRequest request,
-    SuggestionBuilder builder,
-  ) {
-    return LocalLibraryContributor(request, builder);
-  }
-
-  Future<void> test_partFile_Constructor() async {
-    // SimpleIdentifier  NamedType  ConstructorName
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        library libA;
-        import "b.dart";
-        part "test.dart";
-        class A { }
-        var m;''');
-    addTestSource('''
-        part of libA;
-        class B { B.bar(int x); }
-        void f() {new ^}''');
-    await resolveFile('$testPackageLibPath/a.dart');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestConstructor('A');
-    // Suggested by LocalConstructorContributor
-    assertNotSuggested('B.bar');
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-
-  Future<void> test_partFile_Constructor2() async {
-    // SimpleIdentifier  NamedType  ConstructorName
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        part of libA;
-        class B { }''');
-    addTestSource('''
-        library libA;
-        import "b.dart";
-        part "a.dart";
-        class A { A({String boo: 'hoo'}) { } }
-        void f() {new ^}
-        var m;''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestConstructor('B');
-    // Suggested by ConstructorContributor
-    assertNotSuggested('A');
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-
-  Future<void> test_partFile_extension() async {
-    newFile('$testPackageLibPath/a.dart', '''
-part of libA;
-extension E on int {}
-''');
-    addTestSource('''
-library libA;
-part "a.dart";
-void f() {^}
-''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggest('E');
-  }
-
-  Future<void> test_partFile_extension_unnamed() async {
-    newFile('$testPackageLibPath/a.dart', '''
-part of libA;
-extension on int {}
-''');
-    addTestSource('''
-library libA;
-part "a.dart";
-void f() {^}
-''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertNotSuggested('');
-  }
-
-  Future<void>
-      test_partFile_InstanceCreationExpression_assignment_filter() async {
-    // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        part of libA;
-        class A {} class B extends A {} class C implements A {} class D {}
-        ''');
-    addTestSource('''
-        library libA;
-        import "b.dart";
-        part "a.dart";
-        class Local { }
-        void f() {
-          A a;
-          // FAIL:
-          a = new ^
-        }
-        var m;''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    // A is suggested with a higher relevance
-    assertSuggestConstructor('A', elemOffset: -1);
-    assertSuggestConstructor('B', elemOffset: -1);
-    assertSuggestConstructor('C', elemOffset: -1);
-    // D has the default relevance
-    assertSuggestConstructor('D', elemOffset: -1);
-
-    // Suggested by ConstructorContributor
-    assertNotSuggested('Local');
-
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-
-  Future<void>
-      test_partFile_InstanceCreationExpression_variable_declaration_filter() async {
-    // ConstructorName  InstanceCreationExpression  VariableDeclarationList
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        part of libA;
-        class A {} class B extends A {} class C implements A {} class D {}
-        ''');
-    addTestSource('''
-        library libA;
-        import "b.dart";
-        part "a.dart";
-        class Local { }
-        void f() {
-          A a = new ^
-        }
-        var m;''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    // A is suggested with a higher relevance
-    assertSuggestConstructor('A', elemOffset: -1);
-    assertSuggestConstructor('B', elemOffset: -1);
-    assertSuggestConstructor('C', elemOffset: -1);
-    // D has the default relevance
-    assertSuggestConstructor('D', elemOffset: -1);
-
-    // Suggested by ConstructorContributor
-    assertNotSuggested('Local');
-
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-
-  Future<void> test_partFile_TypeName() async {
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        library libA;
-        import "b.dart";
-        part "test.dart";
-        class A { var a1; a2(){}}
-        var m;
-        typedef t1(int blue);
-        typedef t2 = void Function(int blue);
-        typedef t3 = List<int>;
-        int af() {return 0;}''');
-    addTestSource('''
-        part of libA;
-        class B { B.bar(int x); }
-        void f() {^}''');
-    await resolveFile('$testPackageLibPath/a.dart');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestClass('A');
-    if (suggestConstructorsWithoutNew) {
-      assertSuggestConstructor('A');
-    }
-    assertSuggestFunction('af', 'int');
-    assertSuggestTopLevelVar('m', null);
-    assertSuggestTypeAlias('t1',
-        aliasedType: 'dynamic Function(int)', returnType: 'dynamic');
-    assertSuggestTypeAlias('t2',
-        aliasedType: 'void Function(int)', returnType: 'void');
-    assertSuggestTypeAlias('t3', aliasedType: 'List<int>');
-    assertNotSuggested('a1');
-    assertNotSuggested('a2');
-    // Suggested by LocalConstructorContributor
-    assertNotSuggested('B.bar');
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-  }
-
-  Future<void> test_partFile_TypeName2() async {
-    newFile('$testPackageLibPath/b.dart', '''
-        lib B;
-        int T1;
-        F1() { }
-        class X {X.c(); X._d(); z() {}}''');
-    newFile('$testPackageLibPath/a.dart', '''
-        part of libA;
-        class B { var b1; b2(){}}
-        int bf() => 0;
-        typedef t1(int blue);
-        var n;''');
-    addTestSource('''
-        library libA;
-        import "b.dart";
-        part "a.dart";
-        class A { A({String boo: 'hoo'}) { } }
-        void f() {^}
-        var m;''');
-    await computeSuggestions();
-    expect(replacementOffset, completionOffset);
-    expect(replacementLength, 0);
-    assertSuggestClass('B');
-    if (suggestConstructorsWithoutNew) {
-      assertSuggestConstructor('B');
-    }
-    assertSuggestFunction('bf', 'int');
-    assertSuggestTopLevelVar('n', null);
-    assertSuggestTypeAlias('t1',
-        aliasedType: 'dynamic Function(int)', returnType: 'dynamic');
-    assertNotSuggested('b1');
-    assertNotSuggested('b2');
-    // Suggested by ConstructorContributor
-    assertNotSuggested('A');
-    // Suggested by ImportedReferenceContributor
-    assertNotSuggested('Object');
-    assertNotSuggested('X.c');
-    assertNotSuggested('X._d');
-    assertNotSuggested('F1');
-    assertNotSuggested('T1');
-    assertNotSuggested('_d');
-    assertNotSuggested('z');
-    assertNotSuggested('m');
-  }
-}
diff --git a/pkg/analysis_server/test/services/completion/dart/test_all.dart b/pkg/analysis_server/test/services/completion/dart/test_all.dart
index 053fbfc..d558b63 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -8,7 +8,6 @@
 import 'completion_manager_test.dart' as completion_manager;
 import 'declaration/test_all.dart' as declaration;
 import 'imported_reference_contributor_test.dart' as imported_ref_test;
-import 'local_library_contributor_test.dart' as local_lib_test;
 import 'local_reference_contributor_test.dart' as local_ref_test;
 import 'location/test_all.dart' as location;
 import 'relevance/test_all.dart' as relevance_tests;
@@ -20,7 +19,6 @@
     completion_manager.main();
     declaration.main();
     imported_ref_test.main();
-    local_lib_test.main();
     local_ref_test.main();
     location.main();
     relevance_tests.main();
diff --git a/tools/VERSION b/tools/VERSION
index 53b2d6a..8727a3c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 1
 PATCH 0
-PRERELEASE 131
+PRERELEASE 132
 PRERELEASE_PATCH 0
