You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by md...@apache.org on 2021/06/02 22:17:38 UTC

[solr] branch main updated: SOLR-15385 Address many rawtypes warnings (#107)

This is an automated email from the ASF dual-hosted git repository.

mdrob pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new c8e06a7  SOLR-15385 Address many rawtypes warnings (#107)
c8e06a7 is described below

commit c8e06a7298a2745c2b83102169073e2f8e8eceb5
Author: Mike Drob <md...@apache.org>
AuthorDate: Wed Jun 2 17:17:26 2021 -0500

    SOLR-15385 Address many rawtypes warnings (#107)
    
    Addressed significant usage of raw types with Class, Map, and SolrRequest; removed over 400 SuppressWarning annotations.
    
    Map construction was replaced with Map.of when immutability was possible, and Utils.makeMap when a mutable map was required.
    
    Discovered a potential bug in the PackageStore tests where not all assertions were being verified - these tests will be fixed separately.
    
    Co-authored-by: David Smiley <ds...@salesforce.com>
---
 solr/CHANGES.txt                                   |  2 +
 ...ExtractNamedEntitiesUpdateProcessorFactory.java |  2 -
 .../handler/clustering/ClusteringComponent.java    |  1 -
 .../java/org/apache/solr/ltr/feature/Feature.java  |  3 +-
 .../org/apache/solr/ltr/model/LTRScoringModel.java |  3 +-
 .../solr/ltr/store/rest/ManagedModelStore.java     |  1 -
 .../src/java/org/apache/solr/api/AnnotatedApi.java | 18 ++---
 solr/core/src/java/org/apache/solr/api/ApiBag.java |  6 +-
 .../apache/solr/api/ContainerPluginsRegistry.java  | 24 ++++---
 .../client/solrj/embedded/EmbeddedSolrServer.java  |  9 +--
 .../src/java/org/apache/solr/cloud/CloudUtil.java  |  3 +-
 .../apache/solr/cloud/OverseerTaskProcessor.java   |  1 -
 .../solr/cloud/ShardLeaderElectionContextBase.java | 13 ++--
 .../solr/cloud/api/collections/CollApiCmds.java    |  2 -
 .../api/collections/CollectionHandlingUtils.java   |  8 +--
 .../solr/cloud/api/collections/CreateAliasCmd.java |  1 -
 .../cloud/api/collections/DeleteReplicaCmd.java    |  2 -
 .../solr/cloud/api/collections/MigrateCmd.java     |  7 +-
 .../solr/cloud/api/collections/RestoreCmd.java     |  2 +-
 .../solr/cloud/api/collections/RoutedAlias.java    |  6 +-
 .../solr/cloud/overseer/CollectionMutator.java     |  3 +-
 .../apache/solr/cloud/overseer/ReplicaMutator.java |  4 +-
 .../apache/solr/cloud/overseer/SliceMutator.java   |  5 +-
 .../solr/cluster/placement/impl/MetricImpl.java    |  1 -
 .../java/org/apache/solr/core/BlobRepository.java  |  2 +-
 .../java/org/apache/solr/core/ConfigOverlay.java   | 63 ++++++++++--------
 .../java/org/apache/solr/core/CoreContainer.java   |  7 +-
 .../src/java/org/apache/solr/core/PluginBag.java   |  6 +-
 .../java/org/apache/solr/core/RequestParams.java   | 25 +++----
 .../src/java/org/apache/solr/core/SolrConfig.java  | 46 ++++++-------
 .../src/java/org/apache/solr/core/SolrCore.java    |  6 +-
 .../org/apache/solr/core/SolrResourceLoader.java   | 28 ++++----
 .../org/apache/solr/core/TracerConfigurator.java   |  2 +-
 .../java/org/apache/solr/handler/BlobHandler.java  |  8 +--
 .../java/org/apache/solr/handler/ClusterAPI.java   | 11 ++--
 .../apache/solr/handler/CollectionBackupsAPI.java  |  2 -
 .../org/apache/solr/handler/CollectionsAPI.java    |  3 -
 .../org/apache/solr/handler/ExportHandler.java     |  3 +-
 .../java/org/apache/solr/handler/GraphHandler.java |  4 +-
 .../java/org/apache/solr/handler/IndexFetcher.java |  4 +-
 .../apache/solr/handler/ReplicationHandler.java    |  4 +-
 .../org/apache/solr/handler/SchemaHandler.java     | 32 +++++----
 .../org/apache/solr/handler/SolrConfigHandler.java | 21 +++---
 .../org/apache/solr/handler/StreamHandler.java     | 27 +++-----
 .../solr/handler/admin/AdminHandlersProxy.java     | 12 ++--
 .../solr/handler/admin/BaseHandlerApiSupport.java  |  2 +-
 .../solr/handler/admin/CollectionsHandler.java     |  7 +-
 .../apache/solr/handler/admin/MetricsHandler.java  |  6 +-
 .../solr/handler/admin/SecurityConfHandler.java    |  3 +-
 .../solr/handler/component/ExpandComponent.java    |  3 -
 .../handler/component/SpellCheckComponent.java     |  1 -
 .../solr/handler/component/SuggestComponent.java   |  1 -
 .../apache/solr/handler/export/ExportWriter.java   |  4 +-
 .../apache/solr/handler/sql/SolrEnumerator.java    | 13 ++--
 .../org/apache/solr/handler/sql/SolrMethod.java    |  3 +-
 .../org/apache/solr/handler/sql/SolrTable.java     | 58 +++++++---------
 .../handler/sql/SolrToEnumerableConverter.java     |  9 +--
 .../solr/highlight/DefaultSolrHighlighter.java     |  3 -
 .../org/apache/solr/highlight/SolrHighlighter.java |  1 -
 .../solr/index/WrapperMergePolicyFactory.java      |  3 +-
 .../solr/legacy/LegacyNumericRangeQuery.java       |  2 +-
 .../java/org/apache/solr/metrics/MetricsMap.java   | 11 ++--
 .../org/apache/solr/metrics/SolrMetricManager.java |  3 +-
 .../apache/solr/packagemanager/PackageManager.java |  1 -
 .../src/java/org/apache/solr/pkg/PackageAPI.java   |  1 -
 .../solr/pkg/PackageListeningClassLoader.java      |  3 +-
 .../java/org/apache/solr/pkg/PackageLoader.java    |  3 +-
 .../apache/solr/request/SolrQueryRequestBase.java  |  3 +-
 .../org/apache/solr/request/SolrRequestInfo.java   |  1 -
 .../java/org/apache/solr/rest/ManagedResource.java |  1 -
 .../src/java/org/apache/solr/schema/BoolField.java |  2 +-
 .../org/apache/solr/schema/CurrencyFieldType.java  |  5 +-
 .../apache/solr/schema/FieldTypePluginLoader.java  |  9 +--
 .../java/org/apache/solr/schema/IndexSchema.java   |  5 +-
 .../org/apache/solr/schema/RandomSortField.java    |  2 +-
 .../org/apache/solr/schema/StrFieldSource.java     |  2 +-
 .../org/apache/solr/schema/TrieDoubleField.java    |  2 +-
 .../org/apache/solr/schema/TrieFloatField.java     |  2 +-
 .../java/org/apache/solr/schema/TrieIntField.java  |  2 +-
 .../java/org/apache/solr/schema/TrieLongField.java |  2 +-
 .../java/org/apache/solr/search/CacheConfig.java   |  1 +
 .../solr/search/FloatPayloadValueSource.java       |  3 +-
 .../org/apache/solr/search/SolrCoreParser.java     |  8 +--
 .../org/apache/solr/search/ValueSourceParser.java  | 19 ++----
 .../apache/solr/search/facet/AggValueSource.java   |  3 +-
 .../apache/solr/search/facet/FacetFieldMerger.java |  2 +-
 .../org/apache/solr/search/facet/FacetModule.java  |  1 -
 .../solr/search/facet/FacetRangeProcessor.java     |  1 -
 .../search/facet/FacetRequestSortedMerger.java     |  2 +-
 .../apache/solr/search/facet/RelatednessAgg.java   |  2 +-
 .../solr/search/facet/SimpleAggValueSource.java    |  3 +-
 .../java/org/apache/solr/search/facet/SlotAcc.java |  1 -
 .../apache/solr/search/facet/UnInvertedField.java  |  1 -
 .../search/function/CollapseScoreFunction.java     |  3 +-
 .../solr/search/function/FieldNameValueSource.java |  3 +-
 .../solr/search/function/FileFloatSource.java      |  4 +-
 .../solr/search/function/MultiStringFunction.java  |  3 +-
 .../solr/search/function/OrdFieldSource.java       |  3 +-
 .../search/function/ReverseOrdFieldSource.java     |  3 +-
 .../search/function/distance/GeohashFunction.java  |  5 +-
 .../distance/GeohashHaversineFunction.java         |  7 +-
 .../function/distance/HaversineConstFunction.java  |  7 +-
 .../function/distance/HaversineFunction.java       |  7 +-
 .../function/distance/StringDistanceFunction.java  |  5 +-
 .../function/distance/VectorDistanceFunction.java  |  7 +-
 .../distributed/command/TopGroupsFieldCommand.java |  1 -
 .../search/join/ChildFieldValueSourceParser.java   |  2 +-
 .../java/org/apache/solr/servlet/HttpSolrCall.java |  3 +-
 .../solr/servlet/cache/HttpCacheHeaderUtil.java    |  1 -
 .../solr/spelling/suggest/SolrSuggester.java       |  3 +-
 .../org/apache/solr/update/IndexFingerprint.java   | 10 +--
 .../org/apache/solr/update/SolrIndexConfig.java    | 36 +++++-----
 .../src/java/org/apache/solr/update/UpdateLog.java |  4 +-
 ...AbstractDefaultValueUpdateProcessorFactory.java |  1 -
 .../processor/AtomicUpdateDocumentMerger.java      |  3 +-
 .../processor/AtomicUpdateProcessorFactory.java    |  3 +-
 .../CloneFieldUpdateProcessorFactory.java          |  2 -
 .../ConcatFieldUpdateProcessorFactory.java         |  1 -
 .../DefaultValueUpdateProcessorFactory.java        |  1 -
 .../processor/DistributedZkUpdateProcessor.java    |  2 +-
 .../DocExpirationUpdateProcessorFactory.java       |  1 -
 .../FieldLengthUpdateProcessorFactory.java         |  1 -
 .../processor/FieldMutatingUpdateProcessor.java    | 11 ++--
 .../FieldMutatingUpdateProcessorFactory.java       |  1 -
 .../processor/RegexReplaceProcessorFactory.java    |  1 -
 .../RemoveBlankFieldUpdateProcessorFactory.java    |  1 -
 .../processor/TrimFieldUpdateProcessorFactory.java |  1 -
 .../TruncateFieldUpdateProcessorFactory.java       |  1 -
 .../processor/UUIDUpdateProcessorFactory.java      |  1 -
 .../processor/UpdateRequestProcessorChain.java     | 20 ++----
 .../org/apache/solr/util/ConcurrentLRUCache.java   |  4 +-
 .../src/java/org/apache/solr/util/SolrCLI.java     |  1 -
 .../java/org/apache/solr/util/SolrLogLayout.java   |  3 +-
 .../java/org/apache/solr/util/TestInjection.java   |  7 +-
 .../util/circuitbreaker/CircuitBreakerManager.java |  1 -
 .../SSLCredentialProviderFactory.java              |  5 +-
 .../solr/util/plugin/AbstractPluginLoader.java     |  1 -
 .../org/apache/solr/util/stats/MetricUtils.java    |  2 -
 .../test/org/apache/hadoop/http/HttpServer2.java   |  3 -
 .../org/apache/solr/TestDistributedGrouping.java   |  1 -
 .../apache/solr/analysis/TokenizerChainTest.java   |  7 +-
 .../DistribDocExpirationUpdateProcessorTest.java   | 13 ++--
 .../OverseerCollectionConfigSetProcessorTest.java  |  2 +-
 .../org/apache/solr/cloud/ReplaceNodeTest.java     |  1 -
 .../test/org/apache/solr/cloud/RouteFieldTest.java |  6 +-
 .../org/apache/solr/cloud/SSLMigrationTest.java    | 12 +---
 .../solr/cloud/TestConfigSetsAPIShareSchema.java   |  3 +-
 .../org/apache/solr/cloud/TestHashPartitioner.java |  1 -
 .../apache/solr/cloud/TestSSLRandomization.java    | 28 ++++----
 .../solr/cloud/TestStressInPlaceUpdates.java       |  1 -
 .../solr/cloud/api/collections/ShardSplitTest.java |  4 +-
 .../cloud/overseer/TestClusterStateMutator.java    |  6 +-
 .../solr/core/BlobRepositoryMockingTest.java       |  4 --
 .../test/org/apache/solr/core/CoreSorterTest.java  | 12 ++--
 .../solr/core/CountUsageValueSourceParser.java     |  2 +-
 .../org/apache/solr/core/FakeDeletionPolicy.java   |  7 +-
 .../org/apache/solr/core/ResourceLoaderTest.java   |  7 +-
 .../org/apache/solr/core/TestConfigOverlay.java    |  3 +-
 .../test/org/apache/solr/core/TestInitParams.java  |  9 ++-
 .../solr/filestore/TestDistribPackageStore.java    | 66 +++++++++++--------
 .../apache/solr/handler/TestContainerPlugin.java   |  4 +-
 .../solr/handler/TestSolrConfigHandlerCloud.java   |  4 +-
 .../solr/handler/admin/MetricsHandlerTest.java     |  8 +--
 .../handler/admin/SecurityConfHandlerTest.java     |  9 +--
 .../solr/handler/admin/TestApiFramework.java       | 12 ++--
 .../apache/solr/handler/admin/TestConfigsApi.java  |  2 +-
 .../solr/handler/admin/TestCoreAdminApis.java      |  3 +-
 .../DistributedFacetPivotLongTailTest.java         |  1 -
 .../component/ResourceSharingTestComponent.java    |  1 -
 .../handler/component/SpellCheckComponentTest.java |  2 -
 .../src/test/org/apache/solr/pkg/TestPackages.java | 77 ++++++++++++----------
 .../solr/response/TestGraphMLResponseWriter.java   |  1 -
 .../response/TestJavabinTupleStreamParser.java     |  8 +--
 .../apache/solr/schema/SchemaApiFailureTest.java   |  3 +-
 .../apache/solr/search/RankQueryTestPlugin.java    |  4 +-
 .../solr/search/TestMaxScoreQueryParser.java       |  6 +-
 .../org/apache/solr/search/TestTaskManagement.java |  1 -
 .../search/facet/TestCloudJSONFacetSKGEquiv.java   |  6 +-
 .../solr/security/BasicAuthIntegrationTest.java    |  4 +-
 .../security/PKIAuthenticationIntegrationTest.java |  6 +-
 .../solr/spelling/SpellCheckCollatorTest.java      |  1 -
 .../test/org/apache/solr/update/TestUpdate.java    |  2 +-
 .../org/apache/solr/util/TestCircuitBreaker.java   |  1 -
 .../apache/solr/util/stats/MetricUtilsTest.java    |  1 -
 .../org/apache/solr/client/solrj/SolrClient.java   |  4 +-
 .../client/solrj/beans/DocumentObjectBinder.java   | 16 ++---
 .../org/apache/solr/client/solrj/beans/Field.java  |  2 +-
 .../client/solrj/cloud/DelegatingCloudManager.java |  2 +-
 .../solr/client/solrj/cloud/SolrCloudManager.java  |  2 +-
 .../client/solrj/impl/BaseCloudSolrClient.java     |  9 ++-
 .../solrj/impl/BaseHttpClusterStateProvider.java   |  5 +-
 .../client/solrj/impl/ClusterStateProvider.java    |  5 +-
 .../solrj/impl/Http2ClusterStateProvider.java      |  1 -
 .../solrj/impl/HttpClusterStateProvider.java       |  1 -
 .../solr/client/solrj/impl/LBHttpSolrClient.java   |  4 +-
 .../solr/client/solrj/impl/LBSolrClient.java       |  1 +
 .../client/solrj/impl/SolrClientCloudManager.java  |  2 +-
 .../solrj/impl/SolrClientNodeStateProvider.java    |  6 +-
 .../solrj/impl/SolrHttpRequestRetryHandler.java    |  1 -
 .../apache/solr/client/solrj/io/ModelCache.java    |  2 +-
 .../client/solrj/io/eval/FieldValueEvaluator.java  |  1 -
 .../solr/client/solrj/io/eval/IsNullEvaluator.java |  5 +-
 .../client/solrj/io/eval/NotNullEvaluator.java     |  5 +-
 .../client/solrj/io/graph/GatherNodesStream.java   |  5 +-
 .../client/solrj/io/sql/ResultSetMetaDataImpl.java |  3 +-
 .../solr/client/solrj/io/stream/SelectStream.java  |  1 -
 .../solr/client/solrj/io/stream/StreamContext.java | 25 +++----
 .../client/solrj/io/stream/expr/Explanation.java   |  3 +-
 .../solrj/io/stream/expr/StreamExplanation.java    |  1 -
 .../client/solrj/io/stream/expr/StreamFactory.java | 53 ++++++---------
 .../solrj/request/CollectionAdminRequest.java      |  4 +-
 .../client/solrj/request/CollectionApiMapping.java | 28 ++++----
 .../solr/client/solrj/request/CoreApiMapping.java  | 14 ++--
 .../solr/client/solrj/request/RequestWriter.java   |  4 +-
 .../solr/client/solrj/request/UpdateRequest.java   |  3 +-
 .../client/solrj/response/SpellCheckResponse.java  |  1 -
 .../solrj/response/schema/SchemaResponse.java      | 11 ----
 .../org/apache/solr/common/MapSerializable.java    |  3 +-
 .../src/java/org/apache/solr/common/MapWriter.java |  2 +-
 .../java/org/apache/solr/common/MapWriterMap.java  |  9 +--
 .../java/org/apache/solr/common/SolrException.java |  1 -
 .../java/org/apache/solr/common/cloud/Aliases.java |  1 -
 .../apache/solr/common/cloud/SolrClassLoader.java  |  3 +-
 .../org/apache/solr/common/cloud/ZkNodeProps.java  |  6 +-
 .../apache/solr/common/cloud/ZkStateReader.java    | 20 +++---
 .../apache/solr/common/util/CommandOperation.java  |  5 +-
 .../apache/solr/common/util/JsonSchemaCreator.java |  5 +-
 .../solr/common/util/JsonSchemaValidator.java      |  5 +-
 .../src/java/org/apache/solr/common/util/Pair.java |  5 +-
 .../org/apache/solr/common/util/RetryUtil.java     | 20 +++---
 .../java/org/apache/solr/common/util/Utils.java    | 28 +++++---
 .../solrj/io/stream/CloudAuthStreamTest.java       | 19 +++---
 .../solrj/request/TestUpdateRequestCodec.java      | 12 ++--
 .../routing/NodePreferenceRulesComparatorTest.java | 11 ++--
 ...RequestReplicaListTransformerGeneratorTest.java | 13 ++--
 .../org/apache/solr/common/util/NamedListTest.java |  8 +--
 .../apache/solr/common/util/TestJavaBinCodec.java  | 29 ++++----
 .../org/apache/solr/common/util/TestRetryUtil.java | 53 +++++++--------
 .../solr/common/util/TestSolrJsonWriter.java       |  2 +-
 .../solr/common/util/TestValidatingJsonMap.java    |  6 +-
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   | 38 +++++------
 .../solr/cloud/AbstractFullDistribZkTestBase.java  | 17 ++---
 .../org/apache/solr/cloud/CloudInspectUtil.java    |  1 -
 .../java/org/apache/solr/cloud/ZkTestServer.java   |  6 +-
 .../java/org/apache/solr/util/RandomizeSSL.java    | 28 ++++----
 245 files changed, 768 insertions(+), 1045 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e1330ca..7f44a2e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -301,6 +301,8 @@ Other Changes
 
 * SOLR-15439: Upgrade jose4j library used for JWT authentication processing, to v0.7.7 (janhoy)
 
+* SOLR-15385: Address many rawtypes warnings, resulting in several modified signatures in the public API. (Mike Drob, David Smiley)
+
 Bug Fixes
 ---------------------
 * SOLR-14546: Fix for a relatively hard to hit issue in OverseerTaskProcessor that could lead to out of order execution
diff --git a/solr/contrib/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java b/solr/contrib/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
index 9fcf5ca..7e60e9a 100644
--- a/solr/contrib/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
+++ b/solr/contrib/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
@@ -213,7 +213,6 @@ public class OpenNLPExtractNamedEntitiesUpdateProcessorFactory
     throw new SolrException(SERVER_ERROR, "selector was never initialized, inform(SolrCore) never called???");
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
@@ -259,7 +258,6 @@ public class OpenNLPExtractNamedEntitiesUpdateProcessorFactory
    * init helper method that should only be called when we know for certain that both the
    * "source" and "dest" init params do <em>not</em> exist.
    */
-  @SuppressWarnings("unchecked")
   private void initSimpleRegexReplacement(@SuppressWarnings({"rawtypes"})NamedList args) {
     // The syntactic sugar for the case where there is only one regex pattern for source and the same pattern
     // is used for the destination pattern...
diff --git a/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java b/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
index 3c0e06e..7d728f4 100644
--- a/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
+++ b/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
@@ -243,7 +243,6 @@ public class ClusteringComponent extends SearchComponent implements SolrCoreAwar
     }
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public void inform(SolrCore core) {
     declaredEngines.forEach(engineEntry -> {
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
index 52a0cef..df6b60c 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/feature/Feature.java
@@ -68,14 +68,13 @@ public abstract class Feature extends Query implements Accountable {
 
   final private Map<String,Object> params;
 
-  @SuppressWarnings({"rawtypes"})
   public static Feature getInstance(SolrResourceLoader solrResourceLoader,
       String className, String name, Map<String,Object> params) {
     final Feature f = solrResourceLoader.newInstance(
         className,
         Feature.class,
         new String[0], // no sub packages
-        new Class[] { String.class, Map.class },
+        new Class<?>[] { String.class, Map.class },
         new Object[] { name, params });
     if (params != null) {
       SolrPluginUtils.invokeSetters(f, params.entrySet());
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
index e148759..b1fb21f 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/model/LTRScoringModel.java
@@ -89,7 +89,6 @@ public abstract class LTRScoringModel implements Accountable {
   protected final List<Normalizer> norms;
   private Integer hashCode; // cached since it shouldn't actually change after construction
 
-  @SuppressWarnings({"rawtypes"})
   public static LTRScoringModel getInstance(SolrResourceLoader solrResourceLoader,
       String className, String name, List<Feature> features,
       List<Normalizer> norms,
@@ -102,7 +101,7 @@ public abstract class LTRScoringModel implements Accountable {
           className,
           LTRScoringModel.class,
           new String[0], // no sub packages
-          new Class[] { String.class, List.class, List.class, String.class, List.class, Map.class },
+          new Class<?>[] { String.class, List.class, List.class, String.class, List.class, Map.class },
           new Object[] { name, features, norms, featureStoreName, allFeatures, params });
       if (params != null) {
         SolrPluginUtils.invokeSetters(model, params.entrySet());
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/store/rest/ManagedModelStore.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/store/rest/ManagedModelStore.java
index 0627d79..b4f3c42 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/store/rest/ManagedModelStore.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/store/rest/ManagedModelStore.java
@@ -105,7 +105,6 @@ public class ManagedModelStore extends ManagedResource implements ManagedResourc
 
   private Object managedData;
 
-  @SuppressWarnings("unchecked")
   @Override
   protected void onManagedDataLoadedFromStorage(NamedList<?> managedInitArgs,
       Object managedData) throws SolrException {
diff --git a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
index 7b57069..628aca7 100644
--- a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
+++ b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
@@ -101,14 +101,14 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
    *                then absence of Api-s is silently ignored.
    * @return list of discovered Api-s
    */
-  public static List<Api> getApis(Class<? extends Object> theClass , Object obj, boolean allowEmpty)  {
+  public static List<Api> getApis(Class<?> theClass , Object obj, boolean allowEmpty)  {
     Class<?> klas = null;
     try {
       klas = MethodHandles.publicLookup().accessClass(theClass);
     } catch (IllegalAccessException e) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Method may be non-public/inaccessible", e);
     }
-    if (klas.getAnnotation(EndPoint.class) != null) {
+    if (klas.isAnnotationPresent(EndPoint.class)) {
       EndPoint endPoint = klas.getAnnotation(EndPoint.class);
       List<Method> methods = new ArrayList<>();
       Map<String, Cmd> commands = new HashMap<>();
@@ -158,10 +158,9 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
     return endPoint.permission();
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
   private static SpecProvider readSpec(EndPoint endPoint, List<Method> m) {
     return () -> {
-      Map map = new LinkedHashMap();
+      Map<String, Object> map = new LinkedHashMap<>();
       List<String> methods = new ArrayList<>();
       for (SolrRequest.METHOD method : endPoint.method()) {
         methods.add(method.name());
@@ -229,8 +228,7 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
     final Object obj;
 
     int paramsCount;
-    @SuppressWarnings({"rawtypes"})
-    Class parameterClass;
+    Class<?> parameterClass;
     boolean isWrappedInPayloadObj = false;
 
 
@@ -258,7 +256,6 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
       }
     }
 
-    @SuppressWarnings("rawtypes")
     private void readPayloadType(Type t) {
       if (t instanceof ParameterizedType) {
         ParameterizedType typ = (ParameterizedType) t;
@@ -272,18 +269,17 @@ public class AnnotatedApi extends Api implements PermissionNameProvider , Closea
           Type t1 = typ.getActualTypeArguments()[0];
           if (t1 instanceof ParameterizedType) {
             ParameterizedType parameterizedType = (ParameterizedType) t1;
-            parameterClass = (Class) parameterizedType.getRawType();
+            parameterClass = (Class<?>) parameterizedType.getRawType();
           } else {
-            parameterClass = (Class) typ.getActualTypeArguments()[0];
+            parameterClass = (Class<?>) typ.getActualTypeArguments()[0];
           }
         }
       } else {
-        parameterClass = (Class) t;
+        parameterClass = (Class<?>) t;
       }
     }
 
 
-    @SuppressWarnings({"unchecked"})
     void invoke(SolrQueryRequest req, SolrQueryResponse rsp, CommandOperation cmd) {
       Object original = null;
       try {
diff --git a/solr/core/src/java/org/apache/solr/api/ApiBag.java b/solr/core/src/java/org/apache/solr/api/ApiBag.java
index 8b64829..aa64cec 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -70,17 +70,15 @@ public class ApiBag {
   /**Register a POJO annotated with {@link EndPoint}
    * @param o the instance to be used for invocations
    */
-  @SuppressWarnings({"unchecked"})
   public synchronized List<Api> registerObject(Object o) {
     List<Api> l = AnnotatedApi.getApis(o);
     for (Api api : l) {
-      register(api, Collections.EMPTY_MAP);
+      register(api, Collections.emptyMap());
     }
     return l;
   }
-  @SuppressWarnings({"unchecked"})
   public synchronized void register(Api api) {
-    register(api, Collections.EMPTY_MAP);
+    register(api, Collections.emptyMap());
   }
   public synchronized void register(Api api, Map<String, String> nameSubstitutes) {
     try {
diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index e92f715..06015b4 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -56,7 +56,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.lucene.util.IOUtils.closeWhileHandlingException;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 /**
  * This class manages the container-level plugins and their Api-s. It is
@@ -253,9 +252,8 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
     return path;
   }
 
-  @SuppressWarnings({"rawtypes", "unchecked"})
-  private static  Map<String, String> getTemplateVars(PluginMeta pluginMeta) {
-    return (Map) makeMap("plugin-name", pluginMeta.name, "path-prefix", pluginMeta.pathPrefix);
+  private static Map<String, String> getTemplateVars(PluginMeta pluginMeta) {
+    return Utils.makeMap("plugin-name", pluginMeta.name, "path-prefix", pluginMeta.pathPrefix);
   }
 
   private static class ApiHolder extends Api {
@@ -294,7 +292,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
     public final String pkg;
 
     private PackageLoader.Package.Version pkgVersion;
-    private Class klas;
+    private Class<?> klas;
     Object instance;
 
     ApiHolder get(EndPoint endPoint) {
@@ -315,7 +313,6 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
     public PluginMeta getInfo() {
       return info.copy();
     }
-    @SuppressWarnings({"unchecked","rawtypes"})
     public ApiInfo(PluginMetaHolder infoHolder, List<String> errs) {
       this.holder = infoHolder;
       this.info = infoHolder.meta;
@@ -394,7 +391,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
     }
 
-    @SuppressWarnings({"rawtypes", "unchecked"})
+    @SuppressWarnings({"unchecked"})
     public void init() throws Exception {
       if (this.holders != null) return;
       Constructor constructor = klas.getConstructors()[0];
@@ -410,7 +407,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         if (c != null) {
           Map<String, Object> original = (Map<String, Object>) holder.original.getOrDefault("config", Collections.emptyMap());
           holder.meta.config = mapper.readValue(Utils.toJSON(original), c);
-          ((ConfigurablePlugin) instance).configure(holder.meta.config);
+          ((ConfigurablePlugin<MapWriter>) instance).configure(holder.meta.config);
 
         }
       }
@@ -432,9 +429,9 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
   /**
    * Get the generic type of a {@link ConfigurablePlugin}
    */
-  @SuppressWarnings("rawtypes")
-  public static Class getConfigClass(ConfigurablePlugin<?> o) {
-    Class klas = o.getClass();
+  @SuppressWarnings("unchecked")
+  public static <T extends MapWriter> Class<T> getConfigClass(ConfigurablePlugin<T> o) {
+    Class<?> klas = o.getClass();
     do {
       Type[] interfaces = klas.getGenericInterfaces();
       for (Type type : interfaces) {
@@ -443,8 +440,9 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
           Type rawType = parameterizedType.getRawType();
           if (rawType == ConfigurablePlugin.class ||
               // or if a super interface is a ConfigurablePlugin
-              ((rawType instanceof Class) && ConfigurablePlugin.class.isAssignableFrom((Class) rawType))) {
-            return (Class) parameterizedType.getActualTypeArguments()[0];
+              ((rawType instanceof Class<?>) && ConfigurablePlugin.class.isAssignableFrom((Class<?>) rawType))) {
+
+            return (Class<T>) parameterizedType.getActualTypeArguments()[0];
           }
         }
       }
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
index 62cc25e..1066c3e 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
@@ -156,8 +156,7 @@ public class EmbeddedSolrServer extends SolrClient {
   // It *should* be able to convert the response directly into a named list.
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public NamedList<Object> request(@SuppressWarnings({"rawtypes"})SolrRequest request, String coreName) throws SolrServerException, IOException {
+  public NamedList<Object> request(SolrRequest<?> request, String coreName) throws SolrServerException, IOException {
 
     String path = request.getPath();
     if (path == null || !path.startsWith("/")) {
@@ -253,7 +252,9 @@ public class EmbeddedSolrServer extends SolrClient {
             createJavaBinCodec(callback, resolver).setWritableDocFields(resolver).marshal(rsp.getValues(), out);
 
             try (InputStream in = out.toInputStream()) {
-              return (NamedList<Object>) new JavaBinCodec(resolver).unmarshal(in);
+              @SuppressWarnings({"unchecked"})
+              NamedList<Object> resolved = (NamedList<Object>) new JavaBinCodec(resolver).unmarshal(in);
+              return resolved;
             }
           }
         } catch (Exception ex) {
@@ -276,7 +277,7 @@ public class EmbeddedSolrServer extends SolrClient {
     }
   }
 
-  private Set<ContentStream> getContentStreams(@SuppressWarnings({"rawtypes"})SolrRequest request) throws IOException {
+  private Set<ContentStream> getContentStreams(SolrRequest<?> request) throws IOException {
     if (request.getMethod() == SolrRequest.METHOD.GET) return null;
     if (request instanceof ContentStreamUpdateRequest) {
       final ContentStreamUpdateRequest csur = (ContentStreamUpdateRequest) request;
diff --git a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
index d98f783..b4e5452 100644
--- a/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
+++ b/solr/core/src/java/org/apache/solr/cloud/CloudUtil.java
@@ -130,7 +130,6 @@ public class CloudUtil {
   /**Read the list of public keys from ZK
    */
 
-  @SuppressWarnings({"unchecked"})
   public static Map<String, byte[]> getTrustedKeys(SolrZkClient zk, String dir) {
     Map<String, byte[]> result = new HashMap<>();
     try {
@@ -141,7 +140,7 @@ public class CloudUtil {
       }
     } catch (KeeperException.NoNodeException e) {
       log.info("Error fetching key names");
-      return Collections.EMPTY_MAP;
+      return Collections.emptyMap();
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       throw new SolrException(ErrorCode.SERVER_ERROR,"Unable to read crypto keys",e );
diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerTaskProcessor.java b/solr/core/src/java/org/apache/solr/cloud/OverseerTaskProcessor.java
index e496d14..d35583c 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerTaskProcessor.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerTaskProcessor.java
@@ -487,7 +487,6 @@ public class OverseerTaskProcessor implements Runnable, Closeable {
     return isClosed;
   }
 
-  @SuppressWarnings("unchecked")
   private void markTaskAsRunning(QueueEvent head, String asyncId)
       throws KeeperException, InterruptedException {
     runningZKTasks.add(head.getId());
diff --git a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
index 2118ad0..fc87008 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContextBase.java
@@ -117,7 +117,7 @@ class ShardLeaderElectionContextBase extends ElectionContext {
 
     String parent = ZkMaintenanceUtils.getZkParent(leaderPath);
     try {
-      RetryUtil.retryOnThrowable(NodeExistsException.class, 60000, 5000, () -> {
+      RetryUtil.retryOnException(NodeExistsException.class, 60000, 5000, () -> {
         synchronized (lock) {
           log.info("Creating leader registration node {} after winning as {}", leaderPath, leaderSeqPath);
           List<Op> ops = new ArrayList<>(2);
@@ -147,10 +147,9 @@ class ShardLeaderElectionContextBase extends ElectionContext {
     } catch (NoNodeException e) {
       log.info("Will not register as leader because it seems the election is no longer taking place.");
       return;
+    } catch (OutOfMemoryError e) {
+      throw e;
     } catch (Throwable t) {
-      if (t instanceof OutOfMemoryError) {
-        throw (OutOfMemoryError) t;
-      }
       throw new SolrException(ErrorCode.SERVER_ERROR, "Could not register as the leader because creating the ephemeral registration node in ZooKeeper failed", t);
     }
 
@@ -166,11 +165,11 @@ class ShardLeaderElectionContextBase extends ElectionContext {
       }
     }
     if (!isAlreadyLeader) {
-      ZkNodeProps m = ZkNodeProps.fromKeyVals(Overseer.QUEUE_OPERATION, OverseerAction.LEADER.toLower(),
+      ZkNodeProps m = new ZkNodeProps(Overseer.QUEUE_OPERATION, OverseerAction.LEADER.toLower(),
           ZkStateReader.SHARD_ID_PROP, shardId,
           ZkStateReader.COLLECTION_PROP, collection,
-          ZkStateReader.NODE_NAME_PROP, leaderProps.get(ZkStateReader.NODE_NAME_PROP),
-          ZkStateReader.CORE_NAME_PROP, leaderProps.get(ZkStateReader.CORE_NAME_PROP),
+          ZkStateReader.NODE_NAME_PROP, leaderProps.getStr(ZkStateReader.NODE_NAME_PROP),
+          ZkStateReader.CORE_NAME_PROP, leaderProps.getStr(ZkStateReader.CORE_NAME_PROP),
           ZkStateReader.STATE_PROP, Replica.State.ACTIVE.toString());
       assert zkController != null;
       assert zkController.getOverseer() != null;
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollApiCmds.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollApiCmds.java
index 164ee63..be1fc30 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollApiCmds.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollApiCmds.java
@@ -184,7 +184,6 @@ public class CollApiCmds {
       this.ccc = ccc;
     }
 
-    @SuppressWarnings("unchecked")
     public void call(ClusterState clusterState, ZkNodeProps message, @SuppressWarnings({"rawtypes"}) NamedList results)
         throws Exception {
       CollectionHandlingUtils.checkRequired(message, COLLECTION_PROP, SHARD_ID_PROP, CORE_NAME_PROP, ELECTION_NODE_PROP,
@@ -221,7 +220,6 @@ public class CollApiCmds {
       this.ccc = ccc;
     }
 
-    @SuppressWarnings("unchecked")
     public void call(ClusterState clusterState, ZkNodeProps message, @SuppressWarnings({"rawtypes"})NamedList results)
         throws Exception {
       CollectionHandlingUtils.checkRequired(message, COLLECTION_PROP, SHARD_ID_PROP, REPLICA_PROP, PROPERTY_PROP, PROPERTY_VALUE_PROP);
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
index b3358a4..f56c9aa 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
@@ -72,7 +72,6 @@ import org.slf4j.LoggerFactory;
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETE;
 import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
 import static org.apache.solr.common.params.CommonParams.NAME;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 /**
  * This class contains helper methods used by commands of the Collection API. Previously these methods were in
@@ -103,7 +102,8 @@ public class CollectionHandlingUtils {
 
   static final String SKIP_CREATE_REPLICA_IN_CLUSTER_STATE = "skipCreateReplicaInClusterState";
 
-  public static final Map<String, Object> COLLECTION_PROPS_AND_DEFAULTS = Collections.unmodifiableMap(makeMap(
+  // Immutable Maps are null-hostile, so build our own
+  public static final Map<String, Object> COLLECTION_PROPS_AND_DEFAULTS = Collections.unmodifiableMap(Utils.makeMap(
       ROUTER, DocRouter.DEFAULT_NAME,
       ZkStateReader.REPLICATION_FACTOR, "1",
       ZkStateReader.NRT_REPLICAS, "1",
@@ -253,7 +253,7 @@ public class CollectionHandlingUtils {
 
   static void cleanupCollection(String collectionName, @SuppressWarnings({"rawtypes"})NamedList results, CollectionCommandContext ccc) throws Exception {
     log.error("Cleaning up collection [{}].", collectionName);
-    Map<String, Object> props = makeMap(
+    Map<String, Object> props = Map.of(
         Overseer.QUEUE_OPERATION, DELETE.toLower(),
         NAME, collectionName);
     new DeleteCollectionCmd(ccc).call(ccc.getZkStateReader().getClusterState(), new ZkNodeProps(props), results);
@@ -316,7 +316,7 @@ public class CollectionHandlingUtils {
     if (configName != null) {
       String collDir = ZkStateReader.COLLECTIONS_ZKNODE + "/" + coll;
       log.debug("creating collections conf node {} ", collDir);
-      byte[] data = Utils.toJSON(makeMap(ZkController.CONFIGNAME_PROP, configName));
+      byte[] data = Utils.toJSON(Map.of(ZkController.CONFIGNAME_PROP, configName));
       if (stateManager.hasData(collDir)) {
         stateManager.setData(collDir, data, -1);
       } else {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
index 18b0b5b..a05b8d4 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
@@ -107,7 +107,6 @@ public class CreateAliasCmd extends AliasCmd {
         .collect(Collectors.toList());
   }
 
-  @SuppressWarnings("unchecked")
   private void callCreateRoutedAlias(ZkNodeProps message, String aliasName, ZkStateReader zkStateReader, ClusterState state) throws Exception {
     // Validate we got a basic minimum
     if (!message.getProperties().keySet().containsAll(RoutedAlias.MINIMAL_REQUIRED_PARAMS)) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteReplicaCmd.java
index b9b43b1..2448827 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteReplicaCmd.java
@@ -63,13 +63,11 @@ public class DeleteReplicaCmd implements CollectionApiCommand {
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public void call(ClusterState clusterState, ZkNodeProps message, @SuppressWarnings({"rawtypes"})NamedList results) throws Exception {
     deleteReplica(clusterState, message, results,null);
   }
 
 
-  @SuppressWarnings("unchecked")
   void deleteReplica(ClusterState clusterState, ZkNodeProps message, @SuppressWarnings({"rawtypes"})NamedList results, Runnable onComplete)
           throws KeeperException, IOException, InterruptedException {
     if (log.isDebugEnabled()) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateCmd.java
index 80818a8..d17f28f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateCmd.java
@@ -58,7 +58,6 @@ import static org.apache.solr.common.params.CollectionParams.CollectionAction.CR
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.DELETE;
 import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
 import static org.apache.solr.common.params.CommonParams.NAME;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 public class MigrateCmd implements CollApiCmds.CollectionApiCommand {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -141,7 +140,7 @@ public class MigrateCmd implements CollApiCmds.CollectionApiCommand {
     ZkStateReader zkStateReader = ccc.getZkStateReader();
     if (clusterState.hasCollection(tempSourceCollectionName)) {
       log.info("Deleting temporary collection: {}", tempSourceCollectionName);
-      Map<String, Object> props = makeMap(
+      Map<String, Object> props = Map.of(
           Overseer.QUEUE_OPERATION, DELETE.toLower(),
           NAME, tempSourceCollectionName);
 
@@ -232,7 +231,7 @@ public class MigrateCmd implements CollApiCmds.CollectionApiCommand {
 
     // create a temporary collection with just one node on the shard leader
     String configName = zkStateReader.readConfigName(sourceCollection.getName());
-    Map<String, Object> props = makeMap(
+    Map<String, Object> props = Utils.makeMap(
         Overseer.QUEUE_OPERATION, CREATE.toLower(),
         NAME, tempSourceCollectionName,
         NRT_REPLICAS, 1,
@@ -370,7 +369,7 @@ public class MigrateCmd implements CollApiCmds.CollectionApiCommand {
     }
     try {
       log.info("Deleting temporary collection: {}", tempSourceCollectionName);
-      props = makeMap(
+      props = Map.of(
           Overseer.QUEUE_OPERATION, DELETE.toLower(),
           NAME, tempSourceCollectionName);
       new DeleteCollectionCmd(ccc).call(zkStateReader.getClusterState(), new ZkNodeProps(props), results);
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
index 1ee8c18..fb76bfc 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
@@ -86,7 +86,7 @@ public class RestoreCmd implements CollApiCmds.CollectionApiCommand {
   }
 
   @Override
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"rawtypes"})
   public void call(ClusterState state, ZkNodeProps message, NamedList results) throws Exception {
     try (RestoreContext restoreContext = new RestoreContext(message, ccc)) {
       if (state.hasCollection(restoreContext.restoreCollectionName)) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
index cb53e23..c72d16f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
@@ -105,10 +105,10 @@ public abstract class RoutedAlias {
 
         // v2 api case - the v2 -> v1 mapping mechanisms can't handle this conversion because they expect
         // strings or arrays of strings, not lists of objects.
+        // TODO: The generic types for props are a lie
         if (props.containsKey("router.routerList")) {
-          @SuppressWarnings({"unchecked", "rawtypes"})
-          HashMap tmp = new HashMap(props);
-          @SuppressWarnings({"unchecked", "rawtypes"})
+          HashMap<String, Object> tmp = new HashMap<>(props);
+          @SuppressWarnings({"unchecked"})
           List<Map<String, Object>> v2RouterList = (List<Map<String, Object>>) tmp.get("router.routerList");
           Map<String, Object> o = v2RouterList.get(i);
           for (Map.Entry<String, Object> entry : o.entrySet()) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
index 94c89a0..472d1b2 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/CollectionMutator.java
@@ -53,8 +53,7 @@ public class CollectionMutator {
     DocCollection collection = clusterState.getCollection(collectionName);
     Slice slice = collection.getSlice(shardId);
     if (slice == null) {
-      @SuppressWarnings({"unchecked"})
-      Map<String, Replica> replicas = Collections.EMPTY_MAP;
+      Map<String, Replica> replicas = Collections.emptyMap();
       Map<String, Object> sliceProps = new HashMap<>();
       String shardRange = message.getStr(ZkStateReader.SHARD_RANGE_PROP);
       String shardState = message.getStr(ZkStateReader.SHARD_STATE_PROP);
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
index f96acfc..96efbb8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
@@ -47,7 +47,6 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.TestInjection;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -247,7 +246,8 @@ public class ReplicaMutator {
     boolean collectionExists = prevState.hasCollection(cName);
     if (!collectionExists && numShards != null) {
       ClusterStateMutator.getShardNames(numShards, shardNames);
-      Map<String, Object> createMsg = Utils.makeMap(NAME, cName);
+      Map<String, Object> createMsg = new HashMap<>();
+      createMsg.put(NAME, cName);
       createMsg.putAll(message.getProperties());
       writeCommand = new ClusterStateMutator(cloudManager).createCollection(prevState, new ZkNodeProps(createMsg));
       DocCollection collection = writeCommand.collection;
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
index 97285cc..4d7d93b 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/SliceMutator.java
@@ -40,11 +40,11 @@ import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
+import org.apache.solr.common.util.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.cloud.overseer.CollectionMutator.checkCollectionKeyExistence;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 public class SliceMutator {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -89,8 +89,7 @@ public class SliceMutator {
     } else {
       coreNodeName = Assign.assignCoreNodeName(stateManager, collection);
     }
-    Replica replica = new Replica(coreNodeName,
-        makeMap(
+    Replica replica = new Replica(coreNodeName, Utils.makeMap(
             ZkStateReader.CORE_NAME_PROP, message.getStr(ZkStateReader.CORE_NAME_PROP),
             ZkStateReader.STATE_PROP, message.getStr(ZkStateReader.STATE_PROP),
             ZkStateReader.NODE_NAME_PROP, message.getStr(ZkStateReader.NODE_NAME_PROP), 
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
index 7b789d7..21a4740 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
@@ -46,7 +46,6 @@ public abstract class MetricImpl<T> implements Metric<T> {
    * Bytes to gigabytes converter. Supports converting number or string
    * representations of raw values expressed in bytes.
    */
-  @SuppressWarnings("unchecked")
   public static final Function<Object, Double> BYTES_TO_GB_CONVERTER = v -> {
     double sizeInBytes;
     if (!(v instanceof Number)) {
diff --git a/solr/core/src/java/org/apache/solr/core/BlobRepository.java b/solr/core/src/java/org/apache/solr/core/BlobRepository.java
index cf7d960..ba0917c 100644
--- a/solr/core/src/java/org/apache/solr/core/BlobRepository.java
+++ b/solr/core/src/java/org/apache/solr/core/BlobRepository.java
@@ -276,7 +276,7 @@ public class BlobRepository {
    *
    * @param ref The reference that is already there. Doing multiple calls with same ref will not matter
    */
-  public void decrementBlobRefCount(@SuppressWarnings({"rawtypes"})BlobContentRef ref) {
+  public void decrementBlobRefCount(BlobContentRef<?> ref) {
     if (ref == null) return;
     synchronized (ref.blob.references) {
       if (!ref.blob.references.remove(ref)) {
diff --git a/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java b/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
index 75793a2..8ffefce 100644
--- a/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
+++ b/solr/core/src/java/org/apache/solr/core/ConfigOverlay.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.core;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
@@ -43,13 +44,13 @@ public class ConfigOverlay implements MapSerializable {
 
   @SuppressWarnings({"unchecked"})
   public ConfigOverlay(Map<String, Object> jsonObj, int znodeVersion) {
-    if (jsonObj == null) jsonObj = Collections.EMPTY_MAP;
+    if (jsonObj == null) jsonObj = Collections.emptyMap();
     this.znodeVersion = znodeVersion;
     data = Collections.unmodifiableMap(jsonObj);
     props = (Map<String, Object>) data.get("props");
-    if (props == null) props = Collections.EMPTY_MAP;
+    if (props == null) props = Collections.emptyMap();
     userProps = (Map<String, Object>) data.get("userProps");
-    if (userProps == null) userProps = Collections.EMPTY_MAP;
+    if (userProps == null) userProps = Collections.emptyMap();
   }
 
   public Object getXPathProperty(String xpath) {
@@ -62,10 +63,14 @@ public class ConfigOverlay implements MapSerializable {
     return Utils.getObjectByPath(props, onlyPrimitive, hierarchy);
   }
 
-  @SuppressWarnings({"unchecked"})
+  public Object getXPathProperty(List<String> path) {
+    List<String> hierarchy = new ArrayList<>();
+    if(isEditable(true, hierarchy, path) == null) return null;
+    return Utils.getObjectByPath(props, true, hierarchy);
+  }
+
   public ConfigOverlay setUserProperty(String key, Object val) {
-    @SuppressWarnings({"rawtypes"})
-    Map copy = new LinkedHashMap(userProps);
+    Map<String, Object> copy = new LinkedHashMap<>(userProps);
     copy.put(key, val);
     Map<String, Object> jsonObj = new LinkedHashMap<>(this.data);
     jsonObj.put("userProps", copy);
@@ -74,8 +79,7 @@ public class ConfigOverlay implements MapSerializable {
 
   public ConfigOverlay unsetUserProperty(String key) {
     if (!userProps.containsKey(key)) return this;
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    Map copy = new LinkedHashMap(userProps);
+    Map<String, Object> copy = new LinkedHashMap<>(userProps);
     copy.remove(key);
     Map<String, Object> jsonObj = new LinkedHashMap<>(this.data);
     jsonObj.put("userProps", copy);
@@ -178,9 +182,12 @@ public class ConfigOverlay implements MapSerializable {
   }
 
 
-  @SuppressWarnings({"rawtypes"})
-  public static Class checkEditable(String path, boolean isXpath, List<String> hierarchy) {
+  public static Class<?> checkEditable(String path, boolean isXpath, List<String> hierarchy) {
     List<String> parts = StrUtils.splitSmart(path, isXpath ? '/' : '.');
+    return isEditable(isXpath, hierarchy, StrUtils.splitSmart(path, isXpath ? '/' : '.'));
+  }
+
+  private static Class<?> isEditable(boolean isXpath, List<String> hierarchy, List<String> parts) {
     Object obj = editable_prop_map;
     for (int i = 0; i < parts.size(); i++) {
       String part = parts.get(i);
@@ -191,23 +198,21 @@ public class ConfigOverlay implements MapSerializable {
       if (hierarchy != null) hierarchy.add(part);
       if (obj == null) return null;
       if (i == parts.size() - 1) {
-        if (obj instanceof Map) {
-          Map map = (Map) obj;
+        if (obj instanceof Map<?,?>) {
+          Map<?,?> map = (Map<?,?>) obj;
           Object o = map.get(part);
           return checkType(o, isXpath, isAttr);
         }
         return null;
       }
-      obj = ((Map) obj).get(part);
+      obj = ((Map<?,?>) obj).get(part);
     }
     return null;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  static Class[] types = new Class[]{String.class, Boolean.class, Integer.class, Float.class};
+  static Class<?>[] types = new Class<?>[]{String.class, Boolean.class, Integer.class, Float.class};
 
-  @SuppressWarnings({"rawtypes"})
-  private static Class checkType(Object o, boolean isXpath, boolean isAttr) {
+  private static Class<?> checkType(Object o, boolean isXpath, boolean isAttr) {
     if (o instanceof Long) {
       Long aLong = (Long) o;
       int ten = aLong.intValue() / 10;
@@ -240,27 +245,27 @@ public class ConfigOverlay implements MapSerializable {
     return map;
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public Map<String, Map> getNamedPlugins(String typ) {
-    Map<String, Map> reqHandlers = (Map<String, Map>) data.get(typ);
-    if (reqHandlers == null) return Collections.EMPTY_MAP;
+  @SuppressWarnings({"unchecked"})
+  public Map<String, Map<String, Object>> getNamedPlugins(String typ) {
+    Map<String, Map<String, Object>> reqHandlers = (Map<String, Map<String, Object>>) data.get(typ);
+    if (reqHandlers == null) return Collections.emptyMap();
     return Collections.unmodifiableMap(reqHandlers);
   }
 
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"unchecked"})
   public ConfigOverlay addNamedPlugin(Map<String, Object> info, String typ) {
-    Map dataCopy = Utils.getDeepCopy(data, 4);
-    Map existing = (Map) dataCopy.get(typ);
-    if (existing == null) dataCopy.put(typ, existing = new LinkedHashMap());
-    existing.put(info.get(CoreAdminParams.NAME), info);
+    Map<String, Object> dataCopy = Utils.getDeepCopy(data, 4);
+    Map<String, Object> existing = (Map<String, Object>) dataCopy.get(typ);
+    if (existing == null) dataCopy.put(typ, existing = new LinkedHashMap<>());
+    existing.put(info.get(CoreAdminParams.NAME).toString(), info);
     return new ConfigOverlay(dataCopy, this.znodeVersion);
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"unchecked"})
   public ConfigOverlay deleteNamedPlugin(String name, String typ) {
-    Map dataCopy = Utils.getDeepCopy(data, 4);
-    Map reqHandler = (Map) dataCopy.get(typ);
+    Map<String, Object> dataCopy = Utils.getDeepCopy(data, 4);
+    Map<?,?> reqHandler = (Map<?,?>) dataCopy.get(typ);
     if (reqHandler == null) return this;
     reqHandler.remove(name);
     return new ConfigOverlay(dataCopy, this.znodeVersion);
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index 997cec9..9cfc4c5 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -470,7 +470,7 @@ public class CoreContainer {
   }
 
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"unchecked"})
   private synchronized void initializeAuthenticationPlugin(Map<String, Object> authenticationConfig) {
     authenticationConfig = Utils.getDeepCopy(authenticationConfig, 4);
     int newVersion = readVersion(authenticationConfig);
@@ -507,7 +507,7 @@ public class CoreContainer {
           getResourceLoader().newInstance(pluginClassName,
               AuthenticationPlugin.class,
               null,
-              new Class[]{CoreContainer.class},
+              new Class<?>[]{CoreContainer.class},
               new Object[]{this}));
     }
     if (authenticationPlugin != null) {
@@ -2000,9 +2000,8 @@ public class CoreContainer {
 
   // ---------------- CoreContainer request handlers --------------
 
-  @SuppressWarnings({"rawtypes"})
   protected <T> T createHandler(String path, String handlerClass, Class<T> clazz) {
-    T handler = loader.newInstance(handlerClass, clazz, null, new Class[]{CoreContainer.class}, new Object[]{this});
+    T handler = loader.newInstance(handlerClass, clazz, null, new Class<?>[]{CoreContainer.class}, new Object[]{this});
     if (handler instanceof SolrRequestHandler) {
       containerHandlers.put(path, (SolrRequestHandler) handler);
     }
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 427cd7e..8cf794a 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -59,8 +59,7 @@ public class PluginBag<T> implements AutoCloseable {
   private final Map<String, PluginHolder<T>> registry;
   private final Map<String, PluginHolder<T>> immutableRegistry;
   private String def;
-  @SuppressWarnings({"rawtypes"})
-  private final Class klass;
+  private final Class<T> klass;
   private SolrCore core;
   private final SolrConfig.SolrPluginInfo meta;
   private final ApiBag apiBag;
@@ -110,9 +109,8 @@ public class PluginBag<T> implements AutoCloseable {
   /**
    * Check if any of the mentioned names are missing. If yes, return the Set of missing names
    */
-  @SuppressWarnings({"unchecked"})
   public Set<String> checkContains(Collection<String> names) {
-    if (names == null || names.isEmpty()) return Collections.EMPTY_SET;
+    if (names == null || names.isEmpty()) return Collections.emptySet();
     HashSet<String> result = new HashSet<>();
     for (String s : names) if (!this.registry.containsKey(s)) result.add(s);
     return result;
diff --git a/solr/core/src/java/org/apache/solr/core/RequestParams.java b/solr/core/src/java/org/apache/solr/core/RequestParams.java
index 3aa6299..7094991 100644
--- a/solr/core/src/java/org/apache/solr/core/RequestParams.java
+++ b/solr/core/src/java/org/apache/solr/core/RequestParams.java
@@ -47,14 +47,13 @@ import static org.apache.solr.common.util.Utils.getDeepCopy;
 public class RequestParams implements MapSerializable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  @SuppressWarnings({"rawtypes"})
-  private final Map data;
+  private final Map<String, Object> data;
   private final Map<String, ParamSet> paramsets = new LinkedHashMap<>();
   private final int znodeVersion;
 
-  @SuppressWarnings({"rawtypes"})
-  public RequestParams(Map data, int znodeVersion) {
-    if (data == null) data = Collections.EMPTY_MAP;
+  @SuppressWarnings("rawtypes")
+  public RequestParams(Map<String, Object> data, int znodeVersion) {
+    if (data == null) data = Collections.emptyMap();
     this.data = data;
     Map paramsets = (Map) data.get(NAME);
     if (paramsets != null) {
@@ -125,14 +124,12 @@ public class RequestParams implements MapSerializable {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public Map<String, Object> toMap(Map<String, Object> map) {
     return getMapWithVersion(data, znodeVersion);
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
   public static Map<String, Object> getMapWithVersion(Map<String, Object> data, int znodeVersion) {
-    Map result = new LinkedHashMap();
+    Map<String, Object> result = new LinkedHashMap<>();
     result.put(ConfigOverlay.ZNODEVER, znodeVersion);
     result.putAll(data);
     return result;
@@ -157,10 +154,12 @@ public class RequestParams implements MapSerializable {
           log.debug("latest version of {}/{} in ZK  is : {}", resourceLoader.getConfigSetZkPath(), RequestParams.RESOURCE, stat == null ? "" : stat.getVersion());
         }
         if (stat == null) {
-          requestParams = new RequestParams(Collections.EMPTY_MAP, -1);
+          requestParams = new RequestParams(Collections.emptyMap(), -1);
         } else if (requestParams == null || stat.getVersion() > requestParams.getZnodeVersion()) {
           Object[] o = getMapAndVersion(loader, RequestParams.RESOURCE);
-          requestParams = new RequestParams((Map) o[0], (Integer) o[1]);
+          @SuppressWarnings("unchecked")
+          Map<String, Object> data = (Map<String, Object>)  o[0];
+          requestParams = new RequestParams(data, (Integer) o[1]);
           if (log.isInfoEnabled()) {
             log.info("request params refreshed to version {}", requestParams.getZnodeVersion());
           }
@@ -172,7 +171,9 @@ public class RequestParams implements MapSerializable {
 
     } else {
       Object[] o = getMapAndVersion(loader, RequestParams.RESOURCE);
-      requestParams = new RequestParams((Map) o[0], (Integer) o[1]);
+      @SuppressWarnings("unchecked")
+      Map<String, Object> data = (Map<String, Object>)  o[0];
+      requestParams = new RequestParams(data, (Integer) o[1]);
     }
 
     return requestParams;
@@ -197,7 +198,7 @@ public class RequestParams implements MapSerializable {
 
     } catch (IOException e) {
       //no problem no overlay.json file
-      return new Object[]{Collections.EMPTY_MAP, -1};
+      return new Object[]{Collections.emptyMap(), -1};
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/core/SolrConfig.java b/solr/core/src/java/org/apache/solr/core/SolrConfig.java
index 804ceab..7c670ec 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrConfig.java
@@ -56,6 +56,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.util.DOMUtil;
 import org.apache.solr.common.util.IOUtils;
+import org.apache.solr.common.util.Utils;
 import org.apache.solr.handler.component.SearchComponent;
 import org.apache.solr.pkg.PackageListeners;
 import org.apache.solr.pkg.PackageLoader;
@@ -87,7 +88,6 @@ import org.xml.sax.SAXException;
 import static org.apache.solr.common.params.CommonParams.NAME;
 import static org.apache.solr.common.params.CommonParams.PATH;
 import static org.apache.solr.common.util.Utils.fromJSON;
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.core.ConfigOverlay.ZNODEVER;
 import static org.apache.solr.core.SolrConfig.PluginOpts.LAZY;
 import static org.apache.solr.core.SolrConfig.PluginOpts.MULTI_OK;
@@ -369,17 +369,15 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
 
   public static class SolrPluginInfo {
 
-    @SuppressWarnings({"rawtypes"})
-    public final Class clazz;
+    public final Class<?> clazz;
     public final String tag;
     public final Set<PluginOpts> options;
 
 
-    @SuppressWarnings({"unchecked", "rawtypes"})
-    private SolrPluginInfo(Class clz, String tag, PluginOpts... opts) {
+    private SolrPluginInfo(Class<?> clz, String tag, PluginOpts... opts) {
       this.clazz = clz;
       this.tag = tag;
-      this.options = opts == null ? Collections.EMPTY_SET : EnumSet.of(NOOP, opts);
+      this.options = opts == null ? Collections.emptySet() : EnumSet.of(NOOP, opts);
     }
 
     public String getCleanTag() {
@@ -392,7 +390,6 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
     }
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
   public static ConfigOverlay getConfigOverlay(SolrResourceLoader loader) {
     InputStream in = null;
     InputStreamReader isr = null;
@@ -403,7 +400,7 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
         // TODO: we should be explicitly looking for file not found exceptions
         // and logging if it's not the expected IOException
         // hopefully no problem, assume no overlay.json file
-        return new ConfigOverlay(Collections.EMPTY_MAP, -1);
+        return new ConfigOverlay(Collections.emptyMap(), -1);
       }
       
       int version = 0; // will be always 0 for file based resourceLoader
@@ -411,7 +408,8 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
         version = ((ZkSolrResourceLoader.ZkByteArrayInputStream) in).getStat().getVersion();
         log.debug("Config overlay loaded. version : {} ", version);
       }
-      Map m = (Map) fromJSON(in);
+      @SuppressWarnings("unchecked")
+      Map<String, Object> m = (Map<String, Object>) fromJSON(in);
       return new ConfigOverlay(m, version);
     } catch (Exception e) {
       throw new SolrException(ErrorCode.SERVER_ERROR, "Error reading config overlay", e);
@@ -548,18 +546,19 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
     /**
      * config xpath prefix for getting HTTP Caching options
      */
-    private final static String CACHE_PRE
+    private static final String CACHE_PRE
         = "requestDispatcher/httpCaching/";
 
     /**
      * For extracting Expires "ttl" from <cacheControl> config
      */
-    private final static Pattern MAX_AGE
+    private static final Pattern MAX_AGE
         = Pattern.compile("\\bmax-age=(\\d+)");
 
     @Override
     public Map<String, Object> toMap(Map<String, Object> map) {
-      return makeMap("never304", never304,
+      // Could have nulls
+      return Utils.makeMap("never304", never304,
           "etagSeed", etagSeed,
           "lastModFrom", lastModFrom.name().toLowerCase(Locale.ROOT),
           "cacheControl", cacheControlHeader);
@@ -674,20 +673,18 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
 
 
     @Override
-    @SuppressWarnings({"unchecked", "rawtypes"})
     public Map<String, Object> toMap(Map<String, Object> map) {
-      LinkedHashMap result = new LinkedHashMap();
-      result.put("indexWriter", makeMap("closeWaitsForMerges", indexWriterCloseWaitsForMerges));
-      result.put("commitWithin", makeMap("softCommit", commitWithinSoftCommit));
-      result.put("autoCommit", makeMap(
+      map.put("indexWriter", Map.of("closeWaitsForMerges", indexWriterCloseWaitsForMerges));
+      map.put("commitWithin", Map.of("softCommit", commitWithinSoftCommit));
+      map.put("autoCommit", Map.of(
           "maxDocs", autoCommmitMaxDocs,
           "maxTime", autoCommmitMaxTime,
           "openSearcher", openSearcher
       ));
-      result.put("autoSoftCommit",
-          makeMap("maxDocs", autoSoftCommmitMaxDocs,
+      map.put("autoSoftCommit",
+          Map.of("maxDocs", autoSoftCommmitMaxDocs,
               "maxTime", autoSoftCommmitMaxTime));
-      return result;
+      return map;
     }
   }
 
@@ -709,13 +706,12 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
    *             SearchComponent, QueryConverter, SolrEventListener, DirectoryFactory,
    *             IndexDeletionPolicy, IndexReaderFactory, {@link TransformerFactory}
    */
-  @SuppressWarnings({"unchecked", "rawtypes"})
   public List<PluginInfo> getPluginInfos(String type) {
     List<PluginInfo> result = pluginStore.get(type);
     SolrPluginInfo info = classVsSolrPluginInfo.get(type);
     if (info != null &&
         (info.options.contains(REQUIRE_NAME) || info.options.contains(REQUIRE_NAME_IN_OVERLAY))) {
-      Map<String, Map> infos = overlay.getNamedPlugins(info.getCleanTag());
+      Map<String, Map<String, Object>> infos = overlay.getNamedPlugins(info.getCleanTag());
       if (!infos.isEmpty()) {
         LinkedHashMap<String, PluginInfo> map = new LinkedHashMap<>();
         if (result != null) for (PluginInfo pluginInfo : result) {
@@ -725,13 +721,13 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
               pluginInfo.name;
           map.put(name, pluginInfo);
         }
-        for (Map.Entry<String, Map> e : infos.entrySet()) {
+        for (Map.Entry<String, Map<String, Object>> e : infos.entrySet()) {
           map.put(e.getKey(), new PluginInfo(info.getCleanTag(), e.getValue()));
         }
         result = new ArrayList<>(map.values());
       }
     }
-    return result == null ? Collections.<PluginInfo>emptyList() : result;
+    return result == null ? Collections.emptyList() : result;
   }
 
   public PluginInfo getPluginInfo(String type) {
@@ -910,7 +906,7 @@ public class SolrConfig extends XmlConfigFile implements MapSerializable {
     result.put("requestDispatcher", m);
     m.put("handleSelect", handleSelect);
     if (httpCachingConfig != null) m.put("httpCaching", httpCachingConfig);
-    m.put("requestParsers", makeMap("multipartUploadLimitKB", multipartUploadLimitKB,
+    m.put("requestParsers", Map.of("multipartUploadLimitKB", multipartUploadLimitKB,
         "formUploadLimitKB", formUploadLimitKB,
         "addHttpRequestToContext", addHttpRequestToContext));
     if (indexConfig != null) result.put("indexConfig", indexConfig);
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 2f88067..7df1c2d 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -1918,7 +1918,6 @@ public final class SolrCore implements SolrInfoBean, Closeable {
    * Warning: although a lambda is concise, it may be inappropriate to simply return the IndexReader because it might
    * be closed soon after this method returns; it really depends.
    */
-  @SuppressWarnings("unchecked")
   public <R> R withSearcher(IOFunction<SolrIndexSearcher, R> lambda) throws IOException {
     final RefCounted<SolrIndexSearcher> refCounted = getSearcher();
     try {
@@ -2873,7 +2872,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     return def;
   }
 
-  public void initDefaultPlugin(Object plugin, @SuppressWarnings({"rawtypes"})Class type) {
+  public void initDefaultPlugin(Object plugin, Class<?> type) {
     if (plugin instanceof SolrMetricProducer) {
       coreMetricManager.registerMetricProducer(type.getSimpleName() + ".default", (SolrMetricProducer) plugin);
     }
@@ -3231,8 +3230,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       throw new IllegalArgumentException("invalid key format, must end in /N where N is the version number");
     }
     // define the blob
-    @SuppressWarnings({"rawtypes"})
-    BlobRepository.BlobContentRef blobRef = coreContainer.getBlobRepository().getBlobIncRef(key, decoder);
+    BlobRepository.BlobContentRef<Object> blobRef = coreContainer.getBlobRepository().getBlobIncRef(key, decoder);
     addCloseHook(new CloseHook() {
       @Override
       public void preClose(SolrCore core) {
diff --git a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
index b779a1c..83e15a2 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
@@ -38,6 +38,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -542,15 +543,14 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
     }
   }
 
-  private  <T> Class<? extends T> getPackageClass(String cname, Class<T> expectedType) {
+  private <T> Class<? extends T> getPackageClass(String cname, Class<T> expectedType) {
     PluginInfo.ClassName cName = PluginInfo.parseClassName(cname);
     if (cName.pkg == null) return null;
     ResourceLoaderAware aware = CURRENT_AWARE.get();
     if (aware != null) {
       //this is invoked from a component
       //let's check if it's a schema component
-      @SuppressWarnings("rawtypes")
-      Class type = assertAwareCompatibility(ResourceLoaderAware.class, aware);
+      Class<?> type = assertAwareCompatibility(ResourceLoaderAware.class, aware);
       if (schemaResourceLoaderComponents.contains(type)) {
         //this is a schema component
         //lets use schema classloader
@@ -567,16 +567,15 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
     return newInstance(name, expectedType, empty);
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private static final Class[] NO_CLASSES = new Class[0];
+  private static final Class<?>[] NO_CLASSES = new Class<?>[0];
   private static final Object[] NO_OBJECTS = new Object[0];
 
   public <T> T newInstance(String cname, Class<T> expectedType, String... subpackages) {
     return newInstance(cname, expectedType, subpackages, NO_CLASSES, NO_OBJECTS);
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public <T> T newInstance(String cName, Class<T> expectedType, String[] subPackages, Class[] params, Object[] args) {
+  @Override
+  public <T> T newInstance(String cName, Class<T> expectedType, String[] subPackages, Class<?>[] params, Object[] args) {
     Class<? extends T> clazz = findClass(cName, expectedType, subPackages);
     if (clazz == null) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
@@ -771,8 +770,7 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
   /**
    * Keep a list of classes that are allowed to implement each 'Aware' interface
    */
-  @SuppressWarnings({"rawtypes"})
-  private static final Map<Class, Class[]> awareCompatibility;
+  private static final Map<Class<?>, Class<?>[]> awareCompatibility;
 
   static {
     awareCompatibility = new HashMap<>();
@@ -809,8 +807,7 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
   /**If these components are trying to load classes, use schema classloader
    *
    */
-  @SuppressWarnings("rawtypes")
-  private static final ImmutableSet<Class> schemaResourceLoaderComponents = ImmutableSet.of(
+  private static final Set<Class<?>> schemaResourceLoaderComponents = ImmutableSet.of(
       CharFilterFactory.class,
       TokenFilterFactory.class,
       TokenizerFactory.class,
@@ -819,14 +816,13 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
   /**
    * Utility function to throw an exception if the class is invalid
    */
-  @SuppressWarnings({"rawtypes"})
-  public static Class assertAwareCompatibility(Class aware, Object obj) {
-    Class[] valid = awareCompatibility.get(aware);
+  public static Class<?> assertAwareCompatibility(Class<?> aware, Object obj) {
+    Class<?>[] valid = awareCompatibility.get(aware);
     if (valid == null) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
           "Unknown Aware interface: " + aware);
     }
-    for (Class v : valid) {
+    for (Class<?> v : valid) {
       if (v.isInstance(obj)) {
         return v;
       }
@@ -835,7 +831,7 @@ public class SolrResourceLoader implements ResourceLoader, Closeable, SolrClassL
     builder.append("Invalid 'Aware' object: ").append(obj);
     builder.append(" -- ").append(aware.getName());
     builder.append(" must be an instance of: ");
-    for (Class v : valid) {
+    for (Class<?> v : valid) {
       builder.append("[").append(v.getName()).append("] ");
     }
     throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, builder.toString());
diff --git a/solr/core/src/java/org/apache/solr/core/TracerConfigurator.java b/solr/core/src/java/org/apache/solr/core/TracerConfigurator.java
index 9192044..5db59b3 100644
--- a/solr/core/src/java/org/apache/solr/core/TracerConfigurator.java
+++ b/solr/core/src/java/org/apache/solr/core/TracerConfigurator.java
@@ -90,7 +90,7 @@ public abstract class TracerConfigurator implements NamedListInitializedPlugin {
       }
     }
 
-    @SuppressWarnings({"rawtypes", "unchecked"})
+    @SuppressWarnings({"rawtypes"})
     @Override
     public void clean(AtomicReference ctx) {
       Scope scope = (Scope) ctx.get();
diff --git a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
index 829aa28..ade5973 100644
--- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
@@ -71,7 +71,6 @@ import static org.apache.solr.common.params.CommonParams.ID;
 import static org.apache.solr.common.params.CommonParams.JSON;
 import static org.apache.solr.common.params.CommonParams.SORT;
 import static org.apache.solr.common.params.CommonParams.VERSION;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 public class BlobHandler extends RequestHandlerBase implements PluginInfoInitialized , PermissionNameProvider {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -80,7 +79,6 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
   private long maxSize = DEFAULT_MAX_SIZE;
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public void handleRequestBody(final SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     String httpMethod = req.getHttpMethod();
     String path = (String) req.getContext().get("path");
@@ -121,7 +119,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
         if (duplicateCount > 0) {
           rsp.add("error", "duplicate entry");
           forward(req, null,
-              new MapSolrParams((Map) makeMap(
+              new MapSolrParams(Map.of(
                   "q", "md5:" + md5,
                   "fl", "id,size,version,timestamp,blobName")),
               rsp);
@@ -140,7 +138,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
         }
         version++;
         String id = blobName + "/" + version;
-        Map<String, Object> doc = makeMap(
+        Map<String, Object> doc = Map.of(
             ID, id,
             CommonParams.TYPE, "blob",
             "md5", md5,
@@ -214,7 +212,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
         }
 
         forward(req, null,
-            new MapSolrParams((Map) makeMap(
+            new MapSolrParams(Map.of(
                 "q", StrUtils.formatString(q, blobName, version),
                 "fl", "id,size,version,timestamp,blobName,md5",
                 SORT, "version desc"))
diff --git a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
index 09fb2a3..334dbde 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -161,23 +161,20 @@ public class ClusterAPI {
     if (path == null || path.isBlank()) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "In order to insert a file in a configSet, a filePath must be provided in the url after the name of the configSet.");
     }
-    req = wrapParams(req,
-            "action", ConfigSetParams.ConfigSetAction.UPLOAD.toString(),
+    req = wrapParams(req, Map.of("action", ConfigSetParams.ConfigSetAction.UPLOAD.toString(),
             CommonParams.NAME, req.getPathTemplateValues().get("name"),
             ConfigSetParams.FILE_PATH, path,
             ConfigSetParams.OVERWRITE, true,
-            ConfigSetParams.CLEANUP, false);
+            ConfigSetParams.CLEANUP, false));
     configSetsHandler.handleRequestBody(req, rsp);
   }
 
-  @SuppressWarnings({"rawtypes"})
   public static SolrQueryRequest wrapParams(SolrQueryRequest req, Object... def) {
-    Map m = Utils.makeMap(def);
+    Map<String, Object> m = Utils.makeMap(def);
     return wrapParams(req, m);
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public static SolrQueryRequest wrapParams(SolrQueryRequest req, Map m) {
+  public static SolrQueryRequest wrapParams(SolrQueryRequest req, Map<String, Object> m) {
     ModifiableSolrParams solrParams = new ModifiableSolrParams();
     m.forEach((k, v) -> {
       if(v == null) return;
diff --git a/solr/core/src/java/org/apache/solr/handler/CollectionBackupsAPI.java b/solr/core/src/java/org/apache/solr/handler/CollectionBackupsAPI.java
index d3bb4cc..ee104bd 100644
--- a/solr/core/src/java/org/apache/solr/handler/CollectionBackupsAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/CollectionBackupsAPI.java
@@ -51,7 +51,6 @@ public class CollectionBackupsAPI {
   }
 
   @Command(name = LIST_BACKUP_CMD)
-  @SuppressWarnings("unchecked")
   public void listBackups(PayloadObj<ListBackupPayload> obj) throws Exception {
     final Map<String, Object> v1Params = obj.get().toMap(new HashMap<>());
     v1Params.put(ACTION, CollectionParams.CollectionAction.LISTBACKUP.toLower());
@@ -60,7 +59,6 @@ public class CollectionBackupsAPI {
   }
 
   @Command(name = DELETE_BACKUP_CMD)
-  @SuppressWarnings("unchecked")
   public void deleteBackups(PayloadObj<DeleteBackupPayload> obj) throws Exception {
     final Map<String, Object> v1Params = obj.get().toMap(new HashMap<>());
     v1Params.put(ACTION, CollectionParams.CollectionAction.DELETEBACKUP.toLower());
diff --git a/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
index df45b4a..8a82c59 100644
--- a/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
@@ -87,7 +87,6 @@ public class CollectionsAPI {
     public class CollectionsCommands {
 
         @Command(name = V2_BACKUP_CMD)
-        @SuppressWarnings("unchecked")
         public void backupCollection(PayloadObj<BackupCollectionPayload> obj) throws Exception {
             final Map<String, Object> v1Params = obj.get().toMap(new HashMap<>());
             v1Params.put(ACTION, CollectionAction.BACKUP.toLower());
@@ -151,7 +150,6 @@ public class CollectionsAPI {
         }
 
         @Command(name= V2_DELETE_ALIAS_CMD)
-        @SuppressWarnings("unchecked")
         public void deleteAlias(PayloadObj<DeleteAliasPayload> obj) throws Exception {
             final DeleteAliasPayload v2Body = obj.get();
             final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
@@ -161,7 +159,6 @@ public class CollectionsAPI {
         }
 
         @Command(name = V2_CREATE_COLLECTION_CMD)
-        @SuppressWarnings("unchecked")
         public void create(PayloadObj<CreatePayload> obj) throws Exception {
             final CreatePayload v2Body = obj.get();
             final Map<String, Object> v1Params = v2Body.toMap(new HashMap<>());
diff --git a/solr/core/src/java/org/apache/solr/handler/ExportHandler.java b/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
index 93776c0..81288d2 100644
--- a/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
@@ -48,8 +48,7 @@ public class ExportHandler extends SearchHandler {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private ModelCache modelCache = null;
-  @SuppressWarnings({"rawtypes"})
-  private ConcurrentMap objectCache = new ConcurrentHashMap();
+  private ConcurrentMap<String,Object> objectCache = new ConcurrentHashMap<>();
   private SolrDefaultStreamFactory streamFactory = new ExportHandlerStreamFactory();
   private String coreName;
   private SolrClientCache solrClientCache;
diff --git a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
index 5c159e7..87a1633 100644
--- a/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/GraphHandler.java
@@ -91,7 +91,6 @@ public class GraphHandler extends RequestHandlerBase implements SolrCoreAware, P
     return PermissionNameProvider.Name.READ_PERM;
   }
 
-  @SuppressWarnings({"unchecked"})
   public void inform(SolrCore core) {
     String defaultCollection;
     String defaultZkhost;
@@ -125,7 +124,7 @@ public class GraphHandler extends RequestHandlerBase implements SolrCoreAware, P
         } else {
           @SuppressWarnings("resource")
           StreamHandler.ExpressibleHolder holder = new StreamHandler.ExpressibleHolder(pluginInfo, core, SolrConfig.classVsSolrPluginInfo.get(Expressible.class.getName()));
-          streamFactory.withFunctionName(key, () -> holder.getClazz());
+          streamFactory.withFunctionName(key, holder);
         }
 
       }
@@ -254,7 +253,6 @@ public class GraphHandler extends RequestHandlerBase implements SolrCoreAware, P
       return null;
     }
 
-    @SuppressWarnings({"unchecked"})
     public Tuple read() throws IOException {
       Tuple tuple = this.tupleStream.read();
       if(tuple.EOF) {
diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
index de563ed..2d202f0 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -299,7 +299,7 @@ public class IndexFetcher {
   /**
    * Gets the latest commit version and generation from the leader
    */
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"rawtypes"})
   NamedList getLatestVersion() throws IOException {
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.set(COMMAND, CMD_INDEX_VERSION);
@@ -1411,7 +1411,6 @@ public class IndexFetcher {
     if (confFilesToDownload == null || confFilesToDownload.isEmpty())
       return Collections.emptyList();
     //build a map with alias/name as the key
-    @SuppressWarnings({"rawtypes"})
     Map<String, Map<String, Object>> nameVsFile = new HashMap<>();
     @SuppressWarnings({"rawtypes"})
     NamedList names = new NamedList();
@@ -1490,7 +1489,6 @@ public class IndexFetcher {
     return timeElapsed;
   }
 
-  @SuppressWarnings({"unchecked"})
   List<Map<String, Object>> getConfFilesToDownload() {
     //make a copy first because it can be null later
     List<Map<String, Object>> tmp = confFilesToDownload;
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index 4572be1..f4649c2 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -1099,14 +1099,14 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
     addVal(consumer, IndexFetcher.CLEARED_LOCAL_IDX, props, Boolean.class);
   }
 
-  private void addVal(BiConsumer<String, Object> consumer, String key, Properties props, @SuppressWarnings({"rawtypes"})Class clzz) {
+  private void addVal(BiConsumer<String, Object> consumer, String key, Properties props, Class<?> clzz) {
     Object val = formatVal(key, props, clzz);
     if (val != null) {
       consumer.accept(key, val);
     }
   }
 
-  private Object formatVal(String key, Properties props, @SuppressWarnings({"rawtypes"})Class clzz) {
+  private Object formatVal(String key, Properties props, Class<?> clzz) {
     String s = props.getProperty(key);
     if (s == null || s.trim().length() == 0) return null;
     if (clzz == Date.class) {
diff --git a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
index 5a8f9d2..ffaeb2d 100644
--- a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
@@ -18,7 +18,12 @@ package org.apache.solr.handler;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.BiConsumer;
 
 import org.apache.solr.api.Api;
@@ -32,7 +37,6 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.pkg.PackageListeningClassLoader;
@@ -63,20 +67,14 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
   private boolean isImmutableConfigSet = false;
   private SolrRequestHandler managedResourceRequestHandler;
 
-  private static final Map<String, String> level2;
-
+  // java.util factory collections do not accept null values, so we roll our own
+  private static final Map<String, String> level2 = new HashMap<>();
   static {
-    @SuppressWarnings({"rawtypes"})
-    Map s = Utils.makeMap(
-        FIELD_TYPES.nameLower, null,
-        FIELDS.nameLower, "fl",
-        DYNAMIC_FIELDS.nameLower, "fl",
-        COPY_FIELDS.nameLower, null
-    );
-
-    level2 = Collections.unmodifiableMap(s);
-  }
-
+    level2.put(FIELD_TYPES.nameLower, null);
+    level2.put(FIELDS.nameLower, "fl");
+    level2.put(DYNAMIC_FIELDS.nameLower, "fl");
+    level2.put(COPY_FIELDS.nameLower, null);
+  };
 
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
@@ -167,7 +165,7 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
             String realName = parts.get(1);
             String fieldName = IndexSchema.nameMapping.get(realName);
 
-            String pathParam = level2.get(realName);
+            String pathParam = level2.get(realName); // Might be null
             if (parts.size() > 2) {
               req.setParams(SolrParams.wrapDefaults(new MapSolrParams(singletonMap(pathParam, parts.get(2))), req.getParams()));
             }
@@ -242,7 +240,7 @@ public class SchemaHandler extends RequestHandlerBase implements SolrCoreAware,
 
   }
 
-  private static Set<String> subPaths = new HashSet<>(Arrays.asList(
+  private static final Set<String> subPaths = new HashSet<>(Set.of(
       "version",
       "uniquekey",
       "name",
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index db8ec17..e5f44e3 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -89,7 +89,6 @@ import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.util.Collections.singletonList;
 import static org.apache.solr.common.params.CoreAdminParams.NAME;
 import static org.apache.solr.common.util.StrUtils.formatString;
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.core.ConfigOverlay.NOT_EDITABLE;
 import static org.apache.solr.core.ConfigOverlay.ZNODEVER;
 import static org.apache.solr.core.ConfigSetProperties.IMMUTABLE_CONFIGSET_ARG;
@@ -192,11 +191,10 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
           if (parts.size() == 3) {
             RequestParams params = req.getCore().getSolrConfig().getRequestParams();
             RequestParams.ParamSet p = params.getParams(parts.get(2));
-            @SuppressWarnings({"rawtypes"})
-            Map m = new LinkedHashMap<>();
+            Map<String, Object> m = new LinkedHashMap<>();
             m.put(ZNODEVER, params.getZnodeVersion());
             if (p != null) {
-              m.put(RequestParams.NAME, makeMap(parts.get(2), p.toMap(new LinkedHashMap<>())));
+              m.put(RequestParams.NAME, Map.of(parts.get(2), p.toMap(new LinkedHashMap<>())));
             }
             resp.add(SolrQueryResponse.NAME, m);
           } else {
@@ -205,7 +203,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
 
         } else {
           if (ZNODEVER.equals(parts.get(1))) {
-            resp.add(ZNODEVER, Utils.makeMap(
+            resp.add(ZNODEVER, Map.of(
                 ConfigOverlay.NAME, req.getCore().getSolrConfig().getOverlay().getZnodeVersion(),
                 RequestParams.NAME, req.getCore().getSolrConfig().getRequestParams().getZnodeVersion()));
             boolean isStale = false;
@@ -248,19 +246,19 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
 
           } else {
             Map<String, Object> m = getConfigDetails(parts.get(1), req);
-            Map<String, Object> val = makeMap(parts.get(1), m.get(parts.get(1)));
+            Map<String, Object> val = new LinkedHashMap<>();
+            val.put(parts.get(1), m.get(parts.get(1)));
             String componentName = req.getParams().get("componentName");
             if (componentName != null) {
               @SuppressWarnings({"rawtypes"})
               Map pluginNameVsPluginInfo = (Map) val.get(parts.get(1));
               if (pluginNameVsPluginInfo != null) {
-                @SuppressWarnings({"rawtypes"})
                 Object o = pluginNameVsPluginInfo instanceof MapSerializable ?
                        pluginNameVsPluginInfo:
                         pluginNameVsPluginInfo.get(componentName);
                 @SuppressWarnings({"rawtypes"})
                 Map pluginInfo = o instanceof  MapSerializable? ((MapSerializable) o).toMap(new LinkedHashMap<>()): (Map) o;
-                val.put(parts.get(1),pluginNameVsPluginInfo instanceof PluginInfo? pluginInfo :  makeMap(componentName, pluginInfo));
+                val.put(parts.get(1), pluginNameVsPluginInfo instanceof PluginInfo? pluginInfo : Map.of(componentName, pluginInfo));
                 if (req.getParams().getBool("meta", false)) {
                   // meta=true is asking for the package info of the plugin
                   // We go through all the listeners and see if there is one registered for this plugin
@@ -324,7 +322,6 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
       } else if (plugin instanceof PluginInfo) {
         pluginInfo = ((PluginInfo) plugin).toMap(new LinkedHashMap<>());
       }
-      @SuppressWarnings({"rawtypes"})
       String useParams = (String) pluginInfo.get(USEPARAM);
       String useParamsInReq = req.getOriginalParams().get(USEPARAM);
       if (useParams != null || useParamsInReq != null) {
@@ -600,8 +597,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
       return overlay.getNamedPlugins(info.getCleanTag()).containsKey(name);
     }
 
-    @SuppressWarnings({"unchecked"})
-    private boolean verifyClass(CommandOperation op, String clz, @SuppressWarnings({"rawtypes"})Class expected) {
+    private boolean verifyClass(CommandOperation op, String clz, Class<?> expected) {
       if (clz == null) return true;
       PluginInfo info = new PluginInfo(SolrRequestHandler.TYPE, op.getDataMap());
       try {
@@ -668,8 +664,7 @@ public class SolrConfigHandler extends RequestHandlerBase implements SolrCoreAwa
       for (Map.Entry<String, Object> e : m.entrySet()) {
         String name = e.getKey();
         Object val = e.getValue();
-        @SuppressWarnings({"rawtypes"})
-        Class typ = ConfigOverlay.checkEditable(name, false, null);
+        Class<?> typ = ConfigOverlay.checkEditable(name, false, null);
         if (typ == null) {
           op.addError(formatString(NOT_EDITABLE, name));
           continue;
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index 5b9cb27..bca1aa6 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -89,21 +89,19 @@ import static org.apache.solr.common.params.CommonParams.ID;
 public class StreamHandler extends RequestHandlerBase implements SolrCoreAware, PermissionNameProvider {
 
   private ModelCache modelCache;
-  @SuppressWarnings({"rawtypes"})
-  private ConcurrentMap objectCache;
+  private ConcurrentMap<String, Object> objectCache;
   private SolrDefaultStreamFactory streamFactory = new SolrDefaultStreamFactory();
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private String coreName;
   private SolrClientCache solrClientCache;
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  private Map<String, DaemonStream> daemons = Collections.synchronizedMap(new HashMap());
+  private Map<String, DaemonStream> daemons = Collections.synchronizedMap(new HashMap<>());
 
   @Override
   public PermissionNameProvider.Name getPermissionName(AuthorizationContext request) {
     return PermissionNameProvider.Name.READ_PERM;
   }
 
-  @SuppressWarnings({"rawtypes"})
+  @SuppressWarnings("unchecked")
   public void inform(SolrCore core) {
     String defaultCollection;
     String defaultZkhost;
@@ -112,7 +110,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
     this.coreName = core.getName();
     String cacheKey = this.getClass().getName() + "_" + coreName + "_";
     this.objectCache = coreContainer.getObjectCache().computeIfAbsent(cacheKey + "objectCache",
-        ConcurrentHashMap.class, k-> new ConcurrentHashMap());
+        ConcurrentHashMap.class, k-> new ConcurrentHashMap<>());
     if (coreContainer.isZooKeeperAware()) {
       defaultCollection = core.getCoreDescriptor().getCollectionName();
       defaultZkhost = core.getCoreContainer().getZkController().getZkServerAddress();
@@ -128,15 +126,13 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
     addExpressiblePlugins(streamFactory, core);
   }
 
-  @SuppressWarnings({"unchecked"})
   public static void addExpressiblePlugins(StreamFactory streamFactory, SolrCore core) {
     List<PluginInfo> pluginInfos = core.getSolrConfig().getPluginInfos(Expressible.class.getName());
     for (PluginInfo pluginInfo : pluginInfos) {
       if (pluginInfo.pkgName != null) {
         @SuppressWarnings("resource")
         ExpressibleHolder holder = new ExpressibleHolder(pluginInfo, core, SolrConfig.classVsSolrPluginInfo.get(Expressible.class.getName()));
-        streamFactory.withFunctionName(pluginInfo.name,
-            () -> holder.getClazz());
+        streamFactory.withFunctionName(pluginInfo.name, holder);
       } else {
         Class<? extends Expressible> clazz = core.getResourceLoader().findClass(pluginInfo.className, Expressible.class);
         streamFactory.withFunctionName(pluginInfo.name, clazz);
@@ -144,24 +140,23 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
     }
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public static class ExpressibleHolder extends PackagePluginHolder {
-    private Class clazz;
+  public static class ExpressibleHolder extends PackagePluginHolder<Class<? extends Expressible>> {
+    private Class<? extends Expressible> clazz;
 
     public ExpressibleHolder(PluginInfo info, SolrCore core, SolrConfig.SolrPluginInfo pluginMeta) {
       super(info, core, pluginMeta);
     }
 
-    @SuppressWarnings({"rawtypes"})
-    public Class getClazz() {
+    @Override
+    public Class<? extends Expressible> get() {
       return clazz;
     }
 
     @Override
     protected Object initNewInstance(PackageLoader.Package.Version newest, SolrCore core) {
+      // This is called from super constructor, so be careful that pluginInfo.className is done initializing.
       return clazz = newest.getLoader().findClass(pluginInfo.className, Expressible.class);
     }
-
   }
 
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
@@ -485,7 +480,6 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
           .withExpression("--non-expressible--");
     }
 
-    @SuppressWarnings({"unchecked"})
     public Tuple read() throws IOException {
       Tuple tuple = this.tupleStream.read();
       if (tuple.EOF) {
@@ -506,7 +500,6 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
         String collection = param.split("\\.")[0];
         String shardString = params.get(param);
         String[] shards = shardString.split(",");
-        @SuppressWarnings({"rawtypes"})
         List<String> shardList = new ArrayList<>();
         for (String shard : shards) {
           shardList.add(shard);
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlersProxy.java b/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlersProxy.java
index bf6c2fc..e5826a8 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlersProxy.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/AdminHandlersProxy.java
@@ -37,7 +37,7 @@ import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.GenericSolrRequest;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.MapSolrParams;
+import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Pair;
@@ -68,11 +68,7 @@ public class AdminHandlersProxy {
     
     Set<String> nodes;
     String pathStr = req.getPath();
-    
-    @SuppressWarnings({"unchecked"})
-    Map<String,String> paramsMap = req.getParams().toMap(new HashMap<>());
-    paramsMap.remove(PARAM_NODES);
-    SolrParams params = new MapSolrParams(paramsMap);
+
     Set<String> liveNodes = container.getZkController().zkStateReader.getClusterState().getLiveNodes();
     
     if (nodeNames.equals("all")) {
@@ -94,7 +90,9 @@ public class AdminHandlersProxy {
     if (log.isDebugEnabled()) {
       log.debug("{} parameter {} specified on {} request", PARAM_NODES, nodeNames, pathStr);
     }
-    
+
+    ModifiableSolrParams params = new ModifiableSolrParams(req.getParams());
+    params.remove(PARAM_NODES);
     Map<String, Pair<Future<NamedList<Object>>, SolrClient>> responses = new HashMap<>();
     for (String node : nodes) {
       responses.put(node, callRemoteNode(node, pathStr, params, container.getZkController()));
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
index d813e44..cf1bd69 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
@@ -112,7 +112,7 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
                 }
               }
             }
-            wrapParams(req, new CommandOperation("", Collections.EMPTY_MAP), commands.get(0), true);
+            wrapParams(req, new CommandOperation("", Collections.emptyMap()), commands.get(0), true);
             commands.get(0).invoke(req, rsp, apiHandler);
           }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index 8a57056..8891817 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -559,7 +559,6 @@ public class CollectionsHandler extends RequestHandlerBase implements Permission
       return null;
     }),
 
-    @SuppressWarnings({"unchecked"})
     CREATEALIAS_OP(CREATEALIAS, (req, rsp, h) -> {
       String alias = req.getParams().get(NAME);
       SolrIdentifierValidator.validateAliasName(alias);
@@ -569,7 +568,11 @@ public class CollectionsHandler extends RequestHandlerBase implements Permission
       HashMap<String,Object> possiblyModifiedParams = new HashMap<>();
       try {
         // note that RA specific validation occurs here.
-        routedAlias = RoutedAlias.fromProps(alias, req.getParams().toMap(possiblyModifiedParams));
+        req.getParams().toMap(possiblyModifiedParams);
+        @SuppressWarnings({"unchecked", "rawtypes"})
+        // This is awful because RoutedAlias lies about what types it wants
+        Map<String, String> temp = (Map<String, String>) (Map) possiblyModifiedParams;
+        routedAlias = RoutedAlias.fromProps(alias, temp);
       } catch (SolrException e) {
         // we'll throw this later if we are in fact creating a routed alias.
         ex = e;
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
index d3b5cb9..90e8fc0 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/MetricsHandler.java
@@ -109,7 +109,6 @@ public class MetricsHandler extends RequestHandlerBase implements PermissionName
     handleRequest(req.getParams(), (k, v) -> rsp.add(k, v));
   }
   
-  @SuppressWarnings({"unchecked"})
   public void handleRequest(SolrParams params, BiConsumer<String, Object> consumer) throws Exception {
     if (!enabled) {
       consumer.accept("error", "metrics collection is disabled");
@@ -359,10 +358,9 @@ public class MetricsHandler extends RequestHandlerBase implements PermissionName
 
     public static final String SUPPORTED_TYPES_MSG = EnumSet.allOf(MetricType.class).toString();
 
-    @SuppressWarnings({"rawtypes"})
-    private final Class klass;
+    private final Class<? extends Metric> klass;
 
-    MetricType(@SuppressWarnings({"rawtypes"})Class klass) {
+    MetricType(Class<? extends Metric> klass) {
       this.klass = klass;
     }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
index f590bf3..1f3d066 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandler.java
@@ -196,8 +196,7 @@ public abstract class SecurityConfHandler extends RequestHandlerBase implements
    * The data object defaults to EMPTY_MAP if not set
    */
   public static class SecurityConfig {
-    @SuppressWarnings({"unchecked"})
-    private Map<String, Object> data = Collections.EMPTY_MAP;
+    private Map<String, Object> data = Collections.emptyMap();
     private int version = -1;
 
     public SecurityConfig() {}
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
index cad9a4c..12ccfe1 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
@@ -131,7 +131,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
 
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public void process(ResponseBuilder rb) throws IOException {
 
@@ -220,7 +219,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
     if(fieldType instanceof StrField) {
       //Get The Top Level SortedDocValues
       if(CollapsingQParserPlugin.HINT_TOP_FC.equals(hint)) {
-        @SuppressWarnings("resource")
         LeafReader uninvertingReader = CollapsingQParserPlugin.getTopFieldCacheReader(searcher, field);
         values = uninvertingReader.getSortedDocValues(field);
       } else {
@@ -390,7 +388,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
     if(values != null) {
       //Get The Top Level SortedDocValues again so we can re-iterate:
       if(CollapsingQParserPlugin.HINT_TOP_FC.equals(hint)) {
-        @SuppressWarnings("resource")
         LeafReader uninvertingReader = CollapsingQParserPlugin.getTopFieldCacheReader(searcher, field);
         values = uninvertingReader.getSortedDocValues(field);
       } else {
diff --git a/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java b/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
index ae5b439..83fb1de 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
@@ -115,7 +115,6 @@ public class SpellCheckComponent extends SearchComponent implements SolrCoreAwar
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public void prepare(ResponseBuilder rb) throws IOException {
 
     SolrParams params = rb.req.getParams();
diff --git a/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java b/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
index 3c6a8dc..fd72be9 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/SuggestComponent.java
@@ -105,7 +105,6 @@ public class SuggestComponent extends SearchComponent implements SolrCoreAware,
   }
   
   @Override
-  @SuppressWarnings("unchecked")
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
     super.init(args);
     this.initParams = args;
diff --git a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index f2d0b9b..72380fb 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -25,6 +25,7 @@ import java.io.PrintWriter;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
+import java.util.Map;
 import java.util.TreeSet;
 
 import org.apache.lucene.index.LeafReader;
@@ -79,7 +80,6 @@ import org.slf4j.LoggerFactory;
 
 import static java.util.Collections.singletonList;
 import static java.util.Collections.singletonMap;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 /**
  * Prepares and writes the documents requested by /export requests
@@ -164,7 +164,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   protected void writeException(Exception e, PushWriter w, boolean logException) throws IOException {
     w.writeMap(mw -> {
       mw.put("responseHeader", singletonMap("status", 400))
-          .put("response", makeMap(
+          .put("response", Map.of(
               "numFound", 0,
               "docs", singletonList(singletonMap("EXCEPTION", e.getMessage()))));
     });
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
index cd038f5..fc1ea7f 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
@@ -33,8 +33,7 @@ class SolrEnumerator implements Enumerator<Object> {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final TupleStream tupleStream;
-  @SuppressWarnings({"rawtypes"})
-  private final List<Map.Entry<String, Class>> fields;
+  private final List<Map.Entry<String, Class<?>>> fields;
   private Tuple current;
   private char sep = 31;
 
@@ -43,8 +42,7 @@ class SolrEnumerator implements Enumerator<Object> {
    * @param tupleStream Solr TupleStream
    * @param fields Fields to get from each Tuple
    */
-  @SuppressWarnings({"rawtypes"})
-  SolrEnumerator(TupleStream tupleStream, List<Map.Entry<String, Class>> fields) {
+  SolrEnumerator(TupleStream tupleStream, List<Map.Entry<String, Class<?>>> fields) {
 
     this.tupleStream = tupleStream;
     try {
@@ -74,15 +72,14 @@ class SolrEnumerator implements Enumerator<Object> {
     }
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private Object getter(Tuple tuple, Map.Entry<String, Class> field) {
+  private Object getter(Tuple tuple, Map.Entry<String, Class<?>> field) {
     Object val = tuple.get(field.getKey());
 
     if(val == null) {
       return null;
     }
 
-    Class clazz = field.getValue();
+    Class<?> clazz = field.getValue();
     if(clazz.equals(Long.class)) {
       if(val instanceof Double) {
         return this.getRealVal(val);
@@ -91,7 +88,7 @@ class SolrEnumerator implements Enumerator<Object> {
     }
 
     if(val instanceof ArrayList) {
-      ArrayList arrayList = (ArrayList) val;
+      ArrayList<?> arrayList = (ArrayList<?>) val;
       StringBuilder buf = new StringBuilder();
 
       for(Object o : arrayList) {
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
index d6e12e7..b130fdf 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
@@ -38,8 +38,7 @@ enum SolrMethod {
 
   public final Method method;
 
-  @SuppressWarnings({"rawtypes"})
-  SolrMethod(Class clazz, String methodName, Class... argumentTypes) {
+  SolrMethod(Class<?> clazz, String methodName, Class<?>... argumentTypes) {
     this.method = Types.lookupMethod(clazz, methodName, argumentTypes);
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index 5572414..dcc1302 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -97,7 +97,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
    * @return Enumerator of results
    */
   private Enumerable<Object> query(final Properties properties,
-                                   @SuppressWarnings("rawtypes") final List<Map.Entry<String, Class>> fields,
+                                   final List<Map.Entry<String, Class<?>>> fields,
                                    final String query,
                                    final List<Pair<String, String>> orders,
                                    final List<String> buckets,
@@ -251,11 +251,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     }
   }
 
-  @SuppressWarnings({"rawtypes"})
   private TupleStream handleSelect(String zk,
                                    String collection,
                                    String query,
-                                   List<Map.Entry<String, Class>> fields,
+                                   List<Map.Entry<String, Class<?>>> fields,
                                    List<Pair<String, String>> orders,
                                    String limit) throws IOException {
 
@@ -263,7 +262,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     params.add(CommonParams.Q, query);
 
     //Validate the fields
-    for(Map.Entry<String, Class> entry : fields) {
+    for(Map.Entry<String, Class<?>> entry : fields) {
       String fname = entry.getKey();
       if(limit == null && "score".equals(fname)) {
         throw new IOException("score is not a valid field for unlimited queries.");
@@ -319,10 +318,9 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return buf.toString();
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private String getFields(List<Map.Entry<String, Class>> fields) {
+  private String getFields(List<Map.Entry<String, Class<?>>> fields) {
     StringBuilder buf = new StringBuilder();
-    for(Map.Entry<String, Class> field : fields) {
+    for(Map.Entry<String, Class<?>> field : fields) {
 
       if(buf.length() > 0) {
         buf.append(",");
@@ -350,16 +348,15 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
   }
 
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  private Set<String> getFieldSet(Metric[] metrics, List<Map.Entry<String, Class>> fields) {
-    HashSet set = new HashSet<>();
+  private Set<String> getFieldSet(Metric[] metrics, List<Map.Entry<String, Class<?>>> fields) {
+    HashSet<String> set = new HashSet<>();
     for(Metric metric : metrics) {
       for(String column : metric.getColumns()) {
         set.add(column);
       }
     }
 
-    for(Map.Entry<String, Class> field : fields) {
+    for(Map.Entry<String, Class<?>> field : fields) {
       if(field.getKey().indexOf('(') == -1) {
         set.add(field.getKey());
       }
@@ -426,11 +423,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return true;
   }
 
-  @SuppressWarnings({"rawtypes"})
   private TupleStream handleGroupByMapReduce(String zk,
                                              String collection,
                                              Properties properties,
-                                             final List<Map.Entry<String, Class>> fields,
+                                             final List<Map.Entry<String, Class<?>>> fields,
                                              final String query,
                                              final List<Pair<String, String>> orders,
                                              final List<String> _buckets,
@@ -438,8 +434,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                              final String limit,
                                              final String havingPredicate) throws IOException {
 
-    Map<String, Class> fmap = new HashMap<>();
-    for(Map.Entry<String, Class> entry : fields) {
+    Map<String, Class<?>> fmap = new HashMap<>();
+    for(Map.Entry<String, Class<?>> entry : fields) {
       fmap.put(entry.getKey(), entry.getValue());
     }
 
@@ -452,7 +448,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       return handleSelectDistinctMapReduce(zk, collection, properties, fields, query, orders, buckets, limit);
     } else {
       for(Metric metric : metrics) {
-        Class c = fmap.get(metric.getIdentifier());
+        Class<?> c = fmap.get(metric.getIdentifier());
         if(Long.class.equals(c)) {
           metric.outputLong = true;
         }
@@ -553,12 +549,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return tupleStream;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private Bucket[] buildBuckets(List<String> buckets, List<Map.Entry<String, Class>> fields) {
+  private Bucket[] buildBuckets(List<String> buckets, List<Map.Entry<String, Class<?>>> fields) {
     Bucket[] bucketsArray = new Bucket[buckets.size()];
 
     int i=0;
-    for(Map.Entry<String,Class> field : fields) {
+    for(Map.Entry<String,Class<?>> field : fields) {
       String fieldName = field.getKey();
       if(buckets.contains(fieldName)) {
         bucketsArray[i++] = new Bucket(fieldName);
@@ -568,10 +563,9 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return bucketsArray;
   }
 
-  @SuppressWarnings({"rawtypes"})
   private TupleStream handleGroupByFacet(String zkHost,
                                          String collection,
-                                         final List<Map.Entry<String, Class>> fields,
+                                         final List<Map.Entry<String, Class<?>>> fields,
                                          final String query,
                                          final List<Pair<String, String>> orders,
                                          final List<String> bucketFields,
@@ -580,8 +574,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                          final String havingPredicate) throws IOException {
 
 
-    Map<String, Class> fmap = new HashMap<>();
-    for(Map.Entry<String, Class> f : fields) {
+    Map<String, Class<?>> fmap = new HashMap<>();
+    for(Map.Entry<String, Class<?>> f : fields) {
       fmap.put(f.getKey(), f.getValue());
     }
 
@@ -595,7 +589,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       metrics[0] = new CountMetric();
     } else {
       for(Metric metric : metrics) {
-        Class c = fmap.get(metric.getIdentifier());
+        Class<?> c = fmap.get(metric.getIdentifier());
         if(Long.class.equals(c)) {
           metric.outputLong = true;
         }
@@ -659,11 +653,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return tupleStream;
   }
 
-  @SuppressWarnings({"rawtypes"})
   private TupleStream handleSelectDistinctMapReduce(final String zkHost,
                                                     final String collection,
                                                     final Properties properties,
-                                                    final List<Map.Entry<String, Class>> fields,
+                                                    final List<Map.Entry<String, Class<?>>> fields,
                                                     final String query,
                                                     final List<Pair<String, String>> orders,
                                                     final Bucket[] buckets,
@@ -802,16 +795,15 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return adjustedSorts.toArray(new FieldComparator[adjustedSorts.size()]);
   }
 
-  @SuppressWarnings({"rawtypes"})
   private TupleStream handleStats(String zk,
                                   String collection,
                                   String query,
                                   List<Pair<String, String>> metricPairs,
-                                  List<Map.Entry<String, Class>> fields) throws IOException {
+                                  List<Map.Entry<String, Class<?>>> fields) throws IOException {
 
 
-    Map<String, Class> fmap = new HashMap<>();
-    for(Map.Entry<String, Class> entry : fields) {
+    Map<String, Class<?>> fmap = new HashMap<>();
+    for(Map.Entry<String, Class<?>> entry : fields) {
       fmap.put(entry.getKey(), entry.getValue());
     }
 
@@ -820,7 +812,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     Metric[] metrics = buildMetrics(metricPairs, false).toArray(new Metric[0]);
 
     for(Metric metric : metrics) {
-      Class c = fmap.get(metric.getIdentifier());
+      Class<?> c = fmap.get(metric.getIdentifier());
       if(Long.class.equals(c)) {
         metric.outputLong = true;
       }
@@ -862,8 +854,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
      *
      * @see SolrMethod#SOLR_QUERYABLE_QUERY
      */
-    @SuppressWarnings({"rawtypes","UnusedDeclaration"})
-    public Enumerable<Object> query(List<Map.Entry<String, Class>> fields, String query, List<Pair<String, String>> order,
+    @SuppressWarnings({"UnusedDeclaration"})
+    public Enumerable<Object> query(List<Map.Entry<String, Class<?>>> fields, String query, List<Pair<String, String>> order,
                                     List<String> buckets, List<Pair<String, String>> metricPairs, String limit, String negativeQuery, String havingPredicate) {
       return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit, negativeQuery, havingPredicate);
     }
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
index c9d8cae..45f131c 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
@@ -62,15 +62,13 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
     final RelDataType rowType = getRowType();
     final PhysType physType = PhysTypeImpl.of(implementor.getTypeFactory(), rowType, pref.prefer(JavaRowFormat.ARRAY));
     final Expression table = list.append("table", solrImplementor.table.getExpression(SolrTable.SolrQueryable.class));
-    @SuppressWarnings({"rawtypes"})
     final Expression fields =
         list.append("fields",
             constantArrayList(
                 Pair.zip(generateFields(SolrRules.solrFieldNames(rowType), solrImplementor.fieldMappings),
-                    new AbstractList<Class>() {
+                    new AbstractList<Class<?>>() {
                       @Override
-                      @SuppressWarnings({"rawtypes"})
-                      public Class get(int index) {
+                      public Class<?> get(int index) {
                         return physType.fieldClass(index);
                       }
 
@@ -124,8 +122,7 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
    * E.g. {@code constantArrayList("x", "y")} returns
    * "Arrays.asList('x', 'y')".
    */
-  @SuppressWarnings({"rawtypes"})
-  private static <T> MethodCallExpression constantArrayList(List<T> values, Class clazz) {
+  private static <T> MethodCallExpression constantArrayList(List<T> values, Class<?> clazz) {
     return Expressions.call(BuiltInMethod.ARRAYS_AS_LIST.method,
         Expressions.newArrayInit(clazz, constantList(values)));
   }
diff --git a/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java b/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
index 3f05ece..0e559ab 100644
--- a/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
@@ -570,7 +570,6 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
   }
 
   /** Highlights and returns the highlight object for this field -- a String[] by default.  Null if none. */
-  @SuppressWarnings("unchecked")
   protected Object doHighlightingByFastVectorHighlighter(SolrDocument doc, int docId,
                                                          SchemaField schemaField, FvhContainer fvhContainer,
                                                          IndexReader reader, SolrQueryRequest req) throws IOException {
@@ -592,7 +591,6 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
   }
 
   /** Highlights and returns the highlight object for this field -- a String[] by default. Null if none. */
-  @SuppressWarnings("unchecked")
   protected Object doHighlightingByHighlighter(SolrDocument doc, int docId, SchemaField schemaField, Query query,
                                                IndexReader reader, SolrQueryRequest req) throws IOException {
     final SolrParams params = req.getParams();
@@ -767,7 +765,6 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
   }
 
   /** Returns the alternate highlight object for this field -- a String[] by default.  Null if none. */
-  @SuppressWarnings("unchecked")
   protected Object alternateField(SolrDocument doc, int docId, String fieldName, FvhContainer fvhContainer, Query query,
                                   IndexReader reader, SolrQueryRequest req) throws IOException {
     IndexSchema schema = req.getSearcher().getSchema();
diff --git a/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java b/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
index f906a69..8595ccf 100644
--- a/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/SolrHighlighter.java
@@ -118,6 +118,5 @@ public abstract class SolrHighlighter
    * @return NamedList containing a NamedList for each document, which in
    * turns contains sets (field, summary) pairs.
    */
-  @SuppressWarnings("unchecked")
   public abstract NamedList<Object> doHighlighting(DocList docs, Query query, SolrQueryRequest req, String[] defaultFields) throws IOException;
 }
diff --git a/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
index ec5d5c0..b9f36e8 100644
--- a/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
+++ b/solr/core/src/java/org/apache/solr/index/WrapperMergePolicyFactory.java
@@ -68,7 +68,6 @@ public abstract class WrapperMergePolicyFactory extends MergePolicyFactory {
   }
 
   /** Returns an instance of the wrapped {@link MergePolicy} after it has been configured with all set parameters. */
-  @SuppressWarnings({"rawtypes"})
   protected final MergePolicy getWrappedMergePolicy() {
     if (wrappedMergePolicyArgs == null) {
       return getDefaultWrappedMergePolicy();
@@ -78,7 +77,7 @@ public abstract class WrapperMergePolicyFactory extends MergePolicyFactory {
         wrappedMergePolicyClassName,
         MergePolicyFactory.class,
         NO_SUB_PACKAGES,
-        new Class[] {SolrResourceLoader.class, MergePolicyFactoryArgs.class, IndexSchema.class},
+        new Class<?>[] {SolrResourceLoader.class, MergePolicyFactoryArgs.class, IndexSchema.class},
         new Object[] {resourceLoader, wrappedMergePolicyArgs, schema});
     return mpf.getMergePolicy();
   }
diff --git a/solr/core/src/java/org/apache/solr/legacy/LegacyNumericRangeQuery.java b/solr/core/src/java/org/apache/solr/legacy/LegacyNumericRangeQuery.java
index d5c37a7..7dc3e26 100644
--- a/solr/core/src/java/org/apache/solr/legacy/LegacyNumericRangeQuery.java
+++ b/solr/core/src/java/org/apache/solr/legacy/LegacyNumericRangeQuery.java
@@ -340,7 +340,7 @@ public final class LegacyNumericRangeQuery<T extends Number> extends MultiTermQu
   }
 
   @Override
-  @SuppressWarnings({"unchecked","rawtypes"})
+  @SuppressWarnings({"rawtypes"})
   public final boolean equals(final Object o) {
     if (o==this) return true;
     if (!super.equals(o))
diff --git a/solr/core/src/java/org/apache/solr/metrics/MetricsMap.java b/solr/core/src/java/org/apache/solr/metrics/MetricsMap.java
index 8faccff..36227ea 100644
--- a/solr/core/src/java/org/apache/solr/metrics/MetricsMap.java
+++ b/solr/core/src/java/org/apache/solr/metrics/MetricsMap.java
@@ -192,10 +192,8 @@ public class MetricsMap implements Gauge<Map<String,Object>>, MapWriter, Dynamic
         if (jmxAttributes != null && jmxAttributes.containsKey(k)) {
           return;
         }
-        @SuppressWarnings({"rawtypes"})
-        Class type = v.getClass();
-        @SuppressWarnings({"rawtypes"})
-        OpenType typeBox = determineType(type);
+        Class<?> type = v.getClass();
+        OpenType<?> typeBox = determineType(type);
         if (type.equals(String.class) || typeBox == null) {
           attrInfoList.add(new MBeanAttributeInfo(k, String.class.getName(),
               null, true, false, false));
@@ -214,12 +212,11 @@ public class MetricsMap implements Gauge<Map<String,Object>>, MapWriter, Dynamic
     return new MBeanInfo(getClass().getName(), "MetricsMap", attrInfoArr, null, null, null);
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private OpenType determineType(Class type) {
+  private OpenType<?> determineType(Class<?> type) {
     try {
       for (Field field : SimpleType.class.getFields()) {
         if (field.getType().equals(SimpleType.class)) {
-          SimpleType candidate = (SimpleType) field.get(SimpleType.class);
+          SimpleType<?> candidate = (SimpleType<?>) field.get(SimpleType.class);
           if (candidate.getTypeName().equals(type.getName())) {
             return candidate;
           }
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
index 1ebee8c..029f5e6 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricManager.java
@@ -1003,7 +1003,6 @@ public class SolrMetricManager {
    *                      component instances.
    * @throws Exception if any argument is missing or invalid
    */
-  @SuppressWarnings({"rawtypes"})
   public void loadReporter(String registry, SolrResourceLoader loader, CoreContainer coreContainer, SolrCore solrCore, PluginInfo pluginInfo, String tag) throws Exception {
     if (registry == null || pluginInfo == null || pluginInfo.name == null || pluginInfo.className == null) {
       throw new IllegalArgumentException("loadReporter called with missing arguments: " +
@@ -1015,7 +1014,7 @@ public class SolrMetricManager {
         pluginInfo.className,
         SolrMetricReporter.class,
         new String[0],
-    new Class[]{SolrMetricManager.class, String.class},
+        new Class<?>[]{SolrMetricManager.class, String.class},
         new Object[]{this, registry}
     );
     // prepare MDC for plugins that want to use its properties
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
index 6f2f618..971a2f6 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
@@ -219,7 +219,6 @@ public class PackageManager implements Closeable {
   public Map<String, SolrPackageInstance> getPackagesDeployedAsClusterLevelPlugins() {
     Map<String, String> packageVersions = new HashMap<>();
     MultiValuedMap<String, PluginMeta> packagePlugins = new HashSetValuedHashMap<>(); // map of package name to multiple values of pluginMeta (Map<String, String>)
-    @SuppressWarnings({"unchecked"})
     Map<String, Object> result;
     try {
       result = (Map<String, Object>) Utils.executeGET(solrClient.getHttpClient(),
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
index d932e50..5dd9f55 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -264,7 +264,6 @@ public class PackageAPI {
     }
 
     @Command(name = "add")
-    @SuppressWarnings({"unchecked"})
     public void add(PayloadObj<Package.AddVersion> payload) {
       if (!checkEnabled(payload)) return;
       Package.AddVersion add = payload.get();
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
index 14617aa..2dbb6de 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageListeningClassLoader.java
@@ -113,8 +113,7 @@ public class PackageListeningClassLoader implements SolrClassLoader , PackageLis
     }
 
     @Override
-    @SuppressWarnings({"rawtypes"})
-    public <T> T newInstance(String cname, Class<T> expectedType, String[] subPackages, Class[] params, Object[] args) {
+    public <T> T newInstance(String cname, Class<T> expectedType, String[] subPackages, Class<?>[] params, Object[] args) {
         PluginInfo.ClassName cName = new PluginInfo.ClassName(cname);
         if (cName.pkg == null) {
             return fallbackClassLoader.newInstance(cname, expectedType, subPackages, params, args);
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
index e3ad675..2cd6e9c 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageLoader.java
@@ -83,9 +83,8 @@ public class PackageLoader implements Closeable {
     return packageClassLoaders.get(key);
   }
 
-  @SuppressWarnings({"unchecked"})
   public Map<String, Package> getPackages() {
-    return Collections.EMPTY_MAP;
+    return Collections.emptyMap();
   }
 
   public void refreshPackageConf() {
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
index ac3acf3..bc72db8 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
@@ -229,8 +229,7 @@ public abstract class SolrQueryRequestBase implements SolrQueryRequest, Closeabl
     return null;
   }
 
-  @SuppressWarnings({"unchecked"})
   protected Map<String, JsonSchemaValidator> getValidators(){
-    return Collections.EMPTY_MAP;
+    return Collections.emptyMap();
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
index 9e08509..aa10d10 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrRequestInfo.java
@@ -210,7 +210,6 @@ public class SolrRequestInfo {
       }
 
       @Override
-      @SuppressWarnings({"unchecked"})
       public void set(@SuppressWarnings({"rawtypes"})AtomicReference ctx) {
         SolrRequestInfo me = (SolrRequestInfo) ctx.get();
         if (me != null) {
diff --git a/solr/core/src/java/org/apache/solr/rest/ManagedResource.java b/solr/core/src/java/org/apache/solr/rest/ManagedResource.java
index c6e7adf..9c2f9de 100644
--- a/solr/core/src/java/org/apache/solr/rest/ManagedResource.java
+++ b/solr/core/src/java/org/apache/solr/rest/ManagedResource.java
@@ -170,7 +170,6 @@ public abstract class ManagedResource {
   /**
    * Invoked when this object determines it needs to reload the stored data.
    */
-  @SuppressWarnings("unchecked")
   protected synchronized void reloadFromStorage() throws SolrException {
     String resourceId = getResourceId();
     Object data = null;
diff --git a/solr/core/src/java/org/apache/solr/schema/BoolField.java b/solr/core/src/java/org/apache/solr/schema/BoolField.java
index 3a4b49a..6910ee0 100644
--- a/solr/core/src/java/org/apache/solr/schema/BoolField.java
+++ b/solr/core/src/java/org/apache/solr/schema/BoolField.java
@@ -231,7 +231,7 @@ public class BoolField extends PrimitiveFieldType {
 
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+    public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
       final SortedDocValues sindex = DocValues.getSorted(readerContext.reader(), field);
 
       // figure out what ord maps to true
diff --git a/solr/core/src/java/org/apache/solr/schema/CurrencyFieldType.java b/solr/core/src/java/org/apache/solr/schema/CurrencyFieldType.java
index 38e2d57..43c3d7d 100644
--- a/solr/core/src/java/org/apache/solr/schema/CurrencyFieldType.java
+++ b/solr/core/src/java/org/apache/solr/schema/CurrencyFieldType.java
@@ -402,7 +402,7 @@ public class CurrencyFieldType extends FieldType implements SchemaAware, Resourc
     }
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext reader)
+    public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext reader)
         throws IOException {
       final FunctionValues amounts = source.getValues(context, reader);
       // the target digits & currency of our source, 
@@ -514,8 +514,7 @@ public class CurrencyFieldType extends FieldType implements SchemaAware, Resourc
     public Currency getTargetCurrency() { return targetCurrency; }
 
     @Override
-    @SuppressWarnings({"unchecked"})
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext reader) throws IOException {
+    public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext reader) throws IOException {
       final FunctionValues amounts = amountValues.getValues(context, reader);
       final FunctionValues currencies = currencyValues.getValues(context, reader);
 
diff --git a/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java b/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java
index 345a2cf..2e35dc5 100644
--- a/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java
+++ b/solr/core/src/java/org/apache/solr/schema/FieldTypePluginLoader.java
@@ -239,7 +239,6 @@ public final class FieldTypePluginLoader
       ("[schema.xml] analyzer/charFilter", CharFilterFactory.class, false, false) {
 
       @Override
-      @SuppressWarnings("rawtypes")
       protected CharFilterFactory create(SolrClassLoader loader, String name, String className, ConfigNode node) throws Exception {
         final Map<String,String> params = DOMUtil.toMapExcept(node);
         String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
@@ -253,7 +252,7 @@ public final class FieldTypePluginLoader
                 "Cannot create charFilter: Both of name and className are specified.");
           }
         } else if (Objects.nonNull(className)) {
-          factory = loader.newInstance(className, CharFilterFactory.class, getDefaultPackages(), new Class[]{Map.class}, new Object[]{params});
+          factory = loader.newInstance(className, CharFilterFactory.class, getDefaultPackages(), new Class<?>[]{Map.class}, new Object[]{params});
         } else {
           log.error("Neither of name or className is specified for charFilter.");
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
@@ -290,7 +289,6 @@ public final class FieldTypePluginLoader
       ("[schema.xml] analyzer/tokenizer", TokenizerFactory.class, false, false) {
       
       @Override
-      @SuppressWarnings("rawtypes")
       protected TokenizerFactory create(SolrClassLoader loader, String name, String className, ConfigNode node) throws Exception {
         final Map<String,String> params = DOMUtil.toMap(node);
         String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
@@ -304,7 +302,7 @@ public final class FieldTypePluginLoader
                 "Cannot create tokenizer: Both of name and className are specified.");
           }
         } else if (Objects.nonNull(className)) {
-          factory = loader.newInstance(className, TokenizerFactory.class, getDefaultPackages(), new Class[]{Map.class}, new Object[]{params});
+          factory = loader.newInstance(className, TokenizerFactory.class, getDefaultPackages(), new Class<?>[]{Map.class}, new Object[]{params});
         } else {
           log.error("Neither of name or className is specified for tokenizer.");
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
@@ -345,7 +343,6 @@ public final class FieldTypePluginLoader
       new AbstractPluginLoader<TokenFilterFactory>("[schema.xml] analyzer/filter", TokenFilterFactory.class, false, false)
     {
       @Override
-      @SuppressWarnings("rawtypes")
       protected TokenFilterFactory create(SolrClassLoader loader, String name, String className, ConfigNode node) throws Exception {
         final Map<String,String> params = DOMUtil.toMap(node);
         String configuredVersion = params.remove(LUCENE_MATCH_VERSION_PARAM);
@@ -359,7 +356,7 @@ public final class FieldTypePluginLoader
                 "Cannot create tokenFilter: Both of name and className are specified.");
           }
         } else if (Objects.nonNull(className)) {
-          factory = loader.newInstance(className, TokenFilterFactory.class, getDefaultPackages(), new Class[]{Map.class}, new Object[]{params});
+          factory = loader.newInstance(className, TokenFilterFactory.class, getDefaultPackages(), new Class<?>[]{Map.class}, new Object[]{params});
         } else {
           log.error("Neither of name or className is specified for tokenFilter.");
           throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
index 19c1de2..cbbbb8b 100644
--- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
@@ -1380,9 +1380,8 @@ public class IndexSchema {
   /**
    * Get a map of property name -&gt; value for the whole schema.
    */
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public Map getNamedPropertyValues() {
-    return getNamedPropertyValues(null, new MapSolrParams(Collections.EMPTY_MAP));
+  public Map<String, Object> getNamedPropertyValues() {
+    return getNamedPropertyValues(null, new MapSolrParams(Collections.emptyMap()));
   }
 
   public static class SchemaProps implements MapSerializable {
diff --git a/solr/core/src/java/org/apache/solr/schema/RandomSortField.java b/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
index 1a8ec24..971675c 100644
--- a/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
+++ b/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
@@ -173,7 +173,7 @@ public class RandomSortField extends FieldType {
     }
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, final LeafReaderContext readerContext) throws IOException {
+    public FunctionValues getValues(Map<Object, Object> context, final LeafReaderContext readerContext) throws IOException {
       return new IntDocValues(this) {
           private final int seed = getSeed(field, readerContext);
           @Override
diff --git a/solr/core/src/java/org/apache/solr/schema/StrFieldSource.java b/solr/core/src/java/org/apache/solr/schema/StrFieldSource.java
index 002ac3a..b084977 100644
--- a/solr/core/src/java/org/apache/solr/schema/StrFieldSource.java
+++ b/solr/core/src/java/org/apache/solr/schema/StrFieldSource.java
@@ -36,7 +36,7 @@ public class StrFieldSource extends FieldCacheSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     return new DocTermsIndexDocValues(this, readerContext, field) {
 
       @Override
diff --git a/solr/core/src/java/org/apache/solr/schema/TrieDoubleField.java b/solr/core/src/java/org/apache/solr/schema/TrieDoubleField.java
index ad26265..71f8640 100644
--- a/solr/core/src/java/org/apache/solr/schema/TrieDoubleField.java
+++ b/solr/core/src/java/org/apache/solr/schema/TrieDoubleField.java
@@ -71,7 +71,7 @@ public class TrieDoubleField extends TrieField implements DoubleValueFieldType {
     
     return new SortedSetFieldSource(f.getName(), choice) {
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         SortedSetFieldSource thisAsSortedSetFieldSource = this; // needed for nested anon class ref
         
         SortedSetDocValues sortedSet = DocValues.getSortedSet(readerContext.reader(), field);
diff --git a/solr/core/src/java/org/apache/solr/schema/TrieFloatField.java b/solr/core/src/java/org/apache/solr/schema/TrieFloatField.java
index 2932216..fb23f2d 100644
--- a/solr/core/src/java/org/apache/solr/schema/TrieFloatField.java
+++ b/solr/core/src/java/org/apache/solr/schema/TrieFloatField.java
@@ -71,7 +71,7 @@ public class TrieFloatField extends TrieField implements FloatValueFieldType {
     
     return new SortedSetFieldSource(f.getName(), choice) {
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         SortedSetFieldSource thisAsSortedSetFieldSource = this; // needed for nested anon class ref
         
         SortedSetDocValues sortedSet = DocValues.getSortedSet(readerContext.reader(), field);
diff --git a/solr/core/src/java/org/apache/solr/schema/TrieIntField.java b/solr/core/src/java/org/apache/solr/schema/TrieIntField.java
index 489adb5..57e73b5 100644
--- a/solr/core/src/java/org/apache/solr/schema/TrieIntField.java
+++ b/solr/core/src/java/org/apache/solr/schema/TrieIntField.java
@@ -69,7 +69,7 @@ public class TrieIntField extends TrieField implements IntValueFieldType {
     
     return new SortedSetFieldSource(f.getName(), choice) {
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         SortedSetFieldSource thisAsSortedSetFieldSource = this; // needed for nested anon class ref
         
         SortedSetDocValues sortedSet = DocValues.getSortedSet(readerContext.reader(), field);
diff --git a/solr/core/src/java/org/apache/solr/schema/TrieLongField.java b/solr/core/src/java/org/apache/solr/schema/TrieLongField.java
index 4de86a7..483f3a9 100644
--- a/solr/core/src/java/org/apache/solr/schema/TrieLongField.java
+++ b/solr/core/src/java/org/apache/solr/schema/TrieLongField.java
@@ -69,7 +69,7 @@ public class TrieLongField extends TrieField implements LongValueFieldType {
     
     return new SortedSetFieldSource(f.getName(), choice) {
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         SortedSetFieldSource thisAsSortedSetFieldSource = this; // needed for nested anon class ref
         
         SortedSetDocValues sortedSet = DocValues.getSortedSet(readerContext.reader(), field);
diff --git a/solr/core/src/java/org/apache/solr/search/CacheConfig.java b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
index af1b87f..37b509e 100644
--- a/solr/core/src/java/org/apache/solr/search/CacheConfig.java
+++ b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
@@ -181,6 +181,7 @@ public class CacheConfig implements MapSerializable{
 
   @Override
   public Map<String, Object> toMap(Map<String, Object> map) {
+    // TODO: Should not create new HashMap?
     return new HashMap<>(args);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java b/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java
index 130c1ef..cb66114 100644
--- a/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java
+++ b/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java
@@ -53,12 +53,11 @@ public class FloatPayloadValueSource extends ValueSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context
+  public FunctionValues getValues(Map<Object, Object> context
           , LeafReaderContext readerContext) throws IOException {
 
     final Terms terms = readerContext.reader().terms(indexedField);
 
-    @SuppressWarnings({"unchecked"})
     FunctionValues defaultValues = defaultValueSource.getValues(context, readerContext);
 
     // copied the bulk of this from TFValueSource - TODO: this is a very repeated pattern - base-class this advance logic stuff?
diff --git a/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java b/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java
index 9d6e038..a435f43 100755
--- a/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrCoreParser.java
@@ -54,13 +54,13 @@ public class SolrCoreParser extends CoreParser implements NamedListInitializedPl
   }
 
   @Override
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public void init(NamedList initArgs) {
+  public void init(@SuppressWarnings({"rawtypes"}) NamedList initArgs) {
     if (initArgs == null || initArgs.size() == 0) {
       return;
     }
     final SolrResourceLoader loader = req.getCore().getResourceLoader();
 
+    @SuppressWarnings("unchecked")
     final Iterable<Map.Entry<String,Object>> args = initArgs;
     for (final Map.Entry<String,Object> entry : args) {
       final String queryName = entry.getKey();
@@ -71,7 +71,7 @@ public class SolrCoreParser extends CoreParser implements NamedListInitializedPl
             queryBuilderClassName,
             SolrSpanQueryBuilder.class,
             null,
-            new Class[] {String.class, Analyzer.class, SolrQueryRequest.class, SpanQueryBuilder.class},
+            new Class<?>[] {String.class, Analyzer.class, SolrQueryRequest.class, SpanQueryBuilder.class},
             new Object[] {defaultField, analyzer, req, this});
 
         this.addSpanQueryBuilder(queryName, spanQueryBuilder);
@@ -81,7 +81,7 @@ public class SolrCoreParser extends CoreParser implements NamedListInitializedPl
             queryBuilderClassName,
             SolrQueryBuilder.class,
             null,
-            new Class[] {String.class, Analyzer.class, SolrQueryRequest.class, QueryBuilder.class},
+            new Class<?>[] {String.class, Analyzer.class, SolrQueryRequest.class, QueryBuilder.class},
             new Object[] {defaultField, analyzer, req, this});
 
         this.addQueryBuilder(queryName, queryBuilder);
diff --git a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
index b1f7830..5cf632a 100644
--- a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
+++ b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
@@ -1304,7 +1304,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
     }
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context
+    public FunctionValues getValues(Map<Object, Object> context
             , LeafReaderContext readerContext) throws IOException {
       return new LongDocValues(this) {
         @Override
@@ -1410,8 +1410,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
       }
 
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
-        @SuppressWarnings({"unchecked"})
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         final FunctionValues vals =  source.getValues(context, readerContext);
         return new DoubleDocValues(this) {
           @Override
@@ -1458,10 +1457,8 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
       }
 
       @Override
-      public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
-        @SuppressWarnings({"unchecked"})
+      public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
         final FunctionValues aVals =  a.getValues(context, readerContext);
-        @SuppressWarnings({"unchecked"})
         final FunctionValues bVals =  b.getValues(context, readerContext);
         return new DoubleDocValues(this) {
           @Override
@@ -1476,7 +1473,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
       }
 
       @Override
-      public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+      public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
       }
 
       @Override
@@ -1516,7 +1513,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
     }
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context,
+    public FunctionValues getValues(Map<Object, Object> context,
                                     LeafReaderContext readerContext) throws IOException {
       return new BoolDocValues(this) {
         @Override
@@ -1577,8 +1574,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
     }
 
     @Override
-    @SuppressWarnings({"unchecked"})
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context
+    public FunctionValues getValues(Map<Object, Object> context
             , LeafReaderContext readerContext) throws IOException {
       if (context.get(this) == null) {
         SolrRequestInfo requestInfo = SolrRequestInfo.getRequestInfo();
@@ -1603,8 +1599,7 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
     }
 
     @Override
-    @SuppressWarnings({"unchecked"})
-    public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+    public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
       context.put(this, this);
     }
 
diff --git a/solr/core/src/java/org/apache/solr/search/facet/AggValueSource.java b/solr/core/src/java/org/apache/solr/search/facet/AggValueSource.java
index da83b91..a131d1c 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/AggValueSource.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/AggValueSource.java
@@ -44,8 +44,7 @@ public abstract class AggValueSource extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     // FUTURE
     throw new UnsupportedOperationException("NOT IMPLEMENTED " + name + " " + this);
   }
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
index a1c39cf..7826c93 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
@@ -45,7 +45,7 @@ public class FacetFieldMerger extends FacetRequestSortedMerger<FacetField> {
   }
 
   @Override
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"rawtypes"})
   public void merge(Object facetResult, Context mcontext) {
     super.merge(facetResult, mcontext);
     if (numReturnedPerShard == null) {
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
index 3cde18a..5702a12 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
@@ -91,7 +91,6 @@ public class FacetModule extends SearchComponent {
     SolrParams params = rb.req.getParams();
 
     boolean isShard = params.getBool(ShardParams.IS_SHARD, false);
-    @SuppressWarnings({"unchecked"})
     Map<String, Object> facetInfo = null;
     if (isShard) {
       String jfacet = params.get(FACET_INFO);
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRangeProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRangeProcessor.java
index 1bc985f..fdb6496 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetRangeProcessor.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRangeProcessor.java
@@ -286,7 +286,6 @@ class FacetRangeProcessor extends FacetProcessor<FacetRange> {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
             "Expected Map for range but got " + obj.getClass().getSimpleName() + " = " + obj);
       }
-      @SuppressWarnings({"unchecked"})
       Range range;
       @SuppressWarnings({"unchecked"})
       Map<String, Object> interval = (Map<String, Object>) obj;
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
index cdaa5f2..26b7774 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
@@ -69,7 +69,7 @@ abstract class FacetRequestSortedMerger<FacetRequestT extends FacetRequestSorted
     }
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
+  @SuppressWarnings({"rawtypes"})
   public void mergeBucketList(List<SimpleOrderedMap> bucketList, Context mcontext) {
     for (SimpleOrderedMap bucketRes : bucketList) {
       Comparable bucketVal = (Comparable)bucketRes.get("val");
diff --git a/solr/core/src/java/org/apache/solr/search/facet/RelatednessAgg.java b/solr/core/src/java/org/apache/solr/search/facet/RelatednessAgg.java
index 835de9b..1cf0c32 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/RelatednessAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/RelatednessAgg.java
@@ -124,7 +124,7 @@ public class RelatednessAgg extends AggValueSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings("rawtypes") Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     throw new UnsupportedOperationException("NOT IMPLEMENTED " + name + " " + this);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/search/facet/SimpleAggValueSource.java b/solr/core/src/java/org/apache/solr/search/facet/SimpleAggValueSource.java
index afc506c..42ee90b 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/SimpleAggValueSource.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/SimpleAggValueSource.java
@@ -35,8 +35,7 @@ public abstract class SimpleAggValueSource extends AggValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     throw new UnsupportedOperationException();
   }
 
diff --git a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
index 0da8be8..6be4920 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/SlotAcc.java
@@ -576,7 +576,6 @@ public abstract class SlotAcc implements Closeable {
     }
 
     @Override
-    @SuppressWarnings({"unchecked"})
     public Object getValue(int slot) {
       if (fcontext.isShard()) {
         ArrayList<Object> lst = new ArrayList<>(3);
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UnInvertedField.java b/solr/core/src/java/org/apache/solr/search/facet/UnInvertedField.java
index ee86fe0..ad83c8a 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UnInvertedField.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UnInvertedField.java
@@ -600,7 +600,6 @@ public class UnInvertedField extends DocTermOrds {
   //////////////////////////// caching /////////////////////////////
   //////////////////////////////////////////////////////////////////
 
-  @SuppressWarnings("unchecked")
   public static UnInvertedField getUnInvertedField(String field, SolrIndexSearcher searcher) throws IOException {
     SolrCache<String, UnInvertedField> cache = searcher.getFieldValueCache();
     if (cache == null) {
diff --git a/solr/core/src/java/org/apache/solr/search/function/CollapseScoreFunction.java b/solr/core/src/java/org/apache/solr/search/function/CollapseScoreFunction.java
index 69a3d59..fdc6dc3 100644
--- a/solr/core/src/java/org/apache/solr/search/function/CollapseScoreFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/CollapseScoreFunction.java
@@ -41,8 +41,7 @@ public class CollapseScoreFunction extends ValueSource {
     return 1213241257;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     return new CollapseScoreFunctionValues(context);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/FieldNameValueSource.java b/solr/core/src/java/org/apache/solr/search/function/FieldNameValueSource.java
index 7b5714a..2d36be1 100644
--- a/solr/core/src/java/org/apache/solr/search/function/FieldNameValueSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/FieldNameValueSource.java
@@ -39,8 +39,7 @@ public class FieldNameValueSource extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     throw new UnsupportedOperationException("FieldNameValueSource should not be directly used: " + this);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java b/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java
index 183cf2d..8ce7401 100644
--- a/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/FileFloatSource.java
@@ -88,9 +88,7 @@ public class FileFloatSource extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final int off = readerContext.docBase;
     IndexReaderContext topLevelContext = ReaderUtil.getTopLevelContext(readerContext);
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java b/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
index 763b170..c1ca092 100644
--- a/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
@@ -60,8 +60,7 @@ public abstract class MultiStringFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final FunctionValues[] valsArr = new FunctionValues[sources.length];
     for (int i=0; i<sources.length; i++) {
       valsArr[i] = sources[i].getValues(context, readerContext);
diff --git a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
index f4053c6..e07a7f5 100644
--- a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java
@@ -71,8 +71,7 @@ public class OrdFieldSource extends ValueSource {
 
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final int off = readerContext.docBase;
     final LeafReader r;
     Object o = context.get("searcher");
diff --git a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
index a505709..0451213 100644
--- a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
+++ b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
@@ -71,8 +71,7 @@ public class ReverseOrdFieldSource extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final int off = readerContext.docBase;
     final LeafReader r;
     Object o = context.get("searcher");
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
index c8468ad..44e7dd7 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashFunction.java
@@ -45,11 +45,8 @@ public class GeohashFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
-    @SuppressWarnings({"unchecked"})
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final FunctionValues latDV = lat.getValues(context, readerContext);
-    @SuppressWarnings({"unchecked"})
     final FunctionValues lonDV = lon.getValues(context, readerContext);
 
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
index 0bdf9f4..e0a5279 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
@@ -58,11 +58,9 @@ public class GeohashHaversineFunction extends ValueSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context,
+  public FunctionValues getValues(Map<Object, Object> context,
                                   LeafReaderContext readerContext) throws IOException {
-    @SuppressWarnings({"unchecked"})
     final FunctionValues gh1DV = geoHash1.getValues(context, readerContext);
-    @SuppressWarnings({"unchecked"})
     final FunctionValues gh2DV = geoHash2.getValues(context, readerContext);
 
     return new DoubleDocValues(this) {
@@ -98,8 +96,7 @@ public class GeohashHaversineFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+  public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
     geoHash1.createWeight(context, searcher);
     geoHash2.createWeight(context, searcher);
   }
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
index 1afada0..675d4f5 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
@@ -56,11 +56,9 @@ public class HaversineConstFunction extends ValueSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context,
+  public FunctionValues getValues(Map<Object, Object> context,
                                   LeafReaderContext readerContext) throws IOException {
-    @SuppressWarnings({"unchecked"})
     final FunctionValues latVals = latSource.getValues(context, readerContext);
-    @SuppressWarnings({"unchecked"})
     final FunctionValues lonVals = lonSource.getValues(context, readerContext);
     final double latCenterRad = this.latCenter * DEGREES_TO_RADIANS;
     final double lonCenterRad = this.lonCenter * DEGREES_TO_RADIANS;
@@ -87,8 +85,7 @@ public class HaversineConstFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+  public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
     latSource.createWeight(context, searcher);
     lonSource.createWeight(context, searcher);
   }
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
index 41e0ed4..2bbfaae 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
@@ -93,11 +93,9 @@ public class HaversineFunction extends ValueSource {
 
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
-    @SuppressWarnings({"unchecked"})
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final FunctionValues vals1 = p1.getValues(context, readerContext);
 
-    @SuppressWarnings({"unchecked"})
     final FunctionValues vals2 = p2.getValues(context, readerContext);
     return new DoubleDocValues(this) {
       @Override
@@ -116,8 +114,7 @@ public class HaversineFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+  public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
     p1.createWeight(context, searcher);
     p2.createWeight(context, searcher);
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
index 717657c..1900536 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
@@ -43,11 +43,8 @@ public class StringDistanceFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"rawtypes"})
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
-    @SuppressWarnings({"unchecked"})
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
     final FunctionValues str1DV = str1.getValues(context, readerContext);
-    @SuppressWarnings({"unchecked"})
     final FunctionValues str2DV = str2.getValues(context, readerContext);
     return new FloatDocValues(this) {
 
diff --git a/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java b/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
index 37e7e6d..cdb9fc2 100644
--- a/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
+++ b/solr/core/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
@@ -149,12 +149,10 @@ public class VectorDistanceFunction extends ValueSource {
   }
 
   @Override
-  public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context, LeafReaderContext readerContext) throws IOException {
+  public FunctionValues getValues(Map<Object, Object> context, LeafReaderContext readerContext) throws IOException {
 
-    @SuppressWarnings({"unchecked"})
     final FunctionValues vals1 = source1.getValues(context, readerContext);
 
-    @SuppressWarnings({"unchecked"})
     final FunctionValues vals2 = source2.getValues(context, readerContext);
 
 
@@ -179,8 +177,7 @@ public class VectorDistanceFunction extends ValueSource {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
-  public void createWeight(@SuppressWarnings({"rawtypes"})Map context, IndexSearcher searcher) throws IOException {
+  public void createWeight(Map<Object, Object> context, IndexSearcher searcher) throws IOException {
     source1.createWeight(context, searcher);
     source2.createWeight(context, searcher);
   }
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java
index c13a3b6..1410c67 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java
@@ -183,7 +183,6 @@ public class TopGroupsFieldCommand implements Command<TopGroups<BytesRef>> {
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public TopGroups<BytesRef> result() throws IOException {
     return topGroups;
   }
diff --git a/solr/core/src/java/org/apache/solr/search/join/ChildFieldValueSourceParser.java b/solr/core/src/java/org/apache/solr/search/join/ChildFieldValueSourceParser.java
index 30be3a3..b46eeda 100644
--- a/solr/core/src/java/org/apache/solr/search/join/ChildFieldValueSourceParser.java
+++ b/solr/core/src/java/org/apache/solr/search/join/ChildFieldValueSourceParser.java
@@ -150,7 +150,7 @@ public class ChildFieldValueSourceParser extends ValueSourceParser {
     }
 
     @Override
-    public FunctionValues getValues(@SuppressWarnings("rawtypes") Map context,
+    public FunctionValues getValues(Map<Object, Object> context,
         LeafReaderContext readerContext) throws IOException {
       throw new UnsupportedOperationException(this + " is only for sorting");
     }
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 548b00d..892230e 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -1198,9 +1198,8 @@ public class HttpSolrCall {
     return null;
   }
 
-  @SuppressWarnings({"unchecked"})
   protected Map<String, JsonSchemaValidator> getValidators(){
-    return Collections.EMPTY_MAP;
+    return Collections.emptyMap();
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java b/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java
index dc54fc9..2ecd643 100644
--- a/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java
+++ b/solr/core/src/java/org/apache/solr/servlet/cache/HttpCacheHeaderUtil.java
@@ -233,7 +233,6 @@ public final class HttpCacheHeaderUtil {
    * 
    * @return true if no request processing is necessary and HTTP response status has been set, false otherwise.
    */
-  @SuppressWarnings("unchecked")
   public static boolean checkETagValidators(final HttpServletRequest req,
                                             final HttpServletResponse resp,
                                             final Method reqMethod,
diff --git a/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java b/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java
index d31cf21..d1d6a8e 100644
--- a/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java
+++ b/solr/core/src/java/org/apache/solr/spelling/suggest/SolrSuggester.java
@@ -99,7 +99,6 @@ public class SolrSuggester implements Accountable {
    * Uses the <code>config</code> and the <code>core</code> to initialize the underlying 
    * Lucene suggester
    * */
-  @SuppressWarnings({"unchecked"})
   public String init(NamedList<?> config, SolrCore core) {
     log.info("init: {}", config);
     
@@ -116,7 +115,7 @@ public class SolrSuggester implements Accountable {
       log.info("No {} parameter was provided falling back to {}", LOOKUP_IMPL, lookupImpl);
     }
 
-    contextFilterQueryAnalyzer = new TokenizerChain(new StandardTokenizerFactory(Collections.EMPTY_MAP), null);
+    contextFilterQueryAnalyzer = new TokenizerChain(new StandardTokenizerFactory(Collections.emptyMap()), null);
 
     // initialize appropriate lookup instance
     factory = core.getResourceLoader().newInstance(lookupImpl, LookupFactory.class);
diff --git a/solr/core/src/java/org/apache/solr/update/IndexFingerprint.java b/solr/core/src/java/org/apache/solr/update/IndexFingerprint.java
index 8e5af2a..bb1be0d 100644
--- a/solr/core/src/java/org/apache/solr/update/IndexFingerprint.java
+++ b/solr/core/src/java/org/apache/solr/update/IndexFingerprint.java
@@ -186,7 +186,7 @@ public class IndexFingerprint implements MapSerializable {
     return map;
   }
 
-  private static long getLong(@SuppressWarnings({"rawtypes"})Map m, String key, long def) {
+  private static long getLong(Map<String, Object> m, String key, long def) {
     Object oval = m.get(key);
     return oval != null ? ((Number)oval).longValue() : def;
   }
@@ -194,14 +194,14 @@ public class IndexFingerprint implements MapSerializable {
   /**
    * Create an IndexFingerprint object from a deserialized generic object (Map or NamedList)
    */
+  @SuppressWarnings("unchecked")
   public static IndexFingerprint fromObject(Object o) {
     if (o instanceof IndexFingerprint) return (IndexFingerprint) o;
-    @SuppressWarnings({"rawtypes"})
-    Map map = null;
+    Map<String, Object> map = null;
     if (o instanceof Map) {
-      map = (Map) o;
+      map = (Map<String,Object>) o;
     } else if (o instanceof NamedList) {
-      map = ((NamedList) o).asShallowMap();
+      map = ((NamedList<Object>) o).asShallowMap();
     } else {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Unknown type " + o);
     }
diff --git a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
index a364757..1310903 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
@@ -32,7 +32,6 @@ import org.apache.lucene.index.MergeScheduler;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.util.InfoStream;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.common.MapSerializable;
 import org.apache.solr.core.PluginInfo;
@@ -196,23 +195,27 @@ public class SolrIndexConfig implements MapSerializable {
 
   @Override
   public Map<String, Object> toMap(Map<String, Object> map) {
-    Map<String, Object> m = Utils.makeMap("useCompoundFile", useCompoundFile,
-        "maxBufferedDocs", maxBufferedDocs,
-        "ramBufferSizeMB", ramBufferSizeMB,
-        "ramPerThreadHardLimitMB", ramPerThreadHardLimitMB,
-        "maxCommitMergeWaitTime", maxCommitMergeWaitMillis,
-        "writeLockTimeout", writeLockTimeout,
-        "lockType", lockType,
-        "infoStreamEnabled", infoStream != InfoStream.NO_OUTPUT);
-    if(mergeSchedulerInfo != null) m.put("mergeScheduler",mergeSchedulerInfo);
+    map.put("useCompoundFile", useCompoundFile);
+    map.put("maxBufferedDocs", maxBufferedDocs);
+    map.put("ramBufferSizeMB", ramBufferSizeMB);
+    map.put("ramPerThreadHardLimitMB", ramPerThreadHardLimitMB);
+    map.put("maxCommitMergeWaitTime", maxCommitMergeWaitMillis);
+    map.put("writeLockTimeout", writeLockTimeout);
+    map.put("lockType", lockType);
+    map.put("infoStreamEnabled", infoStream != InfoStream.NO_OUTPUT);
+    if(mergeSchedulerInfo != null) {
+      map.put("mergeScheduler",mergeSchedulerInfo);
+    }
     if (metricsInfo != null) {
-      m.put("metrics", metricsInfo);
+      map.put("metrics", metricsInfo);
     }
     if (mergePolicyFactoryInfo != null) {
-      m.put("mergePolicyFactory", mergePolicyFactoryInfo);
+      map.put("mergePolicyFactory", mergePolicyFactoryInfo);
+    }
+    if(mergedSegmentWarmerInfo != null) {
+      map.put("mergedSegmentWarmer",mergedSegmentWarmerInfo);
     }
-    if(mergedSegmentWarmerInfo != null) m.put("mergedSegmentWarmer",mergedSegmentWarmerInfo);
-    return m;
+    return map;
   }
 
   private PluginInfo getPluginInfo(String path, SolrConfig solrConfig, PluginInfo def)  {
@@ -267,11 +270,10 @@ public class SolrIndexConfig implements MapSerializable {
 
     if (mergedSegmentWarmerInfo != null) {
       // TODO: add infostream -> normal logging system (there is an issue somewhere)
-      @SuppressWarnings({"rawtypes"})
       IndexReaderWarmer warmer = core.getResourceLoader().newInstance(mergedSegmentWarmerInfo.className,
                                                                         IndexReaderWarmer.class,
                                                                         null,
-                                                                        new Class[] { InfoStream.class },
+                                                                        new Class<?>[] { InfoStream.class },
                                                                         new Object[] { iwc.getInfoStream() });
       iwc.setMergedSegmentWarmer(warmer);
     }
@@ -300,7 +302,7 @@ public class SolrIndexConfig implements MapSerializable {
         mpfClassName,
         MergePolicyFactory.class,
         NO_SUB_PACKAGES,
-        new Class[] { SolrResourceLoader.class, MergePolicyFactoryArgs.class, IndexSchema.class },
+        new Class<?>[] { SolrResourceLoader.class, MergePolicyFactoryArgs.class, IndexSchema.class },
         new Object[] {resourceLoader, mpfArgs, schema });
 
     return mpf.getMergePolicy();
diff --git a/solr/core/src/java/org/apache/solr/update/UpdateLog.java b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
index 2b021f3..1fe33ec 100644
--- a/solr/core/src/java/org/apache/solr/update/UpdateLog.java
+++ b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
@@ -210,9 +210,9 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
   protected boolean existOldBufferLog = false;
 
   // keep track of deletes only... this is not updated on an add
-  protected LinkedHashMap<BytesRef, LogPtr> oldDeletes = new LinkedHashMap<BytesRef, LogPtr>(numDeletesToKeep) {
+  protected LinkedHashMap<BytesRef, LogPtr> oldDeletes = new LinkedHashMap<>(numDeletesToKeep) {
     @Override
-    protected boolean removeEldestEntry(@SuppressWarnings({"rawtypes"})Map.Entry eldest) {
+    protected boolean removeEldestEntry(Map.Entry<BytesRef, LogPtr> eldest) {
       return size() > numDeletesToKeep;
     }
   };
diff --git a/solr/core/src/java/org/apache/solr/update/processor/AbstractDefaultValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/AbstractDefaultValueUpdateProcessorFactory.java
index 89f6af6..3268e14 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/AbstractDefaultValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/AbstractDefaultValueUpdateProcessorFactory.java
@@ -44,7 +44,6 @@ public abstract class AbstractDefaultValueUpdateProcessorFactory
 
   protected String fieldName = null;
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
index bb98036..3c6c643 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
@@ -523,7 +523,6 @@ public class AtomicUpdateDocumentMerger {
     final String name = sif.getName();
     SolrInputField existingField = toDoc.get(name);
     if (existingField == null) return;
-    @SuppressWarnings({"rawtypes"})
     final Collection<Object> original = existingField.getValues();
     if (fieldVal instanceof Collection) {
       for (Object object : (Collection) fieldVal) {
@@ -616,7 +615,7 @@ public class AtomicUpdateDocumentMerger {
     }
   }
 
-  private void removeFieldValueWithNumericFudging(String fieldName, @SuppressWarnings({"rawtypes"}) Collection<Object> original, Object toRemove) {
+  private void removeFieldValueWithNumericFudging(String fieldName, Collection<Object> original, Object toRemove) {
     if (original.size() == 0) {
       return;
     }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
index a10a041..ac5505d 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
@@ -72,7 +72,7 @@ public class AtomicUpdateProcessorFactory extends UpdateRequestProcessorFactory
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
 
-  @SuppressWarnings({"static-access", "rawtypes", "null"})
+  @SuppressWarnings({"rawtypes", "null"})
   @Override
   public void init(final NamedList args) {
 
@@ -116,7 +116,6 @@ public class AtomicUpdateProcessorFactory extends UpdateRequestProcessorFactory
      * will be treated as conventional updates.
      * 4. retry when encounter version conflict
      */
-    @SuppressWarnings("unchecked")
     @Override
     public void processAdd(AddUpdateCommand cmd)
         throws IOException {
diff --git a/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
index 11fe324..d8e4741 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
@@ -196,7 +196,6 @@ public class CloneFieldUpdateProcessorFactory
                             " inform(SolrCore) never called???");
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
@@ -226,7 +225,6 @@ public class CloneFieldUpdateProcessorFactory
    * init helper method that should only be called when we know for certain that both the 
    * "source" and "dest" init params do <em>not</em> exist.
    */
-  @SuppressWarnings("unchecked")
   private void initSimpleRegexReplacement(@SuppressWarnings({"rawtypes"})NamedList args) {
     // The syntactic sugar for the case where there is only one regex pattern for source and the same pattern
     // is used for the destination pattern...
diff --git a/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
index d20d3b5..4c40edd 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/ConcatFieldUpdateProcessorFactory.java
@@ -65,7 +65,6 @@ public final class ConcatFieldUpdateProcessorFactory extends FieldMutatingUpdate
 
   String delimiter = ", ";
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
     Object d = args.remove("delimiter");
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java
index 55ec6cc..776356d 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DefaultValueUpdateProcessorFactory.java
@@ -52,7 +52,6 @@ public class DefaultValueUpdateProcessorFactory
 
   protected Object defaultValue = null;
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
index ece4f53..fd475ac 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
@@ -936,7 +936,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
                   if (ruleExpiryLock.tryLock(10, TimeUnit.MILLISECONDS)) {
                     log.info("Going to expire routing rule");
                     try {
-                      Map<String, Object> map = Utils.makeMap(Overseer.QUEUE_OPERATION, OverseerAction.REMOVEROUTINGRULE.toLower(),
+                      Map<String, Object> map = Map.of(Overseer.QUEUE_OPERATION, OverseerAction.REMOVEROUTINGRULE.toLower(),
                           ZkStateReader.COLLECTION_PROP, collection,
                           ZkStateReader.SHARD_ID_PROP, myShardId,
                           "routeKey", routeKey + "!");
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
index 90edc57..c0a4025 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DocExpirationUpdateProcessorFactory.java
@@ -209,7 +209,6 @@ public final class DocExpirationUpdateProcessorFactory
     throw confErr(arg + " " + errMsg);
   }
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java
index 2189f9d..f432c73 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/FieldLengthUpdateProcessorFactory.java
@@ -51,7 +51,6 @@ import static org.apache.solr.update.processor.FieldValueMutatingUpdateProcessor
  */
 public final class FieldLengthUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
     // no length specific init args
diff --git a/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
index ed43b32..bea1fb5 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessor.java
@@ -209,15 +209,13 @@ public abstract class FieldMutatingUpdateProcessor
   private static final class ConfigurableFieldNameSelectorHelper {
 
     final SelectorParams params;
-    @SuppressWarnings({"rawtypes"})
-    final Collection<Class> classes;
+    final Collection<Class<?>> classes;
 
     private ConfigurableFieldNameSelectorHelper(final SolrResourceLoader loader,
                                           final SelectorParams params) {
       this.params = params;
 
-      @SuppressWarnings({"rawtypes"})
-      final Collection<Class> classes = new ArrayList<>(params.typeClass.size());
+      final Collection<Class<?>> classes = new ArrayList<>(params.typeClass.size());
 
       for (String t : params.typeClass) {
         try {
@@ -269,9 +267,8 @@ public abstract class FieldMutatingUpdateProcessor
      * returns true if the Object 'o' is an instance of any class in 
      * the Collection
      */
-    private static boolean instanceOfAny(Object o,
-                                         @SuppressWarnings({"rawtypes"})Collection<Class> classes) {
-      for (@SuppressWarnings({"rawtypes"})Class c : classes) {
+    private static boolean instanceOfAny(Object o, Collection<Class<?>> classes) {
+      for (Class<?> c : classes) {
         if ( c.isInstance(o) ) return true;
       }
       return false;
diff --git a/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
index 9e316df..a86f792 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.java
@@ -206,7 +206,6 @@ public abstract class FieldMutatingUpdateProcessorFactory
    * Will error if any unexpected init args are found, so subclasses should
    * remove any subclass-specific init args before calling this method.
    */
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java
index edeb43d..1022025 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/RegexReplaceProcessorFactory.java
@@ -77,7 +77,6 @@ public final class RegexReplaceProcessorFactory extends FieldMutatingUpdateProce
   // by default, literalReplacementEnabled is set to true to allow backward compatibility
   private boolean literalReplacementEnabled = true;
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java
index baf3d89..91585c9 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/RemoveBlankFieldUpdateProcessorFactory.java
@@ -47,7 +47,6 @@ import static org.apache.solr.update.processor.FieldValueMutatingUpdateProcessor
  */
 public final class RemoveBlankFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
     // no trim specific init args
diff --git a/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java
index ab37d39..810ef67 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/TrimFieldUpdateProcessorFactory.java
@@ -45,7 +45,6 @@ import static org.apache.solr.update.processor.FieldValueMutatingUpdateProcessor
  */
 public final class TrimFieldUpdateProcessorFactory extends FieldMutatingUpdateProcessorFactory {
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
     // no trim specific init args
diff --git a/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java
index f97e658..1579eb8 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/TruncateFieldUpdateProcessorFactory.java
@@ -52,7 +52,6 @@ public final class TruncateFieldUpdateProcessorFactory
 
   private int maxLength = 0;
 
-  @SuppressWarnings("unchecked")
   @Override
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java
index 03e8d83..fc3ad14 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/UUIDUpdateProcessorFactory.java
@@ -76,7 +76,6 @@ public class UUIDUpdateProcessorFactory extends UpdateRequestProcessorFactory {
 
   protected String fieldName = null;
 
-  @SuppressWarnings("unchecked")
   public void init(@SuppressWarnings({"rawtypes"})NamedList args) {
 
     Object obj = args.remove(FIELD_PARAM);
diff --git a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java
index c05822e..76b9d55 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/UpdateRequestProcessorChain.java
@@ -25,13 +25,11 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
-import com.google.common.collect.ImmutableMap;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrConfig;
@@ -278,7 +276,7 @@ public final class UpdateRequestProcessorChain implements PluginInfoInitialized
   }
 
   private static void insertBefore(LinkedList<UpdateRequestProcessorFactory> urps, List<UpdateRequestProcessorFactory> newFactories,
-                                   @SuppressWarnings({"rawtypes"})Class klas, int idx) {
+                                   Class<?> klas, int idx) {
     if (newFactories.isEmpty()) return;
     for (int i = 0; i < urps.size(); i++) {
       if (klas.isInstance(urps.get(i))) {
@@ -309,11 +307,10 @@ public final class UpdateRequestProcessorChain implements PluginInfoInitialized
         p = core.getUpdateProcessors().get(s);
       }
       if (p == null) {
-        @SuppressWarnings({"unchecked"})
-        Class<UpdateRequestProcessorFactory> factoryClass = implicits.get(s);
+        Class<? extends UpdateRequestProcessorFactory> factoryClass = implicits.get(s);
         if(factoryClass != null) {
           PluginInfo pluginInfo = new PluginInfo("updateProcessor",
-              Utils.makeMap("name", s,
+              Map.of("name", s,
                   "class", factoryClass.getName()));
           UpdateRequestProcessorFactory plugin = p = core.getUpdateProcessors().createPlugin(pluginInfo).get();
           if (plugin instanceof SolrCoreAware) ((SolrCoreAware) plugin).inform(core);
@@ -389,11 +386,8 @@ public final class UpdateRequestProcessorChain implements PluginInfoInitialized
       }
     }
   }
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public static final Map<String, Class> implicits = new ImmutableMap.Builder()
-      .put(TemplateUpdateProcessorFactory.NAME, TemplateUpdateProcessorFactory.class)
-      .put(AtomicUpdateProcessorFactory.NAME, AtomicUpdateProcessorFactory.class)
-      .put(UUIDUpdateProcessorFactory.NAME, UUIDUpdateProcessorFactory.class)
-      .build();
-
+  public static final Map<String, Class<? extends UpdateRequestProcessorFactory>> implicits = Map.of(
+      TemplateUpdateProcessorFactory.NAME, TemplateUpdateProcessorFactory.class,
+      AtomicUpdateProcessorFactory.NAME, AtomicUpdateProcessorFactory.class,
+      UUIDUpdateProcessorFactory.NAME, UUIDUpdateProcessorFactory.class);
 }
diff --git a/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java b/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java
index 1eed612..93395d4 100644
--- a/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java
+++ b/solr/core/src/java/org/apache/solr/util/ConcurrentLRUCache.java
@@ -596,8 +596,8 @@ public class ConcurrentLRUCache<K,V> implements Cache<K,V>, Accountable {
     }
 
     @Override
-    protected boolean lessThan(@SuppressWarnings({"rawtypes"})CacheEntry a,
-                               @SuppressWarnings({"rawtypes"})CacheEntry b) {
+    protected boolean lessThan(CacheEntry<K,V> a,
+                               CacheEntry<K,V> b) {
       // reverse the parameter order so that the queue keeps the oldest items
       return b.lastAccessedCopy < a.lastAccessedCopy;
     }
diff --git a/solr/core/src/java/org/apache/solr/util/SolrCLI.java b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
index 9242b5b..7cc2ed3 100755
--- a/solr/core/src/java/org/apache/solr/util/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
@@ -702,7 +702,6 @@ public class SolrCLI implements CLIO {
    * Utility function for sending HTTP GET request to Solr and then doing some
    * validation of the response.
    */
-  @SuppressWarnings({"unchecked"})
   public static Map<String,Object> getJson(HttpClient httpClient, String getUrl) throws Exception {
     try {
       // ensure we're requesting JSON back from Solr
diff --git a/solr/core/src/java/org/apache/solr/util/SolrLogLayout.java b/solr/core/src/java/org/apache/solr/util/SolrLogLayout.java
index 0280eee..ded3a54 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrLogLayout.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrLogLayout.java
@@ -237,7 +237,6 @@ public class SolrLogLayout extends AbstractStringLayout {
     return sb.toString();
   }
 
-  @SuppressWarnings({"unchecked"})
   private Map<String, Object> getReplicaProps(ZkController zkController, SolrCore core) {
     final String collectionName = core.getCoreDescriptor().getCloudDescriptor().getCollectionName();
     DocCollection collection = zkController.getClusterState().getCollectionOrNull(collectionName);
@@ -245,7 +244,7 @@ public class SolrLogLayout extends AbstractStringLayout {
     if (replica != null) {
       return replica.getProperties();
     }
-    return Collections.EMPTY_MAP;
+    return Collections.emptyMap();
   }
   
   private void addFirstLine(StringBuilder sb, String msg) {
diff --git a/solr/core/src/java/org/apache/solr/util/TestInjection.java b/solr/core/src/java/org/apache/solr/util/TestInjection.java
index eead921..eee966d 100644
--- a/solr/core/src/java/org/apache/solr/util/TestInjection.java
+++ b/solr/core/src/java/org/apache/solr/util/TestInjection.java
@@ -74,12 +74,10 @@ public class TestInjection {
    * If non-null, then this class should be used for accessing random entropy
    * @see #random
    */
-  @SuppressWarnings({"rawtypes"})
-  private static final Class LUCENE_TEST_CASE;
+  private static final Class<?> LUCENE_TEST_CASE;
   
   static {
-    @SuppressWarnings({"rawtypes"})
-    Class nonFinalTemp = null;
+    Class<?> nonFinalTemp = null;
     try {
       ClassLoader classLoader = MethodHandles.lookup().lookupClass().getClassLoader();
       nonFinalTemp = classLoader.loadClass(LUCENE_TEST_CASE_FQN);
@@ -99,7 +97,6 @@ public class TestInjection {
       return null;
     } else {
       try {
-        @SuppressWarnings({"unchecked"})
         Method randomMethod = LUCENE_TEST_CASE.getMethod("random");
         return (Random) randomMethod.invoke(null);
       } catch (Exception e) {
diff --git a/solr/core/src/java/org/apache/solr/util/circuitbreaker/CircuitBreakerManager.java b/solr/core/src/java/org/apache/solr/util/circuitbreaker/CircuitBreakerManager.java
index 2f6f93d..c2b9159 100644
--- a/solr/core/src/java/org/apache/solr/util/circuitbreaker/CircuitBreakerManager.java
+++ b/solr/core/src/java/org/apache/solr/util/circuitbreaker/CircuitBreakerManager.java
@@ -135,7 +135,6 @@ public class CircuitBreakerManager implements PluginInfoInitialized {
    *
    * Any default circuit breakers should be registered here.
    */
-  @SuppressWarnings({"rawtypes"})
   public static CircuitBreakerManager build(PluginInfo pluginInfo) {
     boolean enabled = pluginInfo == null ? false : Boolean.parseBoolean(pluginInfo.attributes.getOrDefault("enabled", "false"));
     CircuitBreakerManager circuitBreakerManager = new CircuitBreakerManager(enabled);
diff --git a/solr/core/src/java/org/apache/solr/util/configuration/SSLCredentialProviderFactory.java b/solr/core/src/java/org/apache/solr/util/configuration/SSLCredentialProviderFactory.java
index ec1782e..f36068b 100644
--- a/solr/core/src/java/org/apache/solr/util/configuration/SSLCredentialProviderFactory.java
+++ b/solr/core/src/java/org/apache/solr/util/configuration/SSLCredentialProviderFactory.java
@@ -22,8 +22,10 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.solr.util.configuration.providers.AbstractSSLCredentialProvider;
 import org.apache.solr.util.configuration.providers.EnvSSLCredentialProvider;
 import org.apache.solr.util.configuration.providers.HadoopSSLCredentialProvider;
 import org.apache.solr.util.configuration.providers.SysPropSSLCredentialProvider;
@@ -38,8 +40,7 @@ public class SSLCredentialProviderFactory {
   public static final String DEFAULT_PROVIDER_CHAIN = "env;sysprop";
   public static final String PROVIDER_CHAIN_KEY = "solr.ssl.credential.provider.chain";
 
-  @SuppressWarnings({"rawtypes"})
-  private final static ImmutableMap<String, Class> defaultProviders = ImmutableMap.of(
+  private static final Map<String, Class<? extends AbstractSSLCredentialProvider>> defaultProviders = ImmutableMap.of(
       "env", EnvSSLCredentialProvider.class,
       "sysprop", SysPropSSLCredentialProvider.class,
       "hadoop", HadoopSSLCredentialProvider.class
diff --git a/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java b/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
index 1077f14..4dc386d 100644
--- a/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
+++ b/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
@@ -84,7 +84,6 @@ public abstract class AbstractPluginLoader<T>
    * @param className - class name for requested plugin.  In the above example: "solr.ClassName"
    * @param node - the XML node defining this plugin
    */
-  @SuppressWarnings("unchecked")
   protected T create(SolrClassLoader loader, String name, String className, ConfigNode node ) throws Exception
   {
     return loader.newInstance(className, pluginClassType, getDefaultPackages());
diff --git a/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java b/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java
index 1b7b13c..e970200 100644
--- a/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/stats/MetricUtils.java
@@ -219,7 +219,6 @@ public class MetricUtils {
       }
     };
     if (o instanceof MapWriter) {
-      @SuppressWarnings({"unchecked"})
       MapWriter writer = (MapWriter) o;
       writer._forEachEntry(consumer);
     } else if (o instanceof Map) {
@@ -229,7 +228,6 @@ public class MetricUtils {
         consumer.accept(entry.getKey(), entry.getValue());
       }
     } else if (o instanceof IteratorWriter) {
-      @SuppressWarnings({"unchecked"})
       IteratorWriter writer = (IteratorWriter) o;
       final String name = prefix != null ? prefix : "value";
       try {
diff --git a/solr/core/src/test/org/apache/hadoop/http/HttpServer2.java b/solr/core/src/test/org/apache/hadoop/http/HttpServer2.java
index 274dd45..3dcbb9f 100644
--- a/solr/core/src/test/org/apache/hadoop/http/HttpServer2.java
+++ b/solr/core/src/test/org/apache/hadoop/http/HttpServer2.java
@@ -712,7 +712,6 @@ public final class HttpServer2 implements FilterContainer {
       if (conf.getBoolean(
           CommonConfigurationKeys.HADOOP_JETTY_LOGS_SERVE_ALIASES,
           CommonConfigurationKeys.DEFAULT_HADOOP_JETTY_LOGS_SERVE_ALIASES)) {
-        @SuppressWarnings("unchecked")
         Map<String, String> params = logContext.getInitParams();
         params.put("org.eclipse.jetty.servlet.Default.aliases", "true");
       }
@@ -731,7 +730,6 @@ public final class HttpServer2 implements FilterContainer {
     staticContext.setResourceBase(appDir + "/static");
     staticContext.addServlet(DefaultServlet.class, "/*");
     staticContext.setDisplayName("static");
-    @SuppressWarnings("unchecked")
     Map<String, String> params = staticContext.getInitParams();
     params.put("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
     params.put("org.eclipse.jetty.servlet.Default.gzip", "true");
@@ -1529,7 +1527,6 @@ public final class HttpServer2 implements FilterContainer {
         return result;
       }
 
-      @SuppressWarnings("unchecked")
       @Override
       public Map<String, String[]> getParameterMap() {
         Map<String, String[]> result = new HashMap<>();
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
index 0ed36fd..c9e61cc 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
@@ -45,7 +45,6 @@ import static org.hamcrest.CoreMatchers.containsString;
 @SuppressPointFields(bugUrl="https://issues.apache.org/jira/browse/SOLR-10844")
 public class TestDistributedGrouping extends BaseDistributedSearchTestCase {
 
-  @SuppressWarnings({"unchecked"})
   public TestDistributedGrouping() {
     // SOLR-10844: Even with points suppressed, this test breaks if we (randomize) docvalues="true" on trie fields?!?!?!!?
     System.setProperty(NUMERIC_DOCVALUES_SYSPROP,"false");
diff --git a/solr/core/src/test/org/apache/solr/analysis/TokenizerChainTest.java b/solr/core/src/test/org/apache/solr/analysis/TokenizerChainTest.java
index c2c45b7..fe4d39c 100644
--- a/solr/core/src/test/org/apache/solr/analysis/TokenizerChainTest.java
+++ b/solr/core/src/test/org/apache/solr/analysis/TokenizerChainTest.java
@@ -29,14 +29,13 @@ import org.junit.Test;
 public class TokenizerChainTest extends SolrTestCaseJ4 {
 
   @Test
-  @SuppressWarnings({"unchecked"})
   public void testNormalization() throws Exception {
     String fieldName = "f";
     TokenFilterFactory[] tff = new TokenFilterFactory[2];
-    tff[0] = new LowerCaseFilterFactory(Collections.EMPTY_MAP);
-    tff[1] = new ASCIIFoldingFilterFactory(Collections.EMPTY_MAP);
+    tff[0] = new LowerCaseFilterFactory(Collections.emptyMap());
+    tff[1] = new ASCIIFoldingFilterFactory(Collections.emptyMap());
     TokenizerChain tokenizerChain = new TokenizerChain(
-        new MockTokenizerFactory(Collections.EMPTY_MAP),
+        new MockTokenizerFactory(Collections.emptyMap()),
         tff);
     assertEquals(new BytesRef("fooba"),
         tokenizerChain.normalize(fieldName, "FOOB\u00c4"));
diff --git a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
index 027af11..d11546a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
@@ -25,7 +25,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
-import static java.util.Collections.singletonMap;
 import static java.util.Collections.singletonList;
 
 import org.apache.lucene.util.LuceneTestCase.Slow;
@@ -99,15 +98,15 @@ public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
       COLLECTION += "_secure";
       
       final String SECURITY_JSON = Utils.toJSONString
-        (Utils.makeMap("authorization",
-                       Utils.makeMap("class", RuleBasedAuthorizationPlugin.class.getName(),
-                                     "user-role", singletonMap(USER,"admin"),
-                                     "permissions", singletonList(Utils.makeMap("name","all",
+        (Map.of("authorization",
+                       Map.of("class", RuleBasedAuthorizationPlugin.class.getName(),
+                                     "user-role", Map.of(USER,"admin"),
+                                     "permissions", singletonList(Map.of("name","all",
                                                                                 "role","admin"))),
                        "authentication",
-                       Utils.makeMap("class", BasicAuthPlugin.class.getName(),
+                       Map.of("class", BasicAuthPlugin.class.getName(),
                                      "blockUnknown",true,
-                                     "credentials", singletonMap(USER, getSaltedHashedValue(PASS)))));
+                                     "credentials", Map.of(USER, getSaltedHashedValue(PASS)))));
       b.withSecurityJson(SECURITY_JSON);
     }
     b.configure();
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
index ab6ac68..ef869c9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerCollectionConfigSetProcessorTest.java
@@ -593,7 +593,7 @@ public class OverseerCollectionConfigSetProcessorTest extends SolrTestCaseJ4 {
   protected void issueCreateJob(Integer numberOfSlices,
       Integer replicationFactor, List<String> createNodeList, boolean sendCreateNodeList, boolean createNodeSetShuffle) {
     Map<String,Object> propMap = Utils.makeMap(
-        Overseer.QUEUE_OPERATION, CollectionParams.CollectionAction.CREATE.toLower(),
+        (Object) Overseer.QUEUE_OPERATION, CollectionParams.CollectionAction.CREATE.toLower(),
         ZkStateReader.REPLICATION_FACTOR, replicationFactor.toString(),
         "name", COLLECTION_NAME,
         "collection.configName", CONFIG_NAME,
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
index 163cc42..7c0d165 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
@@ -193,7 +193,6 @@ public class ReplaceNodeTest extends SolrCloudTestCase {
       if (!metrics.containsKey("REPLICATION./replication.fetcher")) {
         continue;
       }
-      @SuppressWarnings("unchecked")
       MetricsMap fetcherGauge = (MetricsMap) ((SolrMetricManager.GaugeWrapper<?>) metrics.get("REPLICATION./replication.fetcher")).getGauge();
       assertNotNull("no IndexFetcher gauge in metrics", fetcherGauge);
       Map<String, Object> value = fetcherGauge.getValue();
diff --git a/solr/core/src/test/org/apache/solr/cloud/RouteFieldTest.java b/solr/core/src/test/org/apache/solr/cloud/RouteFieldTest.java
index 4a30af1..a3c1856 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RouteFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RouteFieldTest.java
@@ -38,9 +38,9 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import static org.apache.solr.client.solrj.response.schema.SchemaResponse.*;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 public class RouteFieldTest extends SolrCloudTestCase {
 
@@ -72,8 +72,8 @@ public class RouteFieldTest extends SolrCloudTestCase {
             .process(cluster.getSolrClient()).getStatus());
 
     List<SchemaRequest.Update> updateList = new ArrayList<>();
-    updateList.add(new SchemaRequest.AddField(makeMap("name", ROUTE_FIELD, "type", "string", "indexed", "true", "stored", "true")));
-    updateList.add(new SchemaRequest.AddField(makeMap("name", "sorter", "type", "int", "indexed", "true", "stored", "true")));
+    updateList.add(new SchemaRequest.AddField(Map.of("name", ROUTE_FIELD, "type", "string", "indexed", "true", "stored", "true")));
+    updateList.add(new SchemaRequest.AddField(Map.of("name", "sorter", "type", "int", "indexed", "true", "stored", "true")));
     SchemaRequest.MultiUpdate multiUpdateRequest = new SchemaRequest.MultiUpdate(updateList);
     UpdateResponse multipleUpdatesResponse = multiUpdateRequest.process(cluster.getSolrClient(), COLL_ROUTE);
     assertNull("Error adding fields", multipleUpdatesResponse.getResponse().get("errors"));
diff --git a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
index c2566a7..2d09ac6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
@@ -22,7 +22,6 @@ import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
@@ -43,8 +42,6 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
-import static org.apache.solr.common.util.Utils.makeMap;
-
 /**
  * We want to make sure that when migrating between http and https modes the
  * replicas will not be rejoined as new nodes, but rather take off where it left
@@ -118,16 +115,13 @@ public class SSLMigrationTest extends AbstractFullDistribZkTestBase {
   }
   
   private void setUrlScheme(String value) throws Exception {
-    @SuppressWarnings("rawtypes")
-    Map m = makeMap("action", CollectionAction.CLUSTERPROP.toString()
+    Map<String, String> m = Map.of("action", CollectionAction.CLUSTERPROP.toString()
         .toLowerCase(Locale.ROOT), "name", "urlScheme", "val", value);
-    @SuppressWarnings("unchecked")
     SolrParams params = new MapSolrParams(m);
-    @SuppressWarnings({"rawtypes"})
-    SolrRequest request = new QueryRequest(params);
+    QueryRequest request = new QueryRequest(params);
     request.setPath("/admin/collections");
     
-    List<String> urls = new ArrayList<String>();
+    List<String> urls = new ArrayList<>();
     for(Replica replica : getReplicas()) {
       urls.add(replica.getStr(ZkStateReader.BASE_URL_PROP));
     }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIShareSchema.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIShareSchema.java
index 1d93e2f..8d0b84a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIShareSchema.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIShareSchema.java
@@ -61,7 +61,6 @@ public class TestConfigSetsAPIShareSchema extends SolrCloudTestCase {
   }
 
   @Test
-  @SuppressWarnings({"unchecked"})
   public void testSharedSchema() throws Exception {
     CollectionAdminRequest.createCollection("col1", "cShare", 1, 1)
         .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
@@ -81,7 +80,7 @@ public class TestConfigSetsAPIShareSchema extends SolrCloudTestCase {
 
     // change col1's configSet
     CollectionAdminRequest.modifyCollection("col1",
-      map("collection.configName", "conf1")  // from cShare
+      map("collection.configName", (Object) "conf1")  // from cShare
     ).processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
 
     try (SolrCore coreCol1 = coreContainer.getCore("col1_shard1_replica_n1");
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java b/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
index 2188f6b..55e69fa 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
@@ -267,7 +267,6 @@ public class TestHashPartitioner extends SolrTestCaseJ4 {
 
 
 
-  @SuppressWarnings({"unchecked"})
   DocCollection createCollection(int nSlices, DocRouter router) {
     List<Range> ranges = router.partitionRange(nSlices, router.fullRange());
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java b/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
index 23a453f..42cbb73 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestSSLRandomization.java
@@ -139,7 +139,7 @@ public class TestSSLRandomization extends SolrCloudTestCase {
     // for some cases, we know exactly what the config should be regardless of randomization factors
     SSLTestConfig conf;
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(FullyAnnotated.class, InheritedFullyAnnotated.class,
+    for (Class<?> c : Arrays.asList(FullyAnnotated.class, InheritedFullyAnnotated.class,
                                  GrandchildInheritedEmptyAnnotatationWithOverride.class )) {
       r = SSLRandomizer.getSSLRandomizerForClass(c);
       assertEquals(c.toString(), 0.42D, r.ssl, 0.0D);
@@ -147,17 +147,17 @@ public class TestSSLRandomization extends SolrCloudTestCase {
       assertTrue(c.toString(), r.debug.contains("foo"));
     }
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(NotAnnotated.class, InheritedNotAnnotated.class)) {
+    for (Class<?> c : Arrays.asList(NotAnnotated.class, InheritedNotAnnotated.class)) {
       r = SSLRandomizer.getSSLRandomizerForClass(c);
       assertEquals(c.toString(), 0.0D, r.ssl, 0.0D);
       assertEquals(c.toString(), 0.0D, r.clientAuth, 0.0D);
       assertTrue(c.toString(), r.debug.contains("not specified"));
       conf = r.createSSLTestConfig();
-      assertEquals(c.toString(), false, conf.isSSLMode());
-      assertEquals(c.toString(), false, conf.isClientAuthMode());
+      assertFalse(c.toString(), conf.isSSLMode());
+      assertFalse(c.toString(), conf.isClientAuthMode());
     }
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(Suppressed.class,
+    for (Class<?> c : Arrays.asList(Suppressed.class,
                                  InheritedSuppressed.class,
                                  InheritedAnnotationButSuppressed.class,
                                  InheritedSuppressedWithIgnoredAnnotation.class)) {
@@ -167,17 +167,17 @@ public class TestSSLRandomization extends SolrCloudTestCase {
       assertTrue(c.toString(), r.debug.contains("SuppressSSL"));
       assertTrue(c.toString(), r.debug.contains("fakeBugUrl"));
       conf = r.createSSLTestConfig();
-      assertEquals(c.toString(), false, conf.isSSLMode());
-      assertEquals(c.toString(), false, conf.isClientAuthMode());
+      assertFalse(c.toString(), conf.isSSLMode());
+      assertFalse(c.toString(), conf.isClientAuthMode());
     }
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(EmptyAnnotated.class, InheritedEmptyAnnotated.class)) {
+    for (Class<?> c : Arrays.asList(EmptyAnnotated.class, InheritedEmptyAnnotated.class)) {
       r = SSLRandomizer.getSSLRandomizerForClass(c);
       assertEquals(c.toString(), RandomizeSSL.DEFAULT_ODDS, r.ssl, 0.0D);
       assertEquals(c.toString(), RandomizeSSL.DEFAULT_ODDS, r.clientAuth, 0.0D);
     }
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(SimplyAnnotated.class, InheritedEmptyAnnotatationWithOverride.class)) {
+    for (Class<?> c : Arrays.asList(SimplyAnnotated.class, InheritedEmptyAnnotatationWithOverride.class)) {
       r = SSLRandomizer.getSSLRandomizerForClass(c);
       assertEquals(c.toString(), 0.5D, r.ssl, 0.0D);
       assertEquals(c.toString(), 0.5D, r.clientAuth, 0.0D);
@@ -187,15 +187,15 @@ public class TestSSLRandomization extends SolrCloudTestCase {
     assertEquals(0.0D, r.ssl, 0.0D);
     assertEquals(0.0D, r.clientAuth, 0.0D);
     conf = r.createSSLTestConfig();
-    assertEquals(false, conf.isSSLMode());
-    assertEquals(false, conf.isClientAuthMode());
+    assertFalse(conf.isSSLMode());
+    assertFalse(conf.isClientAuthMode());
     
     r = SSLRandomizer.getSSLRandomizerForClass(MaxAnnotated.class);
     assertEquals(1.0D, r.ssl, 0.0D);
     assertEquals(1.0D, r.clientAuth, 0.0D);
     conf = r.createSSLTestConfig();
-    assertEquals(true, conf.isSSLMode());
-    assertEquals(true, conf.isClientAuthMode());
+    assertTrue(conf.isSSLMode());
+    assertTrue(conf.isClientAuthMode());
 
     r = SSLRandomizer.getSSLRandomizerForClass(SSlButNoClientAuthAnnotated.class);
     assertEquals(0.42D, r.ssl, 0.0D);
@@ -205,7 +205,7 @@ public class TestSSLRandomization extends SolrCloudTestCase {
     assertEquals(RandomizeSSL.DEFAULT_ODDS, r.ssl, 0.0D);
     assertEquals(0.42D, r.clientAuth, 0.0D);
 
-    for (@SuppressWarnings({"rawtypes"})Class c : Arrays.asList(SSLOutOfRangeAnnotated.class,
+    for (Class<?> c : Arrays.asList(SSLOutOfRangeAnnotated.class,
                                  ClientAuthOutOfRangeAnnotated.class,
                                  InheritedOutOfRangeAnnotated.class)) {
       expectThrows(IllegalArgumentException.class, () -> {
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
index 4230ec1..f06418a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
@@ -323,7 +323,6 @@ public class TestStressInPlaceUpdates extends AbstractFullDistribZkTestBase {
       Thread thread = new Thread("READER" + i) {
         Random rand = new Random(random().nextInt());
 
-        @SuppressWarnings("unchecked")
         @Override
         public void run() {
           try {
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
index ad07a35..52cf661 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
@@ -795,7 +795,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     HashMap<String, List<Integer>> collectionInfos = new HashMap<>();
     String shard_fld = "shard_s";
     try (CloudSolrClient client = createCloudClient(null)) {
-      Map<String, Object> props = Utils.makeMap(
+      Map<String, Object> props = Map.of(
           REPLICATION_FACTOR, replicationFactor,
           CollectionHandlingUtils.NUM_SLICES, numShards,
           "router.field", shard_fld);
@@ -854,7 +854,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     HashMap<String, List<Integer>> collectionInfos = new HashMap<>();
 
     try (CloudSolrClient client = createCloudClient(null)) {
-      Map<String, Object> props = Utils.makeMap(
+      Map<String, Object> props = Map.of(
           REPLICATION_FACTOR, replicationFactor,
           CollectionHandlingUtils.NUM_SLICES, numShards);
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
index 988ac25..7933d5b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud.overseer;
 
 import java.util.Collections;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.cloud.DistribStateManager;
@@ -26,7 +27,6 @@ import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.ImplicitDocRouter;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkNodeProps;
-import org.apache.solr.common.util.Utils;
 import org.junit.BeforeClass;
 
 import static org.mockito.Mockito.*;
@@ -45,7 +45,7 @@ public class TestClusterStateMutator extends SolrTestCaseJ4 {
     when(dataProvider.getDistribStateManager()).thenReturn(mockStateManager);
 
     ClusterStateMutator mutator = new ClusterStateMutator(dataProvider);
-    ZkNodeProps message = new ZkNodeProps(Utils.makeMap(
+    ZkNodeProps message = new ZkNodeProps(Map.of(
         "name", "xyz",
         "numShards", "1"
     ));
@@ -55,7 +55,7 @@ public class TestClusterStateMutator extends SolrTestCaseJ4 {
     assertEquals(1, collection.getSlicesMap().size());
 
     ClusterState state = new ClusterState(Collections.<String>emptySet(), Collections.singletonMap("xyz", collection));
-    message = new ZkNodeProps(Utils.makeMap(
+    message = new ZkNodeProps(Map.of(
         "name", "abc",
         "numShards", "2",
         "router.name", "implicit",
diff --git a/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java b/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
index 18922f0..7e06415 100644
--- a/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
+++ b/solr/core/src/test/org/apache/solr/core/BlobRepositoryMockingTest.java
@@ -112,7 +112,6 @@ public class BlobRepositoryMockingTest {
     }
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testGetBlobIncrRefString() {
     when(mockContainer.isZooKeeperAware()).thenReturn(true);
@@ -127,7 +126,6 @@ public class BlobRepositoryMockingTest {
     verify(mapMock).put(eq("foo!"), any(BlobRepository.BlobContent.class));
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testGetBlobIncrRefByUrl() throws Exception{
     when(mockContainer.isZooKeeperAware()).thenReturn(true);
@@ -153,7 +151,6 @@ public class BlobRepositoryMockingTest {
     filecontent = null;
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testCachedAlready() {
     when(mockContainer.isZooKeeperAware()).thenReturn(true);
@@ -168,7 +165,6 @@ public class BlobRepositoryMockingTest {
     verify(mapMock).get("foo!");
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testGetBlobIncrRefStringDecoder() {
     when(mockContainer.isZooKeeperAware()).thenReturn(true);
diff --git a/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java b/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
index fd7b5c4..baa8bd4 100644
--- a/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
+++ b/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
@@ -80,7 +80,6 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  @SuppressWarnings({"unchecked"})
   public void integrationTest() {
     assumeWorkingMockito();
 
@@ -123,10 +122,9 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
           addNewReplica(replicas, collection, slice, downNodes);
         }
         Map<String, Replica> replicaMap = replicas.stream().collect(Collectors.toMap(Replica::getName, Function.identity()));
-        sliceMap.put(slice, new Slice(slice, replicaMap, map(), collection));
+        sliceMap.put(slice, new Slice(slice, replicaMap, Collections.emptyMap(), collection));
       }
-      @SuppressWarnings({"unchecked"})
-      DocCollection col = new DocCollection(collection, sliceMap, map(), DocRouter.DEFAULT);
+      DocCollection col = new DocCollection(collection, sliceMap, Collections.emptyMap(), DocRouter.DEFAULT);
       collToState.put(collection, col);
     }
     // reverse map
@@ -183,8 +181,7 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
   }
 
   private CoreDescriptor newCoreDescriptor(Replica r) {
-    @SuppressWarnings({"unchecked"})
-    Map<String,String> props = map(
+    Map<String,String> props = Map.of(
         CoreDescriptor.CORE_SHARD, r.getShard(),
         CoreDescriptor.CORE_COLLECTION, r.getCollection(),
         CoreDescriptor.CORE_NODE_NAME, r.getNodeName()
@@ -195,8 +192,7 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
   protected Replica addNewReplica(List<Replica> replicaList, String collection, String slice, List<String> possibleNodes) {
     String replica = "r" + replicaList.size();
     String node = possibleNodes.get(random().nextInt(possibleNodes.size())); // place on a random node
-    @SuppressWarnings({"unchecked"})
-    Replica r = new Replica(replica, map("core", replica, "node_name", node), collection, slice);
+    Replica r = new Replica(replica, Map.of("core", replica, "node_name", node), collection, slice);
     replicaList.add(r);
     return r;
   }
diff --git a/solr/core/src/test/org/apache/solr/core/CountUsageValueSourceParser.java b/solr/core/src/test/org/apache/solr/core/CountUsageValueSourceParser.java
index 6050187..8e10711 100644
--- a/solr/core/src/test/org/apache/solr/core/CountUsageValueSourceParser.java
+++ b/solr/core/src/test/org/apache/solr/core/CountUsageValueSourceParser.java
@@ -72,7 +72,7 @@ public class CountUsageValueSourceParser extends ValueSourceParser {
       this.counter = counter;
     }
     @Override
-    public FunctionValues getValues(@SuppressWarnings({"rawtypes"})Map context,
+    public FunctionValues getValues(Map<Object, Object> context,
                                     LeafReaderContext readerContext) throws IOException {
       return new DoubleDocValues(this) {
         @Override
diff --git a/solr/core/src/test/org/apache/solr/core/FakeDeletionPolicy.java b/solr/core/src/test/org/apache/solr/core/FakeDeletionPolicy.java
index ae20e0f..8e5638f 100644
--- a/solr/core/src/test/org/apache/solr/core/FakeDeletionPolicy.java
+++ b/solr/core/src/test/org/apache/solr/core/FakeDeletionPolicy.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.core;
 
+import org.apache.lucene.index.IndexCommit;
 import org.apache.lucene.index.IndexDeletionPolicy;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.util.plugin.NamedListInitializedPlugin;
@@ -46,15 +47,13 @@ public class FakeDeletionPolicy extends IndexDeletionPolicy implements NamedList
     return var2;
   }
 
-  //  @Override
   @Override
-  public void onCommit(@SuppressWarnings({"rawtypes"})List arg0) throws IOException {
+  public void onCommit(List<? extends IndexCommit> arg0) throws IOException {
     System.setProperty("onCommit", "test.org.apache.solr.core.FakeDeletionPolicy.onCommit");
   }
 
-  //  @Override
   @Override
-  public void onInit(@SuppressWarnings({"rawtypes"})List arg0) throws IOException {
+  public void onInit(List<? extends IndexCommit> arg0) throws IOException {
     System.setProperty("onInit", "test.org.apache.solr.core.FakeDeletionPolicy.onInit");
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java b/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
index 366e499..de9bd39 100644
--- a/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
@@ -201,12 +201,12 @@ public class ResourceLoaderTest extends SolrTestCaseJ4 {
     
   }
 
-  @SuppressWarnings({"rawtypes", "deprecation"})
+  @SuppressWarnings("deprecation")
   public void testLoadDeprecatedFactory() throws Exception {
     SolrResourceLoader loader = new SolrResourceLoader(Paths.get("solr/collection1").toAbsolutePath());
     // ensure we get our exception
     loader.newInstance(DeprecatedTokenFilterFactory.class.getName(), TokenFilterFactory.class, null,
-        new Class[] { Map.class }, new Object[] { new HashMap<String,String>() });
+        new Class<?>[] { Map.class }, new Object[] { new HashMap<String,String>() });
     // TODO: How to check that a warning was printed to log file?
     loader.close();    
   }
@@ -215,8 +215,7 @@ public class ResourceLoaderTest extends SolrTestCaseJ4 {
     clearCache();
 
     SolrResourceLoader loader = new SolrResourceLoader(TEST_PATH().resolve("collection1"));
-    @SuppressWarnings({"rawtypes"})
-    Class[] params = { Map.class };
+    Class<?>[] params = { Map.class };
     Map<String,String> args = Map.of("minGramSize", "1", "maxGramSize", "2");
     final String className = "solr.NGramTokenizerFactory";
 
diff --git a/solr/core/src/test/org/apache/solr/core/TestConfigOverlay.java b/solr/core/src/test/org/apache/solr/core/TestConfigOverlay.java
index 07708c6..04434bd 100644
--- a/solr/core/src/test/org/apache/solr/core/TestConfigOverlay.java
+++ b/solr/core/src/test/org/apache/solr/core/TestConfigOverlay.java
@@ -65,8 +65,7 @@ public class TestConfigOverlay extends SolrTestCase {
   }
 
   public void testSetProperty(){
-    @SuppressWarnings({"unchecked"})
-    ConfigOverlay overlay = new ConfigOverlay(Collections.EMPTY_MAP,0);
+    ConfigOverlay overlay = new ConfigOverlay(Collections.emptyMap(),0);
     overlay = overlay.setProperty("query.filterCache.initialSize",100);
     assertEquals(100, overlay.getXPathProperty("query/filterCache/@initialSize"));
     Map<String, Object> map = overlay.getEditableSubProperties("query/filterCache");
diff --git a/solr/core/src/test/org/apache/solr/core/TestInitParams.java b/solr/core/src/test/org/apache/solr/core/TestInitParams.java
index d3a0eef..b8ef93f 100644
--- a/solr/core/src/test/org/apache/solr/core/TestInitParams.java
+++ b/solr/core/src/test/org/apache/solr/core/TestInitParams.java
@@ -18,7 +18,6 @@ package org.apache.solr.core;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.util.NamedList;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrRequestHandler;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
@@ -57,7 +56,7 @@ public class TestInitParams extends SolrTestCaseJ4 {
     @SuppressWarnings({"unchecked", "rawtypes"})
     PluginInfo pluginInfo = new PluginInfo("requestHandler",
         new HashMap<>(),
-        new NamedList<>(singletonMap("defaults", new NamedList(Utils.makeMap("a", "A1")))), null);
+        new NamedList<>(singletonMap("defaults", new NamedList(singletonMap("a", "A1")))), null);
     initParams.apply(pluginInfo);
     assertEquals( "A",initParams.defaults.get("a"));
   }
@@ -126,14 +125,14 @@ public class TestInitParams extends SolrTestCaseJ4 {
   }
 
   public void testMatchPath(){
-    InitParams initParams = new InitParams(new PluginInfo(InitParams.TYPE, Utils.makeMap("path", "/update/json/docs")));
+    InitParams initParams = new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/json/docs")));
     assertFalse(initParams.matchPath("/update"));
     assertTrue(initParams.matchPath("/update/json/docs"));
-    initParams = new InitParams(new PluginInfo(InitParams.TYPE, Utils.makeMap("path", "/update/**")));
+    initParams = new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/**")));
     assertTrue(initParams.matchPath("/update/json/docs"));
     assertTrue(initParams.matchPath("/update/json"));
     assertTrue(initParams.matchPath("/update"));
-    initParams = new InitParams(new PluginInfo(InitParams.TYPE, Utils.makeMap("path", "/update/*")));
+    initParams = new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/*")));
     assertFalse(initParams.matchPath("/update/json/docs"));
     assertTrue(initParams.matchPath("/update/json"));
     assertTrue(initParams.matchPath("/update"));
diff --git a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
index f6930d0..07a1779 100644
--- a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
+++ b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
@@ -27,6 +27,7 @@ import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient.RemoteExecutionException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.V2Request;
+import org.apache.solr.client.solrj.response.SimpleSolrResponse;
 import org.apache.solr.client.solrj.response.V2Response;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.cloud.SolrCloudTestCase;
@@ -40,6 +41,8 @@ import org.apache.solr.util.LogLevel;
 import org.apache.zookeeper.server.ByteBufferInputStream;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Test;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -69,7 +72,8 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
     System.clearProperty("enable.packages");
   }
   
-  @SuppressWarnings({"unchecked"})
+  @Test
+  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-15448")
   public void testPackageStoreManagement() throws Exception {
     MiniSolrCloudCluster cluster =
         configureCluster(4)
@@ -103,7 +107,7 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
           new V2Request.Builder("/node/files/package/mypkg/v1.0")
               .withMethod(SolrRequest.METHOD.GET)
               .build(),
-          Utils.makeMap(
+          Map.of(
               ":files:/package/mypkg/v1.0[0]:name", "runtimelibs.jar",
               ":files:/package/mypkg/v1.0[0]:sha512", "d01b51de67ae1680a84a813983b1de3b592fc32f1a22b662fc9057da5953abd1b72476388ba342cad21671cd0b805503c78ab9075ff2f3951fdf75fa16981420",
               ":files:/package/mypkg/v1.0[0]:sig[0]", "L3q/qIGs4NaF6JiO0ZkMUFa88j0OmYc+I6O7BOdNuMct/xoZ4h73aZHZGc0+nmI1f/U3bOlMPINlSOM6LK3JpQ=="
@@ -115,14 +119,13 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
           new V2Request.Builder("/node/files/package/mypkg")
               .withMethod(SolrRequest.METHOD.GET)
               .build(),
-          Utils.makeMap(
+          Map.of(
               ":files:/package/mypkg[0]:name", "v1.0",
               ":files:/package/mypkg[0]:dir", "true"
           )
       );
 
-      @SuppressWarnings({"rawtypes"})
-      Map expected = Utils.makeMap(
+      Map<String,Object> expected = Map.of(
           ":files:/package/mypkg/v1.0/runtimelibs.jar:name", "runtimelibs.jar",
           ":files:/package/mypkg/v1.0[0]:sha512", "d01b51de67ae1680a84a813983b1de3b592fc32f1a22b662fc9057da5953abd1b72476388ba342cad21671cd0b805503c78ab9075ff2f3951fdf75fa16981420"
       );
@@ -131,13 +134,13 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
           "/package/mypkg/v1.0/runtimelibs_v2.jar",
           null
       );
-      expected = Utils.makeMap(
+      expected = Map.of(
           ":files:/package/mypkg/v1.0/runtimelibs_v2.jar:name", "runtimelibs_v2.jar",
           ":files:/package/mypkg/v1.0[0]:sha512",
           "bc5ce45ad281b6a08fb7e529b1eb475040076834816570902acb6ebdd809410e31006efdeaa7f78a6c35574f3504963f5f7e4d92247d0eb4db3fc9abdda5d417"
       );
       checkAllNodesForFile(cluster,"/package/mypkg/v1.0/runtimelibs_v2.jar", expected, false);
-      expected = Utils.makeMap(
+      expected = Map.of(
           ":files:/package/mypkg/v1.0", (Predicate<Object>) o -> {
             @SuppressWarnings({"rawtypes"})
             List l = (List) o;
@@ -193,8 +196,7 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
   }
 
 
-  @SuppressWarnings({"rawtypes"})
-  public static class Fetcher implements Callable {
+  public static class Fetcher implements Callable<NavigableObject> {
     String url;
     JettySolrRunner jetty;
     public Fetcher(String s, JettySolrRunner jettySolrRunner){
@@ -217,15 +219,24 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
 
   public static NavigableObject assertResponseValues(int repeats, SolrClient client,
                                                      @SuppressWarnings({"rawtypes"})SolrRequest req,
-                                                     @SuppressWarnings({"rawtypes"})Map vals) throws Exception {
+                                                     Map<String, Object> vals) throws Exception {
     Callable<NavigableObject> callable = () -> req.process(client);
 
     return assertResponseValues(repeats, callable,vals);
   }
 
+  /**
+   * Evaluate the given predicates or objects against the given values, obtained by running a given callable.
+   * The values to verify are either predicates to evaluate directly, or strings to compare for equality.
+   * @param repeats how many attempts to make with the Callable
+   * @param callable the code to execute getting a result
+   * @param vals the values to check in the result, this is a map of paths to predicates or values
+   * @return the final passing result of the callable
+   * @throws Exception if the callable throws an Exception, or on interrupt between retries
+   */
   @SuppressWarnings({"unchecked"})
   public static NavigableObject assertResponseValues(int repeats,  Callable<NavigableObject> callable,
-                                                     @SuppressWarnings({"rawtypes"})Map vals) throws Exception {
+                                                     Map<String, Object> vals) throws Exception {
     NavigableObject rsp = null;
 
     for (int i = 0; i < repeats; i++) {
@@ -238,26 +249,29 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
         if (i >= repeats - 1) throw e;
         continue;
       }
-      for (Object e : vals.entrySet()) {
-        @SuppressWarnings({"rawtypes"})
-        Map.Entry entry = (Map.Entry) e;
-        String k = (String) entry.getKey();
+      boolean passed = true;
+      for (Map.Entry<String, Object> entry : vals.entrySet()) {
+        String k = entry.getKey();
         List<String> key = StrUtils.split(k, '/');
 
         Object val = entry.getValue();
-        @SuppressWarnings({"rawtypes"})
-        Predicate p = val instanceof Predicate ? (Predicate) val : o -> {
-          String v = o == null ? null : String.valueOf(o);
-          return Objects.equals(val, o);
+        // TODO: This map should just be <String,Predicate> and we should instead provide a static eq() method for callers
+        Predicate<Object> p = val instanceof Predicate ? (Predicate<Object>) val : o -> {
+          String v = o == null ? null : o.toString();
+          return Objects.equals(val, v);
         };
-        boolean isPass = p.test(rsp._get(key, null));
-        if (isPass) return rsp;
-        else if (i >= repeats - 1) {
-          fail("req: " + callable.toString() +" . attempt: " + i + " Mismatch for value : '" + key + "' in response , " + Utils.toJSONString(rsp));
+        Object actual = rsp._get(key, null);
+        passed = passed && p.test(actual); // Important: check all of the values, not just the first one
+        if (!passed && i >= repeats - 1) {
+          String description = rsp.toString();
+          if (rsp instanceof SimpleSolrResponse) {
+            description = ((SimpleSolrResponse) rsp).getResponse().toString();
+          }
+          // we know these are unequal but call assert instead of fail() because it gives a better error message
+          assertEquals("Failed on path " + key + " of " + description + "after attempt #" + (i+1),
+              val, Utils.toJSONString(actual));
         }
-
       }
-
     }
     return rsp;
   }
@@ -269,7 +283,7 @@ public class TestDistribPackageStore extends SolrCloudTestCase {
       Object resp = Utils.executeGET(client.getHttpClient(), jetty.getBaseURLV2().toString() + "/node/files" + path + "?sync=true", null);
       System.out.println("sync resp: "+jetty.getBaseURLV2().toString() + "/node/files" + path + "?sync=true" + " ,is: " + resp);
     }
-    checkAllNodesForFile(cluster,path, Utils.makeMap(":files:" + path + ":name", (Predicate<Object>) Objects::nonNull), false);
+    checkAllNodesForFile(cluster,path, Map.of(":files:" + path + ":name", (Predicate<Object>) Objects::nonNull), false);
   }
 
   public static void postFile(SolrClient client, ByteBuffer buffer, String name, String sig)
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index fb63e0e..7254b0f 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -47,7 +47,6 @@ import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.NavigableObject;
 import org.apache.solr.common.annotation.JsonProperty;
 import org.apache.solr.common.util.ReflectMapWriter;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.filestore.PackageStoreAPI;
@@ -312,7 +311,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
               .build();
       addPkgVersionReq.process(cluster.getSolrClient());
 
-      waitForAllNodesToSync(cluster, "/cluster/package", Utils.makeMap(
+      waitForAllNodesToSync(cluster, "/cluster/package", Map.of(
               ":result:packages:mypkg[0]:version", "1.0",
               ":result:packages:mypkg[0]:files[0]", FILE1
       ));
@@ -537,7 +536,6 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
   }
 
-  @SuppressWarnings("unchecked")
   public static void waitForAllNodesToSync(MiniSolrCloudCluster cluster, String path, Map<String, Object> expected) throws Exception {
     for (JettySolrRunner jettySolrRunner : cluster.getJettySolrRunners()) {
       String baseUrl = jettySolrRunner.getBaseUrl().toString().replace("/solr", "/api");
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
index 53072d0..5bc531e 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSolrConfigHandlerCloud.java
@@ -276,11 +276,11 @@ public class TestSolrConfigHandlerCloud extends AbstractFullDistribZkTestBase {
   }
 
   @SuppressWarnings({"unchecked"})
-  public static void compareValues(@SuppressWarnings({"rawtypes"})Map result, Object expected, List<String> jsonPath) {
+  public static void compareValues(Map<?,?> result, Object expected, List<String> jsonPath) {
     Object val = Utils.getObjectByPath(result, false, jsonPath);
     assertTrue(StrUtils.formatString("Could not get expected value  {0} for path {1} full output {2}", expected, jsonPath, result.toString()),
         expected instanceof Predicate ?
-            ((Predicate)expected ).test(val) :
+            ((Predicate<Object>)expected ).test(val) :
             Objects.equals(expected, val)
         );
   }
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
index 8f2bdba..12c3f75 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
@@ -27,7 +27,6 @@ import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
-import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.PluginBag;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
@@ -187,7 +186,6 @@ public class MetricsHandlerTest extends SolrTestCaseJ4 {
     assertNotNull(values.get("solr.core.collection1"));
     values = (NamedList) values.get("solr.core.collection1");
     assertEquals(1, values.size());
-    @SuppressWarnings({"rawtypes"})
     MapWriter writer = (MapWriter) values.get("CACHE.core.fieldCache");
     assertNotNull(writer);
     assertNotNull(writer._get("entries_count", null));
@@ -367,9 +365,9 @@ public class MetricsHandlerTest extends SolrTestCaseJ4 {
     SolrCore core = h.getCoreContainer().getCore("collection1");//;.getRequestHandlers().put("/dumphandler", new DumpRequestHandler());
     RefreshablePluginHolder pluginHolder =null;
     try {
-      PluginInfo info = new PluginInfo(SolrRequestHandler.TYPE, Utils.makeMap("name", "/dumphandler", "class", DumpRequestHandler.class.getName()));
+      PluginInfo info = new PluginInfo(SolrRequestHandler.TYPE, Map.of("name", "/dumphandler", "class", DumpRequestHandler.class.getName()));
       DumpRequestHandler requestHandler = new DumpRequestHandler();
-      requestHandler.gaugevals =  Utils.makeMap("d_k1","v1", "d_k2","v2");
+      requestHandler.gaugevals =  Map.of("d_k1","v1", "d_k2","v2");
       pluginHolder = new RefreshablePluginHolder(info, requestHandler);
       core.getRequestHandlers().put("/dumphandler",
 
@@ -397,7 +395,7 @@ public class MetricsHandlerTest extends SolrTestCaseJ4 {
     assertEquals(null, resp.getValues()._getStr(Arrays.asList("metrics","solr.core.collection1:QUERY./dumphandler.dumphandlergauge","d_k2"), null));
 
     DumpRequestHandler requestHandler = new DumpRequestHandler();
-    requestHandler.gaugevals =  Utils.makeMap("d_k1","v1.1", "d_k2","v2.1");
+    requestHandler.gaugevals =  Map.of("d_k1","v1.1", "d_k2","v2.1");
     pluginHolder.reset(requestHandler);
     resp = new SolrQueryResponse();
     handler.handleRequestBody(req(CommonParams.QT, "/admin/metrics", CommonParams.WT, "json", MetricsHandler.COMPACT_PARAM, "true", "key", "solr.core.collection1:QUERY./dumphandler.dumphandlergauge"),
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
index 270e3ba..d04b6fd 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
@@ -32,7 +32,6 @@ import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.security.BasicAuthPlugin;
 import org.apache.solr.security.RuleBasedAuthorizationPlugin;
 
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.handler.admin.SecurityConfHandler.SecurityConfig;
 
 public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
@@ -191,12 +190,14 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
       super(null);
       m = new HashMap<>();
       SecurityConfig sp = new SecurityConfig();
-      sp.setData(makeMap("authentication", makeMap("class", "solr."+ BasicAuthPlugin.class.getSimpleName())));
+      Map<String, Object> securityData = new HashMap<>();
+      securityData.put("authentication", Map.of("class", "solr."+ BasicAuthPlugin.class.getSimpleName()));
+      securityData.put("authorization", Map.of("class", "solr."+RuleBasedAuthorizationPlugin.class.getSimpleName()));
       sp.setVersion(1);
-      sp.getData().put("authorization", makeMap("class", "solr."+RuleBasedAuthorizationPlugin.class.getSimpleName()));
+      sp.setData(securityData);
       m.put("/security.json", sp);
 
-      basicAuthPlugin.init(Collections.singletonMap("credentials", Collections.singletonMap("ignore", "me")));
+      basicAuthPlugin.init(Map.of("credentials", Map.of("ignore", "me")));
 
       rulesBasedAuthorizationPlugin.init(new HashMap<>());
     }
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index bfa9eae..f3ca9da 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -95,7 +95,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     Api api = V2HttpCall.getApiInfo(containerHandlers, fullPath, "POST",
         fullPath, parts);
     assertNotNull(api);
-    assertConditions(api.getSpec(), Utils.makeMap(
+    assertConditions(api.getSpec(), Map.of(
         "/methods[0]", "POST",
         "/commands/create", NOT_NULL));
     assertEquals("hello", parts.get("collection"));
@@ -104,7 +104,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     parts = new HashMap<>();
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards", "POST",
         null, parts);
-    assertConditions(api.getSpec(), Utils.makeMap(
+    assertConditions(api.getSpec(), Map.of(
         "/methods[0]", "POST",
         "/commands/split", NOT_NULL,
         "/commands/add-replica", NOT_NULL
@@ -114,7 +114,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     parts = new HashMap<>();
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards/shard1", "POST",
         null, parts);
-    assertConditions(api.getSpec(), Utils.makeMap(
+    assertConditions(api.getSpec(), Map.of(
         "/methods[0]", "POST",
         "/commands/force-leader", NOT_NULL
     ));
@@ -125,7 +125,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     parts = new HashMap<>();
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello", "POST",
         null, parts);
-    assertConditions(api.getSpec(), Utils.makeMap(
+    assertConditions(api.getSpec(), Map.of(
         "/methods[0]", "POST",
         "/commands/add-replica-property", NOT_NULL,
         "/commands/delete-replica-property", NOT_NULL
@@ -134,7 +134,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
 
     api = V2HttpCall.getApiInfo(containerHandlers, "/collections/hello/shards/shard1/replica1", "DELETE",
         null, parts);
-    assertConditions(api.getSpec(), Utils.makeMap(
+    assertConditions(api.getSpec(), Map.of(
         "/methods[0]", "DELETE",
         "/url/params/onlyIfDown/type", "boolean"
     ));
@@ -161,7 +161,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
     assertTrue(methodNames.contains("GET"));
 
     rsp = invoke(coreHandlers, "/", "/collections/hello/_introspect", GET, mockCC);
-    assertConditions(rsp.getValues().asMap(2), Utils.makeMap(
+    assertConditions(rsp.getValues().asMap(2), Map.of(
         "/availableSubPaths", NOT_NULL,
         "availableSubPaths /collections/hello/config/jmx", NOT_NULL,
         "availableSubPaths /collections/hello/schema", NOT_NULL,
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java b/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
index eb97ea7..2f40702 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestConfigsApi.java
@@ -54,7 +54,7 @@ public class TestConfigsApi extends SolrTestCaseJ4 {
       ClusterAPI o = new ClusterAPI(null, handler);
       apiBag.registerObject(o);
       apiBag.registerObject(o.configSetCommands);
-//      for (Api api : handler.getApis()) apiBag.register(api, EMPTY_MAP);
+//      for (Api api : handler.getApis()) apiBag.register(api, emptyMap());
       compareOutput(apiBag, "/cluster/configs/sample", DELETE, null, null,
           "{name :sample, operation:delete}");
     }
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
index 15b5025..3ea289a 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCoreAdminApis.java
@@ -35,7 +35,6 @@ import static org.mockito.Mockito.*;
 
 public class TestCoreAdminApis extends SolrTestCaseJ4 {
 
-  @SuppressWarnings({"unchecked"})
   public void testCalls() throws Exception {
     Map<String, Object[]> calls = new HashMap<>();
     CoreContainer mockCC = getCoreContainerMock(calls, new HashMap<>());
@@ -44,7 +43,7 @@ public class TestCoreAdminApis extends SolrTestCaseJ4 {
     try (CoreAdminHandler  coreAdminHandler = new CoreAdminHandler(mockCC)) {
        apiBag = new ApiBag(false);
        for (Api api : coreAdminHandler.getApis()) {
-         apiBag.register(api, Collections.EMPTY_MAP);
+         apiBag.register(api, Collections.emptyMap());
        }
     }
     TestCollectionAPIs.makeCall(apiBag, "/cores", SolrRequest.METHOD.POST,
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedFacetPivotLongTailTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedFacetPivotLongTailTest.java
index 37d9989..4f94082 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DistributedFacetPivotLongTailTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedFacetPivotLongTailTest.java
@@ -67,7 +67,6 @@ public class DistributedFacetPivotLongTailTest extends BaseDistributedSearchTest
     doTestDeepPivotStats();
   }
   
-  @SuppressWarnings({"rawtypes"})
   private void sanityCheckIndividualShards() throws Exception {
     assertEquals("This test assumes exactly 3 shards/clients", 3, clients.size());
     
diff --git a/solr/core/src/test/org/apache/solr/handler/component/ResourceSharingTestComponent.java b/solr/core/src/test/org/apache/solr/handler/component/ResourceSharingTestComponent.java
index c36a8ad..c8360fc 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/ResourceSharingTestComponent.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/ResourceSharingTestComponent.java
@@ -63,7 +63,6 @@ public class ResourceSharingTestComponent extends SearchComponent implements Sol
     return "ResourceSharingTestComponent";
   }
 
-  @SuppressWarnings("unchecked")
   TestObject getTestObj() {
     return this.blob.get();
   }
diff --git a/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
index 30457e4..015e31a 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
@@ -230,7 +230,6 @@ public class SpellCheckComponentTest extends SolrTestCaseJ4 {
     );
   }
   
-  @SuppressWarnings("unchecked")
   @Test
   public void testRelativeIndexDirLocation() throws Exception {
     SolrCore core = h.getCore();
@@ -288,7 +287,6 @@ public class SpellCheckComponentTest extends SolrTestCaseJ4 {
     checker.close();
   }
   
-    @SuppressWarnings("unchecked")
     @Test
   public void testRebuildOnCommit() throws Exception {
     SolrQueryRequest req = req("q", "lowerfilt:lucenejavt", "qt", "/spellCheckCompRH", "spellcheck", "true");
diff --git a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
index af6545c..afbf7df 100644
--- a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
+++ b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
@@ -66,6 +66,7 @@ import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.zip.ZipEntry;
@@ -112,6 +113,8 @@ public class TestPackages extends SolrCloudTestCase {
   }
 
 
+  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-15448")
+  @Test
   public void testCoreReloadingPlugin() throws Exception {
       String FILE1 = "/mypkg/runtimelibs.jar";
       String COLLECTION_NAME = "testCoreReloadingPluginColl";
@@ -135,7 +138,7 @@ public class TestPackages extends SolrCloudTestCase {
               () -> new V2Request.Builder("/cluster/package").
                       withMethod(SolrRequest.METHOD.GET)
                       .build().process(cluster.getSolrClient()),
-              Utils.makeMap(
+              Map.of(
                       ":result:packages:mypkg[0]:version", "1.0",
                       ":result:packages:mypkg[0]:files[0]", FILE1
               ));
@@ -154,7 +157,7 @@ public class TestPackages extends SolrCloudTestCase {
               () -> new V2Request.Builder("/cluster/package").
                       withMethod(SolrRequest.METHOD.GET)
                       .build().process(cluster.getSolrClient()),
-              Utils.makeMap(
+              Map.of(
                       ":result:packages:mypkg[1]:version", "2.0",
                       ":result:packages:mypkg[1]:files[0]", FILE1
               ));
@@ -164,8 +167,9 @@ public class TestPackages extends SolrCloudTestCase {
               COLLECTION_NAME, "query", "filterCache",
               "mypkg", "2.0" );
   }
+
+  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-15448")
   @Test
-  @SuppressWarnings({"unchecked"})
   public void testPluginLoading() throws Exception {
       String FILE1 = "/mypkg/runtimelibs.jar";
       String FILE2 = "/mypkg/runtimelibs_v2.jar";
@@ -207,7 +211,7 @@ public class TestPackages extends SolrCloudTestCase {
           () -> new V2Request.Builder("/cluster/package").
               withMethod(SolrRequest.METHOD.GET)
               .build().process(cluster.getSolrClient()),
-          Utils.makeMap(
+          Map.of(
               ":result:packages:mypkg[0]:version", "1.0",
               ":result:packages:mypkg[0]:files[0]", FILE1
           ));
@@ -268,10 +272,10 @@ public class TestPackages extends SolrCloudTestCase {
       TestDistribPackageStore.assertResponseValues(10,
           cluster.getSolrClient() ,
           new GenericSolrRequest(SolrRequest.METHOD.GET,
-              "/stream", new MapSolrParams((Map) Utils.makeMap("collection", COLLECTION_NAME,
+              "/stream", new MapSolrParams(Map.of("collection", COLLECTION_NAME,
                   WT, JAVABIN,
                   "action", "plugins"
-                  ))), Utils.makeMap(
+                  ))), Map.of(
               ":plugins:mincopy", "org.apache.solr.client.solrj.io.stream.metrics.MinCopyMetric"
           ));
 
@@ -288,17 +292,17 @@ public class TestPackages extends SolrCloudTestCase {
 
       executeReq( "/" + COLLECTION_NAME + "/runtime?wt=javabin", cluster.getRandomJetty(random()),
           Utils.JAVABINCONSUMER,
-          Utils.makeMap("class", "org.apache.solr.core.RuntimeLibReqHandler"));
+          Map.of("class", "org.apache.solr.core.RuntimeLibReqHandler"));
 
       executeReq( "/" + COLLECTION_NAME + "/get?wt=json", cluster.getRandomJetty(random()),
           Utils.JSONCONSUMER,
-          Utils.makeMap("class", "org.apache.solr.core.RuntimeLibSearchComponent",
+          Map.of("class", "org.apache.solr.core.RuntimeLibSearchComponent",
               "Version","1"));
 
 
       executeReq( "/" + COLLECTION_NAME + "/runtime?wt=json1", cluster.getRandomJetty(random()),
           Utils.JSONCONSUMER,
-          Utils.makeMap("wt", "org.apache.solr.core.RuntimeLibResponseWriter"));
+          Map.of("wt", "org.apache.solr.core.RuntimeLibResponseWriter"));
 
       //now upload the second jar
       postFileAndWait(cluster, "runtimecode/runtimelibs_v2.jar.bin", FILE2,
@@ -330,7 +334,7 @@ public class TestPackages extends SolrCloudTestCase {
 
       executeReq( "/" + COLLECTION_NAME + "/get?wt=json", cluster.getRandomJetty(random()),
           Utils.JSONCONSUMER,
-          Utils.makeMap(  "Version","2"));
+          Map.of(  "Version","2"));
 
 
       //now upload the third jar
@@ -356,7 +360,7 @@ public class TestPackages extends SolrCloudTestCase {
 
       executeReq( "/" + COLLECTION_NAME + "/runtime?wt=json", cluster.getRandomJetty(random()),
           Utils.JSONCONSUMER,
-          Utils.makeMap("Version","2"));
+          Map.of("Version","2"));
 
       //insert a doc with urp
       ur = new UpdateRequest();
@@ -497,7 +501,7 @@ public class TestPackages extends SolrCloudTestCase {
           .process(cluster.getSolrClient());
       cluster.waitForActiveCollection(COLLECTION_NAME, 2, 5);
       checkAllNodesForFile(cluster,FILE3,
-          Utils.makeMap(":files:" + FILE3 + ":name", "runtimelibs_v3.jar"),
+          Map.of(":files:" + FILE3 + ":name", "runtimelibs_v3.jar"),
           false);
   }
   @SuppressWarnings({"unchecked","rawtypes"})
@@ -517,8 +521,7 @@ public class TestPackages extends SolrCloudTestCase {
 
   private void verifyComponent(SolrClient client, String COLLECTION_NAME,
                                String componentType, String componentName, String pkg, String version) throws Exception {
-    @SuppressWarnings({"unchecked"})
-    SolrParams params = new MapSolrParams((Map) Utils.makeMap("collection", COLLECTION_NAME,
+    SolrParams params = new MapSolrParams(Map.of("collection", COLLECTION_NAME,
         WT, JAVABIN,
         "componentName", componentName,
         "meta", "true"));
@@ -527,13 +530,14 @@ public class TestPackages extends SolrCloudTestCase {
         "/config/" + componentType, params);
     TestDistribPackageStore.assertResponseValues(10,
         client,
-        req1, Utils.makeMap(
+        req1, Map.of(
             ":config:" + componentType + ":" + componentName + ":_packageinfo_:package", pkg,
             ":config:" + componentType + ":" + componentName + ":_packageinfo_:version", version
         ));
   }
 
   @Test
+  @SuppressWarnings("unchecked")
   public void testAPI() throws Exception {
       String errPath = "/error/details[0]/errorMessages[0]";
       String FILE1 = "/mypkg/v.0.12/jar_a.jar";
@@ -543,7 +547,7 @@ public class TestPackages extends SolrCloudTestCase {
       Package.AddVersion add = new Package.AddVersion();
       add.version = "0.12";
       add.pkg = "test_pkg";
-      add.files = Arrays.asList(new String[]{FILE1, FILE2});
+      add.files = List.of(FILE1, FILE2);
       V2Request req = new V2Request.Builder("/cluster/package")
           .forceV2(true)
           .withMethod(SolrRequest.METHOD.POST)
@@ -558,7 +562,7 @@ public class TestPackages extends SolrCloudTestCase {
       postFileAndWait(cluster, "runtimecode/runtimelibs.jar.bin", FILE1, null);
 
 
-      add.files = Arrays.asList(new String[]{FILE1});
+      add.files = Collections.singletonList(FILE1);
       expectError(req, cluster.getSolrClient(), errPath,
           FILE1 + " has no signature");
       //now we upload the keys
@@ -569,7 +573,7 @@ public class TestPackages extends SolrCloudTestCase {
           "L3q/qIGs4NaF6JiO0ZkMUFa88j0OmYc+I6O7BOdNuMct/xoZ4h73aZHZGc0+nmI1f/U3bOlMPINlSOM6LK3JpQ==");
       // with correct signature
       //after uploading the file, let's delete the keys to see if we get proper error message
-      add.files = Arrays.asList(new String[]{FILE2});
+      add.files = Collections.singletonList(FILE2);
       /*expectError(req, cluster.getSolrClient(), errPath,
           "ZooKeeper does not have any public keys");*/
 
@@ -581,11 +585,11 @@ public class TestPackages extends SolrCloudTestCase {
 
       //Now verify the data in ZK
       TestDistribPackageStore.assertResponseValues(1,
-          () -> new MapWriterMap((Map) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
+          () -> new MapWriterMap((Map<String,Object>) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
               null, new Stat(), true))),
-          Utils.makeMap(
+          Map.of(
               ":packages:test_pkg[0]:version", "0.12",
-              ":packages:test_pkg[0]:files[0]", FILE1
+              ":packages:test_pkg[0]:files[0]", FILE2
           ));
 
       //post a new jar with a proper signature
@@ -596,15 +600,15 @@ public class TestPackages extends SolrCloudTestCase {
       //this time we are adding the second version of the package (0.13)
       add.version = "0.13";
       add.pkg = "test_pkg";
-      add.files = Arrays.asList(new String[]{FILE3});
+      add.files = Collections.singletonList(FILE3);
 
       //this request should succeed
       req.process(cluster.getSolrClient());
       //no verify the data (/packages.json) in ZK
       TestDistribPackageStore.assertResponseValues(1,
-          () -> new MapWriterMap((Map) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
+          () -> new MapWriterMap((Map<String,Object>) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
               null, new Stat(), true))),
-          Utils.makeMap(
+          Map.of(
               ":packages:test_pkg[1]:version", "0.13",
               ":packages:test_pkg[1]:files[0]", FILE3
           ));
@@ -626,11 +630,11 @@ public class TestPackages extends SolrCloudTestCase {
       req.process(cluster.getSolrClient());
       //Verify with ZK that the data is correct
       TestDistribPackageStore.assertResponseValues(1,
-          () -> new MapWriterMap((Map) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
+          () -> new MapWriterMap((Map<String,Object>) Utils.fromJSON(cluster.getZkClient().getData(SOLR_PKGS_PATH,
               null, new Stat(), true))),
-          Utils.makeMap(
+          Map.of(
               ":packages:test_pkg[0]:version", "0.13",
-              ":packages:test_pkg[0]:files[0]", FILE2
+              ":packages:test_pkg[0]:files[0]", FILE3
           ));
 
       //So far we have been verifying the details with  ZK directly
@@ -644,7 +648,7 @@ public class TestPackages extends SolrCloudTestCase {
               return (NavigableObject) Utils.executeGET(solrClient.getHttpClient(), path, Utils.JAVABINCONSUMER);
             }
           }
-        }, Utils.makeMap(
+        }, Map.of(
             ":result:packages:test_pkg[0]:version", "0.13",
             ":result:packages:test_pkg[0]:files[0]", FILE3
         ));
@@ -686,6 +690,8 @@ public class TestPackages extends SolrCloudTestCase {
     }
   }
 
+  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-15448")
+  @Test
   public void testSchemaPlugins() throws Exception {
     String COLLECTION_NAME = "testSchemaLoadingColl";
     System.setProperty("managed.schema.mutable", "true");
@@ -715,7 +721,7 @@ public class TestPackages extends SolrCloudTestCase {
           () -> new V2Request.Builder("/cluster/package").
               withMethod(SolrRequest.METHOD.GET)
               .build().process(cluster.getSolrClient()),
-          Utils.makeMap(
+          Map.of(
               ":result:packages:schemapkg[0]:version", "1.0",
               ":result:packages:schemapkg[0]:files[0]", FILE1
           ));
@@ -726,7 +732,7 @@ public class TestPackages extends SolrCloudTestCase {
       cluster.waitForActiveCollection(COLLECTION_NAME, 2, 4);
 
       verifySchemaComponent(cluster.getSolrClient(), COLLECTION_NAME, "/schema/fieldtypes/myNewTextFieldWithAnalyzerClass",
-              Utils.makeMap(":fieldType:analyzer:charFilters[0]:_packageinfo_:version" ,"1.0",
+              Map.of(":fieldType:analyzer:charFilters[0]:_packageinfo_:version" ,"1.0",
                       ":fieldType:analyzer:tokenizer:_packageinfo_:version","1.0",
                       ":fieldType:_packageinfo_:version","1.0"));
 
@@ -745,20 +751,19 @@ public class TestPackages extends SolrCloudTestCase {
           () -> new V2Request.Builder("/cluster/package").
               withMethod(SolrRequest.METHOD.GET)
               .build().process(cluster.getSolrClient()),
-          Utils.makeMap(
+          Map.of(
               ":result:packages:schemapkg[0]:version", "2.0",
               ":result:packages:schemapkg[0]:files[0]", FILE1
           ));
 
       verifySchemaComponent(cluster.getSolrClient(), COLLECTION_NAME, "/schema/fieldtypes/myNewTextFieldWithAnalyzerClass",
-          Utils.makeMap(":fieldType:analyzer:charFilters[0]:_packageinfo_:version" ,"2.0",
+          Map.of(":fieldType:analyzer:charFilters[0]:_packageinfo_:version" ,"2.0",
               ":fieldType:analyzer:tokenizer:_packageinfo_:version","2.0",
               ":fieldType:_packageinfo_:version","2.0"));
   }
-  @SuppressWarnings({"rawtypes","unchecked"})
   private void verifySchemaComponent(SolrClient client, String COLLECTION_NAME, String path,
-                                     Map expected) throws Exception {
-    SolrParams params = new MapSolrParams((Map) Utils.makeMap("collection", COLLECTION_NAME,
+                                     Map<String, Object> expected) throws Exception {
+    SolrParams params = new MapSolrParams(Map.of("collection", COLLECTION_NAME,
         WT, JAVABIN,
         "meta", "true"));
 
@@ -777,7 +782,7 @@ public class TestPackages extends SolrCloudTestCase {
         fileContent,
         path, sig);// has file, but no signature
 
-    TestDistribPackageStore.checkAllNodesForFile(cluster, path, Utils.makeMap(
+    TestDistribPackageStore.checkAllNodesForFile(cluster, path, Map.of(
         ":files:" + path + ":sha512",
         sha512
     ), false);
diff --git a/solr/core/src/test/org/apache/solr/response/TestGraphMLResponseWriter.java b/solr/core/src/test/org/apache/solr/response/TestGraphMLResponseWriter.java
index 7edffa4..7f68cd2 100644
--- a/solr/core/src/test/org/apache/solr/response/TestGraphMLResponseWriter.java
+++ b/solr/core/src/test/org/apache/solr/response/TestGraphMLResponseWriter.java
@@ -48,7 +48,6 @@ public class TestGraphMLResponseWriter extends SolrTestCaseJ4 {
   @SuppressWarnings({"unchecked"})
   public void testGraphMLOutput() throws Exception {
     SolrQueryRequest request = req("blah", "blah"); // Just need a request to attach the stream and traversal to.
-    @SuppressWarnings({"rawtypes"})
     SolrQueryResponse response = new SolrQueryResponse();
     @SuppressWarnings({"rawtypes"})
     Map context = request.getContext();
diff --git a/solr/core/src/test/org/apache/solr/response/TestJavabinTupleStreamParser.java b/solr/core/src/test/org/apache/solr/response/TestJavabinTupleStreamParser.java
index 74e0c95..6cd662e 100644
--- a/solr/core/src/test/org/apache/solr/response/TestJavabinTupleStreamParser.java
+++ b/solr/core/src/test/org/apache/solr/response/TestJavabinTupleStreamParser.java
@@ -96,10 +96,10 @@ public class TestJavabinTupleStreamParser extends SolrTestCaseJ4 {
 
   public void testSimple() throws IOException {
     List<Map<String, Object>> l = new ArrayList<>();
-    l.add(Utils.makeMap("id", 1, "f", 1.0f, "s", "Some str 1"));
-    l.add(Utils.makeMap("id", 2, "f", 2.0f, "s", "Some str 2"));
-    l.add(Utils.makeMap("id", 3, "f", 1.0f, "s", "Some str 3"));
-    l.add(Utils.makeMap("EOF", true, "RESPONSE_TIME", 206, "sleepMillis", 1000));
+    l.add(Map.of("id", 1, "f", 1.0f, "s", "Some str 1"));
+    l.add(Map.of("id", 2, "f", 2.0f, "s", "Some str 2"));
+    l.add(Map.of("id", 3, "f", 1.0f, "s", "Some str 3"));
+    l.add(Map.of("EOF", true, "RESPONSE_TIME", 206, "sleepMillis", 1000));
     Iterator<Map<String, Object>> iterator = l.iterator();
     TupleStream tupleStream = new TupleStream() {
       @Override
diff --git a/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java b/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
index b4c2129..1634326 100644
--- a/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/SchemaApiFailureTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.schema;
 
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
@@ -48,7 +49,7 @@ public class SchemaApiFailureTest extends SolrCloudTestCase {
   public void testAddTheSameFieldTwice() throws Exception {
     CloudSolrClient client = cluster.getSolrClient();
     SchemaRequest.Update fieldAddition = new SchemaRequest.AddField
-        (Utils.makeMap("name","myfield", "type","string"));
+        (Map.of("name","myfield", "type","string"));
     SchemaResponse.UpdateResponse updateResponse = fieldAddition.process(client, COLLECTION);
 
     BaseHttpSolrClient.RemoteExecutionException ex = expectThrows(BaseHttpSolrClient.RemoteExecutionException.class,
diff --git a/solr/core/src/test/org/apache/solr/search/RankQueryTestPlugin.java b/solr/core/src/test/org/apache/solr/search/RankQueryTestPlugin.java
index 120847b..69d8255 100644
--- a/solr/core/src/test/org/apache/solr/search/RankQueryTestPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/RankQueryTestPlugin.java
@@ -670,7 +670,7 @@ public class RankQueryTestPlugin extends QParserPlugin {
     private List<ScoreDoc> list = new ArrayList<>();
 
     @SuppressWarnings({"unchecked"})
-    public TestCollector(@SuppressWarnings({"rawtypes"})PriorityQueue pq) {
+    public TestCollector(PriorityQueue pq) {
       super(pq);
     }
 
@@ -738,7 +738,7 @@ public class RankQueryTestPlugin extends QParserPlugin {
     private List<ScoreDoc> list = new ArrayList<>();
 
     @SuppressWarnings({"unchecked"})
-    public TestCollector1(@SuppressWarnings({"rawtypes"})PriorityQueue pq) {
+    public TestCollector1(PriorityQueue pq) {
       super(pq);
     }
 
diff --git a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
index 82ed69c..796e8c4 100644
--- a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
@@ -29,6 +29,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.legacy.LegacyNumericRangeQuery;
+import org.hamcrest.Matchers;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -58,15 +59,14 @@ public class TestMaxScoreQueryParser extends SolrTestCaseJ4 {
     assertEquals(new BoostQuery(new TermQuery(new Term("text", "foo")), 3f), q);
 
     q = parse("price:[0 TO 10]");
-    @SuppressWarnings({"rawtypes"})
-    Class expected = LegacyNumericRangeQuery.class;
+    Class<? extends Query> expected = LegacyNumericRangeQuery.class;
     if (Boolean.getBoolean(NUMERIC_POINTS_SYSPROP)) {
       expected = PointRangeQuery.class;
       if (Boolean.getBoolean(NUMERIC_DOCVALUES_SYSPROP)) {
         expected = IndexOrDocValuesQuery.class;
       }
     }
-    assertTrue(expected + " vs actual: " + q.getClass(), expected.isInstance(q));
+    assertThat(q, Matchers.instanceOf(expected));
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java
index daf70e5..7f54385 100644
--- a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java
+++ b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java
@@ -194,7 +194,6 @@ public class TestTaskManagement extends SolrCloudTestCase {
         GenericSolrRequest request = new GenericSolrRequest(SolrRequest.METHOD.GET, "/tasks/list", params);
         NamedList<Object> queryResponse = cluster.getSolrClient().request(request);
 
-        @SuppressWarnings({"unchecked"})
         String result = (String) queryResponse.get("taskStatus");
 
         assertTrue(result.contains("inactive"));
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
index 293463e..021eb13 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
@@ -544,7 +544,7 @@ public class TestCloudJSONFacetSKGEquiv extends SolrCloudTestCase {
     { // trivial single level facet w/ prefix 
       Map<String,TermFacet> facets = new LinkedHashMap<>();
       facets.put("xxx", new TermFacet(multiStrField(9),
-                                      map("prefix", "2")));
+                                      Map.of("prefix", "2")));
       
       
       assertFacetSKGsAreConsistent(facets, multiStrField(7)+":11", multiStrField(5)+":9", "*:*");
@@ -841,11 +841,11 @@ public class TestCloudJSONFacetSKGEquiv extends SolrCloudTestCase {
     
     /** Assumes null for fore/back queries w/no options */
     public RelatednessFacet() {
-      this(null, null, map());
+      this(null, null, Collections.emptyMap());
     }
     /** Assumes no options */
     public RelatednessFacet(final String foreQ, final String backQ) {
-      this(foreQ, backQ, map());
+      this(foreQ, backQ, Collections.emptyMap());
     }
     public RelatednessFacet(final String foreQ, final String backQ,
                             final Map<String,Object> options) {
diff --git a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
index c23a4f0..dacc842 100644
--- a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
@@ -188,7 +188,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
       baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
       verifySecurityStatus(cl, baseUrl + authzPrefix, "authorization/user-role/harry", NOT_NULL_PREDICATE, 20);
 
-      executeCommand(baseUrl + authzPrefix, cl, Utils.toJSONString(singletonMap("set-permission", Utils.makeMap
+      executeCommand(baseUrl + authzPrefix, cl, Utils.toJSONString(singletonMap("set-permission", Map.of
           ("collection", "x",
               "path", "/update/*",
               "role", "dev"))), "harry", "HarryIsUberCool" );
@@ -196,7 +196,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
       verifySecurityStatus(cl, baseUrl + authzPrefix, "authorization/permissions[1]/collection", "x", 20);
       assertAuthMetricsMinimums(8, 3, 5, 0, 0, 0);
 
-      executeCommand(baseUrl + authzPrefix, cl,Utils.toJSONString(singletonMap("set-permission", Utils.makeMap
+      executeCommand(baseUrl + authzPrefix, cl,Utils.toJSONString(singletonMap("set-permission", Map.of
           ("name", "collection-admin-edit", "role", "admin"))), "harry", "HarryIsUberCool"  );
       verifySecurityStatus(cl, baseUrl + authzPrefix, "authorization/permissions[2]/name", "collection-admin-edit", 20);
       assertAuthMetricsMinimums(10, 4, 6, 0, 0, 0);
diff --git a/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
index 0bd514b..787da26 100644
--- a/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.security;
 import javax.servlet.http.HttpServletRequest;
 import java.lang.invoke.MethodHandles;
 import java.security.Principal;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.http.client.HttpClient;
@@ -35,7 +36,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static java.util.Collections.singletonMap;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 public class PKIAuthenticationIntegrationTest extends SolrCloudAuthTestCase {
 
@@ -45,8 +45,8 @@ public class PKIAuthenticationIntegrationTest extends SolrCloudAuthTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     final String SECURITY_CONF = Utils.toJSONString
-      (makeMap("authorization", singletonMap("class", MockAuthorizationPlugin.class.getName()),
-               "authentication", singletonMap("class", MockAuthenticationPlugin.class.getName())));
+      (Map.of("authorization", singletonMap("class", MockAuthorizationPlugin.class.getName()),
+          "authentication", singletonMap("class", MockAuthenticationPlugin.class.getName())));
     
     configureCluster(2)
       .addConfig("conf", configset("cloud-minimal"))
diff --git a/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java b/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
index ebab432..31aac34 100644
--- a/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
@@ -328,7 +328,6 @@ public class SpellCheckCollatorTest extends SolrTestCaseJ4 {
     // All words are "correct" per the dictionary, but this collation would
     // return no results if tried.
     SolrRequestHandler handler = core.getRequestHandler("/spellCheckCompRH");
-    @SuppressWarnings({"rawtypes"})
     SolrQueryResponse rsp = new SolrQueryResponse();
     rsp.addResponseHeader(new SimpleOrderedMap());
     SolrQueryRequest req = new LocalSolrQueryRequest(core, params);
diff --git a/solr/core/src/test/org/apache/solr/update/TestUpdate.java b/solr/core/src/test/org/apache/solr/update/TestUpdate.java
index d93b844..b7bae0f 100644
--- a/solr/core/src/test/org/apache/solr/update/TestUpdate.java
+++ b/solr/core/src/test/org/apache/solr/update/TestUpdate.java
@@ -48,7 +48,7 @@ public class TestUpdate extends SolrTestCaseJ4 {
 
   }
 
-  public void doUpdateTest(@SuppressWarnings({"rawtypes"})Callable afterUpdate) throws Exception {
+  public void doUpdateTest(Callable<Void> afterUpdate) throws Exception {
     clearIndex();
     afterUpdate.call();
 
diff --git a/solr/core/src/test/org/apache/solr/util/TestCircuitBreaker.java b/solr/core/src/test/org/apache/solr/util/TestCircuitBreaker.java
index 9b1075c..9c48c8c 100644
--- a/solr/core/src/test/org/apache/solr/util/TestCircuitBreaker.java
+++ b/solr/core/src/test/org/apache/solr/util/TestCircuitBreaker.java
@@ -48,7 +48,6 @@ import org.slf4j.LoggerFactory;
 
 import static org.hamcrest.CoreMatchers.containsString;
 
-@SuppressWarnings({"rawtypes"})
 public class TestCircuitBreaker extends SolrTestCaseJ4 {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private final static int NUM_DOCS = 20;
diff --git a/solr/core/src/test/org/apache/solr/util/stats/MetricUtilsTest.java b/solr/core/src/test/org/apache/solr/util/stats/MetricUtilsTest.java
index e95bea4..3fdd282 100644
--- a/solr/core/src/test/org/apache/solr/util/stats/MetricUtilsTest.java
+++ b/solr/core/src/test/org/apache/solr/util/stats/MetricUtilsTest.java
@@ -121,7 +121,6 @@ public class MetricUtilsTest extends SolrTestCaseJ4 {
 
     MetricUtils.toMaps(registry, Collections.singletonList(MetricFilter.ALL), MetricFilter.ALL,
         MetricUtils.ALL_PROPERTIES, false, false, false, false, (k, o) -> {
-      @SuppressWarnings({"rawtypes"})
       Map<String, Object> v = new HashMap<>();
       if (o != null) {
         ((MapWriter) o).toMap(v);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
index cee4e9a..b23c9de 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
@@ -1273,7 +1273,7 @@ public abstract class SolrClient implements Serializable, Closeable {
    * @throws IOException If there is a low-level I/O error.
    * @throws SolrServerException if there is an error on the server
    */
-  public abstract NamedList<Object> request(@SuppressWarnings({"rawtypes"})final SolrRequest request, String collection)
+  public abstract NamedList<Object> request(final SolrRequest<?> request, String collection)
       throws SolrServerException, IOException;
 
   /**
@@ -1286,7 +1286,7 @@ public abstract class SolrClient implements Serializable, Closeable {
    * @throws IOException If there is a low-level I/O error.
    * @throws SolrServerException if there is an error on the server
    */
-  public final NamedList<Object> request(@SuppressWarnings({"rawtypes"})final SolrRequest request) throws SolrServerException, IOException {
+  public final NamedList<Object> request(final SolrRequest<?> request) throws SolrServerException, IOException {
     return request(request, null);
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
index 9dc10d8..68b3410 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
@@ -37,8 +37,7 @@ import java.nio.ByteBuffer;
  */
 public class DocumentObjectBinder {
 
-  @SuppressWarnings({"rawtypes"})
-  private final Map<Class, List<DocField>> infocache = new ConcurrentHashMap<>();
+  private final Map<Class<?>, List<DocField>> infocache = new ConcurrentHashMap<>();
 
   public DocumentObjectBinder() {
   }
@@ -119,7 +118,7 @@ public class DocumentObjectBinder {
     }
   }
 
-  private List<DocField> getDocFields(@SuppressWarnings({"rawtypes"})Class clazz) {
+  private List<DocField> getDocFields(Class<?> clazz) {
     List<DocField> fields = infocache.get(clazz);
     if (fields == null) {
       synchronized(infocache) {
@@ -130,10 +129,9 @@ public class DocumentObjectBinder {
   }
 
   @SuppressForbidden(reason = "Needs access to possibly private @Field annotated fields/methods")
-  private List<DocField> collectInfo(@SuppressWarnings({"rawtypes"})Class clazz) {
+  private List<DocField> collectInfo(Class<?> clazz) {
     List<DocField> fields = new ArrayList<>();
-    @SuppressWarnings({"rawtypes"})
-    Class superClazz = clazz;
+    Class<?> superClazz = clazz;
     List<AccessibleObject> members = new ArrayList<>();
 
     while (superClazz != null && superClazz != Object.class) {
@@ -163,8 +161,7 @@ public class DocumentObjectBinder {
     private java.lang.reflect.Field field;
     private Method setter;
     private Method getter;
-    @SuppressWarnings({"rawtypes"})
-    private Class type;
+    private Class<?> type;
     private boolean isArray;
     private boolean isList;
     private List<DocField> child;
@@ -235,8 +232,7 @@ public class DocumentObjectBinder {
       if (field != null) {
         type = field.getType();
       } else {
-        @SuppressWarnings({"rawtypes"})
-        Class[] params = setter.getParameterTypes();
+        Class<?>[] params = setter.getParameterTypes();
         if (params.length != 1) {
           throw new BindingException("Invalid setter method (" + setter +
               "). A setter must have one and only one parameter but we found " + params.length + " parameters.");
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/Field.java b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/Field.java
index 39f6752..9bfa80a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/Field.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/Field.java
@@ -26,7 +26,7 @@ import java.lang.annotation.Retention;
 
 /**
  * This class can be used to annotate a field or a setter an any class
- * and SlrJ would help you convert to SolrInputDocument and from SolrDocument
+ * and SolrJ would help you convert to SolrInputDocument and from SolrDocument
  *
  * @since solr 1.3
  */
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
index 98dee96..dde4093 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/DelegatingCloudManager.java
@@ -73,7 +73,7 @@ public class DelegatingCloudManager implements SolrCloudManager {
     }
 
     @Override
-    public SolrResponse request(@SuppressWarnings({"rawtypes"})SolrRequest req) throws IOException {
+    public <T extends SolrResponse> T request(SolrRequest<T> req) throws IOException {
         return delegate.request(req);
     }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
index dc84440..3e7af6d 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/cloud/SolrCloudManager.java
@@ -48,7 +48,7 @@ public interface SolrCloudManager extends SolrCloseable {
 
   // Solr-like methods
 
-  SolrResponse request(@SuppressWarnings({"rawtypes"})SolrRequest req) throws IOException;
+  <T extends SolrResponse> T request(SolrRequest<T> req) throws IOException;
 
   byte[] httpRequest(String url, SolrRequest.METHOD method, Map<String, String> headers, String payload, int timeout, boolean followRedirects) throws IOException;
 }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseCloudSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseCloudSolrClient.java
index abed2aa..1763895 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseCloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseCloudSolrClient.java
@@ -538,8 +538,7 @@ public abstract class BaseCloudSolrClient extends SolrClient {
     }
 
     final NamedList<Throwable> exceptions = new NamedList<>();
-    @SuppressWarnings({"rawtypes"})
-    final NamedList<NamedList> shardResponses = new NamedList<>(routes.size()+1); // +1 for deleteQuery
+    final NamedList<NamedList<?>> shardResponses = new NamedList<>(routes.size()+1); // +1 for deleteQuery
 
     long start = System.nanoTime();
 
@@ -848,7 +847,7 @@ public abstract class BaseCloudSolrClient extends SolrClient {
   }
 
   @Override
-  public NamedList<Object> request(@SuppressWarnings({"rawtypes"})SolrRequest request, String collection) throws SolrServerException, IOException {
+  public NamedList<Object> request(SolrRequest<?> request, String collection) throws SolrServerException, IOException {
     // the collection parameter of the request overrides that of the parameter to this method
     String requestCollection = request.getCollection();
     if (requestCollection != null) {
@@ -866,7 +865,7 @@ public abstract class BaseCloudSolrClient extends SolrClient {
    * there's a chance that the request will fail due to cached stale state,
    * which means the state must be refreshed from ZK and retried.
    */
-  protected NamedList<Object> requestWithRetryOnStaleState(@SuppressWarnings({"rawtypes"})SolrRequest request, int retryCount, List<String> inputCollections)
+  protected NamedList<Object> requestWithRetryOnStaleState(SolrRequest<?> request, int retryCount, List<String> inputCollections)
       throws SolrServerException, IOException {
     connect(); // important to call this before you start working with the ZkStateReader
 
@@ -1051,7 +1050,7 @@ public abstract class BaseCloudSolrClient extends SolrClient {
     return resp;
   }
 
-  protected NamedList<Object> sendRequest(@SuppressWarnings({"rawtypes"})SolrRequest request, List<String> inputCollections)
+  protected NamedList<Object> sendRequest(SolrRequest<?> request, List<String> inputCollections)
       throws SolrServerException, IOException {
     connect();
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
index 55fa3b5..5f79206 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/BaseHttpClusterStateProvider.java
@@ -44,7 +44,6 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.solr.client.solrj.impl.BaseHttpSolrClient.*;
 
-@SuppressWarnings({"unchecked"})
 public abstract class BaseHttpClusterStateProvider implements ClusterStateProvider {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -109,7 +108,7 @@ public abstract class BaseHttpClusterStateProvider implements ClusterStateProvid
         + " solrUrl(s) or zkHost(s).");
   }
 
-  @SuppressWarnings({"rawtypes"})
+  @SuppressWarnings({"rawtypes", "unchecked"})
   private ClusterState fetchClusterState(SolrClient client, String collection, Map<String, Object> clusterProperties) throws SolrServerException, IOException, NotACollectionException {
     ModifiableSolrParams params = new ModifiableSolrParams();
     if (collection != null) {
@@ -180,7 +179,7 @@ public abstract class BaseHttpClusterStateProvider implements ClusterStateProvid
     }
   }
 
-  @SuppressWarnings({"rawtypes"})
+  @SuppressWarnings({"rawtypes", "unchecked"})
   private static Set<String> fetchLiveNodes(SolrClient client) throws Exception {
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.set("action", "CLUSTERSTATUS");
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
index fcd9e29..e7441dc 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ClusterStateProvider.java
@@ -99,9 +99,8 @@ public interface ClusterStateProvider extends SolrCloseable {
   /**
    * Obtain a cluster property, or null if it doesn't exist.
    */
-  @SuppressWarnings({"unchecked"})
-  default <T> T getClusterProperty(String propertyName) {
-    return (T) getClusterProperties().get(propertyName);
+  default Object getClusterProperty(String propertyName) {
+    return getClusterProperties().get(propertyName);
   }
 
   /**
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2ClusterStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2ClusterStateProvider.java
index 1f801c9..335684a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2ClusterStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2ClusterStateProvider.java
@@ -22,7 +22,6 @@ import java.util.List;
 
 import org.apache.solr.client.solrj.SolrClient;
 
-@SuppressWarnings({"unchecked"})
 public class Http2ClusterStateProvider extends BaseHttpClusterStateProvider {
   final Http2SolrClient httpClient;
   final boolean closeClient;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpClusterStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpClusterStateProvider.java
index 947e4e7..07fd8f8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpClusterStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpClusterStateProvider.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.http.client.HttpClient;
 import org.apache.solr.client.solrj.SolrClient;
 
-@SuppressWarnings({"unchecked"})
 public class HttpClusterStateProvider extends BaseHttpClusterStateProvider {
 
   private final HttpClient httpClient;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
index 0f39fc0..5ffc70c 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
@@ -80,11 +80,11 @@ public class LBHttpSolrClient extends LBSolrClient {
    */
   @Deprecated
   public static class Req extends LBSolrClient.Req {
-    public Req(@SuppressWarnings({"rawtypes"})SolrRequest request, List<String> servers) {
+    public Req(SolrRequest<?> request, List<String> servers) {
       super(request, servers);
     }
 
-    public Req(@SuppressWarnings({"rawtypes"})SolrRequest request, List<String> servers, Integer numServersToTry) {
+    public Req(SolrRequest<?> request, List<String> servers, Integer numServersToTry) {
       super(request, servers, numServersToTry);
     }
   }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
index 5488f66..9fe39a3 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBSolrClient.java
@@ -232,6 +232,7 @@ public abstract class LBSolrClient extends SolrClient {
     }
   }
 
+  // Req should be parameterized too, but that touches a whole lotta code
   public static class Req {
     @SuppressWarnings({"rawtypes"})
     protected SolrRequest request;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
index e1a9fd8..09c683c8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientCloudManager.java
@@ -124,7 +124,7 @@ public class SolrClientCloudManager implements SolrCloudManager {
   }
 
   @Override
-  public SolrResponse request(@SuppressWarnings({"rawtypes"})SolrRequest req) throws IOException {
+  public <T extends SolrResponse> T request(SolrRequest<T> req) throws IOException {
     try {
       return req.process(solrClient);
     } catch (SolrServerException e) {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
index a6ae53e..c6d3622 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientNodeStateProvider.java
@@ -378,12 +378,10 @@ public class SolrClientNodeStateProvider implements NodeStateProvider, MapWriter
 
 
     public final String tagName, metricsAttribute;
-    @SuppressWarnings("rawtypes")
-    public final Class type;
+    public final Class<?> type;
 
 
-    @SuppressWarnings("rawtypes")
-    Variable(String tagName, String metricsAttribute, Class type) {
+    Variable(String tagName, String metricsAttribute, Class<?> type) {
       this.tagName = tagName;
       this.metricsAttribute = metricsAttribute;
       this.type = type;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrHttpRequestRetryHandler.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrHttpRequestRetryHandler.java
index c628bb6..4642db8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrHttpRequestRetryHandler.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrHttpRequestRetryHandler.java
@@ -82,7 +82,6 @@ public class SolrHttpRequestRetryHandler implements HttpRequestRetryHandler {
    *          how many times to retry; 0 means no retries
    *          true if it's OK to retry non-idempotent requests that have been sent
    */
-  @SuppressWarnings("unchecked")
   public SolrHttpRequestRetryHandler(final int retryCount) {
     this(retryCount, Arrays.asList(InterruptedIOException.class, UnknownHostException.class,
         ConnectException.class, SSLException.class));
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ModelCache.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ModelCache.java
index a77380a..123e4c9 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ModelCache.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ModelCache.java
@@ -136,7 +136,7 @@ public class ModelCache {
       this.maxSize = maxSize;
     }
 
-    public boolean removeEldestEntry(@SuppressWarnings({"rawtypes"})Map.Entry eldest) {
+    public boolean removeEldestEntry(Map.Entry<String, Model> eldest) {
       if(size()> maxSize) {
         return true;
       } else {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FieldValueEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FieldValueEvaluator.java
index 065f3d4..73bc0c7 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FieldValueEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FieldValueEvaluator.java
@@ -42,7 +42,6 @@ public class FieldValueEvaluator extends SourceEvaluator {
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public Object evaluate(Tuple tuple) throws IOException {
     Object value = tuple.get(fieldName);
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/IsNullEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/IsNullEvaluator.java
index 5707922..9ba71ae 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/IsNullEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/IsNullEvaluator.java
@@ -17,7 +17,6 @@
 package org.apache.solr.client.solrj.io.eval;
 
 import java.io.IOException;
-import java.util.Map;
 import java.util.Locale;
 
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
@@ -42,9 +41,7 @@ public class IsNullEvaluator extends RecursiveBooleanEvaluator implements ManyVa
 
     if(values[0] instanceof String) {
       //Check to see if the this tuple had a null value for that string.
-      @SuppressWarnings({"rawtypes"})
-      Map tupleContext = getStreamContext().getTupleContext();
-      String nullField = (String)tupleContext.get("null");
+      String nullField = getStreamContext().getTupleContext().get("null");
       if(nullField != null && nullField.equals(values[0])) {
         return true;
       }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/NotNullEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/NotNullEvaluator.java
index a7282d1..250cb74 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/NotNullEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/NotNullEvaluator.java
@@ -17,7 +17,6 @@
 package org.apache.solr.client.solrj.io.eval;
 
 import java.io.IOException;
-import java.util.Map;
 import java.util.Locale;
 
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
@@ -42,9 +41,7 @@ public class NotNullEvaluator extends RecursiveBooleanEvaluator implements ManyV
 
     if(values[0] instanceof String) {
       //Check to see if the this tuple had a null value for that string.
-      @SuppressWarnings({"rawtypes"})
-      Map tupleContext = getStreamContext().getTupleContext();
-      String nullField = (String)tupleContext.get("null");
+      String nullField = getStreamContext().getTupleContext().get("null");
       if(nullField != null && nullField.equals(values[0])) {
         return false;
       }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/graph/GatherNodesStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/graph/GatherNodesStream.java
index 3f65bd8..77a01de 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/graph/GatherNodesStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/graph/GatherNodesStream.java
@@ -419,8 +419,8 @@ public class GatherNodesStream extends TupleStream implements Expressible {
       localContext.setSolrClientCache(context.getSolrClientCache());
       localContext.setStreamFactory(context.getStreamFactory());
 
-      for(Object key :context.getEntries().keySet()) {
-        localContext.put(key, context.get(key));
+      for(Map.Entry<String, Object> entry : context.getEntries().entrySet()) {
+        localContext.put(entry.getKey(), entry.getValue());
       }
 
       traversal = new Traversal();
@@ -445,7 +445,6 @@ public class GatherNodesStream extends TupleStream implements Expressible {
     tupleStream.open();
   }
 
-  @SuppressWarnings({"unchecked"})
   private class JoinRunner implements Callable<List<Tuple>> {
 
     private List<String> nodes;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ResultSetMetaDataImpl.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ResultSetMetaDataImpl.java
index 63ff226..d43c780 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ResultSetMetaDataImpl.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/sql/ResultSetMetaDataImpl.java
@@ -35,8 +35,7 @@ class ResultSetMetaDataImpl implements ResultSetMetaData {
     this.firstTuple = this.resultSet.getFirstTuple();
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private Class getColumnClass(int column) throws SQLException {
+  private Class<?> getColumnClass(int column) throws SQLException {
     Object o = this.firstTuple.get(this.getColumnLabel(column));
     if(o == null) {
       return String.class; //Nulls will only be present with Strings.
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java
index 62e490a..4f0a6c0 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/SelectStream.java
@@ -74,7 +74,6 @@ public class SelectStream extends TupleStream implements Expressible {
     selectedEvaluators = new LinkedHashMap<>();
   }
   
-  @SuppressWarnings({"unchecked"})
   public SelectStream(StreamExpression expression,StreamFactory factory) throws IOException {
     // grab all parameters out
     List<StreamExpression> streamExpressions = factory.getExpressionOperandsRepresentingTypes(expression, Expressible.class, TupleStream.class);
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StreamContext.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StreamContext.java
index 921370a..677a661 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StreamContext.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StreamContext.java
@@ -38,13 +38,11 @@ import org.apache.solr.common.params.SolrParams;
 
 public class StreamContext implements Serializable {
 
-  @SuppressWarnings({"rawtypes"})
-  private Map entries = new HashMap();
-  @SuppressWarnings({"rawtypes"})
-  private Map tupleContext = new HashMap();
+  private Map<String, Object> entries = new HashMap<String, Object>();
+  private Map<String, String> tupleContext = new HashMap<>();
   private Map<String, Object> lets = new HashMap<>();
-  @SuppressWarnings({"rawtypes"})
-  private ConcurrentMap objectCache;
+  // TODO: This might be ok as a Map<String, Map<String, Object>>
+  private ConcurrentMap<String, Object> objectCache;
   public int workerID;
   public int numWorkers;
   private SolrClientCache clientCache;
@@ -54,12 +52,11 @@ public class StreamContext implements Serializable {
   private SolrParams requestParams;
   private RequestReplicaListTransformerGenerator requestReplicaListTransformerGenerator;
 
-  @SuppressWarnings({"rawtypes"})
-  public ConcurrentMap getObjectCache() {
+  public ConcurrentMap<String, Object> getObjectCache() {
     return this.objectCache;
   }
 
-  public void setObjectCache(@SuppressWarnings({"rawtypes"})ConcurrentMap objectCache) {
+  public void setObjectCache(ConcurrentMap<String, Object> objectCache) {
     this.objectCache = objectCache;
   }
 
@@ -71,8 +68,7 @@ public class StreamContext implements Serializable {
     return entries.get(key);
   }
 
-  @SuppressWarnings({"unchecked"})
-  public void put(Object key, Object value) {
+  public void put(String key, Object value) {
     this.entries.put(key, value);
   }
 
@@ -80,8 +76,7 @@ public class StreamContext implements Serializable {
     return entries.containsKey(key);
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public Map getEntries() {
+  public Map<String, Object> getEntries() {
     return this.entries;
   }
 
@@ -105,8 +100,8 @@ public class StreamContext implements Serializable {
     this.streamFactory = streamFactory;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public Map getTupleContext() {
+  // TODO: This could probably be replaced with an Optional, since the only key ever used is "null"
+  public Map<String, String> getTupleContext() {
     return tupleContext;
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java
index b62777f..80eccc3 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/Explanation.java
@@ -128,8 +128,7 @@ public class Explanation implements MapSerializable {
   }
 
   @Override
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public Map toMap(Map<String, Object> map) {
+  public Map<String,Object> toMap(Map<String, Object> map) {
     if(null != expressionNodeId){ map.put("expressionNodeId",expressionNodeId); }
     if(null != expressionType){ map.put("expressionType",expressionType); }
     if(null != functionName){ map.put("functionName",functionName); }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java
index d6e61c4..bfe6651 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamExplanation.java
@@ -55,7 +55,6 @@ public class StreamExplanation extends Explanation {
     children.add(child);
   }
   
-  @SuppressWarnings({"unchecked"})
   public Map<String,Object> toMap(Map<String,Object> map){
     map = super.toMap(map);
     
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
index f3443e9..8381da1 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
@@ -182,14 +182,12 @@ public class StreamFactory implements Serializable {
     return namedParameters;
   }
 
-  @SuppressWarnings({"unchecked"})
-  public List<StreamExpressionParameter> getOperandsOfType(StreamExpression expression,
-                                                           @SuppressWarnings({"rawtypes"})Class ... clazzes) {
+  public List<StreamExpressionParameter> getOperandsOfType(StreamExpression expression, Class<?>... clazzes) {
     List<StreamExpressionParameter> parameters = new ArrayList<>();
     
     parameterLoop:
      for (StreamExpressionParameter parameter : expression.getParameters()) {
-      for (@SuppressWarnings({"rawtypes"})Class clazz : clazzes) {
+      for (Class<?> clazz : clazzes) {
         if (!clazz.isAssignableFrom(parameter.getClass())) {
           continue parameterLoop; // go to the next parameter since this parameter cannot be assigned to at least one of the classes
         }
@@ -199,9 +197,7 @@ public class StreamFactory implements Serializable {
     return parameters;
   }
   
-  @SuppressWarnings({"unchecked"})
-  public List<StreamExpression> getExpressionOperandsRepresentingTypes(StreamExpression expression,
-                                                                       @SuppressWarnings({"rawtypes"})Class ... clazzes) {
+  public List<StreamExpression> getExpressionOperandsRepresentingTypes(StreamExpression expression, Class<?>... clazzes) {
     List<StreamExpression> matchingStreamExpressions = new ArrayList<>();
     List<StreamExpression> allStreamExpressions = getExpressionOperands(expression);
     
@@ -209,7 +205,7 @@ public class StreamFactory implements Serializable {
     for (StreamExpression streamExpression : allStreamExpressions) {
       Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(streamExpression.getFunctionName());
       if (classSupplier != null) {
-        for (@SuppressWarnings({"rawtypes"})Class clazz : clazzes) {
+        for (Class<?> clazz : clazzes) {
           if (!clazz.isAssignableFrom(classSupplier.get())) {
             continue parameterLoop;
           }
@@ -220,11 +216,10 @@ public class StreamFactory implements Serializable {
     return matchingStreamExpressions;   
   }
   
-  @SuppressWarnings({"unchecked"})
-  public boolean doesRepresentTypes(StreamExpression expression, @SuppressWarnings({"rawtypes"})Class ... clazzes) {
+  public boolean doesRepresentTypes(StreamExpression expression, Class<?>... clazzes) {
     Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(expression.getFunctionName());
     if (classSupplier != null) {
-      for (@SuppressWarnings({"rawtypes"})Class clazz : clazzes) {
+      for (Class<?> clazz : clazzes) {
         if (!clazz.isAssignableFrom(classSupplier.get())) {
           return false;
         }
@@ -270,15 +265,14 @@ public class StreamFactory implements Serializable {
   public TupleStream constructStream(String expressionClause) throws IOException {
     return constructStream(StreamExpressionParser.parse(expressionClause));
   }
-  @SuppressWarnings({"rawtypes"})
   public TupleStream constructStream(StreamExpression expression) throws IOException {
     String function = expression.getFunctionName();
     Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
 
     if (classSupplier != null) {
       Class<? extends Expressible> clazz =  classSupplier.get();
-      if (Expressible.class.isAssignableFrom(clazz) && TupleStream.class.isAssignableFrom(clazz)) {
-        return (TupleStream)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+      if (TupleStream.class.isAssignableFrom(clazz)) {
+        return createInstance(clazz.asSubclass(TupleStream.class), new Class<?>[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
@@ -289,22 +283,20 @@ public class StreamFactory implements Serializable {
     return constructMetric(StreamExpressionParser.parse(expressionClause));
   }
 
-  @SuppressWarnings({"rawtypes"})
   public Metric constructMetric(StreamExpression expression) throws IOException {
     String function = expression.getFunctionName();
     Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
     if (classSupplier != null) {
       Class<? extends Expressible> clazz = classSupplier.get();
-      if (Expressible.class.isAssignableFrom(clazz) && Metric.class.isAssignableFrom(clazz)) {
-        return (Metric)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+      if (Metric.class.isAssignableFrom(clazz)) {
+        return createInstance(clazz.asSubclass(Metric.class), new Class<?>[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
     throw new IOException(String.format(Locale.ROOT, "Invalid metric expression %s - function '%s' is unknown (not mapped to a valid Metric)", expression, expression.getFunctionName()));
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public StreamComparator constructComparator(String comparatorString, @SuppressWarnings({"rawtypes"})Class comparatorType) throws IOException {
+  public StreamComparator constructComparator(String comparatorString, Class<? extends StreamComparator> comparatorType) throws IOException {
     if (comparatorString.contains(",")) {
       String[] parts = comparatorString.split(",");
       StreamComparator[] comps = new StreamComparator[parts.length];
@@ -342,7 +334,7 @@ public class StreamFactory implements Serializable {
         throw new IOException(String.format(Locale.ROOT, "Invalid comparator expression %s - expecting 'left=right order'",comparatorString));
       }
       
-      return (StreamComparator) createInstance(comparatorType, new Class[]{ String.class, String.class, ComparatorOrder.class }, new Object[]{ leftFieldName, rightFieldName, ComparatorOrder.fromString(order) });
+      return createInstance(comparatorType, new Class<?>[]{ String.class, String.class, ComparatorOrder.class }, new Object[]{ leftFieldName, rightFieldName, ComparatorOrder.fromString(order) });
     } else {
       // expected format is "field order"
       String[] parts = comparatorString.split(" ");
@@ -353,12 +345,11 @@ public class StreamFactory implements Serializable {
       String fieldName = parts[0].trim();
       String order = parts[1].trim();
       
-      return (StreamComparator) createInstance(comparatorType, new Class[]{ String.class, ComparatorOrder.class }, new Object[]{ fieldName, ComparatorOrder.fromString(order) });
+      return createInstance(comparatorType, new Class<?>[]{ String.class, ComparatorOrder.class }, new Object[]{ fieldName, ComparatorOrder.fromString(order) });
     }
   }
     
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public StreamEqualitor constructEqualitor(String equalitorString, Class equalitorType) throws IOException {
+  public StreamEqualitor constructEqualitor(String equalitorString, Class<? extends StreamEqualitor> equalitorType) throws IOException {
     if (equalitorString.contains(",")) {
       String[] parts = equalitorString.split(",");
       StreamEqualitor[] eqs = new StreamEqualitor[parts.length];
@@ -382,7 +373,7 @@ public class StreamFactory implements Serializable {
         leftFieldName = rightFieldName = equalitorString.trim();
       }
       
-      return (StreamEqualitor) createInstance(equalitorType, new Class[]{ String.class, String.class }, new Object[]{ leftFieldName, rightFieldName });
+      return createInstance(equalitorType, new Class<?>[]{ String.class, String.class }, new Object[]{ leftFieldName, rightFieldName });
     }
   }
   
@@ -390,33 +381,31 @@ public class StreamFactory implements Serializable {
     return constructMetric(StreamExpressionParser.parse(expressionClause));
   }
 
-  @SuppressWarnings({"rawtypes"})
   public StreamOperation constructOperation(StreamExpression expression) throws IOException {
     String function = expression.getFunctionName();
     Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
     if (classSupplier != null) {
       Class<? extends Expressible> clazz = classSupplier.get();
-      if (Expressible.class.isAssignableFrom(clazz) && StreamOperation.class.isAssignableFrom(clazz)) {
-        return (StreamOperation) createInstance(clazz, new Class[]{StreamExpression.class, StreamFactory.class}, new Object[]{expression, this});
+      if (StreamOperation.class.isAssignableFrom(clazz)) {
+        return createInstance(clazz.asSubclass(StreamOperation.class), new Class<?>[]{StreamExpression.class, StreamFactory.class}, new Object[]{expression, this});
       }
     }
 
     throw new IOException(String.format(Locale.ROOT, "Invalid operation expression %s - function '%s' is unknown (not mapped to a valid StreamOperation)", expression, expression.getFunctionName()));
   }
   
-  public org.apache.solr.client.solrj.io.eval.StreamEvaluator constructEvaluator(String expressionClause) throws IOException {
+  public StreamEvaluator constructEvaluator(String expressionClause) throws IOException {
     return constructEvaluator(StreamExpressionParser.parse(expressionClause));
   }
 
-  @SuppressWarnings({"rawtypes"})
-  public org.apache.solr.client.solrj.io.eval.StreamEvaluator constructEvaluator(StreamExpression expression) throws IOException {
+  public StreamEvaluator constructEvaluator(StreamExpression expression) throws IOException {
     String function = expression.getFunctionName();
     Supplier<Class<? extends Expressible>> classSupplier = functionNames.get(function);
 
     if (classSupplier != null) {
       Class<? extends Expressible> clazz = classSupplier.get();
-      if (Expressible.class.isAssignableFrom(clazz) && StreamEvaluator.class.isAssignableFrom(clazz)) {
-        return (org.apache.solr.client.solrj.io.eval.StreamEvaluator)createInstance(clazz, new Class[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
+      if (StreamEvaluator.class.isAssignableFrom(clazz)) {
+        return createInstance(clazz.asSubclass(StreamEvaluator.class), new Class<?>[]{ StreamExpression.class, StreamFactory.class }, new Object[]{ expression, this});
       }
     }
     
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 607a5a8..273f447 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -2652,9 +2652,7 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
    */
   public static class RequestApiDistributedProcessingResponse extends CollectionAdminResponse {
     public boolean getIsCollectionApiDistributed() {
-      @SuppressWarnings({"rawtypes"})
-      Boolean isDistributedApi = (Boolean) getResponse().get("isDistributedApi");
-      return isDistributedApi;
+      return (Boolean) getResponse().get("isDistributedApi");
     }
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
index b54447c..cda91db 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
@@ -32,7 +32,6 @@ import org.apache.solr.client.solrj.request.beans.V2ApiConstants;
 import org.apache.solr.common.params.CollectionParams.CollectionAction;
 import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.util.Pair;
-import org.apache.solr.common.util.Utils;
 
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.DELETE;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
@@ -71,7 +70,7 @@ public class CollectionApiMapping {
         POST,
         RELOAD,
         RELOAD.toLower(),
-        Utils.makeMap(NAME, "collection")),
+        Map.of(NAME, "collection")),
     MODIFY_COLLECTION(PER_COLLECTION,
         POST,
         MODIFYCOLLECTION,
@@ -80,7 +79,7 @@ public class CollectionApiMapping {
         POST,
         MIGRATE,
         "migrate-docs",
-        Utils.makeMap("split.key", "splitKey",
+        Map.of("split.key", "splitKey",
             "target.collection", "target",
             "forward.timeout", "forwardTimeout"
         )),
@@ -94,8 +93,8 @@ public class CollectionApiMapping {
         POST,
         CREATESHARD,
         "create",
-        Utils.makeMap("createNodeSet", V2ApiConstants.NODE_SET),
-        Utils.makeMap("property.", "coreProperties.")) {
+        Map.of("createNodeSet", V2ApiConstants.NODE_SET),
+        Map.of("property.", "coreProperties.")) {
       @Override
       public String getParamSubstitute(String param) {
         return super.getParamSubstitute(param);
@@ -106,9 +105,8 @@ public class CollectionApiMapping {
         POST,
         SPLITSHARD,
         "split",
-        Utils.makeMap(
-            "split.key", "splitKey"),
-        Utils.makeMap("property.", "coreProperties.")),
+        Map.of("split.key", "splitKey"),
+        Map.of("property.", "coreProperties.")),
     DELETE_SHARD(PER_COLLECTION_PER_SHARD_DELETE,
         DELETE, DELETESHARD),
 
@@ -117,7 +115,7 @@ public class CollectionApiMapping {
         ADDREPLICA,
         "add-replica",
         null,
-        Utils.makeMap("property.", "coreProperties.")),
+        Map.of("property.", "coreProperties.")),
 
     DELETE_REPLICA(PER_COLLECTION_PER_SHARD_PER_REPLICA_DELETE,
         DELETE, DELETEREPLICA),
@@ -131,7 +129,7 @@ public class CollectionApiMapping {
         POST,
         CollectionAction.ADDREPLICAPROP,
         "add-replica-property",
-        Utils.makeMap("property", "name", "property.value", "value")),
+        Map.of("property", "name", "property.value", "value")),
     DELETE_REPLICA_PROPERTY(PER_COLLECTION,
         POST,
         DELETEREPLICAPROP,
@@ -141,7 +139,7 @@ public class CollectionApiMapping {
         POST,
         COLLECTIONPROP,
         "set-collection-property",
-        Utils.makeMap(
+        Map.of(
             NAME, "collection",
             "propertyName", "name",
             "propertyValue", "value")),
@@ -171,16 +169,14 @@ public class CollectionApiMapping {
 
     Meta(EndPoint endPoint, SolrRequest.METHOD method, CollectionAction action,
          String commandName,
-         @SuppressWarnings({"rawtypes"})Map paramsToAttrs) {
+         Map<String, String> paramsToAttrs) {
       this(endPoint, method, action, commandName, paramsToAttrs, Collections.emptyMap());
     }
 
-    // lame... the Maps aren't typed simply because callers want to use Utils.makeMap which yields object vals
-    @SuppressWarnings("unchecked")
     Meta(EndPoint endPoint, SolrRequest.METHOD method, CollectionAction action,
          String commandName,
-         @SuppressWarnings({"rawtypes"})Map paramsToAttrs,
-         @SuppressWarnings({"rawtypes"})Map prefixParamsToAttrs) {
+         Map<String, String> paramsToAttrs,
+         Map<String, String> prefixParamsToAttrs) {
       this.action = action;
       this.commandName = commandName;
       this.endPoint = endPoint;
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java
index 164b9ad..74dd466 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CoreApiMapping.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.request.CollectionApiMapping.CommandMeta;
 import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
-import org.apache.solr.common.util.Utils;
 
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
@@ -40,14 +39,14 @@ import static org.apache.solr.client.solrj.request.CoreApiMapping.EndPoint.PER_C
  */
 public class CoreApiMapping {
   public enum Meta implements CommandMeta {
-    CREATE(CORES_COMMANDS, POST, CoreAdminAction.CREATE, "create", Utils.makeMap("config", "configSet")),
+    CREATE(CORES_COMMANDS, POST, CoreAdminAction.CREATE, "create", Collections.singletonMap("config", "configSet")),
     UNLOAD(PER_CORE_COMMANDS, POST, CoreAdminAction.UNLOAD, "unload", null),
     RELOAD(PER_CORE_COMMANDS, POST, CoreAdminAction.RELOAD, "reload", null),
     STATUS(CORES_STATUS, GET, CoreAdminAction.STATUS, "status", null),
-    SWAP(PER_CORE_COMMANDS, POST, CoreAdminAction.SWAP, "swap", Utils.makeMap("other", "with")),
-    RENAME(PER_CORE_COMMANDS, POST, CoreAdminAction.RENAME, "rename", Utils.makeMap("other", "to")),
+    SWAP(PER_CORE_COMMANDS, POST, CoreAdminAction.SWAP, "swap", Collections.singletonMap("other", "with")),
+    RENAME(PER_CORE_COMMANDS, POST, CoreAdminAction.RENAME, "rename", Collections.singletonMap("other", "to")),
     MERGEINDEXES(PER_CORE_COMMANDS, POST, CoreAdminAction.MERGEINDEXES, "merge-indexes", null),
-    SPLIT(PER_CORE_COMMANDS, POST, CoreAdminAction.SPLIT, "split", Utils.makeMap("split.key", "splitKey")),
+    SPLIT(PER_CORE_COMMANDS, POST, CoreAdminAction.SPLIT, "split", Collections.singletonMap("split.key", "splitKey")),
     PREPRECOVERY(PER_CORE_COMMANDS, POST, CoreAdminAction.PREPRECOVERY, "prep-recovery", null),
     REQUESTRECOVERY(PER_CORE_COMMANDS, POST, CoreAdminAction.REQUESTRECOVERY, "request-recovery", null),
     REQUESTSYNCSHARD(PER_CORE_COMMANDS, POST, CoreAdminAction.REQUESTSYNCSHARD, "request-sync-shard", null),
@@ -64,13 +63,12 @@ public class CoreApiMapping {
     public final CoreAdminAction action;
     public final Map<String, String> paramstoAttr;
 
-    @SuppressWarnings({"unchecked"})
     Meta(EndPoint endPoint, SolrRequest.METHOD method, CoreAdminAction action, String commandName,
-         @SuppressWarnings({"rawtypes"})Map paramstoAttr) {
+         Map<String,String> paramstoAttr) {
       this.commandName = commandName;
       this.endPoint = endPoint;
       this.method = method;
-      this.paramstoAttr = paramstoAttr == null ? Collections.EMPTY_MAP : Collections.unmodifiableMap(paramstoAttr);
+      this.paramstoAttr = paramstoAttr == null ? Collections.emptyMap() : paramstoAttr; // expect this to be immutable
       this.action = action;
     }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java
index 0c69ce8..3838ed6 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/RequestWriter.java
@@ -92,11 +92,11 @@ public class RequestWriter {
             updateRequest.getDocIterator() == null;
   }
 
-  public String getPath(@SuppressWarnings({"rawtypes"})SolrRequest req) {
+  public String getPath(SolrRequest<?> req) {
     return req.getPath();
   }
 
-  public void write(@SuppressWarnings({"rawtypes"})SolrRequest request, OutputStream os) throws IOException {
+  public void write(SolrRequest<?> request, OutputStream os) throws IOException {
     if (request instanceof UpdateRequest) {
       UpdateRequest updateRequest = (UpdateRequest) request;
       BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8));
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
index 071717b..39c0d07 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
@@ -31,7 +31,6 @@ import java.util.Objects;
 import java.util.Set;
 
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.LBHttpSolrClient;
 import org.apache.solr.client.solrj.impl.LBSolrClient;
@@ -235,7 +234,7 @@ public class UpdateRequest extends AbstractUpdateRequest {
   }
 
   private interface ReqSupplier<T extends LBSolrClient.Req> {
-    T get(@SuppressWarnings({"rawtypes"})SolrRequest solrRequest, List<String> servers);
+    T get(UpdateRequest request, List<String> servers);
   }
 
   private <T extends LBSolrClient.Req> Map<String, T> getRoutes(DocRouter router,
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/response/SpellCheckResponse.java b/solr/solrj/src/java/org/apache/solr/client/solrj/response/SpellCheckResponse.java
index 84138fe..1a1cfb0 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/response/SpellCheckResponse.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/response/SpellCheckResponse.java
@@ -160,7 +160,6 @@ public class SpellCheckResponse {
         } else if ("origFreq".equals(n)) {
           originalFrequency = (Integer) suggestion.getVal(i);
         } else if ("suggestion".equals(n)) {
-          @SuppressWarnings("unchecked")
           List list = (List)suggestion.getVal(i);
           if (list.size() > 0 && list.get(0) instanceof NamedList) {
             // extended results detected
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/response/schema/SchemaResponse.java b/solr/solrj/src/java/org/apache/solr/client/solrj/response/schema/SchemaResponse.java
index 7708c73..b93b4f0 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/response/schema/SchemaResponse.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/response/schema/SchemaResponse.java
@@ -81,7 +81,6 @@ public class SchemaResponse extends SolrResponseBase {
     return analyzerDefinition;
   }
 
-  @SuppressWarnings("unchecked")
   private static FieldTypeDefinition createFieldTypeDefinition(NamedList<Object> fieldTypeNamedList) {
     FieldTypeDefinition fieldTypeDefinition = new FieldTypeDefinition();
     fillFieldTypeDefinition(fieldTypeDefinition, fieldTypeNamedList);
@@ -236,7 +235,6 @@ public class SchemaResponse extends SolrResponseBase {
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public void setResponse(NamedList<Object> response) {
     super.setResponse(response);
 
@@ -253,7 +251,6 @@ public class SchemaResponse extends SolrResponseBase {
     private String schemaName;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -270,7 +267,6 @@ public class SchemaResponse extends SolrResponseBase {
     private float schemaVersion;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -305,7 +301,6 @@ public class SchemaResponse extends SolrResponseBase {
     List<Map<String, Object>> fields;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -339,7 +334,6 @@ public class SchemaResponse extends SolrResponseBase {
     List<Map<String, Object>> dynamicFields;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -355,7 +349,6 @@ public class SchemaResponse extends SolrResponseBase {
     private String uniqueKey;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -371,7 +364,6 @@ public class SchemaResponse extends SolrResponseBase {
     Map<String, Object> similarity;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -388,7 +380,6 @@ public class SchemaResponse extends SolrResponseBase {
     List<Map<String, Object>> copyFields;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -422,7 +413,6 @@ public class SchemaResponse extends SolrResponseBase {
     List<FieldTypeRepresentation> fieldTypes;
 
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
 
@@ -436,7 +426,6 @@ public class SchemaResponse extends SolrResponseBase {
 
   public static class UpdateResponse extends SolrResponseBase {
     @Override
-    @SuppressWarnings("unchecked")
     public void setResponse(NamedList<Object> response) {
       super.setResponse(response);
     }
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java b/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
index f56f1b2..8cc6fbd 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
@@ -26,6 +26,5 @@ public interface MapSerializable {
    * Do not keep a reference to the passed map and reuse it.
    * it may be reused by the framework
    */
-  @SuppressWarnings({"rawtypes"})
-  Map toMap(Map<String, Object> map);
+  Map<String, Object> toMap(Map<String, Object> map);
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
index 7266410..b7cc4e2 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
@@ -41,7 +41,7 @@ public interface MapWriter extends MapSerializable , NavigableObject {
 
   @Override
   @SuppressWarnings({"unchecked", "rawtypes"})
-  default Map toMap(Map<String, Object> map) {
+  default Map<String,Object> toMap(Map<String, Object> map) {
     try {
       writeMap(new EntryWriter() {
         @Override
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
index 5e6dfeb..430f436 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapWriterMap.java
@@ -22,28 +22,24 @@ import java.util.List;
 import java.util.Map;
 
 public class MapWriterMap implements MapWriter {
-  @SuppressWarnings({"rawtypes"})
-  private final Map delegate;
+  private final Map<String, Object> delegate;
 
-  public MapWriterMap(@SuppressWarnings({"rawtypes"})Map delegate) {
+  public MapWriterMap(Map<String,Object> delegate) {
     this.delegate = delegate;
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public void writeMap(EntryWriter ew) throws IOException {
     delegate.forEach(ew.getBiConsumer());
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public Object _get(String path, Object def) {
     if (path.indexOf('/') == -1) return delegate.getOrDefault(path, def);
     return MapWriter.super._get(path, def);
   }
 
   @Override
-  @SuppressWarnings({"unchecked"})
   public Object _get(List<String> path, Object def) {
     if (path.size() == 1) return delegate.getOrDefault(path.get(0), def);
     return MapWriter.super._get(path, def);
@@ -56,7 +52,6 @@ public class MapWriterMap implements MapWriter {
   }
 
   @Override
-  @SuppressWarnings("unchecked")
   public Map<String,Object> toMap(Map<String, Object> map) {
     return delegate;
   }
diff --git a/solr/solrj/src/java/org/apache/solr/common/SolrException.java b/solr/solrj/src/java/org/apache/solr/common/SolrException.java
index b86d485..d818b3a 100644
--- a/solr/solrj/src/java/org/apache/solr/common/SolrException.java
+++ b/solr/solrj/src/java/org/apache/solr/common/SolrException.java
@@ -226,7 +226,6 @@ public class SolrException extends RuntimeException {
     return t;
   }
 
-  @SuppressWarnings({"unchecked"})
   public void logInfoWithMdc(Logger logger, String msg) {
     Map<String, String> previousMdcContext = MDC.getCopyOfContextMap();
     MDC.setContextMap(mdcContext);
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
index a87735f..43d452c 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
@@ -154,7 +154,6 @@ public class Aliases {
    * @return an unmodifiable Map of collection aliases mapped to a comma delimited string of the collection(s) the
    * alias maps to. Does not return null.
    */
-  @SuppressWarnings("unchecked")
   public Map<String, String> getCollectionAliasMap() {
     return Collections.unmodifiableMap(convertMapOfListToMapOfCommaDelimited(collectionAliases));
   }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/SolrClassLoader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/SolrClassLoader.java
index 98e920d..ac38558 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/SolrClassLoader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/SolrClassLoader.java
@@ -22,8 +22,7 @@ public interface SolrClassLoader {
 
     <T> T newInstance(String cname, Class<T> expectedType, String... subpackages);
 
-    @SuppressWarnings({"rawtypes"})
-    <T> T newInstance(String cName, Class<T> expectedType, String[] subPackages, Class[] params, Object[] args);
+    <T> T newInstance(String cName, Class<T> expectedType, String[] subPackages, Class<?>[] params, Object[] args);
 
     <T> Class<? extends T> findClass(String cname, Class<T> expectedType);
 }
\ No newline at end of file
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
index 4f6bc42..20b7340 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
@@ -48,7 +48,7 @@ public class ZkNodeProps implements JSONWriter.Writable {
    * Construct ZKNodeProps from map.
    */
   public ZkNodeProps(Map<String,Object> propMap) {
-    this.propMap = propMap;
+    this.propMap = new HashMap<>(propMap); // We need propMap to be mutable
 
     // don't store base_url if we have a node_name to recompute from when we read back from ZK
     // sub-classes that know they need a base_url (Replica) can eagerly compute in their ctor
@@ -80,6 +80,10 @@ public class ZkNodeProps implements JSONWriter.Writable {
     this( Utils.makeMap((Object[]) keyVals) );
   }
 
+  /**
+   * @deprecated use {@link ZkNodeProps#ZkNodeProps(String...)}
+   */
+  @Deprecated(since = "9.0.0")
   public static ZkNodeProps fromKeyVals(Object... keyVals)  {
     return new ZkNodeProps( Utils.makeMap(keyVals) );
   }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index 7ff0b3a..0cfbbab 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -65,7 +65,7 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static java.util.Collections.EMPTY_MAP;
+import static java.util.Collections.emptyMap;
 import static java.util.Collections.emptySortedSet;
 import static org.apache.solr.common.cloud.UrlScheme.HTTP;
 import static org.apache.solr.common.util.Utils.fromJSON;
@@ -439,7 +439,7 @@ public class ZkStateReader implements SolrCloseable {
       if (securityNodeListener != null) {
         addSecurityNodeWatcher(pair -> {
           ConfigData cd = new ConfigData();
-          cd.data = pair.first() == null || pair.first().length == 0 ? EMPTY_MAP : Utils.getDeepCopy((Map) fromJSON(pair.first()), 4, false);
+          cd.data = pair.first() == null || pair.first().length == 0 ? emptyMap() : Utils.getDeepCopy((Map) fromJSON(pair.first()), 4, false);
           cd.version = pair.second() == null ? -1 : pair.second().getVersion();
           securityData = cd;
           securityNodeListener.run();
@@ -1001,13 +1001,14 @@ public class ZkStateReader implements SolrCloseable {
     loadClusterProperties();
   };
 
-  @SuppressWarnings("unchecked")
   private void loadClusterProperties() {
     try {
       while (true) {
         try {
           byte[] data = zkClient.getData(ZkStateReader.CLUSTER_PROPS, clusterPropertiesWatcher, new Stat(), true);
-          this.clusterProperties = ClusterProperties.convertCollectionDefaultsToNestedFormat((Map<String, Object>) Utils.fromJSON(data));
+          @SuppressWarnings("unchecked")
+          Map<String, Object> properties = (Map<String, Object>) Utils.fromJSON(data);
+          this.clusterProperties = ClusterProperties.convertCollectionDefaultsToNestedFormat(properties);
           log.debug("Loaded cluster properties: {}", this.clusterProperties);
 
           // Make the urlScheme globally accessible
@@ -1110,7 +1111,6 @@ public class ZkStateReader implements SolrCloseable {
     return COLLECTIONS_ZKNODE + '/' + collection + '/' + COLLECTION_PROPS_ZKNODE;
   }
 
-  @SuppressWarnings("unchecked")
   private VersionedCollectionProps fetchCollectionProperties(String collection, Watcher watcher) throws KeeperException, InterruptedException {
     final String znodePath = getCollectionPropsPath(collection);
     // lazy init cache cleaner once we know someone is using collection properties.
@@ -1125,7 +1125,9 @@ public class ZkStateReader implements SolrCloseable {
       try {
         Stat stat = new Stat();
         byte[] data = zkClient.getData(znodePath, watcher, stat, true);
-        return new VersionedCollectionProps(stat.getVersion(), (Map<String, String>) Utils.fromJSON(data));
+        @SuppressWarnings("unchecked")
+        Map<String, String> props = (Map<String, String>) Utils.fromJSON(data);
+        return new VersionedCollectionProps(stat.getVersion(), props);
       } catch (ClassCastException e) {
         throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to parse collection properties for collection " + collection, e);
       } catch (KeeperException.NoNodeException e) {
@@ -1138,7 +1140,7 @@ public class ZkStateReader implements SolrCloseable {
             continue;
           }
         }
-        return new VersionedCollectionProps(-1, EMPTY_MAP);
+        return new VersionedCollectionProps(-1, emptyMap());
       }
     }
   }
@@ -1147,10 +1149,10 @@ public class ZkStateReader implements SolrCloseable {
    * Returns the content of /security.json from ZooKeeper as a Map
    * If the files doesn't exist, it returns null.
    */
-  @SuppressWarnings({"unchecked"})
+  @SuppressWarnings("unchecked")
   public ConfigData getSecurityProps(boolean getFresh) {
     if (!getFresh) {
-      if (securityData == null) return new ConfigData(EMPTY_MAP, -1);
+      if (securityData == null) return new ConfigData(emptyMap(), -1);
       return new ConfigData(securityData.data, securityData.version);
     }
     try {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
index 0cdbd76..83de0d4 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
@@ -171,9 +171,8 @@ public class CommandOperation {
     return s;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private Map errorDetails() {
-    return Utils.makeMap(name, commandData, ERR_MSGS, errors);
+  private Map<String, Object> errorDetails() {
+    return Map.of(name, commandData, ERR_MSGS, errors);
   }
 
   public boolean hasError() {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
index bc32d94..6d2546e 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaCreator.java
@@ -36,8 +36,7 @@ import org.apache.solr.common.annotation.JsonProperty;
  */
 
 public class JsonSchemaCreator {
-  @SuppressWarnings({"rawtypes"})
-  public static final Map<Class, String> natives = new HashMap<>();
+  public static final Map<Class<?>, String> natives = new HashMap<>();
 
   static {
     natives.put(String.class, "string");
@@ -74,7 +73,7 @@ public class JsonSchemaCreator {
     return map;
   }
 
-  private static void createObjectSchema(@SuppressWarnings({"rawtypes"})Class klas, Map<String, Object> map) {
+  private static void createObjectSchema(Class<?> klas, Map<String, Object> map) {
     map.put("type", "object");
     Map<String, Object> props = new HashMap<>();
     map.put("properties", props);
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
index d67e6eb..e246d02 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
@@ -120,10 +120,9 @@ enum Type {
   NULL(null),
   UNKNOWN(Object.class);
 
-  @SuppressWarnings({"rawtypes"})
-  Class type;
+  Class<?> type;
 
-  Type(@SuppressWarnings({"rawtypes"})Class type) {
+  Type(Class<?> type) {
     this.type = type;
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Pair.java b/solr/solrj/src/java/org/apache/solr/common/util/Pair.java
index 05b09e8..bf11d09 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Pair.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Pair.java
@@ -23,7 +23,6 @@ import java.util.Objects;
 
 import org.apache.solr.common.MapWriter;
 
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.common.util.Utils.toJSONString;
 
 public class Pair<T1, T2> implements Serializable, MapWriter {
@@ -52,7 +51,7 @@ public class Pair<T1, T2> implements Serializable, MapWriter {
 
   @Override
   public String toString() {
-    return toJSONString(makeMap("first", first, "second", second));
+    return toJSONString(Map.of("first", first, "second", second));
   }
 
   @Override
@@ -67,7 +66,7 @@ public class Pair<T1, T2> implements Serializable, MapWriter {
   }
 
   @SuppressWarnings({"unchecked", "rawtypes"})
-  public static Pair parse(Map m) {
+  public static Pair parse(Map<String, ?> m) {
     return new Pair(m.get("first"), m.get("second"));
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java b/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
index 422b505..c9a66b4 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
@@ -30,27 +30,27 @@ public class RetryUtil {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   
   public interface RetryCmd {
-    void execute() throws Throwable;
+    void execute() throws Exception;
   }
   
   public interface BooleanRetryCmd {
     boolean execute();
   }
-  
-  public static void retryOnThrowable(@SuppressWarnings({"rawtypes"})Class clazz, long timeoutms, long intervalms, RetryCmd cmd) throws Throwable {
-    retryOnThrowable(Collections.singleton(clazz), timeoutms, intervalms, cmd);
+
+  public static void retryOnException(Class<? extends Exception> clazz, long timeoutms, long intervalms, RetryCmd cmd) throws Exception {
+    retryOnException(Collections.singleton(clazz), timeoutms, intervalms, cmd);
   }
   
-  public static void retryOnThrowable(@SuppressWarnings({"rawtypes"})Set<Class> classes,
-                                      long timeoutms, long intervalms, RetryCmd cmd) throws Throwable {
+  public static void retryOnException(Set<Class<? extends Exception>> classes,
+                                      long timeoutms, long intervalms, RetryCmd cmd) throws Exception {
     long timeout = System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeoutms, TimeUnit.MILLISECONDS);
     while (true) {
       try {
         cmd.execute();
-      } catch (Throwable t) {
+      } catch (Exception t) {
         if (isInstanceOf(classes, t) && System.nanoTime() < timeout) {
           if (log.isInfoEnabled()) {
-            log.info("Retry due to Throwable, {} ", t.getClass().getName(), t);
+            log.info("Retry due to Exception, {} ", t.getClass().getName(), t);
           }
           Thread.sleep(intervalms);
           continue;
@@ -62,8 +62,8 @@ public class RetryUtil {
     }
   }
   
-  private static boolean isInstanceOf(@SuppressWarnings({"rawtypes"})Set<Class> classes, Throwable t) {
-    for (@SuppressWarnings({"rawtypes"})Class c : classes) {
+  private static boolean isInstanceOf(Set<Class<? extends Exception>> classes, Throwable t) {
+    for (Class<? extends Exception> c : classes) {
       if (c.isInstance(t)) {
         return true;
       }
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index 13e732d..b8f457a 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -321,19 +321,28 @@ public class Utils {
     }
   }
 
+  public static <V> Map<String, V> makeMap(String k1, V v1, String k2, V v2) {
+    Map<String, V> map = new LinkedHashMap<>(2, 1);
+    map.put(k1, v1);
+    map.put(k2, v2);
+    return map;
+  }
+
   public static Map<String, Object> makeMap(Object... keyVals) {
-    return makeMap(false, keyVals);
+    return _makeMap(keyVals);
   }
 
-  public static Map<String, Object> makeMap(boolean skipNulls, Object... keyVals) {
+  public static Map<String, String> makeMap(String... keyVals) {
+    return _makeMap(keyVals);
+  }
+
+  private static <T> Map<String, T> _makeMap(T[] keyVals) {
     if ((keyVals.length & 0x01) != 0) {
       throw new IllegalArgumentException("arguments should be key,value");
     }
-    Map<String, Object> propMap = new LinkedHashMap<>(keyVals.length >> 1);
+    Map<String, T> propMap = new LinkedHashMap<>(); // Cost of oversizing LHM is low, don't compute initialCapacity
     for (int i = 0; i < keyVals.length; i += 2) {
-      Object keyVal = keyVals[i + 1];
-      if (skipNulls && keyVal == null) continue;
-      propMap.put(keyVals[i].toString(), keyVal);
+      propMap.put(String.valueOf(keyVals[i]), keyVals[i + 1]);
     }
     return propMap;
   }
@@ -520,7 +529,9 @@ public class Utils {
           if (o instanceof MapWriter) {
             o = getVal(o, null, idx);
           } else if (o instanceof Map) {
-            o = getVal(new MapWriterMap((Map) o), null, idx);
+            @SuppressWarnings("unchecked")
+            Map<String, Object> map = (Map<String, Object>) o;
+            o = getVal(new MapWriterMap(map), null, idx);
           } else {
             @SuppressWarnings({"rawtypes"})
             List l = (List) o;
@@ -883,8 +894,7 @@ public class Utils {
     }
   }
 
-  @SuppressWarnings("rawtypes")
-  private static List<FieldWriter> getReflectData(Class c) throws IllegalAccessException {
+  private static List<FieldWriter> getReflectData(Class<?> c) throws IllegalAccessException {
     boolean sameClassLoader = c.getClassLoader() == Utils.class.getClassLoader();
     //we should not cache the class references of objects loaded from packages because they will not get garbage collected
     //TODO fix that later
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
index f839314..5f3422b 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/CloudAuthStreamTest.java
@@ -74,8 +74,7 @@ public class CloudAuthStreamTest extends SolrCloudTestCase {
    *
    * @see SolrRequest#setBasicAuthCredentials
    */
-  @SuppressWarnings({"rawtypes"})
-  private static <T extends SolrRequest> T setBasicAuthCredentials(T req, String user) {
+  private static <T extends SolrRequest<?>> T setBasicAuthCredentials(T req, String user) {
     assert null != user;
     req.setBasicAuthCredentials(user, user);
     return req;
@@ -93,28 +92,28 @@ public class CloudAuthStreamTest extends SolrCloudTestCase {
       .collect(Collectors.toMap(Function.identity(), Function.identity()));
 
     final String SECURITY_JSON = Utils.toJSONString
-      (Utils.makeMap("authorization",
-                     Utils.makeMap("class", RuleBasedAuthorizationPlugin.class.getName(),
+      (Map.of("authorization",
+                     Map.of("class", RuleBasedAuthorizationPlugin.class.getName(),
                                    "user-role", roles,
                                    // NOTE: permissions order matters!
                                    "permissions", Arrays.asList(// any authn user can 'read' or hit /stream
-                                                                Utils.makeMap("name","read",
+                                                                Map.of("name","read",
                                                                               "role","*"),
-                                                                Utils.makeMap("name","stream",
+                                                                Map.of("name","stream",
                                                                               "collection", "*",
                                                                               "path", "/stream",
                                                                               "role","*"),
                                                                 // per collection write perms
-                                                                Utils.makeMap("name","update",
+                                                                Map.of("name","update",
                                                                               "collection", COLLECTION_X,
                                                                               "role", WRITE_X_USER),
-                                                                Utils.makeMap("name","update",
+                                                                Map.of("name","update",
                                                                               "collection", COLLECTION_Y,
                                                                               "role", WRITE_Y_USER),
-                                                                Utils.makeMap("name","all",
+                                                                Map.of("name","all",
                                                                               "role",ADMIN_USER))),
                      "authentication",
-                     Utils.makeMap("class", BasicAuthPlugin.class.getName(),
+                     Map.of("class", BasicAuthPlugin.class.getName(),
                                    "blockUnknown",true,
                                    "credentials", credentials)));
     
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
index a44a668..fad66ed 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/TestUpdateRequestCodec.java
@@ -24,6 +24,7 @@ import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -157,15 +158,15 @@ public class TestUpdateRequestCodec extends SolrTestCase {
   }
 
   //this format accepts a 1:1 mapping of the json format and javabin format
-  @SuppressWarnings({"unchecked"})
   public void testStreamableInputDocFormat() throws IOException {
-    @SuppressWarnings({"rawtypes"})
-    Map m = Utils.makeMap("id","1","desc" ,"The desc 1");
+    Map<String, Object> m = new LinkedHashMap<>();
+    m.put("id", "1");
+    m.put("desc", "The desc 1");
     m.put(CHILDDOC, (MapWriter) ew -> {
       ew.put("id","1.1");
       ew.put("desc" ,"The desc 1.1");
       ew.put(CHILDDOC, (IteratorWriter) iw -> {
-        iw.add(Utils.makeMap("id", "1.1.1","desc","The desc 1.1.1"));
+        iw.add(Map.of("id", "1.1.1","desc","The desc 1.1.1"));
         iw.add((MapWriter) ew1 -> {
           ew1.put("id", "1.1.2");
           ew1.put("desc", "The desc 1.1.2");
@@ -177,8 +178,7 @@ public class TestUpdateRequestCodec extends SolrTestCase {
       ew.put("des", "The desc 2");
     };
 
-    @SuppressWarnings({"rawtypes"})
-    List l = new ArrayList();
+    List<Object> l = new ArrayList<>();
     l.add(m);
     l.add(m2);
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparatorTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparatorTest.java
index 63c44db..4131400 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparatorTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparatorTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.routing;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.UrlScheme;
@@ -64,7 +65,6 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     assertEquals("node1", getHost(replicas.get(1).getNodeName()));
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void replicaTypeAndReplicaLocationTest() {
     List<Replica> replicas = getBasicReplicaList();
@@ -72,7 +72,7 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node4",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node4:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "TLOG"
@@ -115,7 +115,6 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     }
   }
 
-  @SuppressWarnings("unchecked")
   private static List<Replica> getBasicReplicaList() {
     UrlScheme.INSTANCE.setUrlScheme(UrlScheme.HTTP);
 
@@ -123,7 +122,7 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node1",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node1:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "NRT"
@@ -133,7 +132,7 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node2",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node2:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "TLOG"
@@ -143,7 +142,7 @@ public class NodePreferenceRulesComparatorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node3",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node3:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "PULL"
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/routing/RequestReplicaListTransformerGeneratorTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/routing/RequestReplicaListTransformerGeneratorTest.java
index c09366d..499565a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/routing/RequestReplicaListTransformerGeneratorTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/routing/RequestReplicaListTransformerGeneratorTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.client.solrj.routing;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.Replica;
@@ -73,7 +74,6 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     return colonAt != -1 ? nodeName.substring(0,colonAt) : nodeName.substring(0, nodeName.indexOf('_'));
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void replicaTypeAndReplicaBase() {
     RequestReplicaListTransformerGenerator generator = new RequestReplicaListTransformerGenerator();
@@ -84,7 +84,7 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node4",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node4:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "TLOG"
@@ -96,7 +96,7 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node5",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node5:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "PULL"
@@ -129,13 +129,12 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     assertEquals("node3", getHost(replicas.get(4).getNodeName()));
   }
 
-  @SuppressWarnings("unchecked")
   private static List<Replica> getBasicReplicaList() {
     List<Replica> replicas = new ArrayList<Replica>();
     replicas.add(
         new Replica(
             "node1",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node1:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "NRT"
@@ -145,7 +144,7 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node2",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node2:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "TLOG"
@@ -155,7 +154,7 @@ public class RequestReplicaListTransformerGeneratorTest extends SolrTestCaseJ4 {
     replicas.add(
         new Replica(
             "node3",
-            map(
+            Map.of(
                 ZkStateReader.NODE_NAME_PROP, "node3:8983_solr",
                 ZkStateReader.CORE_NAME_PROP, "collection1",
                 ZkStateReader.REPLICA_TYPE, "PULL"
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java b/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java
index c50edfc..d31d878 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java
@@ -153,11 +153,11 @@ public class NamedListTest extends SolrTestCase {
     assertEquals("value3c", test3);
     // Checking that invalid values return null.
     String test4 = (String) nl.findRecursive("key3", "key3c", "invalid");
-    assertEquals(null, test4);
+    assertNull(test4);
     String test5 = (String) nl.findRecursive("key3", "invalid", "invalid");
-    assertEquals(null, test5);
+    assertNull(test5);
     String test6 = (String) nl.findRecursive("invalid", "key3c");
-    assertEquals(null, test6);
+    assertNull(test6);
     // Verify that retrieved NamedList objects have the right type.
     Object test7 = nl.findRecursive("key2", "key2b");
     assertTrue(test7 instanceof NamedList);
@@ -208,7 +208,7 @@ public class NamedListTest extends SolrTestCase {
     assertEquals("Val1_", nl.get("key1"));
     assertEquals("Val1_", m.get("key1"));
     assertEquals(0, nl.indexOf("key1", 0));
-    m.putAll(Utils.makeMap("key1", "Val1__", "key2", "Val2"));
+    m.putAll(Map.of("key1", "Val1__", "key2", "Val2"));
     assertEquals("Val1__", nl.get("key1"));
     assertEquals("Val1__", m.get("key1"));
     assertEquals(0, nl.indexOf("key1", 0));
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
index b9db14f..4724f19 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJavaBinCodec.java
@@ -398,21 +398,19 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 {
     assertNull(grandChildDocuments.get(0).getChildDocuments());
   }
   @Test
-  @SuppressWarnings({"unchecked", "rawtypes"})
   public void testStringCaching() throws Exception {
-    Map<String, Object> m = Utils.makeMap("key1", "val1", "key2", "val2");
+    Map<String, Object> m = Map.of("key1", "val1", "key2", "val2");
     byte[] b1 = getBytes(m);//copy 1
     byte[] b2 = getBytes(m);//copy 2
-    Map m1 = (Map) getObject(b1);
-    Map m2 = (Map) getObject(b1);
+    Map<?,?> m1 = (Map<?,?>) getObject(b1);
+    Map<?,?> m2 = (Map<?,?>) getObject(b2);
 
-    List l1 = new ArrayList<>(m1.keySet());
-    List l2 = new ArrayList<>(m2.keySet());
+    List<?> l1 = new ArrayList<>(m1.keySet());
+    List<?> l2 = new ArrayList<>(m2.keySet());
 
-    assertTrue(l1.get(0).equals(l2.get(0)));
-    assertFalse(l1.get(0) == l2.get(0));
-    assertTrue(l1.get(1).equals(l2.get(1)));
-    assertFalse(l1.get(1) == l2.get(1));
+    assertEquals(l1, l2);
+    assertNotSame(l1.get(0), l2.get(0));
+    assertNotSame(l1.get(1), l2.get(1));
 
     JavaBinCodec.StringCache stringCache = new JavaBinCodec.StringCache(new MapBackedCache<>(new HashMap<>()));
 
@@ -420,16 +418,15 @@ public class TestJavaBinCodec extends SolrTestCaseJ4 {
     try (JavaBinCodec c1 = new JavaBinCodec(null, stringCache);
          JavaBinCodec c2 = new JavaBinCodec(null, stringCache)) {
 
-      m1 = (Map) c1.unmarshal(new ByteArrayInputStream(b1));
-      m2 = (Map) c2.unmarshal(new ByteArrayInputStream(b2));
+      m1 = (Map<?,?>) c1.unmarshal(new ByteArrayInputStream(b1));
+      m2 = (Map<?,?>) c2.unmarshal(new ByteArrayInputStream(b2));
 
       l1 = new ArrayList<>(m1.keySet());
       l2 = new ArrayList<>(m2.keySet());
     }
-    assertTrue(l1.get(0).equals(l2.get(0)));
-    assertTrue(l1.get(0) == l2.get(0));
-    assertTrue(l1.get(1).equals(l2.get(1)));
-    assertTrue(l1.get(1) == l2.get(1));
+    assertEquals(l1, l2);
+    assertSame(l1.get(0), l2.get(0));
+    assertSame(l1.get(1), l2.get(1));
 
 
   }
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestRetryUtil.java b/solr/solrj/src/test/org/apache/solr/common/util/TestRetryUtil.java
index 2eefa08..b77acd2 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestRetryUtil.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestRetryUtil.java
@@ -27,7 +27,7 @@ public class TestRetryUtil extends SolrTestCaseJ4 {
 
   public void testRetryOnThrowable() throws Throwable {
     final AtomicInteger executes = new AtomicInteger();
-    RetryUtil.retryOnThrowable(SolrException.class, 10000, 10, () -> {
+    RetryUtil.retryOnException(SolrException.class, 10000, 10, () -> {
       int calls = executes.incrementAndGet();
       if (calls <= 2) {
         throw new SolrException(ErrorCode.SERVER_ERROR, "Bad Stuff Happened");
@@ -35,37 +35,28 @@ public class TestRetryUtil extends SolrTestCaseJ4 {
     });
     
     assertEquals(3, executes.get());
-    
-    final AtomicInteger executes2 = new AtomicInteger();
-    boolean caughtSolrException = false;
-    try {
-      RetryUtil.retryOnThrowable(IllegalStateException.class, 10000, 10,
-          () -> {
-            int calls = executes2.incrementAndGet();
-            if (calls <= 2) {
-              throw new SolrException(ErrorCode.SERVER_ERROR,
-                  "Bad Stuff Happened");
-            }
-          });
-    } catch (SolrException e) {
-      caughtSolrException = true;
-    }
-    assertTrue(caughtSolrException);
-    assertEquals(1, executes2.get());
-    
-    final AtomicInteger executes3 = new AtomicInteger();
-    caughtSolrException = false;
-    try {
-      RetryUtil.retryOnThrowable(SolrException.class, 1000, 10, () -> {
-        executes3.incrementAndGet();
+
+    executes.set(0);
+    assertThrows(SolrException.class, () ->
+      RetryUtil.retryOnException(IllegalStateException.class, 10000, 10, () -> {
+        int calls = executes.incrementAndGet();
+        if (calls <= 2) {
+          throw new SolrException(ErrorCode.SERVER_ERROR,
+              "Bad Stuff Happened");
+        }
+      })
+    );
+    assertEquals(1, executes.get());
+
+    executes.set(0);
+    assertThrows(SolrException.class, () ->
+      RetryUtil.retryOnException(SolrException.class, 1000, 10, () -> {
+        executes.incrementAndGet();
         throw new SolrException(ErrorCode.SERVER_ERROR, "Bad Stuff Happened");
-      });
-    } catch (SolrException e) {
-      caughtSolrException = true;
-    }
-    
-    assertTrue(caughtSolrException);
-    assertTrue(executes3.get() > 1);
+      })
+    );
+
+    assertTrue(executes.get() > 1);
   }
 
 }
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestSolrJsonWriter.java b/solr/solrj/src/test/org/apache/solr/common/util/TestSolrJsonWriter.java
index 8672e64..07a71d6 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestSolrJsonWriter.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestSolrJsonWriter.java
@@ -36,7 +36,7 @@ public class TestSolrJsonWriter  extends SolrTestCaseJ4 {
     map.put("k1","v1");
     map.put("k2",1);
     map.put("k3",false);
-    map.put("k4",Utils.makeMap("k41", "v41", "k42","v42"));
+    map.put("k4",Utils.makeMap("k41", "v41", "k42","v42")); // Compare in order
     map.put("k5", (MapWriter) ew -> {
       ew.put("k61","v61");
       ew.put("k62","v62");
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestValidatingJsonMap.java b/solr/solrj/src/test/org/apache/solr/common/util/TestValidatingJsonMap.java
index 7c04ff4..6adab7f 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestValidatingJsonMap.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestValidatingJsonMap.java
@@ -19,11 +19,11 @@ package org.apache.solr.common.util;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 
 import com.google.common.collect.ImmutableSet;
 import org.apache.solr.SolrTestCaseJ4;
 
-import static org.apache.solr.common.util.Utils.makeMap;
 import static org.apache.solr.common.util.ValidatingJsonMap.ENUM_OF;
 import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
 
@@ -31,11 +31,11 @@ public class TestValidatingJsonMap extends SolrTestCaseJ4 {
 
   public void testBasic() throws Exception {
     ValidatingJsonMap m = ValidatingJsonMap.wrap(
-        makeMap("a", Boolean.TRUE,
+        Map.of("a", Boolean.TRUE,
                 "b", Boolean.FALSE,
                 "i", 10,
                 "l" , Arrays.asList("X", "Y"),
-            "c", makeMap("d", "D")));
+            "c", Map.of("d", "D")));
     assertEquals(Boolean.TRUE, m.getBool("a", Boolean.FALSE));
     assertEquals(Boolean.FALSE, m.getBool("b", Boolean.TRUE));
     assertEquals(Integer.valueOf(10), m.getInt("i",0));
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index ed0e612..3fb48d9 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -477,10 +477,8 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
   private static Map<String, Level> savedClassLogLevels = new HashMap<>();
 
   public static void initClassLogLevels() {
-    @SuppressWarnings({"rawtypes"})
-    Class currentClass = RandomizedContext.current().getTargetClass();
-    @SuppressWarnings({"unchecked"})
-    LogLevel annotation = (LogLevel) currentClass.getAnnotation(LogLevel.class);
+    Class<?> currentClass = RandomizedContext.current().getTargetClass();
+    LogLevel annotation = currentClass.getAnnotation(LogLevel.class);
     if (annotation == null) {
       return;
     }
@@ -1325,14 +1323,12 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     return msp;
   }
 
-  @SuppressWarnings({"unchecked", "rawtypes"})
-  public static Map map(Object... params) {
-    LinkedHashMap ret = new LinkedHashMap();
-    for (int i=0; i<params.length; i+=2) {
-      Object o = ret.put(params[i], params[i+1]);
-      // TODO: handle multi-valued map?
-    }
-    return ret;
+  public static Map<String, String> map(String... params) {
+    return Utils.makeMap(params);
+  }
+
+  public static Map<String, Object> map(Object... params) {
+    return Utils.makeMap(params);
   }
 
   /**
@@ -2982,8 +2978,8 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     System.clearProperty(AllowListUrlChecker.DISABLE_URL_ALLOW_LIST);
   }
 
-  @SuppressWarnings({"unchecked"})
-  protected <T> T pickRandom(T... options) {
+  @SafeVarargs
+  protected static <T> T pickRandom(T... options) {
     return options[random().nextInt(options.length)];
   }
   
@@ -3033,7 +3029,6 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
    * @lucene.experimental
    * @lucene.internal
    */
-  @SuppressWarnings({"rawtypes"})
   private static void randomizeNumericTypesProperties() {
 
     final boolean useDV = random().nextBoolean();
@@ -3071,7 +3066,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
       
       System.setProperty(NUMERIC_POINTS_SYSPROP, "true");
     }
-    for (Map.Entry<Class,String> entry : RANDOMIZED_NUMERIC_FIELDTYPES.entrySet()) {
+    for (Map.Entry<Class<?>,String> entry : RANDOMIZED_NUMERIC_FIELDTYPES.entrySet()) {
       System.setProperty("solr.tests." + entry.getKey().getSimpleName() + "FieldType",
                          entry.getValue());
 
@@ -3097,7 +3092,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     org.apache.solr.schema.PointField.TEST_HACK_IGNORE_USELESS_TRIEFIELD_ARGS = false;
     System.clearProperty("solr.tests.numeric.points");
     System.clearProperty("solr.tests.numeric.points.dv");
-    for (@SuppressWarnings({"rawtypes"})Class c : RANDOMIZED_NUMERIC_FIELDTYPES.keySet()) {
+    for (Class<?> c : RANDOMIZED_NUMERIC_FIELDTYPES.keySet()) {
       System.clearProperty("solr.tests." + c.getSimpleName() + "FieldType");
     }
     private_RANDOMIZED_NUMERIC_FIELDTYPES.clear();
@@ -3113,8 +3108,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
 
   private static boolean isChildDoc(Object o) {
     if(o instanceof Collection) {
-      @SuppressWarnings({"rawtypes"})
-      Collection col = (Collection) o;
+      Collection<?> col = (Collection<?>) o;
       if(col.size() == 0) {
         return false;
       }
@@ -3123,8 +3117,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     return o instanceof SolrInputDocument;
   }
 
-  @SuppressWarnings({"rawtypes"})
-  private static final Map<Class,String> private_RANDOMIZED_NUMERIC_FIELDTYPES = new HashMap<>();
+  private static final Map<Class<?>,String> private_RANDOMIZED_NUMERIC_FIELDTYPES = new HashMap<>();
   
   /**
    * A Map of "primitive" java "numeric" types and the string name of the <code>class</code> used in the
@@ -3135,8 +3128,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
    *
    * @see #randomizeNumericTypesProperties
    */
-  @SuppressWarnings({"rawtypes"})
-  protected static final Map<Class,String> RANDOMIZED_NUMERIC_FIELDTYPES
+  protected static final Map<Class<?>,String> RANDOMIZED_NUMERIC_FIELDTYPES
     = Collections.unmodifiableMap(private_RANDOMIZED_NUMERIC_FIELDTYPES);
 
 }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index 510f3f5..3b200ac 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -17,7 +17,6 @@
 package org.apache.solr.cloud;
 
 import static org.apache.solr.common.cloud.ZkStateReader.URL_SCHEME;
-import static org.apache.solr.common.util.Utils.makeMap;
 
 import java.io.File;
 import java.io.IOException;
@@ -388,10 +387,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
   protected List<JettySolrRunner> createJettys(int numJettys) throws Exception {
     List<JettySolrRunner> jettys = Collections.synchronizedList(new ArrayList<>());
     List<SolrClient> clients = Collections.synchronizedList(new ArrayList<>());
-    @SuppressWarnings({"rawtypes"})
-    List<CollectionAdminRequest> createReplicaRequests = Collections.synchronizedList(new ArrayList<>());
-    @SuppressWarnings({"rawtypes"})
-    List<CollectionAdminRequest> createPullReplicaRequests = Collections.synchronizedList(new ArrayList<>());
+    List<CollectionAdminRequest<CollectionAdminResponse>> createReplicaRequests = Collections.synchronizedList(new ArrayList<>());
+    List<CollectionAdminRequest<CollectionAdminResponse>> createPullReplicaRequests = Collections.synchronizedList(new ArrayList<>());
     StringBuilder sb = new StringBuilder();
 
     // HACK: Don't be fooled by the replication factor of '1'...
@@ -526,11 +523,11 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     
     customThreadPool = ExecutorUtil.newMDCAwareCachedThreadPool(new SolrNamedThreadFactory("createReplicaRequests"));
     
-    for (@SuppressWarnings({"rawtypes"})CollectionAdminRequest r : createReplicaRequests) {
+    for (CollectionAdminRequest<CollectionAdminResponse> r : createReplicaRequests) {
       customThreadPool.submit(() -> {
         CollectionAdminResponse response;
         try {
-          response = (CollectionAdminResponse) r.process(cloudClient);
+          response = r.process(cloudClient);
         } catch (SolrServerException | IOException e) {
           throw new RuntimeException(e);
         }
@@ -544,11 +541,11 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     
     customThreadPool = ExecutorUtil
         .newMDCAwareCachedThreadPool(new SolrNamedThreadFactory("createPullReplicaRequests"));
-    for (@SuppressWarnings({"rawtypes"})CollectionAdminRequest r : createPullReplicaRequests) {
+    for (CollectionAdminRequest<CollectionAdminResponse> r : createPullReplicaRequests) {
       customThreadPool.submit(() -> {
         CollectionAdminResponse response;
         try {
-          response = (CollectionAdminResponse) r.process(cloudClient);
+          response = r.process(cloudClient);
         } catch (SolrServerException | IOException e) {
           throw new RuntimeException(e);
         }
@@ -2045,7 +2042,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
                                   int numShards ) throws Exception {
     int numNrtReplicas = useTlogReplicas()?0:replicationFactor;
     int numTlogReplicas = useTlogReplicas()?replicationFactor:0;
-    Map<String, Object> props = makeMap(
+    Map<String, Object> props = Map.of(
         ZkStateReader.NRT_REPLICAS, numNrtReplicas,
         ZkStateReader.TLOG_REPLICAS, numTlogReplicas,
         ZkStateReader.PULL_REPLICAS, getPullReplicaCount(),
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java b/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java
index bc3b108..fe8a5b8 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/CloudInspectUtil.java
@@ -48,7 +48,6 @@ public class CloudInspectUtil {
    * @param bDeleteFails null or list of the ids of deletes that failed for b
    * @return true if the difference in a and b is legal
    */
-  @SuppressWarnings({"unchecked"})
   public static boolean checkIfDiffIsLegal(SolrDocumentList a,
       SolrDocumentList b, String aName, String bName, Set<String> bAddFails,
       Set<String> bDeleteFails) {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
index 5112aab..34de037 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/ZkTestServer.java
@@ -644,8 +644,10 @@ public class ZkTestServer {
 
       while (true) {
         try {
-          zooThread.join();
-          ObjectReleaseTracker.release(zooThread);
+          if (zooThread != null) {
+            zooThread.join();
+            ObjectReleaseTracker.release(zooThread);
+          }
           zooThread = null;
           break;
         } catch (InterruptedException e) {
diff --git a/solr/test-framework/src/java/org/apache/solr/util/RandomizeSSL.java b/solr/test-framework/src/java/org/apache/solr/util/RandomizeSSL.java
index 20644a3..15d979c 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/RandomizeSSL.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/RandomizeSSL.java
@@ -135,42 +135,40 @@ public @interface RandomizeSSL {
     /**
      * Returns an SSLRandomizer suitable for the specified (test) class
      */
-    public static final SSLRandomizer getSSLRandomizerForClass(@SuppressWarnings({"rawtypes"})Class clazz) {
+    public static final SSLRandomizer getSSLRandomizerForClass(Class<?> clazz) {
 
-      @SuppressWarnings({"unchecked"})
-      final SuppressSSL suppression = (SuppressSSL) clazz.getAnnotation(SuppressSSL.class);
-      if (null != suppression) {
+      final SuppressSSL suppressSSL = clazz.getAnnotation(SuppressSSL.class);
+      if (null != suppressSSL) {
         // Even if this class has a RandomizeSSL annotation, any usage of SuppressSSL -- even in a
         // super class -- overrules that.
         //
         // (If it didn't work this way, it would be a pain in the ass to quickly disable SSL for a
         // broad hierarchy of tests)
-        return new SSLRandomizer(0.0D, 0.0D, suppression.toString());
+        return new SSLRandomizer(0.0D, 0.0D, suppressSSL.toString());
       }
 
-      @SuppressWarnings({"unchecked"})
-      final RandomizeSSL annotation = (RandomizeSSL) clazz.getAnnotation(RandomizeSSL.class);
+      final RandomizeSSL randomizeSSL = clazz.getAnnotation(RandomizeSSL.class);
       
-      if (null == annotation) {
+      if (null == randomizeSSL) {
         return new SSLRandomizer(0.0D, 0.0D, RandomizeSSL.class.getName() + " annotation not specified");
       }
 
-      final double def = Double.isNaN(annotation.value()) ? DEFAULT_ODDS : annotation.value();
+      final double def = Double.isNaN(randomizeSSL.value()) ? DEFAULT_ODDS : randomizeSSL.value();
       if (def < 0.0D || 1.0D < def) {
         throw new IllegalArgumentException
-          (clazz.getName() + ": default value is not a ratio between 0 and 1: " + annotation.toString());
+          (clazz.getName() + ": default value is not a ratio between 0 and 1: " + randomizeSSL.toString());
       }
-      final double ssl = Double.isNaN(annotation.ssl()) ? def : annotation.ssl();
+      final double ssl = Double.isNaN(randomizeSSL.ssl()) ? def : randomizeSSL.ssl();
       if (ssl < 0.0D || 1.0D < ssl) {
         throw new IllegalArgumentException
-          (clazz.getName() + ": ssl value is not a ratio between 0 and 1: " + annotation.toString());
+          (clazz.getName() + ": ssl value is not a ratio between 0 and 1: " + randomizeSSL.toString());
       }
-      final double clientAuth = Double.isNaN(annotation.clientAuth()) ? ssl : annotation.clientAuth();
+      final double clientAuth = Double.isNaN(randomizeSSL.clientAuth()) ? ssl : randomizeSSL.clientAuth();
       if (clientAuth < 0.0D || 1 < clientAuth) {
         throw new IllegalArgumentException
-          (clazz.getName() + ": clientAuth value is not a ratio between 0 and 1: " + annotation.toString());
+          (clazz.getName() + ": clientAuth value is not a ratio between 0 and 1: " + randomizeSSL.toString());
       }
-      return new SSLRandomizer(ssl, clientAuth, annotation.toString());
+      return new SSLRandomizer(ssl, clientAuth, randomizeSSL.toString());
     }
   }
 }