diff --git a/DEPS b/DEPS
index c431fa6..9a7549d 100644
--- a/DEPS
+++ b/DEPS
@@ -45,6 +45,7 @@
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
   "co19_rev": "21e89324642656dcd903e97352d9d16da6a361ee",
+  # This line prevents conflicts when both packages are rolled simultaneously.
   "co19_2_rev": "3e1ea1af9ef293d7f6a8f3332b5c71c7072a30e0",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/pkg/analysis_server/lib/src/cider/completion.dart b/pkg/analysis_server/lib/src/cider/completion.dart
index 458ce08..8591b99 100644
--- a/pkg/analysis_server/lib/src/cider/completion.dart
+++ b/pkg/analysis_server/lib/src/cider/completion.dart
@@ -99,7 +99,6 @@
             return await manager.computeSuggestions(
               performance,
               completionRequest,
-              enableImportedReferenceContributor: false,
               enableOverrideContributor: false,
               enableUriContributor: false,
             );
diff --git a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
index e433551..1d4b4b5 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -37,9 +37,8 @@
   ) {
     int relevance;
     if (importedUriSet.contains(library.uri)) {
-      return;
-    }
-    if (library.isDeprecated) {
+      relevance = importedRelevance;
+    } else if (library.isDeprecated) {
       relevance = deprecatedRelevance;
     } else {
       relevance = otherwiseRelevance;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 61eea1c..cec2be3 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -92,7 +92,6 @@
   Future<List<CompletionSuggestion>> computeSuggestions(
     OperationPerformanceImpl performance,
     CompletionRequest request, {
-    bool enableImportedReferenceContributor = true,
     bool enableOverrideContributor = true,
     bool enableUriContributor = true,
     CompletionPreference? completionPreference,
@@ -131,7 +130,6 @@
       CombinatorContributor(),
       ExtensionMemberContributor(),
       FieldFormalContributor(),
-      if (enableImportedReferenceContributor) ImportedReferenceContributor(),
       KeywordContributor(),
       LabelContributor(),
       LibraryMemberContributor(),
@@ -150,6 +148,8 @@
     if (includedElementKinds != null) {
       _addIncludedElementKinds(dartRequest);
       _addIncludedSuggestionRelevanceTags(dartRequest);
+    } else {
+      contributors.add(ImportedReferenceContributor());
     }
 
     try {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
index ba9b690..adc0a5e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart
@@ -116,8 +116,9 @@
       sourceRanges.add(sourceRange);
     }
 
+    final uniqueSourceRanges = _uniqueSourceRanges(sourceRanges);
     await builder.addDartFileEdit(file, (builder) {
-      for (var sourceRange in sourceRanges) {
+      for (var sourceRange in uniqueSourceRanges) {
         builder.addDeletion(sourceRange);
       }
     });
@@ -182,6 +183,24 @@
     }
   }
 
+  /// Return [SourceRange]s that are not covered by other in [ranges].
+  /// If there is any intersection, it must be fully covered, never partially.
+  List<SourceRange> _uniqueSourceRanges(List<SourceRange> ranges) {
+    var result = <SourceRange>[];
+    candidates:
+    for (var candidate in ranges) {
+      for (var other in ranges) {
+        if (identical(candidate, other)) {
+          continue;
+        } else if (candidate.coveredBy(other)) {
+          continue candidates;
+        }
+      }
+      result.add(candidate);
+    }
+    return result;
+  }
+
   /// Return an instance of this class. Used as a tear-off in `FixProcessor`.
   static RemoveUnusedField newInstance() => RemoveUnusedField();
 }
diff --git a/pkg/analysis_server/test/client/completion_driver_test.dart b/pkg/analysis_server/test/client/completion_driver_test.dart
index d122baf..3f888c5 100644
--- a/pkg/analysis_server/test/client/completion_driver_test.dart
+++ b/pkg/analysis_server/test/client/completion_driver_test.dart
@@ -71,7 +71,6 @@
   }
 
   void assertSuggestion({
-    bool allowMultiple = false,
     required String completion,
     ElementKind? element,
     CompletionSuggestionKind? kind,
@@ -79,7 +78,6 @@
   }) {
     expect(
         suggestionWith(
-          allowMultiple: allowMultiple,
           completion: completion,
           element: element,
           kind: kind,
@@ -184,7 +182,6 @@
           completion: completion, element: element, kind: kind, file: file));
 
   CompletionSuggestion suggestionWith({
-    bool allowMultiple = false,
     required String completion,
     ElementKind? element,
     CompletionSuggestionKind? kind,
@@ -192,9 +189,7 @@
   }) {
     final matches = suggestionsWith(
         completion: completion, element: element, kind: kind, file: file);
-    if (!allowMultiple) {
-      expect(matches, hasLength(1));
-    }
+    expect(matches, hasLength(1));
     return matches.first;
   }
 
@@ -269,10 +264,7 @@
 }
 ''');
 
-    // TODO(brianwilkerson) There should be a single suggestion here after we
-    //  figure out how to stop the duplication.
     assertSuggestion(
-        allowMultiple: true,
         completion: 'A',
         element: ElementKind.CONSTRUCTOR,
         kind: CompletionSuggestionKind.INVOCATION);
@@ -296,11 +288,7 @@
   ^
 }
 ''');
-
-    // TODO(brianwilkerson) There should be a single suggestion here after we
-    //  figure out how to stop the duplication.
     assertSuggestion(
-        allowMultiple: true,
         completion: 'E.e',
         element: ElementKind.ENUM_CONSTANT,
         kind: CompletionSuggestionKind.INVOCATION);
@@ -325,10 +313,7 @@
 }
 ''');
 
-    // TODO(brianwilkerson) There should be a single suggestion here after we
-    //  figure out how to stop the duplication.
     assertSuggestion(
-        allowMultiple: true,
         completion: 'A.a',
         element: ElementKind.CONSTRUCTOR,
         kind: CompletionSuggestionKind.INVOCATION);
@@ -661,15 +646,13 @@
 }
 ''');
 
-    // TODO(brianwilkerson) There should be a single suggestion here after we
-    //  figure out how to stop the duplication.
     expect(
         suggestionsWith(
             completion: 'Future.value',
             file: '/sdk/lib/async/async.dart',
             element: ElementKind.CONSTRUCTOR,
             kind: CompletionSuggestionKind.INVOCATION),
-        hasLength(2));
+        hasLength(1));
   }
 
   Future<void> test_sdk_lib_suggestions() async {
diff --git a/pkg/analysis_server/test/lsp/completion_dart_test.dart b/pkg/analysis_server/test/lsp/completion_dart_test.dart
index 0328fa0..9ccf020 100644
--- a/pkg/analysis_server/test/lsp/completion_dart_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_dart_test.dart
@@ -1560,7 +1560,7 @@
     expect(completions, hasLength(1));
     final resolved = await resolveCompletion(completions.first);
     // It should not include auto-import text since it's already imported.
-    expect(resolved.detail, isNot(contains('Auto import from')));
+    expect(resolved.detail, isNull);
   }
 
   Future<void> test_suggestionSets_filtersOutAlreadyImportedSymbols() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
index b796a44..039c915 100644
--- a/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/relevance/bool_assignment_test.dart
@@ -15,13 +15,7 @@
 
 @reflectiveTest
 class BoolAssignmentTest extends CompletionRelevanceTest {
-  @failingTest
   Future<void> test_boolLiterals_imported() async {
-    // TODO(brianwilkerson) This test is arguably invalid given that there's no
-    //  data to suggest that the boolean keywords should appear before a
-    //  constructor in the list, but it does seem likely to be valid in this
-    //  case, so we should investigate features that might cause this test to
-    //  start passing again.
     await addTestFile('''
 foo() {
   bool b;
diff --git a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
index b0ca4c6..8524de5 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/remove_unused_field_test.dart
@@ -192,6 +192,23 @@
 ''');
   }
 
+  Future<void> test_unusedField_notUsed_assign_nested() async {
+    await resolveTestCode(r'''
+class A {
+  var _f;
+  main() {
+    _f = () { _f = 0; };
+  }
+}
+''');
+    await assertHasFix(r'''
+class A {
+  main() {
+  }
+}
+''');
+  }
+
   Future<void> test_unusedField_notUsed_compoundAssign() async {
     await resolveTestCode(r'''
 class A {
diff --git a/sdk/lib/core/print.dart b/sdk/lib/core/print.dart
index d88ea7f..460a852 100644
--- a/sdk/lib/core/print.dart
+++ b/sdk/lib/core/print.dart
@@ -6,7 +6,7 @@
 
 /// Prints a string representation of the object to the console.
 void print(Object? object) {
-  String line = object.toString();
+  String line = checkNotNullable(object.toString(), "object.toString()");
   var toZone = printToZone;
   if (toZone == null) {
     printToConsole(line);
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 71f02d9..e7fd45a 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -749,8 +749,7 @@
 class NotNullableError<T> extends Error implements TypeError {
   final String _name;
   NotNullableError(this._name);
-  String toString() =>
-      "Null is not a valid value for the parameter '$_name' of type '$T'";
+  String toString() => "Null is not a valid value for '$_name' of type '$T'";
 }
 
 /// A function that returns the value or default value (if invoked with `null`
diff --git a/tests/co19/update.sh b/tests/co19/update.sh
index 85e8019..abce487 100755
--- a/tests/co19/update.sh
+++ b/tests/co19/update.sh
@@ -18,7 +18,7 @@
 NEW=$(cd $CO19 && git fetch origin && git rev-parse origin/master)
 
 git fetch origin
-git branch cl-co19-roll-co19-to-$NEW origin/master
+git branch cl-co19-roll-co19-to-$NEW origin/main
 git checkout cl-co19-roll-co19-to-$NEW
 
 # Build a cipd package of the commit.
@@ -50,7 +50,7 @@
   "$(printf "[co19] Roll co19 to $NEW\n\n" \
   && cd $CO19 \
   && git log --date='format:%Y-%m-%d' --pretty='format:%ad %ae %s' $OLD..$NEW \
-    | tr -d '#' \
+    | sed 's/\#/dart-lang\/co19\#/g' \
   && printf "\nCq-Include-Trybots: dart/try:$BUILDERS\n")"
 
 rm -rf tests/co19/src.git
diff --git a/tests/co19_2/update.sh b/tests/co19_2/update.sh
index 3bac8ab..b70d919 100755
--- a/tests/co19_2/update.sh
+++ b/tests/co19_2/update.sh
@@ -18,7 +18,7 @@
 NEW=$(cd $CO19 && git fetch origin && git rev-parse origin/pre-nnbd)
 
 git fetch origin
-git branch cl-co19-roll-co19-to-$NEW origin/master
+git branch cl-co19-roll-co19-to-$NEW origin/main
 git checkout cl-co19-roll-co19-to-$NEW
 
 # Build a cipd package of the commit.
@@ -33,32 +33,32 @@
 # Update DEPS:
 gclient setdep --var=co19_2_rev=$NEW
 
+BUILDERS=$(jq -r '.builder_configurations
+  | map(select(.steps
+    | any(.arguments
+      | select(.!=null)
+        | any(test("co19_2($|(/.*))")))))
+  | map(.builders)
+  | flatten
+  | sort
+  | .[] += "-try"
+  | join(",")' \
+  tools/bots/test_matrix.json)
+
 # Make a nice commit. Don't include the '#' character to avoid referencing Dart
 # SDK issues.
 git commit DEPS -m \
-  "$(printf "[co19] Roll co19_2 to $NEW\n\n" &&
-     cd $CO19 &&
-     git log --date='format:%Y-%m-%d' --pretty='format:%ad %ae %s' \
-       $OLD..$NEW | tr -d '#')"
+  "$(printf "[co19] Roll co19_2 to $NEW\n\n" \
+  && cd $CO19 \
+  && git log --date='format:%Y-%m-%d' --pretty='format:%ad %ae %s' $OLD..$NEW \
+    | sed 's/\#/dart-lang\/co19\#/g' \
+  && printf "\nCq-Include-Trybots: dart/try:$BUILDERS\n")"
 
 rm -rf tests/co19_2/src.git
 
 GIT_EDITOR=true git cl upload
 ISSUE=$(git config --get branch.cl-co19-roll-co19-to-$NEW.gerritissue)
 
-BUILDERS=$(jq '.builder_configurations|
-                map(select(.steps|
-                           any(.arguments|
-                               select(.!=null)|
-                               any(.=="co19_2"))))|
-                map(.builders)|
-                flatten|
-                sort' \
-                tools/bots/test_matrix.json \
-             | tr -d '[",]')
-
-git cl try -B dart/try $(for BUILDER in $BUILDERS; do echo -b $BUILDER-try; done)
-
 git cl web
 
 set +x
diff --git a/tools/VERSION b/tools/VERSION
index aa58cf1..84ea1f9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 141
+PRERELEASE 142
 PRERELEASE_PATCH 0
\ No newline at end of file
