You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2021/02/10 23:52:47 UTC

[lucene-solr] 03/03: @1342 Lighten up our test class model, the fields are punishing with randomized testing framework and it's something to move away from for a few reasons.

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

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 0e59ebb01df42f90d1694c4e4f80b62efe424576
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Wed Feb 10 17:52:09 2021 -0600

    @1342 Lighten up our test class model, the fields are punishing with randomized testing framework and it's something to move away from for a few reasons.
---
 .../org/apache/lucene/util/LuceneTestCase.java     |  28 +-
 .../lucene/util/TestRuleTemporaryFilesCleanup.java |  15 +-
 .../analysis/TestFoldingMultitermExtrasQuery.java  |   5 +-
 .../apache/solr/schema/TestICUCollationField.java  |   7 +-
 .../schema/TestICUCollationFieldDocValues.java     |   7 +-
 .../solr/schema/TestICUCollationFieldOptions.java  |   5 +-
 ...ExtractNamedEntitiesUpdateProcessorFactory.java |   5 +-
 .../solr/analytics/ExpressionFactoryTest.java      |   5 +-
 .../solr/analytics/SolrAnalyticsTestCase.java      |   3 +-
 .../legacy/LegacyAbstractAnalyticsCloudTest.java   |   3 +-
 .../legacy/expression/LegacyExpressionTest.java    |   3 +-
 .../legacy/expression/LegacyFunctionTest.java      |   6 +-
 .../clustering/carrot2/CarrotClusteringEngine.java |  20 +-
 .../clustering/AbstractClusteringTestCase.java     |   5 +-
 .../DistributedClusteringComponentTest.java        |   3 +-
 .../dataimport/TestTikaEntityProcessor.java        |  21 +-
 .../solr/handler/dataimport/DataImportHandler.java |  28 +-
 .../apache/solr/handler/dataimport/DocBuilder.java |  20 +-
 .../solr/handler/dataimport/ScriptTransformer.java |  23 +-
 .../AbstractDataImportHandlerTestCase.java         |   7 +-
 .../AbstractSqlEntityProcessorTestCase.java        |   3 +-
 .../dataimport/TestContentStreamDataSource.java    |  11 +-
 .../solr/handler/dataimport/TestDocBuilder2.java   |   3 +-
 .../dataimport/TestFileListEntityProcessor.java    |   9 +-
 .../TestFileListWithLineEntityProcessor.java       |   4 +-
 .../dataimport/TestHierarchicalDocBuilder.java     |  10 +-
 .../handler/dataimport/TestJdbcDataSource.java     |  13 +-
 .../dataimport/TestJdbcDataSourceConvertType.java  |   6 +-
 .../dataimport/TestNonWritablePersistFile.java     |  12 +-
 .../handler/dataimport/TestScriptTransformer.java  |  24 +-
 .../dataimport/TestSimplePropertiesWriter.java     |   3 +-
 .../TestSolrEntityProcessorEndToEnd.java           |  11 +-
 .../dataimport/TestXPathEntityProcessor.java       |   5 +-
 .../handler/dataimport/TestXPathRecordReader.java  |   7 +-
 .../handler/dataimport/TestZKPropertiesWriter.java |   5 +-
 .../extraction/ExtractingRequestHandlerTest.java   |  34 +-
 .../handler/extraction/TestXLSXResponseWriter.java |   3 +-
 .../apache/solr/jaeger/TestJaegerConfigurator.java |  22 +-
 ...geIdentifierUpdateProcessorFactoryTestCase.java |   3 +-
 .../apache/solr/ltr/search/LTRQParserPlugin.java   |   2 +-
 .../org/apache/solr/ltr/TestLTRQParserPlugin.java  |  11 +-
 .../apache/solr/ltr/TestLTRReRankingPipeline.java  |  41 +--
 .../org/apache/solr/ltr/TestLTRScoringQuery.java   |  48 +--
 .../test/org/apache/solr/ltr/TestRerankBase.java   |   6 +-
 .../solr/ltr/TestSelectiveWeightCreation.java      |  18 +-
 .../solr/ltr/feature/TestExternalFeatures.java     |  15 +-
 .../apache/solr/ltr/feature/TestValueFeature.java  |   5 +-
 .../org/apache/solr/ltr/model/TestLinearModel.java |  27 +-
 .../ltr/model/TestMultipleAdditiveTreesModel.java  |  46 ++-
 .../solr/ltr/model/TestNeuralNetworkModel.java     |  26 +-
 .../apache/solr/ltr/model/TestWrapperModel.java    |  11 +-
 .../apache/solr/ltr/norm/TestMinMaxNormalizer.java |   4 +-
 .../solr/ltr/norm/TestStandardNormalizer.java      |   8 +-
 .../ltr/store/rest/TestManagedFeatureStore.java    |   3 +-
 .../prometheus/PrometheusExporterTestBase.java     |   5 +-
 .../scraper/SolrStandaloneScraperTest.java         |   7 +-
 .../org/apache/solr/prometheus/utils/Helpers.java  |   4 +-
 .../solr/velocity/VelocityResponseWriterTest.java  |  16 +-
 .../src/java/org/apache/solr/cloud/Overseer.java   |   1 -
 .../org/apache/solr/cloud/ReplicateFromLeader.java |   1 -
 .../solr/cloud/api/collections/CreateShardCmd.java |  75 +++--
 .../api/collections/DimensionalRoutedAlias.java    |   2 +-
 .../solr/cloud/api/collections/MoveReplicaCmd.java |  36 ++-
 .../solr/cloud/api/collections/RoutedAlias.java    |   2 +-
 .../cloud/api/collections/TimeRoutedAlias.java     |   3 +-
 .../apache/solr/core/CachingDirectoryFactory.java  |   1 -
 .../java/org/apache/solr/core/CoreContainer.java   |   1 -
 .../apache/solr/core/StandardDirectoryFactory.java |   1 -
 .../java/org/apache/solr/handler/BlobHandler.java  |  42 ++-
 .../org/apache/solr/handler/CalciteJDBCStream.java |  50 +--
 .../handler/component/RealTimeGetComponent.java    |   1 -
 .../org/apache/solr/handler/loader/JsonLoader.java |  42 ++-
 .../solr/highlight/DefaultSolrHighlighter.java     |  65 ++--
 .../apache/solr/logging/log4j2/Log4j2Watcher.java  |   4 +-
 .../org/apache/solr/request/IntervalFacets.java    |  36 ++-
 .../apache/solr/request/LocalSolrQueryRequest.java |   2 +-
 .../java/org/apache/solr/request/SimpleFacets.java |  43 ++-
 .../apache/solr/response/JSONResponseWriter.java   |   5 +-
 .../analysis/ManagedSynonymFilterFactory.java      |   5 +-
 .../src/java/org/apache/solr/schema/BoolField.java | 142 ++++----
 .../org/apache/solr/schema/RandomSortField.java    | 104 +++---
 .../solr/schema/RptWithGeometrySpatialField.java   |  79 +++--
 .../org/apache/solr/search/BoolQParserPlugin.java  |  58 ++--
 .../org/apache/solr/search/BoostQParserPlugin.java |  74 +++--
 .../solr/search/CollapsingQParserPlugin.java       |  44 ++-
 .../apache/solr/search/ExportQParserPlugin.java    |   2 +-
 .../solr/search/FloatPayloadValueSource.java       |  94 +++---
 .../solr/search/PayloadScoreQParserPlugin.java     |  74 +++--
 .../apache/solr/search/PrefixQParserPlugin.java    |  20 +-
 .../org/apache/solr/search/RawQParserPlugin.java   |  18 +-
 .../apache/solr/search/ReRankQParserPlugin.java    |   2 +-
 .../apache/solr/search/SwitchQParserPlugin.java    |  66 ++--
 .../org/apache/solr/search/TermQParserPlugin.java  |  40 ++-
 .../org/apache/solr/search/TermsQParserPlugin.java |  94 +++---
 .../org/apache/solr/search/TopLevelJoinQuery.java  |  75 +++--
 .../java/org/apache/solr/search/facet/AvgAgg.java  |   6 +-
 .../org/apache/solr/search/facet/CountValsAgg.java |   8 +-
 .../org/apache/solr/search/facet/DocValuesAcc.java |   4 +-
 .../org/apache/solr/search/facet/FacetModule.java  |   2 +-
 .../org/apache/solr/search/facet/MinMaxAgg.java    |   2 +-
 .../org/apache/solr/search/facet/MissingAgg.java   |   2 +-
 .../org/apache/solr/search/facet/SumsqAgg.java     |   2 +-
 .../search/function/ReverseOrdFieldSource.java     |  38 ++-
 .../solr/search/join/ScoreJoinQParserPlugin.java   | 122 +++----
 .../apache/solr/search/mlt/CloudMLTQParser.java    |   8 +-
 .../org/apache/solr/security/BasicAuthPlugin.java  |   2 +-
 .../suggest/fst/AnalyzingInfixLookupFactory.java   |  46 +--
 .../suggest/fst/BlendedInfixLookupFactory.java     |  48 +--
 .../apache/solr/uninverting/FieldCacheImpl.java    | 154 +++++----
 .../apache/solr/uninverting/UninvertingReader.java |  20 +-
 .../org/apache/solr/update/TransactionLog.java     |   5 +-
 .../processor/DistributedZkUpdateProcessor.java    |   1 -
 .../processor/UUIDUpdateProcessorFactory.java      |  18 +-
 .../apache/solr/AnalysisAfterCoreReloadTest.java   |   4 +-
 .../org/apache/solr/BasicFunctionalityTest.java    |  45 +--
 .../src/test/org/apache/solr/CursorPagingTest.java |  13 +-
 .../solr/DistributedIntervalFacetingTest.java      |   4 +-
 .../apache/solr/HelloWorldSolrCloudTestCase.java   |   2 +-
 .../test/org/apache/solr/SolrTestCaseJ4Test.java   |  12 +-
 .../test/org/apache/solr/TestCrossCoreJoin.java    |   2 +-
 .../solr/TestCursorMarkWithoutUniqueKey.java       |   6 +-
 .../org/apache/solr/TestDistributedGrouping.java   |   5 +-
 .../org/apache/solr/TestDistributedSearch.java     |  14 +-
 .../test/org/apache/solr/TestGroupingSearch.java   |   8 +-
 solr/core/src/test/org/apache/solr/TestJoin.java   |  15 +-
 .../test/org/apache/solr/TestRandomDVFaceting.java |   5 +-
 .../test/org/apache/solr/TestRandomFaceting.java   |   2 +-
 .../org/apache/solr/TestSolrCoreProperties.java    |   8 +-
 .../test/org/apache/solr/TestTolerantSearch.java   |  30 +-
 solr/core/src/test/org/apache/solr/TestTrie.java   |   3 +-
 .../analysis/ProtectedTermFilterFactoryTest.java   |   3 +-
 .../analysis/TestWordDelimiterFilterFactory.java   |   4 +-
 .../solr/backcompat/TestLuceneIndexBackCompat.java |   7 +-
 .../TestEmbeddedSolrServerAdminHandler.java        |   5 +-
 .../TestEmbeddedSolrServerConstructors.java        |  12 +-
 .../embedded/TestEmbeddedSolrServerSchemaAPI.java  |  14 +-
 .../client/solrj/embedded/TestJettySolrRunner.java |   9 +-
 .../test/org/apache/solr/cloud/AddReplicaTest.java |   4 +-
 .../apache/solr/cloud/AliasIntegrationTest.java    |  30 +-
 .../cloud/AssignBackwardCompatibilityTest.java     |   3 +-
 .../apache/solr/cloud/BasicDistributedZk2Test.java |  12 +-
 .../apache/solr/cloud/BasicDistributedZkTest.java  |  15 +-
 ...aosMonkeyNothingIsSafeWithPullReplicasTest.java |   4 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java      |   5 +-
 .../org/apache/solr/cloud/CleanupOldIndexTest.java |   4 +-
 .../cloud/CloudExitableDirectoryReaderTest.java    |   5 +-
 .../apache/solr/cloud/ClusterStateUpdateTest.java  |   3 +-
 .../org/apache/solr/cloud/CollectionPropsTest.java |   9 +-
 .../solr/cloud/CollectionStateZnodeTest.java       |   3 +-
 .../apache/solr/cloud/CollectionsAPISolrJTest.java |  20 +-
 .../cloud/ConcurrentCreateRoutedAliasTest.java     |   3 +-
 .../org/apache/solr/cloud/ConfigSetsAPITest.java   |  10 +-
 .../solr/cloud/CreateCollectionCleanupTest.java    |  12 +-
 .../apache/solr/cloud/CreateRoutedAliasTest.java   |  17 +-
 .../solr/cloud/DeleteInactiveReplicaTest.java      |   4 +-
 .../cloud/DeleteLastCustomShardedReplicaTest.java  |   4 +-
 .../test/org/apache/solr/cloud/DeleteNodeTest.java |   7 +-
 .../org/apache/solr/cloud/DeleteReplicaTest.java   |  14 +-
 .../org/apache/solr/cloud/DeleteShardTest.java     |   8 +-
 .../org/apache/solr/cloud/DeleteStatusTest.java    |   3 +-
 .../apache/solr/cloud/DistribCursorPagingTest.java |   5 +-
 .../DistribDocExpirationUpdateProcessorTest.java   |  17 +-
 .../solr/cloud/DistribJoinFromCollectionTest.java  |   3 +-
 .../solr/cloud/DistributedVersionInfoTest.java     |   3 +-
 .../apache/solr/cloud/DocValuesNotIndexedTest.java |   3 +-
 .../org/apache/solr/cloud/ForceLeaderTest.java     |   5 +-
 .../solr/cloud/FullSolrCloudDistribCmdsTest.java   |  12 +-
 .../solr/cloud/LeaderElectionContextKeyTest.java   |   3 +-
 .../solr/cloud/LeaderElectionIntegrationTest.java  |   3 +-
 .../org/apache/solr/cloud/LeaderElectionTest.java  |   5 +-
 .../apache/solr/cloud/LeaderTragicEventTest.java   |   3 +-
 .../solr/cloud/LeaderVoteWaitTimeoutTest.java      |   9 +-
 .../solr/cloud/MetricsHistoryIntegrationTest.java  |   4 +-
 .../MetricsHistoryWithAuthIntegrationTest.java     |   3 +-
 .../org/apache/solr/cloud/MigrateRouteKeyTest.java |   7 +-
 .../solr/cloud/MissingSegmentRecoveryTest.java     |   3 +-
 .../solr/cloud/MoveReplicaHDFSFailoverTest.java    |   7 +-
 .../org/apache/solr/cloud/MoveReplicaHDFSTest.java |   5 +-
 .../org/apache/solr/cloud/MoveReplicaTest.java     |  17 +-
 .../solr/cloud/NestedShardedAtomicUpdateTest.java  |   6 +-
 .../OutOfBoxZkACLAndCredentialsProvidersTest.java  |  10 +-
 ...OverriddenZkACLAndCredentialsProvidersTest.java |   9 +-
 .../solr/cloud/OverseerModifyCollectionTest.java   |   9 +-
 .../org/apache/solr/cloud/OverseerRolesTest.java   |   3 +-
 .../org/apache/solr/cloud/OverseerStatusTest.java  |   6 +-
 .../test/org/apache/solr/cloud/OverseerTest.java   |   5 +-
 .../apache/solr/cloud/PackageManagerCLITest.java   |   7 +-
 .../test/org/apache/solr/cloud/RecoveryZkTest.java |   3 +-
 .../apache/solr/cloud/ReindexCollectionTest.java   |   7 +-
 .../apache/solr/cloud/RemoteQueryErrorTest.java    |   6 +-
 .../org/apache/solr/cloud/ReplaceNodeTest.java     |  21 +-
 .../apache/solr/cloud/ReplicationFactorTest.java   |   2 +-
 .../apache/solr/cloud/SaslZkACLProviderTest.java   |  20 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java     |   3 +-
 .../org/apache/solr/cloud/SolrCLIZkUtilsTest.java  |  33 +-
 .../apache/solr/cloud/SolrCloudBridgeTestCase.java |   5 +-
 .../org/apache/solr/cloud/SolrXmlInZkTest.java     |  12 +-
 .../test/org/apache/solr/cloud/SplitShardTest.java |   3 +-
 .../solr/cloud/SystemCollectionCompatTest.java     |   3 +-
 .../solr/cloud/TestAuthenticationFramework.java    |   7 +-
 .../apache/solr/cloud/TestBaseStatsCacheCloud.java |   3 +-
 .../apache/solr/cloud/TestCloudConsistency.java    |  48 ++-
 .../apache/solr/cloud/TestCloudDeleteByQuery.java  |   3 +-
 .../apache/solr/cloud/TestCloudInspectUtil.java    |   6 +-
 .../TestCloudPhrasesIdentificationComponent.java   |  12 +-
 .../org/apache/solr/cloud/TestCloudPivotFacet.java |  21 +-
 .../solr/cloud/TestCloudPseudoReturnFields.java    |   9 +-
 .../org/apache/solr/cloud/TestCloudRecovery.java   |   3 +-
 .../org/apache/solr/cloud/TestCloudRecovery2.java  |   4 +-
 .../solr/cloud/TestCloudSearcherWarming.java       |   3 +-
 .../org/apache/solr/cloud/TestConfigSetsAPI.java   |  31 +-
 .../solr/cloud/TestConfigSetsAPIExclusivity.java   |   8 +-
 .../solr/cloud/TestConfigSetsAPIZkFailure.java     |  13 +-
 .../cloud/TestDeleteCollectionOnDownNodes.java     |   3 +-
 .../org/apache/solr/cloud/TestDistributedMap.java  |   5 +-
 .../solr/cloud/TestDownShardTolerantSearch.java    |   6 +-
 .../cloud/TestExclusionRuleCollectionAccess.java   |   3 +-
 .../cloud/TestLeaderElectionWithEmptyReplica.java  |   3 +-
 .../solr/cloud/TestLeaderElectionZkExpiry.java     |   5 +-
 .../solr/cloud/TestMiniSolrCloudClusterSSL.java    |  51 +--
 .../org/apache/solr/cloud/TestPrepRecovery.java    |   9 +-
 .../org/apache/solr/cloud/TestPullReplica.java     |  24 +-
 .../solr/cloud/TestPullReplicaErrorHandling.java   |  14 +-
 .../solr/cloud/TestQueryingOnDownCollection.java   |   8 +-
 .../apache/solr/cloud/TestRandomFlRTGCloud.java    |  16 +-
 .../apache/solr/cloud/TestRebalanceLeaders.java    |   3 +-
 .../apache/solr/cloud/TestRequestForwarding.java   |   5 +-
 .../apache/solr/cloud/TestSSLRandomization.java    |   7 +-
 .../org/apache/solr/cloud/TestSegmentSorting.java  |   7 +-
 .../solr/cloud/TestSkipOverseerOperations.java     |   3 +-
 .../cloud/TestSolrCloudWithDelegationTokens.java   |   7 +-
 .../solr/cloud/TestSolrCloudWithKerberosAlt.java   |   5 +-
 .../TestSolrCloudWithSecureImpersonation.java      |  44 +--
 .../cloud/TestStressCloudBlindAtomicUpdates.java   |  18 +-
 .../solr/cloud/TestStressInPlaceUpdates.java       |   3 +-
 .../org/apache/solr/cloud/TestStressLiveNodes.java |   3 +-
 .../solr/cloud/TestTlogReplayVsRecovery.java       |  26 +-
 .../org/apache/solr/cloud/TestTlogReplica.java     |  10 +-
 .../cloud/TestTolerantUpdateProcessorCloud.java    |  17 +-
 .../TestTolerantUpdateProcessorRandomCloud.java    |  12 +-
 .../cloud/TestWaitForStateWithJettyShutdowns.java  |   8 +-
 .../solr/cloud/TriLevelCompositeIdRoutingTest.java |  11 +-
 .../apache/solr/cloud/UnloadDistributedZkTest.java |   9 +-
 .../VMParamsZkACLAndCredentialsProvidersTest.java  |   9 +-
 .../src/test/org/apache/solr/cloud/ZkCLITest.java  |  24 +-
 .../org/apache/solr/cloud/ZkControllerTest.java    |  13 +-
 .../test/org/apache/solr/cloud/ZkFailoverTest.java |   3 +-
 .../org/apache/solr/cloud/ZkShardTermsTest.java    |   5 +-
 .../org/apache/solr/cloud/ZkSolrClientTest.java    |  12 +-
 .../AbstractCloudBackupRestoreTestCase.java        |   3 +-
 .../AsyncCallRequestStatusResponseTest.java        |   3 +-
 .../api/collections/CollectionReloadTest.java      |   3 +-
 .../collections/CollectionTooManyReplicasTest.java |  13 +-
 .../CollectionsAPIAsyncDistributedZkTest.java      |   5 +-
 .../CollectionsAPIDistClusterPerZkTest.java        |  16 +-
 .../CollectionsAPIDistributedZkTest.java           |  23 +-
 .../ConcurrentDeleteAndCreateCollectionTest.java   |   7 +-
 .../CreateCollectionsIndexAndRestartTest.java      |   3 +-
 .../api/collections/CustomCollectionTest.java      |   3 +-
 .../HdfsCollectionsAPIDistributedZkTest.java       |   3 +-
 .../solr/cloud/api/collections/ShardSplitTest.java |  31 +-
 .../cloud/api/collections/SplitByPrefixTest.java   |   3 +-
 .../cloud/api/collections/TestCollectionAPI.java   |   9 +-
 .../TestCollectionsAPIViaSolrCloudCluster.java     |   7 +-
 .../collections/TestHdfsCloudBackupRestore.java    |   7 +-
 .../collections/TestLocalFSCloudBackupRestore.java |   9 +-
 .../solr/cloud/hdfs/HDFSCollectionsAPITest.java    |   5 +-
 .../cloud/hdfs/HdfsBasicDistributedZk2Test.java    |   3 +-
 .../cloud/hdfs/HdfsBasicDistributedZkTest.java     |   3 +-
 .../hdfs/HdfsChaosMonkeyNothingIsSafeTest.java     |   3 +-
 .../cloud/hdfs/HdfsChaosMonkeySafeLeaderTest.java  |   3 +-
 .../apache/solr/cloud/hdfs/HdfsNNFailoverTest.java |   3 +-
 .../solr/cloud/hdfs/HdfsRecoverLeaseTest.java      |   3 +-
 .../apache/solr/cloud/hdfs/HdfsRecoveryZkTest.java |   5 +-
 .../cloud/hdfs/HdfsRestartWhileUpdatingTest.java   |   3 +-
 .../apache/solr/cloud/hdfs/HdfsSyncSliceTest.java  |   3 +-
 .../apache/solr/cloud/hdfs/HdfsThreadLeakTest.java |   3 +-
 .../HdfsTlogReplayBufferedWhileIndexingTest.java   |   3 +-
 .../cloud/hdfs/HdfsUnloadDistributedZkTest.java    |   3 +-
 .../hdfs/HdfsWriteToMultipleCollectionsTest.java   |   3 +-
 .../org/apache/solr/cloud/hdfs/StressHdfsTest.java |   3 +-
 .../overseer/ZkCollectionPropsCachingTest.java     |   3 +-
 .../apache/solr/core/AlternateDirectoryTest.java   |   3 +-
 .../apache/solr/core/BlobRepositoryCloudTest.java  |   3 +-
 .../test/org/apache/solr/core/CoreSorterTest.java  |   3 +-
 .../org/apache/solr/core/DirectoryFactoryTest.java |   3 +-
 .../apache/solr/core/HdfsDirectoryFactoryTest.java |   5 +-
 .../org/apache/solr/core/QueryResultKeyTest.java   |   3 +-
 .../org/apache/solr/core/ResourceLoaderTest.java   |  16 +-
 .../solr/core/SolrCoreCheckLockOnStartupTest.java  |   5 +-
 .../solr/core/TestBackupRepositoryFactory.java     |   5 +-
 .../test/org/apache/solr/core/TestBadConfig.java   |   3 +-
 .../org/apache/solr/core/TestCodecSupport.java     |   9 +-
 .../src/test/org/apache/solr/core/TestConfig.java  |  18 +-
 .../apache/solr/core/TestConfigSetImmutable.java   |   5 +-
 .../apache/solr/core/TestConfigSetProperties.java  |   8 +-
 .../test/org/apache/solr/core/TestConfigSets.java  |  16 +-
 .../org/apache/solr/core/TestCoreContainer.java    |  40 +--
 .../org/apache/solr/core/TestCoreDiscovery.java    |  58 ++--
 .../apache/solr/core/TestCorePropertiesReload.java |   5 +-
 .../org/apache/solr/core/TestDirectoryFactory.java |   3 +-
 .../test/org/apache/solr/core/TestLazyCores.java   |  21 +-
 .../apache/solr/core/TestMergePolicyConfig.java    |   3 +-
 .../apache/solr/core/TestReloadAndDeleteDocs.java  |   3 +-
 .../apache/solr/core/TestShardHandlerFactory.java  |   3 +-
 .../apache/solr/core/TestSolrConfigHandler.java    |   7 +-
 .../apache/solr/core/TestSolrDeletionPolicy1.java  |   3 +-
 .../org/apache/solr/core/TestSolrIndexConfig.java  |   6 +-
 .../src/test/org/apache/solr/core/TestSolrXml.java |   7 +-
 .../repository/HdfsBackupRepositoryTest.java       |  16 +-
 .../core/snapshots/TestSolrCloudSnapshots.java     |  11 +-
 .../solr/core/snapshots/TestSolrCoreSnapshots.java |   5 +-
 .../solr/filestore/TestDistribPackageStore.java    |   3 +-
 .../handler/FieldAnalysisRequestHandlerTest.java   |   3 +-
 .../org/apache/solr/handler/JsonLoaderTest.java    |  14 +-
 .../solr/handler/MoreLikeThisHandlerTest.java      |   6 +-
 .../solr/handler/PingRequestHandlerTest.java       |   8 +-
 .../org/apache/solr/handler/TestCSVLoader.java     |   3 +-
 .../org/apache/solr/handler/TestCoreBackup.java    |   7 +-
 .../solr/handler/TestHdfsBackupRestoreCore.java    |   7 +-
 .../solr/handler/TestReplicationHandler.java       |  24 +-
 .../solr/handler/TestReplicationHandlerBackup.java |   5 +-
 .../TestReplicationHandlerDiskOverFlow.java        |   5 +-
 .../org/apache/solr/handler/TestReqParamsAPI.java  |   3 +-
 .../org/apache/solr/handler/TestRestoreCore.java   |  26 +-
 .../org/apache/solr/handler/TestSQLHandler.java    |   5 +-
 .../solr/handler/TestSQLHandlerNonCloud.java       |   6 +-
 .../solr/handler/TestStressThreadBackup.java       |   7 +-
 .../solr/handler/TestSystemCollAutoCreate.java     |   1 -
 .../apache/solr/handler/V2ApiIntegrationTest.java  |  13 +-
 .../org/apache/solr/handler/V2StandaloneTest.java  |   7 +-
 .../solr/handler/XmlUpdateRequestHandlerTest.java  |   3 +-
 .../solr/handler/XsltUpdateRequestHandlerTest.java |   3 +-
 .../solr/handler/admin/AdminHandlersProxyTest.java |   3 +-
 .../handler/admin/CoreAdminCreateDiscoverTest.java |   5 +-
 .../solr/handler/admin/CoreAdminHandlerTest.java   |  34 +-
 .../solr/handler/admin/CoreAdminOperationTest.java |  93 +++---
 .../handler/admin/CoreAdminRequestStatusTest.java  |   3 +-
 .../admin/CoreMergeIndexesAdminHandlerTest.java    |  10 +-
 .../solr/handler/admin/DaemonStreamApiTest.java    |   5 +-
 .../solr/handler/admin/HealthCheckHandlerTest.java |  11 +-
 .../solr/handler/admin/IndexSizeEstimatorTest.java |   3 +-
 .../apache/solr/handler/admin/InfoHandlerTest.java |   8 +-
 .../solr/handler/admin/LoggingHandlerTest.java     |   3 +-
 .../solr/handler/admin/MBeansHandlerTest.java      |   3 +-
 .../handler/admin/MetricsHistoryHandlerTest.java   |   3 +-
 .../handler/admin/ShowFileRequestHandlerTest.java  |   3 +-
 .../solr/handler/admin/SplitHandlerTest.java       |   3 +-
 .../solr/handler/admin/StatsReloadRaceTest.java    |   6 +-
 .../solr/handler/admin/TestCollectionAPIs.java     |   5 +-
 .../solr/handler/admin/ZookeeperReadAPITest.java   |   3 +-
 .../handler/admin/ZookeeperStatusHandlerTest.java  |   3 +-
 .../component/CustomHighlightComponentTest.java    |   3 +-
 .../component/DistributedDebugComponentTest.java   |   8 +-
 .../component/DistributedExpandComponentTest.java  |   3 +-
 .../component/DistributedFacetExistsSmallTest.java |   3 +-
 .../DistributedQueryComponentOptimizationTest.java |  10 +-
 .../DistributedQueryElevationComponentTest.java    |   6 +-
 .../component/DistributedTermsComponentTest.java   |   2 +-
 .../handler/component/InfixSuggestersTest.java     |   5 +-
 .../PhrasesIdentificationComponentTest.java        |   9 +-
 .../component/QueryElevationComponentTest.java     |   3 +-
 .../solr/handler/component/SearchHandlerTest.java  |  18 +-
 .../handler/component/ShardsWhitelistTest.java     |   6 +-
 .../handler/component/SpellCheckComponentTest.java |  33 +-
 .../solr/handler/component/StatsComponentTest.java |  21 +-
 .../SuggestComponentContextFilterQueryTest.java    |   7 +-
 .../handler/component/SuggestComponentTest.java    |   2 +-
 .../TermVectorComponentDistributedTest.java        |   3 +-
 .../TestDistributedStatsComponentCardinality.java  |   3 +-
 .../handler/component/TestExpandComponent.java     |  20 +-
 .../component/TestHttpShardHandlerFactory.java     |  14 +-
 .../handler/component/TestPivotHelperCode.java     |   5 +-
 .../solr/handler/export/TestExportWriter.java      |  11 +-
 .../solr/handler/tagger/RandomizedTaggerTest.java  |   3 +-
 .../apache/solr/handler/tagger/Tagger2Test.java    |   3 +-
 .../org/apache/solr/highlight/HighlighterTest.java |   3 +-
 .../highlight/TestPostingsSolrHighlighter.java     |   4 +-
 .../solr/highlight/TestUnifiedSolrHighlighter.java |   6 +-
 .../solr/index/TestSlowCompositeReaderWrapper.java |  12 +-
 .../solr/index/WrapperMergePolicyFactoryTest.java  |   4 +-
 .../apache/solr/index/hdfs/CheckHdfsIndexTest.java |   3 +-
 .../apache/solr/internal/csv/CharBufferTest.java   |   4 +-
 .../org/apache/solr/legacy/TestLegacyField.java    |  25 +-
 .../apache/solr/legacy/TestLegacyNumericUtils.java |   9 +-
 .../org/apache/solr/legacy/TestLegacyTerms.java    |  17 +-
 .../legacy/TestMultiValuedNumericRangeQuery.java   |  14 +-
 .../solr/legacy/TestNumericRangeQuery32.java       |  17 +-
 .../solr/legacy/TestNumericRangeQuery64.java       |  18 +-
 .../org/apache/solr/metrics/JvmMetricsTest.java    |   7 +-
 .../org/apache/solr/metrics/MetricsConfigTest.java |   5 +-
 .../solr/metrics/SolrMetricsIntegrationTest.java   |   3 +-
 .../reporters/SolrGraphiteReporterTest.java        |   3 +-
 .../reporters/SolrJmxReporterCloudTest.java        |   3 +-
 .../metrics/reporters/SolrSlf4jReporterTest.java   |   3 +-
 .../reporters/solr/SolrCloudReportersTest.java     |   8 +-
 .../metrics/rrd/SolrRrdBackendFactoryTest.java     |   3 +-
 .../src/test/org/apache/solr/pkg/TestPackages.java |   5 +-
 .../org/apache/solr/request/SimpleFacetsTest.java  |  35 +-
 .../test/org/apache/solr/request/TestFaceting.java |   7 +-
 .../apache/solr/request/TestIntervalFaceting.java  |  33 +-
 .../apache/solr/request/TestRemoteStreaming.java   |   8 +-
 .../org/apache/solr/request/TestStreamBody.java    |   7 +-
 .../solr/request/TestUnInvertedFieldException.java |   5 +-
 .../org/apache/solr/response/SmileWriterTest.java  |   3 +-
 .../response/TestJavabinTupleStreamParser.java     |   3 +-
 .../transform/TestChildDocTransformer.java         |  16 +-
 .../TestChildDocTransformerHierarchy.java          |  13 +-
 .../transform/TestSubQueryTransformer.java         |  10 +-
 .../transform/TestSubQueryTransformerDistrib.java  |  12 +-
 .../org/apache/solr/rest/SolrRestletTestBase.java  |  10 +-
 .../solr/rest/TestManagedResourceStorage.java      |   3 +-
 .../test/org/apache/solr/rest/TestRestManager.java |   3 +-
 .../apache/solr/rest/schema/TestBulkSchemaAPI.java |   7 +-
 .../schema/TestSerializedLuceneMatchVersion.java   |   3 +-
 .../rest/schema/TestUniqueKeyFieldResource.java    |   2 -
 .../analysis/TestManagedStopFilterFactory.java     |   5 +-
 .../analysis/TestManagedSynonymFilterFactory.java  |   5 +-
 .../TestManagedSynonymGraphFilterFactory.java      |   5 +-
 .../apache/solr/schema/ChangedSchemaMergeTest.java |   8 +-
 .../test/org/apache/solr/schema/CopyFieldTest.java |  18 +-
 .../apache/solr/schema/CurrencyFieldTypeTest.java  |  26 +-
 .../test/org/apache/solr/schema/DateFieldTest.java |   3 +-
 .../org/apache/solr/schema/DocValuesMultiTest.java |   3 +-
 .../test/org/apache/solr/schema/DocValuesTest.java |   5 +-
 .../test/org/apache/solr/schema/EnumFieldTest.java |  45 +--
 .../solr/schema/ExternalFileFieldSortTest.java     |   7 +-
 .../schema/ManagedSchemaRoundRobinCloudTest.java   |   4 +-
 .../schema/OpenExchangeRatesOrgProviderTest.java   |   4 +-
 .../PreAnalyzedFieldManagedSchemaCloudTest.java    |   3 +-
 .../apache/solr/schema/PreAnalyzedFieldTest.java   |   3 +-
 .../apache/solr/schema/PrimitiveFieldTypeTest.java |   5 +-
 .../apache/solr/schema/SchemaApiFailureTest.java   |   4 +-
 .../solr/schema/SpatialRPTFieldTypeTest.java       |  10 +-
 .../org/apache/solr/schema/TestBinaryField.java    |   9 +-
 .../org/apache/solr/schema/TestCollationField.java |   9 +-
 .../solr/schema/TestCollationFieldDocValues.java   |   9 +-
 .../org/apache/solr/schema/TestManagedSchema.java  |   5 +-
 .../apache/solr/schema/TestManagedSchemaAPI.java   |   3 +-
 .../solr/schema/TestManagedSchemaThreadSafety.java |  10 +-
 .../org/apache/solr/schema/TestPointFields.java    |  38 +--
 .../org/apache/solr/schema/TestPointFields2.java   | 105 +++---
 .../solr/schema/TestSchemalessBufferedUpdates.java |   5 +-
 .../apache/solr/schema/TestSortableTextField.java  |   8 +-
 .../test/org/apache/solr/schema/TestTextField.java |   3 +-
 .../solr/schema/TestUseDocValuesAsStored.java      |   8 +-
 .../solr/schema/TestUseDocValuesAsStored2.java     |   5 +-
 .../solr/search/CurrencyRangeFacetCloudTest.java   |  18 +-
 .../org/apache/solr/search/CursorMarkTest.java     |   5 +-
 .../org/apache/solr/search/FuzzySearchTest.java    |   6 +-
 .../org/apache/solr/search/QueryEqualityTest.java  |  31 +-
 .../org/apache/solr/search/QueryParsingTest.java   |  17 +-
 .../org/apache/solr/search/ReturnFieldsTest.java   |   3 +-
 .../org/apache/solr/search/SpatialFilterTest.java  |   5 +-
 .../solr/search/TestAddFieldRealTimeGet.java       |   5 +-
 .../org/apache/solr/search/TestCaffeineCache.java  |   3 +-
 .../solr/search/TestCollapseQParserPlugin.java     |  19 +-
 .../solr/search/TestExtendedDismaxParser.java      |  17 +-
 .../apache/solr/search/TestFilteredDocIdSet.java   |  13 +-
 .../test/org/apache/solr/search/TestFiltering.java |   7 +-
 .../solr/search/TestFoldingMultitermQuery.java     |   5 +-
 .../apache/solr/search/TestHashQParserPlugin.java  |   5 +-
 .../org/apache/solr/search/TestIndexSearcher.java  |   3 +-
 .../org/apache/solr/search/TestMissingGroups.java  |   7 +-
 .../apache/solr/search/TestPseudoReturnFields.java |   5 +-
 .../org/apache/solr/search/TestQueryTypes.java     |   8 +-
 .../search/TestRandomCollapseQParserPlugin.java    |   5 +-
 .../org/apache/solr/search/TestRangeQuery.java     |  64 ++--
 .../solr/search/TestReRankQParserPlugin.java       |   3 +-
 .../org/apache/solr/search/TestRealTimeGet.java    |  50 ++-
 .../test/org/apache/solr/search/TestRecovery.java  |   2 +-
 .../org/apache/solr/search/TestRecoveryHdfs.java   |   3 +-
 .../test/org/apache/solr/search/TestReload.java    |   3 +-
 .../org/apache/solr/search/TestSearcherReuse.java  |   7 +-
 .../org/apache/solr/search/TestSolr4Spatial.java   |  11 +-
 .../org/apache/solr/search/TestSolr4Spatial2.java  |   3 +-
 .../apache/solr/search/TestSolrQueryParser.java    |  33 +-
 .../src/test/org/apache/solr/search/TestSort.java  |   3 +-
 .../org/apache/solr/search/TestStressLucene.java   |   6 +-
 .../org/apache/solr/search/TestStressRecovery.java |   5 +-
 .../test/org/apache/solr/search/TestTrieFacet.java |   3 +-
 .../solr/search/facet/RangeFacetCloudTest.java     |  11 +-
 .../search/facet/SpatialHeatmapFacetsTest.java     |   2 +-
 .../search/facet/TestCloudJSONFacetJoinDomain.java |  26 +-
 .../solr/search/facet/TestCloudJSONFacetSKG.java   |  25 +-
 .../search/facet/TestCloudJSONFacetSKGEquiv.java   |  22 +-
 .../solr/search/facet/TestJsonFacetErrors.java     |  37 +--
 .../solr/search/facet/TestJsonFacetRefinement.java |   7 +-
 .../apache/solr/search/facet/TestJsonFacets.java   |  30 +-
 .../facet/TestJsonFacetsWithNestedObjects.java     |   4 +-
 .../solr/search/function/TestFunctionQuery.java    |   8 +-
 .../function/TestMinMaxOnMultiValuedField.java     |   8 +-
 .../apache/solr/search/function/TestOrdValues.java |  15 +-
 .../org/apache/solr/search/join/BJQParserTest.java |   7 +-
 .../solr/search/join/TestCloudNestedDocsSort.java  |  16 +-
 .../solr/search/join/TestScoreJoinQPNoScore.java   |   6 +-
 .../org/apache/solr/search/join/XCJFQueryTest.java |   9 +-
 .../apache/solr/search/json/TestJsonRequest.java   |   3 +-
 .../solr/search/mlt/CloudMLTQParserTest.java       |   6 +-
 .../TestSweetSpotSimilarityFactory.java            |   9 +-
 .../solr/search/stats/TestDefaultStatsCache.java   |   4 +-
 .../apache/solr/search/stats/TestDistribIDF.java   |  12 +-
 .../solr/security/AuditLoggerIntegrationTest.java  |  42 +--
 .../solr/security/BasicAuthIntegrationTest.java    |  21 +-
 .../solr/security/BasicAuthOnSingleNodeTest.java   |   3 +-
 .../solr/security/BasicAuthStandaloneTest.java     |   5 +-
 .../security/JWTAuthPluginIntegrationTest.java     |   9 +-
 .../apache/solr/security/JWTAuthPluginTest.java    |  11 +-
 .../apache/solr/security/JWTIssuerConfigTest.java  |   6 +-
 .../security/PKIAuthenticationIntegrationTest.java |   3 +-
 .../solr/security/TestAuthorizationFramework.java  |   3 +-
 .../hadoop/TestDelegationWithHadoopAuth.java       |   6 +-
 .../hadoop/TestImpersonationWithHadoopAuth.java    |  20 +-
 .../hadoop/TestSolrCloudWithHadoopAuthPlugin.java  |   7 +-
 .../security/hadoop/TestZkAclsWithHadoopAuth.java  |   5 +-
 .../org/apache/solr/servlet/CacheHeaderTest.java   |   5 +-
 .../solr/servlet/DirectSolrConnectionTest.java     |   3 +-
 .../solr/servlet/HttpSolrCallGetCoreTest.java      |   3 +-
 .../org/apache/solr/servlet/NoCacheHeaderTest.java |   3 +-
 .../apache/solr/servlet/ResponseHeaderTest.java    |   6 +-
 .../apache/solr/servlet/SolrRequestParserTest.java |  12 +-
 .../spelling/ConjunctionSolrSpellCheckerTest.java  |   3 +-
 .../solr/spelling/FileBasedSpellCheckerTest.java   |   6 +-
 .../solr/spelling/IndexBasedSpellCheckerTest.java  |  12 +-
 .../solr/spelling/SpellCheckCollatorTest.java      |   3 +-
 .../solr/spelling/suggest/SuggesterTest.java       |   1 -
 .../solr/store/blockcache/BlockDirectoryTest.java  |   3 +-
 .../apache/solr/store/hdfs/HdfsDirectoryTest.java  |  23 +-
 .../solr/store/hdfs/HdfsLockFactoryTest.java       |   3 +-
 .../apache/solr/uninverting/TestDocTermOrds.java   |  78 ++---
 .../uninverting/TestDocTermOrdsUninvertLimit.java  |  12 +-
 .../apache/solr/uninverting/TestFieldCache.java    | 100 +++---
 .../solr/uninverting/TestFieldCacheReopen.java     |  10 +-
 .../solr/uninverting/TestFieldCacheSort.java       | 295 +++++++++--------
 .../solr/uninverting/TestFieldCacheSortRandom.java |  10 +-
 .../uninverting/TestFieldCacheVsDocValues.java     |  46 +--
 .../uninverting/TestFieldCacheWithThreads.java     |  12 +-
 .../solr/uninverting/TestLegacyFieldCache.java     |  50 +--
 .../solr/uninverting/TestNumericTerms32.java       |  12 +-
 .../solr/uninverting/TestNumericTerms64.java       |  12 +-
 .../solr/uninverting/TestUninvertingReader.java    |  32 +-
 .../org/apache/solr/update/AddBlockUpdateTest.java |  13 +-
 .../solr/update/AnalysisErrorHandlingTest.java     |   5 +-
 .../solr/update/DataDrivenBlockJoinTest.java       |   5 +-
 .../apache/solr/update/DocumentBuilderTest.java    |  18 +-
 .../test/org/apache/solr/update/PeerSyncTest.java  |   3 +-
 .../org/apache/solr/update/SoftAutoCommitTest.java |   2 +-
 .../apache/solr/update/SolrIndexConfigTest.java    |  11 +-
 .../apache/solr/update/SolrIndexSplitterTest.java  |   9 +-
 .../solr/update/TestAtomicUpdateErrorCases.java    |   9 +-
 .../org/apache/solr/update/TestHdfsUpdateLog.java  |   3 +-
 .../update/TestInPlaceUpdateWithRouteField.java    |   3 +-
 .../solr/update/TestInPlaceUpdatesDistrib.java     |  13 +-
 .../solr/update/TestInPlaceUpdatesStandalone.java  |  16 +-
 .../test/org/apache/solr/update/TestUpdate.java    |  15 +-
 .../org/apache/solr/update/TransactionLogTest.java |   5 +-
 .../test/org/apache/solr/update/UpdateLogTest.java |  10 +-
 .../AbstractAtomicUpdatesMultivalueTestBase.java   |  13 +-
 .../AddSchemaFieldsUpdateProcessorFactoryTest.java |  10 +-
 .../processor/AtomicUpdateRemovalJavabinTest.java  |   3 +-
 .../CategoryRoutedAliasUpdateProcessorTest.java    |  28 +-
 .../ClassificationUpdateProcessorTest.java         |  11 +-
 .../DimensionalRoutedAliasUpdateProcessorTest.java |   9 +-
 .../DocExpirationUpdateProcessorFactoryTest.java   |   5 +-
 .../IgnoreLargeDocumentProcessorFactoryTest.java   |   3 +-
 .../processor/RoutedAliasUpdateProcessorTest.java  |   3 +-
 .../solr/update/processor/ScriptEngineTest.java    |   3 +-
 .../SignatureUpdateProcessorFactoryTest.java       |   3 +-
 .../StatelessScriptUpdateProcessorFactoryTest.java |  21 +-
 .../processor/TemplateUpdateProcessorTest.java     |   3 +-
 .../processor/TestDocBasedVersionConstraints.java  |  68 ++--
 .../TimeRoutedAliasUpdateProcessorTest.java        |  33 +-
 .../processor/TolerantUpdateProcessorTest.java     |  15 +-
 .../UpdateRequestProcessorFactoryTest.java         |   3 +-
 .../test/org/apache/solr/util/AuthToolTest.java    |   5 +-
 .../org/apache/solr/util/DateMathParserTest.java   |  12 +-
 .../org/apache/solr/util/OrderedExecutorTest.java  |   3 +-
 .../org/apache/solr/util/SimplePostToolTest.java   |   3 +-
 .../org/apache/solr/util/SolrPluginUtilsTest.java  |  15 +-
 .../test/org/apache/solr/util/TestExportTool.java  |   8 +-
 .../org/apache/solr/util/TestSafeXMLParsing.java   |   3 +-
 .../apache/solr/util/TestSolrCLIRunExample.java    |  15 +-
 .../org/apache/solr/util/TestSystemIdResolver.java |  10 +-
 .../org/apache/solr/util/TestTestInjection.java    |   5 +-
 .../org/apache/solr/util/TimeZoneUtilsTest.java    |   5 +-
 .../test/org/apache/solr/util/UtilsToolTest.java   |   3 +-
 .../BigEndianAscendingWordDeserializerTest.java    |  13 +-
 .../hll/BigEndianAscendingWordSerializerTest.java  |  20 +-
 .../apache/solr/util/hll/HLLSerializationTest.java |  17 +-
 .../solr/util/tracing/TestDistributedTracing.java  |   5 +-
 .../client/solrj/impl/BinaryRequestWriter.java     |  30 +-
 .../solr/client/solrj/impl/HttpSolrClient.java     |  62 ++--
 .../client/solrj/io/eval/PairSortEvaluator.java    |   2 +-
 .../solrj/io/stream/CartesianProductStream.java    |   2 +-
 .../client/solrj/io/stream/ParallelListStream.java |   2 +-
 .../solrj/request/ContentStreamUpdateRequest.java  |  43 +--
 .../solrj/request/StreamingUpdateRequest.java      |  35 +-
 .../org/apache/solr/common/IteratorWriter.java     |  26 +-
 .../src/java/org/apache/solr/common/MapWriter.java |  70 ++--
 .../solr/common/cloud/ConnectionManager.java       |   1 -
 .../org/apache/solr/common/util/JavaBinCodec.java  |  94 +++---
 .../ref_guide_examples/JsonRequestApiTest.java     |   3 +-
 .../client/solrj/MergeIndexesExampleTestBase.java  |   7 +-
 .../apache/solr/client/solrj/SolrExampleTests.java |  33 +-
 .../solr/client/solrj/SolrExampleTestsBase.java    |   4 +-
 .../client/solrj/SolrSchemalessExampleTest.java    |   3 +-
 .../solr/client/solrj/TestLBHttp2SolrClient.java   |   9 +-
 .../solr/client/solrj/TestLBHttpSolrClient.java    |  18 +-
 .../solr/client/solrj/TestSolrJErrorHandling.java  |   7 +-
 .../AbstractEmbeddedSolrServerTestCase.java        |   9 +-
 .../client/solrj/embedded/JettyWebappTest.java     |   7 +-
 .../solrj/embedded/SolrExampleJettyTest.java       |  34 +-
 .../client/solrj/embedded/TestSolrProperties.java  |  13 +-
 .../client/solrj/impl/BasicHttpSolrClientTest.java |   7 +-
 .../impl/CloudHttp2SolrClientBadInputTest.java     |   2 +-
 .../solrj/impl/CloudHttp2SolrClientRetryTest.java  |   6 +-
 .../solrj/impl/CloudHttp2SolrClientTest.java       |  20 +-
 .../solrj/impl/CloudSolrClientBadInputTest.java    |   2 +-
 .../solrj/impl/CloudSolrClientRetryTest.java       |   5 +-
 .../client/solrj/impl/CloudSolrClientTest.java     |  13 +-
 ...oncurrentUpdateHttp2SolrClientBadInputTest.java |   2 +-
 .../impl/ConcurrentUpdateHttp2SolrClientTest.java  |   5 +-
 .../ConcurrentUpdateSolrClientBadInputTest.java    |   2 +-
 .../ConcurrentUpdateSolrClientBuilderTest.java     |   3 +-
 .../impl/Http2SolrClientCompatibilityTest.java     |   3 +-
 .../client/solrj/impl/Http2SolrClientTest.java     |  41 +--
 .../solrj/impl/HttpSolrClientBadInputTest.java     |   7 +-
 .../solrj/impl/HttpSolrClientConPoolTest.java      |   5 +-
 .../solrj/impl/LBHttpSolrClientBadInputTest.java   |   4 +-
 .../solrj/impl/SolrPortAwareCookieSpecTest.java    |  20 +-
 .../solrj/impl/TestCloudSolrClientConnections.java |  18 +-
 .../client/solrj/io/graph/GraphExpressionTest.java |   3 +-
 .../solr/client/solrj/io/graph/GraphTest.java      |   3 +-
 .../apache/solr/client/solrj/io/sql/JdbcTest.java  |   3 +-
 .../solrj/io/stream/CloudAuthStreamTest.java       |  80 ++---
 .../client/solrj/io/stream/JDBCStreamTest.java     |   6 +-
 .../client/solrj/io/stream/MathExpressionTest.java |   5 +-
 .../solrj/io/stream/SelectWithEvaluatorsTest.java  |   6 +-
 .../solrj/io/stream/StreamDecoratorTest.java       |  19 +-
 .../solrj/io/stream/StreamExpressionTest.java      |  15 +-
 .../solr/client/solrj/io/stream/StreamingTest.java |  35 +-
 .../solr/client/solrj/request/Schema2Test.java     |  15 +-
 .../solr/client/solrj/request/SchemaTest.java      |  15 +-
 .../solr/client/solrj/request/SolrPingTest.java    |   5 +-
 .../solrj/request/TestCollectionAdminRequest.java  |  11 +-
 .../solrj/request/TestConfigSetAdminRequest.java   |   3 +-
 .../solr/client/solrj/request/TestCoreAdmin.java   |  21 +-
 .../solr/client/solrj/request/TestV2Request.java   |   3 +-
 ...DirectJsonQueryRequestFacetingEmbeddedTest.java |   3 +-
 ...ectJsonQueryRequestFacetingIntegrationTest.java |   3 +-
 .../client/solrj/request/json/DomainMapTest.java   |  15 +-
 .../solrj/request/json/HeatmapFacetMapTest.java    |  15 +-
 .../JsonQueryRequestFacetingIntegrationTest.java   |   3 +-
 .../json/JsonQueryRequestIntegrationTest.java      |   3 +-
 .../request/json/JsonQueryRequestUnitTest.java     |  33 +-
 .../solrj/request/json/QueryFacetMapTest.java      |   3 +-
 .../solrj/request/json/RangeFacetMapTest.java      |   9 +-
 .../solrj/request/json/TermsFacetMapTest.java      |  15 +-
 .../response/TestDelegationTokenResponse.java      |   9 +-
 .../solrj/response/TestSpellCheckResponse.java     |   3 +-
 .../solr/common/TestToleratedUpdateError.java      |  11 +-
 .../apache/solr/common/cloud/SolrZkClientTest.java |  19 +-
 .../cloud/TestCloudCollectionsListeners.java       |   3 +-
 .../common/cloud/TestCollectionStateWatchers.java  |   7 +-
 .../common/cloud/TestDocCollectionWatcher.java     |   7 +-
 .../solr/common/cloud/TestZkConfigManager.java     |  11 +-
 .../apache/solr/common/params/ShardParamsTest.java |   3 +-
 .../apache/solr/common/util/ContentStreamTest.java |  13 +-
 .../apache/solr/common/util/JsonValidatorTest.java |   7 +-
 .../org/apache/solr/common/util/NamedListTest.java |   3 +-
 .../apache/solr/common/util/TestJavaBinCodec.java  |  10 +-
 .../solr/common/util/TestJsonRecordReader.java     |   3 +-
 .../solr/common/util/TestValidatingJsonMap.java    |   3 +-
 .../src/test/org/noggit/TestObjectBuilder.java     |  11 +-
 .../org/apache/solr/AbstractBeforeAfterRule.java   |  63 ++++
 .../apache/solr/BaseDistributedSearchTestCase.java |   9 +-
 .../java/org/apache/solr/SolrJettyTestBase.java    |   4 +-
 .../src/java/org/apache/solr/SolrTestCase.java     | 358 ++++++++++-----------
 .../src/java/org/apache/solr/SolrTestCaseHS.java   |   6 +-
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   |  65 ++--
 .../src/java/org/apache/solr/SolrTestCaseUtil.java |  23 ++
 .../src/java/org/apache/solr/SolrTestUtil.java     | 277 ++++++++++++++++
 .../solr/TestRuleSetupAndRestoreClassEnv.java      | 309 ++++++++++++++++++
 .../solr}/TestRuleTemporaryFilesCleanup.java       |  57 ++--
 .../solr/cloud/AbstractFullDistribZkTestBase.java  |  14 +-
 .../org/apache/solr/cloud/AbstractZkTestCase.java  |   7 +-
 .../apache/solr/cloud/MultiSolrCloudTestCase.java  |   5 +-
 .../org/apache/solr/cloud/SolrCloudTestCase.java   |   4 +-
 .../java/org/apache/solr/cloud/ZkTestServer.java   |   4 +-
 .../solr/util/RevertDefaultThreadHandlerRule.java  |  38 ++-
 .../org/apache/solr/cloud/JettySolrRunnerTest.java |   6 +-
 .../solr/cloud/MiniSolrCloudClusterTest.java       |   3 +-
 692 files changed, 5797 insertions(+), 4373 deletions(-)

diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
index 18a3850..b42807d 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
@@ -87,6 +87,7 @@ import org.apache.lucene.search.LRUQueryCache;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.QueryCache;
 import org.apache.lucene.search.QueryCachingPolicy;
+import org.apache.lucene.search.similarities.BM25Similarity;
 import org.apache.lucene.store.BaseDirectoryWrapper;
 import org.apache.lucene.store.ByteBuffersDirectory;
 import org.apache.lucene.store.Directory;
@@ -686,12 +687,12 @@ public abstract class LuceneTestCase extends Assert {
 
   private static final Map<String,FieldType> fieldToType = new HashMap<String,FieldType>();
 
-  enum LiveIWCFlushMode {BY_RAM, BY_DOCS, EITHER};
+  public enum LiveIWCFlushMode {BY_RAM, BY_DOCS, EITHER}; // MRM TODO:
 
   /** Set by TestRuleSetupAndRestoreClassEnv */
   static LiveIWCFlushMode liveIWCFlushMode;
 
-  static void setLiveIWCFlushMode(LiveIWCFlushMode flushMode) {
+  public static void setLiveIWCFlushMode(LiveIWCFlushMode flushMode) {
     liveIWCFlushMode = flushMode;
   }
 
@@ -935,7 +936,9 @@ public abstract class LuceneTestCase extends Assert {
   /** create a new index writer config with random defaults using the specified random */
   public static IndexWriterConfig newIndexWriterConfig(Random r, Analyzer a) {
     IndexWriterConfig c = new IndexWriterConfig(a);
-    c.setSimilarity(classEnvRule.similarity);
+    if (classEnvRule.similarity != null) {
+      c.setSimilarity(classEnvRule.similarity); // TODO: get sim from our classEnvRule instead of LuceneTestCase's
+    }
     if (VERBOSE) {
       // Even though TestRuleSetupAndRestoreClassEnv calls
       // InfoStream.setDefault, we do it again here so that
@@ -1062,9 +1065,11 @@ public abstract class LuceneTestCase extends Assert {
       return new MockRandomMergePolicy(r);
     } else if (r.nextBoolean()) {
       return newTieredMergePolicy(r);
-    } else if (rarely(r) ) { 
-      return newAlcoholicMergePolicy(r, classEnvRule.timeZone);
     }
+    // MRM TODO: need time stuff setup correctly with our SolrTestCase.classEnvRule, not LuceneTestCase
+//    else if (rarely(r) ) {
+//      return newAlcoholicMergePolicy(r, classEnvRule.timeZone);
+//    }
     return newLogMergePolicy(r);
   }
 
@@ -1927,7 +1932,11 @@ public abstract class LuceneTestCase extends Assert {
       } else {
         ret = random.nextBoolean() ? new IndexSearcher(r) : new IndexSearcher(r.getContext());
       }
-      ret.setSimilarity(classEnvRule.similarity);
+      if (classEnvRule.similarity != null) {
+        ret.setSimilarity(classEnvRule.similarity);
+      } else {
+        ret.setSimilarity(new BM25Similarity());
+      }
       return ret;
     } else {
       int threads = 0;
@@ -1967,7 +1976,12 @@ public abstract class LuceneTestCase extends Assert {
             ? new IndexSearcher(r, ex)
             : new IndexSearcher(r.getContext(), ex);
       }
-      ret.setSimilarity(classEnvRule.similarity);
+
+      if (classEnvRule.similarity != null) {
+        ret.setSimilarity(classEnvRule.similarity);
+      } else {
+        ret.setSimilarity(new BM25Similarity());
+      }
       ret.setQueryCachingPolicy(MAYBE_CACHE_POLICY);
       return ret;
     }
diff --git a/lucene/test-framework/src/java/org/apache/lucene/util/TestRuleTemporaryFilesCleanup.java b/lucene/test-framework/src/java/org/apache/lucene/util/TestRuleTemporaryFilesCleanup.java
index 4867554..72efc17 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/util/TestRuleTemporaryFilesCleanup.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/util/TestRuleTemporaryFilesCleanup.java
@@ -108,10 +108,6 @@ final class TestRuleTemporaryFilesCleanup extends TestRuleAdapter {
   @Override
   protected void before() throws Throwable {
     super.before();
-
-    assert tempDirBase == null;
-    fileSystem = initializeFileSystem();
-    javaTempDir = initializeJavaTempDir();
   }
   
   // os/config-independent limit for too many open files
@@ -224,7 +220,7 @@ final class TestRuleTemporaryFilesCleanup extends TestRuleAdapter {
         }
         throw e;
       }
-      if (fileSystem != FileSystems.getDefault()) {
+      if (fileSystem != FileSystems.getDefault() && fileSystem != null) {
         fileSystem.close();
       }
     } else {
@@ -236,6 +232,14 @@ final class TestRuleTemporaryFilesCleanup extends TestRuleAdapter {
   
   Path getPerTestClassTempDir() {
     if (tempDirBase == null) {
+
+      fileSystem = initializeFileSystem();
+      try {
+        javaTempDir = initializeJavaTempDir();
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+
       RandomizedContext ctx = RandomizedContext.current();
       Class<?> clazz = ctx.getTargetClass();
       String prefix = clazz.getName();
@@ -260,6 +264,7 @@ final class TestRuleTemporaryFilesCleanup extends TestRuleAdapter {
       } while (!success);
 
       tempDirBase = f;
+
       registerToRemoveAfterSuite(tempDirBase);
     }
     return tempDirBase;
diff --git a/solr/contrib/analysis-extras/src/test/org/apache/solr/analysis/TestFoldingMultitermExtrasQuery.java b/solr/contrib/analysis-extras/src/test/org/apache/solr/analysis/TestFoldingMultitermExtrasQuery.java
index b2cdbc2..bf89e1b 100644
--- a/solr/contrib/analysis-extras/src/test/org/apache/solr/analysis/TestFoldingMultitermExtrasQuery.java
+++ b/solr/contrib/analysis-extras/src/test/org/apache/solr/analysis/TestFoldingMultitermExtrasQuery.java
@@ -20,6 +20,7 @@ import java.io.File;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -32,8 +33,8 @@ public class TestFoldingMultitermExtrasQuery extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeTests() throws Exception {
-    File testHome = createTempDir().toFile();
-    FileUtils.copyDirectory(getFile("analysis-extras/solr"), testHome);
+    File testHome = SolrTestUtil.createTempDir().toFile();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("analysis-extras/solr"), testHome);
     initCore("solrconfig-icucollate.xml","schema-folding-extra.xml", testHome.getAbsolutePath());
 
     int idx = 1;
diff --git a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationField.java b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationField.java
index f164080..a843882 100644
--- a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationField.java
+++ b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationField.java
@@ -25,6 +25,7 @@ import org.apache.lucene.analysis.util.FilesystemResourceLoader;
 import org.apache.lucene.analysis.util.ResourceLoader;
 import org.apache.lucene.analysis.util.StringMockResourceLoader;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.junit.BeforeClass;
 
 import com.ibm.icu.text.Collator;
@@ -63,15 +64,15 @@ public class TestICUCollationField extends SolrTestCaseJ4 {
    * So it's preferable to create this file on-the-fly.
    */
   public static String setupSolrHome() throws Exception {
-    String tmpFile = createTempDir().toFile().getAbsolutePath();
+    String tmpFile = SolrTestUtil.createTempDir().toFile().getAbsolutePath();
     // make data and conf dirs
     new File(tmpFile  + "/collection1", "data").mkdirs();
     File confDir = new File(tmpFile + "/collection1", "conf");
     confDir.mkdirs();
     
     // copy over configuration files
-    FileUtils.copyFile(getFile("analysis-extras/solr/collection1/conf/solrconfig-icucollate.xml"), new File(confDir, "solrconfig.xml"));
-    FileUtils.copyFile(getFile("analysis-extras/solr/collection1/conf/schema-icucollate.xml"), new File(confDir, "schema.xml"));
+    FileUtils.copyFile(SolrTestUtil.getFile("analysis-extras/solr/collection1/conf/solrconfig-icucollate.xml"), new File(confDir, "solrconfig.xml"));
+    FileUtils.copyFile(SolrTestUtil.getFile("analysis-extras/solr/collection1/conf/schema-icucollate.xml"), new File(confDir, "schema.xml"));
     
     // generate custom collation rules (DIN 5007-2), saving to customrules.dat
     RuleBasedCollator baseCollator = (RuleBasedCollator) Collator.getInstance(new ULocale("de", "DE"));
diff --git a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldDocValues.java b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldDocValues.java
index 57b403a..ae84c50 100644
--- a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldDocValues.java
+++ b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldDocValues.java
@@ -22,6 +22,7 @@ import java.io.FileOutputStream;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.junit.BeforeClass;
 
 import com.ibm.icu.text.Collator;
@@ -60,7 +61,7 @@ public class TestICUCollationFieldDocValues extends SolrTestCaseJ4 {
    * So it's preferable to create this file on-the-fly.
    */
   public static String setupSolrHome() throws Exception {
-    File tmpFile = createTempDir().toFile();
+    File tmpFile = SolrTestUtil.createTempDir().toFile();
     
     // make data and conf dirs
     new File(tmpFile + "/collection1", "data").mkdirs();
@@ -68,8 +69,8 @@ public class TestICUCollationFieldDocValues extends SolrTestCaseJ4 {
     confDir.mkdirs();
     
     // copy over configuration files
-    FileUtils.copyFile(getFile("analysis-extras/solr/collection1/conf/solrconfig-icucollate.xml"), new File(confDir, "solrconfig.xml"));
-    FileUtils.copyFile(getFile("analysis-extras/solr/collection1/conf/schema-icucollate-dv.xml"), new File(confDir, "schema.xml"));
+    FileUtils.copyFile(SolrTestUtil.getFile("analysis-extras/solr/collection1/conf/solrconfig-icucollate.xml"), new File(confDir, "solrconfig.xml"));
+    FileUtils.copyFile(SolrTestUtil.getFile("analysis-extras/solr/collection1/conf/schema-icucollate-dv.xml"), new File(confDir, "schema.xml"));
     
     // generate custom collation rules (DIN 5007-2), saving to customrules.dat
     RuleBasedCollator baseCollator = (RuleBasedCollator) Collator.getInstance(new ULocale("de", "DE"));
diff --git a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldOptions.java b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldOptions.java
index 0b198b7..18ef453 100644
--- a/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldOptions.java
+++ b/solr/contrib/analysis-extras/src/test/org/apache/solr/schema/TestICUCollationFieldOptions.java
@@ -18,6 +18,7 @@ package org.apache.solr.schema;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.junit.BeforeClass;
 
 import java.io.File;
@@ -28,8 +29,8 @@ import java.io.File;
 public class TestICUCollationFieldOptions extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
-    File testHome = createTempDir().toFile();
-    FileUtils.copyDirectory(getFile("analysis-extras/solr"), testHome);
+    File testHome = SolrTestUtil.createTempDir().toFile();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("analysis-extras/solr"), testHome);
     initCore("solrconfig-icucollate.xml","schema-icucollateoptions.xml", testHome.getAbsolutePath());
     // add some docs
     assertU(adoc("id", "1", "text", "foo-bar"));
diff --git a/solr/contrib/analysis-extras/src/test/org/apache/solr/update/processor/TestOpenNLPExtractNamedEntitiesUpdateProcessorFactory.java b/solr/contrib/analysis-extras/src/test/org/apache/solr/update/processor/TestOpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
index 851fea0..771d959 100644
--- a/solr/contrib/analysis-extras/src/test/org/apache/solr/update/processor/TestOpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
+++ b/solr/contrib/analysis-extras/src/test/org/apache/solr/update/processor/TestOpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
@@ -21,6 +21,7 @@ import java.io.File;
 import java.util.Arrays;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -29,8 +30,8 @@ public class TestOpenNLPExtractNamedEntitiesUpdateProcessorFactory extends Updat
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    File testHome = createTempDir().toFile();
-    FileUtils.copyDirectory(getFile("analysis-extras/solr"), testHome);
+    File testHome = SolrTestUtil.createTempDir().toFile();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("analysis-extras/solr"), testHome);
     initCore("solrconfig-opennlp-extract.xml", "schema-opennlp-extract.xml", testHome.getAbsolutePath());
   }
 
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/ExpressionFactoryTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/ExpressionFactoryTest.java
index 25cd19b..f9b272a 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/ExpressionFactoryTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/ExpressionFactoryTest.java
@@ -20,6 +20,7 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.analytics.function.ReductionCollectionManager;
 import org.apache.solr.analytics.value.constant.ConstantValue;
@@ -72,7 +73,7 @@ public class ExpressionFactoryTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void userDefinedVariableFunctionTest() {
     ExpressionFactory fact = getExpressionFactory();
 
@@ -176,7 +177,7 @@ public class ExpressionFactoryTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void reductionManagerCreationTest() {
     ExpressionFactory fact = getExpressionFactory();
 
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/SolrAnalyticsTestCase.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/SolrAnalyticsTestCase.java
index 3d5f25d..94757b3 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/SolrAnalyticsTestCase.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/SolrAnalyticsTestCase.java
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
 
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.QueryRequest;
@@ -56,7 +57,7 @@ public class SolrAnalyticsTestCase extends SolrCloudTestCase {
 
     // Solr Cloud
     configureCluster(4)
-        .addConfig("conf", configset("cloud-analytics"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-analytics"))
         .configure();
 
     CollectionAdminRequest.createCollection(COLLECTIONORALIAS, "conf", 2, 1).process(cluster.getSolrClient());
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsCloudTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsCloudTest.java
index 8fbf4ef..36004e3 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsCloudTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsCloudTest.java
@@ -22,6 +22,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.concurrent.TimeoutException;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.analytics.util.AnalyticsResponseHeadings;
 import org.apache.solr.analytics.util.MedianCalculator;
 import org.apache.solr.analytics.util.OrdinalCalculator;
@@ -45,7 +46,7 @@ public class LegacyAbstractAnalyticsCloudTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCollection() throws Exception {
     configureCluster(4)
-        .addConfig("conf", configset("cloud-analytics"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-analytics"))
         .configure();
 
     CollectionAdminRequest.createCollection(COLLECTIONORALIAS, "conf", 2, 1).process(cluster.getSolrClient());
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyExpressionTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyExpressionTest.java
index 89fe2c7..dc561ea 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyExpressionTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyExpressionTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.analytics.legacy.expression;
 import java.time.Instant;
 import java.util.Date;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.analytics.legacy.LegacyAbstractAnalyticsTest;
 import org.apache.solr.util.DateMathParser;
 import org.junit.BeforeClass;
@@ -51,7 +52,7 @@ public class LegacyExpressionTest extends LegacyAbstractAnalyticsTest {
       assertU(adoc("id", "1000" + j, "int_id", "" + i, "long_ld", "" + l, "float_fd", "" + f,
           "double_dd", "" + d, "date_dtd", dt, "string_sd", s));
 
-      if (usually()) {
+      if (LuceneTestCase.usually()) {
         assertU(commit()); // to have several segments
       }
     }
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
index bdb12df..c48f751 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
@@ -17,13 +17,13 @@
 package org.apache.solr.analytics.legacy.expression;
 
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.analytics.legacy.LegacyAbstractAnalyticsTest;
 import org.apache.solr.analytics.legacy.facet.LegacyAbstractAnalyticsFacetTest;
-import org.apache.solr.common.util.IOUtils;
-import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+@LuceneTestCase.Nightly
 public class LegacyFunctionTest extends LegacyAbstractAnalyticsTest {
   static String fileName = "functions.txt";
 
@@ -73,7 +73,7 @@ public class LegacyFunctionTest extends LegacyAbstractAnalyticsTest {
             "concat_first_sd", concat_first, "concat_second_sd", concat_second, "miss_dd", ""+d0 )));
 
 
-      if (usually()) {
+      if (LuceneTestCase.usually()) {
         assertU(commit()); // to have several segments
       }
     }
diff --git a/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java b/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java
index 8e1f625..5399b55 100644
--- a/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java
+++ b/solr/contrib/clustering/src/java/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngine.java
@@ -332,12 +332,7 @@ public class CarrotClusteringEngine extends SearchClusteringEngine {
         args.put(HighlightParams.SIMPLE_POST, "");
         args.put(HighlightParams.FRAGSIZE, solrParams.getInt(CarrotParams.SUMMARY_FRAGSIZE, solrParams.getInt(HighlightParams.FRAGSIZE, 100)));
         args.put(HighlightParams.SNIPPETS, solrParams.getInt(CarrotParams.SUMMARY_SNIPPETS, solrParams.getInt(HighlightParams.SNIPPETS, 1)));
-        req = new LocalSolrQueryRequest(core, query.toString(), "", 0, 1, args) {
-          @Override
-          public SolrIndexSearcher getSearcher() {
-            return sreq.getSearcher();
-          }
-        };
+        req = new MyLocalSolrQueryRequest(core, query, args, sreq);
       } else {
         log.warn("No highlighter configured, cannot produce summary");
         produceSummary = false;
@@ -562,4 +557,17 @@ public class CarrotClusteringEngine extends SearchClusteringEngine {
     }
   }
 
+  private static class MyLocalSolrQueryRequest extends LocalSolrQueryRequest {
+    private final SolrQueryRequest sreq;
+
+    public MyLocalSolrQueryRequest(SolrCore core, Query query, Map<String,Object> args, SolrQueryRequest sreq) {
+      super(core, query.toString(), "", 0, 1, args);
+      this.sreq = sreq;
+    }
+
+    @Override
+    public SolrIndexSearcher getSearcher() {
+      return sreq.getSearcher();
+    }
+  }
 }
diff --git a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java
index ca2f424..912edf2 100644
--- a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java
+++ b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/AbstractClusteringTestCase.java
@@ -20,6 +20,7 @@ import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.BeforeClass;
 
@@ -32,8 +33,8 @@ public abstract class AbstractClusteringTestCase extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    File testHome = createTempDir().toFile();
-    FileUtils.copyDirectory(getFile("clustering/solr"), testHome);
+    File testHome = SolrTestUtil.createTempDir().toFile();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("clustering/solr"), testHome);
     initCore("solrconfig.xml", "schema.xml", testHome.getAbsolutePath());
     numberOfDocs = 0;
     for (String[] doc : DOCUMENTS) {
diff --git a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/DistributedClusteringComponentTest.java b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/DistributedClusteringComponentTest.java
index 889eb48..f8aee37 100644
--- a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/DistributedClusteringComponentTest.java
+++ b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/DistributedClusteringComponentTest.java
@@ -18,6 +18,7 @@ package org.apache.solr.handler.clustering;
 
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.params.CommonParams;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -29,7 +30,7 @@ public class DistributedClusteringComponentTest extends
 
   @Override
   public String getSolrHome() {
-    return getFile("clustering/solr/collection1").getParent();
+    return SolrTestUtil.getFile("clustering/solr/collection1").getParent();
   }
 
   @Test
diff --git a/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java b/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java
index bdb16a3..a8c0523 100644
--- a/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java
+++ b/solr/contrib/dataimporthandler-extras/src/test/org/apache/solr/handler/dataimport/TestTikaEntityProcessor.java
@@ -17,6 +17,7 @@
 package org.apache.solr.handler.dataimport;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -32,7 +33,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
   "<dataConfig>" +
   "  <dataSource type=\"BinFileDataSource\"/>" +
   "  <document>" +
-  "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + getFile("dihextras/solr-word.pdf").getAbsolutePath() + "\" >" +
+  "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/solr-word.pdf").getAbsolutePath() + "\" >" +
   "      <field column=\"Author\" meta=\"true\" name=\"author\"/>" +
   "      <field column=\"title\" meta=\"true\" name=\"title\"/>" +
   "      <field column=\"text\"/>" +
@@ -44,10 +45,10 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
       "<dataConfig>" +
           "  <dataSource type=\"BinFileDataSource\"/>" +
           "  <document>" +
-          "    <entity name=\"Tika\" onError=\"skip\"  processor=\"TikaEntityProcessor\" url=\"" + getFile("dihextras/bad.doc").getAbsolutePath() + "\" >" +
+          "    <entity name=\"Tika\" onError=\"skip\"  processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/bad.doc").getAbsolutePath() + "\" >" +
           "<field column=\"content\" name=\"text\"/>" +
           " </entity>" +
-          " <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + getFile("dihextras/solr-word.pdf").getAbsolutePath() + "\" >" +
+          " <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/solr-word.pdf").getAbsolutePath() + "\" >" +
           "      <field column=\"text\"/>" +
           "</entity>" +
           "  </document>" +
@@ -57,8 +58,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
       "<dataConfig>" +
           "  <dataSource type=\"BinFileDataSource\"/>" +
           "  <document>" +
-          "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" +
-          getFile("dihextras/test_jpeg.jpg").getAbsolutePath() + "\" spatialMetadataField=\"home\">" +
+          "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/test_jpeg.jpg").getAbsolutePath() + "\" spatialMetadataField=\"home\">" +
           "      <field column=\"text\"/>" +
           "     </entity>" +
           "  </document>" +
@@ -68,7 +68,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
       "<dataConfig>" +
           "  <dataSource type=\"BinFileDataSource\"/>" +
           "  <document>" +
-          "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + getFile("dihextras/test_vsdx.vsdx").getAbsolutePath() + "\" >" +
+          "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/test_vsdx.vsdx").getAbsolutePath() + "\" >" +
           "      <field column=\"text\"/>" +
           "     </entity>" +
           "  </document>" +
@@ -118,9 +118,9 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    assumeFalse("This test fails on UNIX with Turkish default locale (https://issues.apache.org/jira/browse/SOLR-6387)",
+    LuceneTestCase.assumeFalse("This test fails on UNIX with Turkish default locale (https://issues.apache.org/jira/browse/SOLR-6387)",
         new Locale("tr").getLanguage().equals(Locale.getDefault().getLanguage()));
-    initCore("dataimport-solrconfig.xml", "dataimport-schema-no-unique-key.xml", getFile("dihextras/solr").getAbsolutePath());
+    initCore("dataimport-solrconfig.xml", "dataimport-schema-no-unique-key.xml", SolrTestUtil.getFile("dihextras/solr").getAbsolutePath());
   }
 
   @Test
@@ -177,7 +177,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
             "  <dataSource type='BinFileDataSource'/>" +
             "  <document>" +
             "    <entity name='Tika' format='xml' processor='TikaEntityProcessor' " +
-            "       url='" + getFile("dihextras/structured.html").getAbsolutePath() + "' " +
+            "       url='" + SolrTestUtil.getFile("dihextras/structured.html").getAbsolutePath() + "' " +
             ((htmlMapper == null) ? "" : (" htmlMapper='" + htmlMapper + "'")) + ">" +
             "      <field column='text'/>" +
             "     </entity>" +
@@ -210,8 +210,7 @@ public class TestTikaEntityProcessor extends AbstractDataImportHandlerTestCase {
         "<dataConfig>" +
             "  <dataSource type=\"BinFileDataSource\"/>" +
             "  <document>" +
-            "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" +
-                    getFile("dihextras/test_recursive_embedded.docx").getAbsolutePath() + "\" " +
+            "    <entity name=\"Tika\" processor=\"TikaEntityProcessor\" url=\"" + SolrTestUtil.getFile("dihextras/test_recursive_embedded.docx").getAbsolutePath() + "\" " +
             "       extractEmbedded=\""+extractEmbedded+"\">" +
             "      <field column=\"Author\" meta=\"true\" name=\"author\"/>" +
             "      <field column=\"title\" meta=\"true\" name=\"title\"/>" +
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
index a657ab4..29b04c4 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DataImportHandler.java
@@ -262,17 +262,7 @@ public class DataImportHandler extends RequestHandlerBase implements
             "Unable to load Writer implementation:" + writerClassStr, e);
       }
     } else {
-      return new SolrWriter(processor, req) {
-        @Override
-        public boolean upload(SolrInputDocument document) {
-          try {
-            return super.upload(document);
-          } catch (RuntimeException e) {
-            log.error("Exception while adding: {}", document, e);
-            return false;
-          }
-        }
-      };
+      return new MySolrWriter(processor, req);
     }
   }
 
@@ -312,4 +302,20 @@ public class DataImportHandler extends RequestHandlerBase implements
   }
 
   public static final String ENABLE_DEBUG = "enableDebug";
+
+  private static class MySolrWriter extends SolrWriter {
+    public MySolrWriter(UpdateRequestProcessor processor, SolrQueryRequest req) {
+      super(processor, req);
+    }
+
+    @Override
+    public boolean upload(SolrInputDocument document) {
+      try {
+        return super.upload(document);
+      } catch (RuntimeException e) {
+        log.error("Exception while adding: {}", document, e);
+        return false;
+      }
+    }
+  }
 }
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
index 0f8dd6e..7c5e3c7 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DocBuilder.java
@@ -184,12 +184,7 @@ public class DocBuilder {
       dataImporter.store(DataImporter.STATUS_MSGS, statusMessages);
       config = dataImporter.getConfig();
       final AtomicLong startTime = new AtomicLong(System.nanoTime());
-      statusMessages.put(TIME_ELAPSED, new Object() {
-        @Override
-        public String toString() {
-          return getTimeElapsedSince(startTime.get());
-        }
-      });
+      statusMessages.put(TIME_ELAPSED, new MyObject(startTime));
 
       statusMessages.put(DataImporter.MSG.TOTAL_QUERIES_EXECUTED,
               importStatistics.queryCount);
@@ -1001,4 +996,17 @@ public class DocBuilder {
 
   public static final String LAST_INDEX_TIME = "last_index_time";
   public static final String INDEX_START_TIME = "index_start_time";
+
+  private static class MyObject {
+    private final AtomicLong startTime;
+
+    public MyObject(AtomicLong startTime) {
+      this.startTime = startTime;
+    }
+
+    @Override
+    public String toString() {
+      return getTimeElapsedSince(startTime.get());
+    }
+  }
 }
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java
index fe848b1..2841f6c 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/ScriptTransformer.java
@@ -100,13 +100,7 @@ public class ScriptTransformer extends Transformer {
     }
     try {
       try {
-        AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
-          @Override
-          public Void run() throws ScriptException  {
-            scriptEngine.eval(scriptText);
-            return null;
-          }
-        }, SCRIPT_SANDBOX);
+        AccessController.doPrivileged(new VoidPrivilegedExceptionAction(scriptEngine, scriptText), SCRIPT_SANDBOX);
       } catch (PrivilegedActionException e) {
         throw (ScriptException) e.getException();
       }
@@ -128,4 +122,19 @@ public class ScriptTransformer extends Transformer {
   private static final AccessControlContext SCRIPT_SANDBOX =
       new AccessControlContext(new ProtectionDomain[] { new ProtectionDomain(null, null) });
 
+  private static class VoidPrivilegedExceptionAction implements PrivilegedExceptionAction<Void> {
+    private final ScriptEngine scriptEngine;
+    private final String scriptText;
+
+    public VoidPrivilegedExceptionAction(ScriptEngine scriptEngine, String scriptText) {
+      this.scriptEngine = scriptEngine;
+      this.scriptText = scriptText;
+    }
+
+    @Override
+    public Void run() throws ScriptException {
+      scriptEngine.eval(scriptText);
+      return null;
+    }
+  }
 }
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
index ff8cbdc..9c7e6a1 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
@@ -25,6 +25,7 @@ import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
@@ -56,8 +57,8 @@ public abstract class AbstractDataImportHandlerTestCase extends
 
   // note, a little twisted that we shadow this static method
   public static void initCore(String config, String schema) throws Exception {
-    File testHome = createTempDir("core-home").toFile();
-    FileUtils.copyDirectory(getFile("dih/solr"), testHome);
+    File testHome = SolrTestUtil.createTempDir("core-home").toFile();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("dih/solr"), testHome);
     initCore(config, schema, testHome.getAbsolutePath());
   }
 
@@ -96,7 +97,7 @@ public abstract class AbstractDataImportHandlerTestCase extends
    */
   protected File redirectTempProperties(DataImporter di) {
     try {
-      File tempFile = createTempFile().toFile();
+      File tempFile = SolrTestUtil.createTempFile().toFile();
       di.getConfig().getPropertyWriter().getParameters()
         .put(SimplePropertiesWriter.FILENAME, tempFile.getAbsolutePath());
       return tempFile;
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractSqlEntityProcessorTestCase.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractSqlEntityProcessorTestCase.java
index ee5ec82..6a2b91e 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractSqlEntityProcessorTestCase.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractSqlEntityProcessorTestCase.java
@@ -17,6 +17,7 @@
 package org.apache.solr.handler.dataimport;
 
 import junit.framework.Assert;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.junit.After;
 import org.junit.Before;
@@ -67,7 +68,7 @@ public abstract class AbstractSqlEntityProcessorTestCase extends
   
   @Before
   public void beforeSqlEntitiyProcessorTestCase() throws Exception {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
     fileLocation = tmpdir.getPath();
     fileName = "the.properties";
   } 
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java
index 0d1c474..0074dc7 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestContentStreamDataSource.java
@@ -18,6 +18,7 @@ package org.apache.solr.handler.dataimport;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.DirectXmlRequest;
@@ -156,7 +157,7 @@ public class TestContentStreamDataSource extends AbstractDataImportHandlerTestCa
 
 
     public void setUp() throws Exception {
-      homeDir = createTempDir("inst").toFile();
+      homeDir = SolrTestUtil.createTempDir("inst").toFile();
       dataDir = new File(homeDir + "/collection1", "data");
       confDir = new File(homeDir + "/collection1", "conf");
 
@@ -164,14 +165,14 @@ public class TestContentStreamDataSource extends AbstractDataImportHandlerTestCa
       dataDir.mkdirs();
       confDir.mkdirs();
 
-      FileUtils.copyFile(getFile(getSolrXmlFile()), new File(homeDir, "solr.xml"));
+      FileUtils.copyFile(SolrTestUtil.getFile(getSolrXmlFile()), new File(homeDir, "solr.xml"));
       File f = new File(confDir, "solrconfig.xml");
-      FileUtils.copyFile(getFile(getSolrConfigFile()), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(getSolrConfigFile()), f);
       f = new File(confDir, "schema.xml");
 
-      FileUtils.copyFile(getFile(getSchemaFile()), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(getSchemaFile()), f);
       f = new File(confDir, "data-config.xml");
-      FileUtils.copyFile(getFile(CONF_DIR + "dataconfig-contentstream.xml"), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(CONF_DIR + "dataconfig-contentstream.xml"), f);
 
       Files.createFile(homeDir.toPath().resolve("collection1/core.properties"));
     }
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
index 7cc3a0c..aae0232 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -278,7 +279,7 @@ public class TestDocBuilder2 extends AbstractDataImportHandlerTestCase {
   @Test
   @Ignore("Fix Me. See SOLR-4103.")
   public void testFileListEntityProcessor_lastIndexTime() throws Exception  {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
 
     @SuppressWarnings({"unchecked"})
     Map<String, String> params = createMap("baseDir", tmpdir.getAbsolutePath());
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListEntityProcessor.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListEntityProcessor.java
index c4b4ab0..b10c9d1 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListEntityProcessor.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListEntityProcessor.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.junit.Test;
 
@@ -45,7 +46,7 @@ public class TestFileListEntityProcessor extends AbstractDataImportHandlerTestCa
   @Test
   @SuppressWarnings("unchecked")
   public void testSimple() throws IOException {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
 
     createFile(tmpdir, "a.xml", "a.xml".getBytes(StandardCharsets.UTF_8), false);
     createFile(tmpdir, "b.xml", "b.xml".getBytes(StandardCharsets.UTF_8), false);
@@ -71,7 +72,7 @@ public class TestFileListEntityProcessor extends AbstractDataImportHandlerTestCa
   @Test
   @SuppressWarnings({"unchecked"})
   public void testBiggerSmallerFiles() throws IOException {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
 
     long minLength = Long.MAX_VALUE;
     String smallestFile = "";
@@ -142,7 +143,7 @@ public class TestFileListEntityProcessor extends AbstractDataImportHandlerTestCa
   @Test
   @SuppressWarnings({"unchecked"})
   public void testNTOT() throws IOException {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
 
     createFile(tmpdir, "a.xml", "a.xml".getBytes(StandardCharsets.UTF_8), true);
     createFile(tmpdir, "b.xml", "b.xml".getBytes(StandardCharsets.UTF_8), true);
@@ -177,7 +178,7 @@ public class TestFileListEntityProcessor extends AbstractDataImportHandlerTestCa
 
   @Test
   public void testRECURSION() throws IOException {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
     File childdir = new File(tmpdir + "/child" );
     childdir.mkdir();
     createFile(childdir, "a.xml", "a.xml".getBytes(StandardCharsets.UTF_8), true);
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
index 618c89e..1415d65 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
@@ -19,7 +19,7 @@ package org.apache.solr.handler.dataimport;
 import java.io.File;
 import java.nio.charset.StandardCharsets;
 
-import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.junit.BeforeClass;
 
@@ -30,7 +30,7 @@ public class TestFileListWithLineEntityProcessor extends AbstractDataImportHandl
   }
   
   public void test() throws Exception {
-    File tmpdir = createTempDir(LuceneTestCase.getTestClass().getSimpleName()).toFile();
+    File tmpdir = SolrTestUtil.createTempDir(SolrTestUtil.getTestName()).toFile();
     createFile(tmpdir, "a.txt", "a line one\na line two\na line three".getBytes(StandardCharsets.UTF_8), false);
     createFile(tmpdir, "b.txt", "b line one\nb line two".getBytes(StandardCharsets.UTF_8), false);
     createFile(tmpdir, "c.txt", "c line one\nc line two\nc line three\nc line four".getBytes(StandardCharsets.UTF_8), false);
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
index 9a230be..901f714 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
@@ -35,6 +35,8 @@ import org.apache.lucene.search.join.BitSetProducer;
 import org.apache.lucene.search.join.QueryBitSetProducer;
 import org.apache.lucene.search.join.ScoreMode;
 import org.apache.lucene.search.join.ToParentBlockJoinQuery;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.handler.dataimport.config.ConfigNameConstants;
 import org.apache.solr.request.SolrQueryRequest;
@@ -111,7 +113,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
   }
 
   @Test
-  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-12801") // this test fails easily under beasting
+  @LuceneTestCase.AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-12801") // this test fails easily under beasting
   public void testThreeLevelHierarchy() throws Exception {
     int parentsNum = 3; //fixed for simplicity of test
     int childrenNum = 0;
@@ -137,7 +139,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
     final String childId = childrenIds.get(0);
     String description = "grandchild of first parent, child of " + childId + " child";
     select = "select * from GRANDCHILD where parent_id='" + childId + "'";
-    List<String> grandChildrenIds = createDataIterator(select, grandChildType, description, atLeast(2));
+    List<String> grandChildrenIds = createDataIterator(select, grandChildType, description, SolrTestUtil.atLeast(2));
     grandChildrenNum += grandChildrenIds.size();
     
     // grand children of first parent second child
@@ -146,7 +148,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
       description = "grandchild of first parent, child of " + childId2 + " child";
       select = "select * from GRANDCHILD where parent_id='" + childId2 + "'";
     }
-    final List<String> grandChildrenIds2 = createDataIterator(select, grandChildType, description, atLeast(2));
+    final List<String> grandChildrenIds2 = createDataIterator(select, grandChildType, description, SolrTestUtil.atLeast(2));
     grandChildrenNum += grandChildrenIds2.size();
     
     List<String> allGrandChildrenIds = new ArrayList<>(grandChildrenIds);
@@ -156,7 +158,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
     
     // parent 2 children (no grand children)   
     select = "select * from CHILD where parent_id='" + parentId2 + "'";
-    childrenIds = createDataIterator(select, childType, "child of second parent", atLeast(2));
+    childrenIds = createDataIterator(select, childType, "child of second parent", SolrTestUtil.atLeast(2));
     childrenNum += childrenIds.size();
     
     // parent 3 has no children and grand children
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSource.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSource.java
index 5d89c19..274a271 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSource.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSource.java
@@ -34,6 +34,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.handler.dataimport.JdbcDataSource.ResultSetIterator;
 import org.junit.After;
@@ -211,8 +213,7 @@ public class TestJdbcDataSource extends AbstractDataImportHandlerTestCase {
     SQLException sqlException = new SQLException("fake");
     when(dataSource.getConnection()).thenThrow(sqlException);
 
-    SQLException ex = expectThrows(SQLException.class,
-        () -> jdbcDataSource.createConnectionFactory(context, props).call());
+    SQLException ex = SolrTestCaseUtil.expectThrows(SQLException.class, () -> jdbcDataSource.createConnectionFactory(context, props).call());
     assertSame(sqlException, ex);
 
     verify(dataSource).getConnection();
@@ -228,8 +229,7 @@ public class TestJdbcDataSource extends AbstractDataImportHandlerTestCase {
     when(dataSource.getConnection()).thenReturn(connection);
     doThrow(sqlException).when(connection).setAutoCommit(false);
 
-    DataImportHandlerException ex = expectThrows(DataImportHandlerException.class,
-        () -> jdbcDataSource.createConnectionFactory(context, props).call());
+    DataImportHandlerException ex = SolrTestCaseUtil.expectThrows(DataImportHandlerException.class, () -> jdbcDataSource.createConnectionFactory(context, props).call());
     assertSame(sqlException, ex.getCause());
 
     verify(dataSource).getConnection();
@@ -252,8 +252,7 @@ public class TestJdbcDataSource extends AbstractDataImportHandlerTestCase {
         .thenReturn(statement);
     when(statement.execute("query")).thenThrow(sqlException);
 
-    DataImportHandlerException ex = expectThrows(DataImportHandlerException.class,
-        () -> jdbcDataSource.getData("query"));
+    DataImportHandlerException ex = SolrTestCaseUtil.expectThrows(DataImportHandlerException.class, () -> jdbcDataSource.getData("query"));
     assertSame(sqlException, ex.getCause());
 
     verify(dataSource).getConnection();
@@ -597,7 +596,7 @@ public class TestJdbcDataSource extends AbstractDataImportHandlerTestCase {
   }
   
   private String createEncryptionKeyFile() throws IOException {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
     byte[] content = "secret".getBytes(StandardCharsets.UTF_8);
     createFile(tmpdir, "enckeyfile.txt", content, false);
     return new File(tmpdir, "enckeyfile.txt").getAbsolutePath();
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSourceConvertType.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSourceConvertType.java
index e4576c8..e5d77b3 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSourceConvertType.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestJdbcDataSourceConvertType.java
@@ -16,10 +16,6 @@
  */
 package org.apache.solr.handler.dataimport;
 
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakAction;
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakZombies;
 import org.apache.lucene.util.LuceneTestCase;
 import org.junit.BeforeClass;
 
@@ -43,7 +39,7 @@ public class TestJdbcDataSourceConvertType extends AbstractDataImportHandlerTest
 
   public void testConvertType() throws Throwable {
     final Locale loc = Locale.getDefault();
-    assumeFalse("Derby is not happy with locale sr-Latn-*",
+    LuceneTestCase.assumeFalse("Derby is not happy with locale sr-Latn-*",
         Objects.equals(new Locale("sr").getLanguage(), loc.getLanguage()) &&
         Objects.equals("Latn", loc.getScript()));
 
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestNonWritablePersistFile.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestNonWritablePersistFile.java
index ee8979b..5a88390 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestNonWritablePersistFile.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestNonWritablePersistFile.java
@@ -21,6 +21,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.core.SolrCore;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -55,8 +57,8 @@ public class TestNonWritablePersistFile extends AbstractDataImportHandlerTestCas
 
   @BeforeClass
   public static void createTempSolrHomeAndCore() throws Exception {
-    tmpSolrHome = createTempDir().toFile().getAbsolutePath();
-    FileUtils.copyDirectory(getFile("dih/solr"), new File(tmpSolrHome).getAbsoluteFile());
+    tmpSolrHome = SolrTestUtil.createTempDir().toFile().getAbsolutePath();
+    FileUtils.copyDirectory(SolrTestUtil.getFile("dih/solr"), new File(tmpSolrHome).getAbsoluteFile());
     initCore("dataimport-solrconfig.xml", "dataimport-schema.xml", 
              new File(tmpSolrHome).getAbsolutePath());
     
@@ -70,9 +72,9 @@ public class TestNonWritablePersistFile extends AbstractDataImportHandlerTestCas
     filePath += "dataimport.properties";
     f = new File(filePath);
     // execute the test only if we are able to set file to read only mode
-    assumeTrue("No dataimport.properties file", f.exists() || f.createNewFile());
-    assumeTrue("dataimport.properties can't be set read only", f.setReadOnly());
-    assumeFalse("dataimport.properties is still writable even though " + 
+    LuceneTestCase.assumeTrue("No dataimport.properties file", f.exists() || f.createNewFile());
+    LuceneTestCase.assumeTrue("dataimport.properties can't be set read only", f.setReadOnly());
+    LuceneTestCase.assumeFalse("dataimport.properties is still writable even though " +
                 "marked readonly - test running as superuser?", f.canWrite());
   }
   
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java
index 44418ea..bd62b83 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestScriptTransformer.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.handler.dataimport;
 
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.handler.dataimport.config.DIHConfiguration;
 import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl;
 import org.junit.Test;
@@ -50,8 +52,8 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
       sep.init(context);
       sep.applyTransformer(map);
       assertEquals("Hello Scott", map.get("name").toString());
-    } catch (DataImportHandlerException e) {    
-      assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
+    } catch (DataImportHandlerException e) {
+      LuceneTestCase.assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
           .getMessage().startsWith("Cannot load Script Engine for language"));
       throw e;
     }
@@ -59,7 +61,7 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
 
   @Test
   public void testEvil() {
-    assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
+    LuceneTestCase.assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
     String script = "function f1(row) {"
             + "var os = Packages.java.lang.System.getProperty('os.name');"
             + "row.put('name', os);"
@@ -71,10 +73,10 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
     map.put("name", "Scott");
     EntityProcessorWrapper sep = new EntityProcessorWrapper(new SqlEntityProcessor(), null, null);
     sep.init(context);
-    DataImportHandlerException expected = expectThrows(DataImportHandlerException.class, () -> {
+    DataImportHandlerException expected = SolrTestCaseUtil.expectThrows(DataImportHandlerException.class, () -> {
       sep.applyTransformer(map);
     });
-    assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.",
+    LuceneTestCase.assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.",
         expected.getMessage().startsWith("Cannot load Script Engine for language"));
     assertTrue(expected.getCause().toString(), SecurityException.class.isAssignableFrom(expected.getCause().getClass()));
   }
@@ -105,8 +107,8 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
       sep.init(context);
       sep.applyTransformer(map);
       assertEquals("Hello Scott", map.get("name").toString());
-    } catch (DataImportHandlerException e) {   
-      assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
+    } catch (DataImportHandlerException e) {
+      LuceneTestCase.assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
           .getMessage().startsWith("Cannot load Script Engine for language"));
       throw e;
     }
@@ -121,8 +123,8 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
       DataImporter di = new DataImporter();
       DIHConfiguration dc = di.readFromXml(document);
       assertTrue(dc.getScript().getText().indexOf("checkNextToken") > -1);
-    } catch (DataImportHandlerException e) {    
-      assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
+    } catch (DataImportHandlerException e) {
+      LuceneTestCase.assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
           .getMessage().startsWith("Cannot load Script Engine for language"));
       throw e;
     }
@@ -150,8 +152,8 @@ public class TestScriptTransformer extends AbstractDataImportHandlerTestCase {
       map.put("nextToken", "");
       sep.applyTransformer(map);
       assertNull(map.get("$hasMore"));
-    } catch (DataImportHandlerException e) {    
-      assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
+    } catch (DataImportHandlerException e) {
+      LuceneTestCase.assumeFalse("This JVM does not have JavaScript installed.  Test Skipped.", e
           .getMessage().startsWith("Cannot load Script Engine for language"));
       throw e;
     }
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSimplePropertiesWriter.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSimplePropertiesWriter.java
index 7f42abe..eca2110 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSimplePropertiesWriter.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSimplePropertiesWriter.java
@@ -27,6 +27,7 @@ import java.util.Locale;
 import java.util.Map;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.junit.Before;
 import org.junit.Test;
@@ -46,7 +47,7 @@ public class TestSimplePropertiesWriter extends AbstractDIHJdbcTestCase {
   
   @Before
   public void spwBefore() throws Exception {
-    fileLocation = createTempDir().toFile().getAbsolutePath();
+    fileLocation = SolrTestUtil.createTempDir().toFile().getAbsolutePath();
     fileName = "the.properties";
   }
 
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSolrEntityProcessorEndToEnd.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSolrEntityProcessorEndToEnd.java
index 1ba9469..4600089 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSolrEntityProcessorEndToEnd.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestSolrEntityProcessorEndToEnd.java
@@ -32,6 +32,7 @@ import java.util.Properties;
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
@@ -340,7 +341,7 @@ public class TestSolrEntityProcessorEndToEnd extends AbstractDataImportHandlerTe
     }
 
     public void setUp() throws Exception {
-      homeDir = createTempDir().toFile();
+      homeDir = SolrTestUtil.createTempDir().toFile();
       dataDir = new File(homeDir + "/collection1", "data");
       confDir = new File(homeDir + "/collection1", "conf");
       
@@ -348,14 +349,14 @@ public class TestSolrEntityProcessorEndToEnd extends AbstractDataImportHandlerTe
       dataDir.mkdirs();
       confDir.mkdirs();
 
-      FileUtils.copyFile(getFile(getSolrXmlFile()), new File(homeDir, "solr.xml"));
+      FileUtils.copyFile(SolrTestUtil.getFile(getSolrXmlFile()), new File(homeDir, "solr.xml"));
       File f = new File(confDir, "solrconfig.xml");
-      FileUtils.copyFile(getFile(getSolrConfigFile()), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(getSolrConfigFile()), f);
       f = new File(confDir, "schema.xml");
       
-      FileUtils.copyFile(getFile(getSchemaFile()), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(getSchemaFile()), f);
       f = new File(confDir, "data-config.xml");
-      FileUtils.copyFile(getFile(SOURCE_CONF_DIR + "dataconfig-contentstream.xml"), f);
+      FileUtils.copyFile(SolrTestUtil.getFile(SOURCE_CONF_DIR + "dataconfig-contentstream.xml"), f);
 
       Files.createFile(confDir.toPath().resolve("../core.properties"));
     }
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathEntityProcessor.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathEntityProcessor.java
index e2200ea..cf7b9dc 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathEntityProcessor.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathEntityProcessor.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.solr.SolrTestUtil;
 import org.junit.Test;
 
 /**
@@ -44,7 +45,7 @@ public class TestXPathEntityProcessor extends AbstractDataImportHandlerTestCase
   @Test
   @SuppressWarnings({"unchecked"})
   public void withFieldsAndXpath() throws Exception {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
     
     createFile(tmpdir, "x.xsl", xsl.getBytes(StandardCharsets.UTF_8), false);
     @SuppressWarnings({"rawtypes"})
@@ -346,7 +347,7 @@ public class TestXPathEntityProcessor extends AbstractDataImportHandlerTestCase
   @Test
   @SuppressWarnings({"unchecked"})
   public void withDefaultSolrAndXsl() throws Exception {
-    File tmpdir = createTempDir().toFile();
+    File tmpdir = SolrTestUtil.createTempDir().toFile();
     AbstractDataImportHandlerTestCase.createFile(tmpdir, "x.xsl", xsl.getBytes(StandardCharsets.UTF_8),
             false);
 
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathRecordReader.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathRecordReader.java
index fe8c657..6337d16 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathRecordReader.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestXPathRecordReader.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.solr.SolrTestCaseUtil;
 import org.junit.Test;
 
 /**
@@ -361,11 +362,11 @@ public class TestXPathRecordReader extends AbstractDataImportHandlerTestCase {
 
   @Test
   public void testUnsupportedXPaths() {
-    RuntimeException ex = expectThrows(RuntimeException.class, () -> new XPathRecordReader("//b"));
+    RuntimeException ex = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> new XPathRecordReader("//b"));
     assertEquals("forEach cannot start with '//': //b", ex.getMessage());
 
     XPathRecordReader rr = new XPathRecordReader("/anyd/contenido");
-    ex = expectThrows(RuntimeException.class, () -> rr.addField("bold", "b", false));
+    ex = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> rr.addField("bold", "b", false));
     assertEquals("xpath must start with '/' : b", ex.getMessage());
   }
 
@@ -585,7 +586,7 @@ public class TestXPathRecordReader extends AbstractDataImportHandlerTestCase {
     XPathRecordReader rr = new XPathRecordReader("/root/node");
     rr.addField("id", "/root/node/id", true);
     rr.addField("desc", "/root/node/desc", true);
-    RuntimeException e = expectThrows(RuntimeException.class, () -> rr.getAllRecords(new StringReader(malformedXml)));
+    RuntimeException e = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> rr.getAllRecords(new StringReader(malformedXml)));
     assertTrue(e.getMessage().contains("Unexpected close tag </id>"));
  }
 }
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java
index 2ed9d8e..4d686f9 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestZKPropertiesWriter.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.cloud.ZkTestServer;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.SuppressForbidden;
@@ -56,7 +57,7 @@ public class TestZKPropertiesWriter extends AbstractDataImportHandlerTestCase {
 
   @BeforeClass
   public static void dihZk_beforeClass() throws Exception {
-    zkDir = createTempDir("zkData");
+    zkDir = SolrTestUtil.createTempDir("zkData");
     zkServer = new ZkTestServer(zkDir);
     zkServer.run();
 
@@ -70,7 +71,7 @@ public class TestZKPropertiesWriter extends AbstractDataImportHandlerTestCase {
 //        "dataimport-solrconfig.xml", "dataimport-schema.xml");
 
     //initCore("solrconfig.xml", "schema.xml", getFile("dih/solr").getAbsolutePath());
-    cc = createDefaultCoreContainer(getFile("dih/solr").toPath());
+    cc = createDefaultCoreContainer(SolrTestUtil.getFile("dih/solr").toPath());
   }
 
   @Before
diff --git a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
index 978e9fd..6487a8c 100644
--- a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
+++ b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
@@ -21,7 +21,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
@@ -50,10 +53,10 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     if (!tzDisplayName.matches("[A-Za-z]{3,}([+-]\\d\\d(:\\d\\d)?)?")) {
       assertTrue("Is some other JVM affected?  Or bad regex? TzDisplayName: " + tzDisplayName,
           System.getProperty("java.version").startsWith("11"));
-      assumeTrue("SOLR-12759 JDK 11 (1st release) and Tika 1.x can result in extracting dates in a bad format.", false);
+      LuceneTestCase.assumeTrue("SOLR-12759 JDK 11 (1st release) and Tika 1.x can result in extracting dates in a bad format.", false);
     }
 
-    initCore("solrconfig.xml", "schema.xml", getFile("extraction/solr").getAbsolutePath());
+    initCore("solrconfig.xml", "schema.xml", SolrTestUtil.getFile("extraction/solr").getAbsolutePath());
   }
 
   @Override
@@ -237,11 +240,8 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     try {
       ignoreException("unknown field 'a'");
       ignoreException("unknown field 'meta'");  // TODO: should this exception be happening?
-      expectThrows(SolrException.class, () -> {
-        loadLocal("extraction/simple.html",
-            "literal.id", "simple2",
-            "lowernames", "true",
-            "captureAttr", "true",
+      SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+        loadLocal("extraction/simple.html", "literal.id", "simple2", "lowernames", "true", "captureAttr", "true",
             //"fmap.content_type", "abcxyz",
             "commit", "true"  // test immediate commit
         );
@@ -463,7 +463,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     BufferingRequestProcessor p = new BufferingRequestProcessor(null);
 
     ExtractingDocumentLoader loader = (ExtractingDocumentLoader) handler.newLoader(req, p);
-    loader.load(req, rsp, new ContentStreamBase.FileStream(getFile("extraction/version_control.txt")),p);
+    loader.load(req, rsp, new ContentStreamBase.FileStream(SolrTestUtil.getFile("extraction/version_control.txt")),p);
 
     AddUpdateCommand add = p.addCommands.get(0);
     assertEquals(200, add.commitWithin);
@@ -570,7 +570,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
-    expectThrows(Exception.class, () -> {
+    SolrTestCaseUtil.expectThrows(Exception.class, () -> {
       loadLocal("extraction/password-is-solrcell.docx", "literal.id", "one");
     });
     assertU(commit());
@@ -601,20 +601,14 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
-    expectThrows(Exception.class, () -> {
+    SolrTestCaseUtil.expectThrows(Exception.class, () -> {
       // Load plain text specifying another mime type, should fail
-      loadLocal("extraction/version_control.txt",
-          "literal.id", "one",
-          ExtractingParams.STREAM_TYPE, "application/pdf"
-      );
+      loadLocal("extraction/version_control.txt", "literal.id", "one", ExtractingParams.STREAM_TYPE, "application/pdf");
     });
 
-    expectThrows(Exception.class, () -> {
+    SolrTestCaseUtil.expectThrows(Exception.class, () -> {
       // Load plain text specifying non existing mimetype, should fail
-      loadLocal("extraction/version_control.txt",
-          "literal.id", "one",
-          ExtractingParams.STREAM_TYPE, "foo/bar"
-      );
+      loadLocal("extraction/version_control.txt", "literal.id", "one", ExtractingParams.STREAM_TYPE, "foo/bar");
     });
   }
 
@@ -779,7 +773,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
       // TODO: stop using locally defined streams once stream.file and
       // stream.body work everywhere
       List<ContentStream> cs = new ArrayList<>();
-      cs.add(new ContentStreamBase.FileStream(getFile(filename)));
+      cs.add(new ContentStreamBase.FileStream(SolrTestUtil.getFile(filename)));
       req.setContentStreams(cs);
       return h.queryAndResponse(handler, req);
     } finally {
diff --git a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/TestXLSXResponseWriter.java b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/TestXLSXResponseWriter.java
index 84be003..49b5289 100644
--- a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/TestXLSXResponseWriter.java
+++ b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/TestXLSXResponseWriter.java
@@ -30,6 +30,7 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.core.SolrCore;
@@ -50,7 +51,7 @@ public class TestXLSXResponseWriter extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
     System.setProperty("enable.update.log", "false");
-    initCore("solrconfig.xml","schema.xml",getFile("extraction/solr").getAbsolutePath());
+    initCore("solrconfig.xml","schema.xml", SolrTestUtil.getFile("extraction/solr").getAbsolutePath());
     createIndex();
     //find a reference to the default response writer so we can redirect its output later
     SolrCore testCore = h.getCore();
diff --git a/solr/contrib/jaegertracer-configurator/src/test/org/apache/solr/jaeger/TestJaegerConfigurator.java b/solr/contrib/jaegertracer-configurator/src/test/org/apache/solr/jaeger/TestJaegerConfigurator.java
index 9e4d995..dd159fe 100644
--- a/solr/contrib/jaegertracer-configurator/src/test/org/apache/solr/jaeger/TestJaegerConfigurator.java
+++ b/solr/contrib/jaegertracer-configurator/src/test/org/apache/solr/jaeger/TestJaegerConfigurator.java
@@ -22,6 +22,8 @@ import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -47,9 +49,9 @@ public class TestJaegerConfigurator extends SolrTestCaseJ4 {
 
   @Test
   public void testInjected() throws Exception{
-    MiniSolrCloudCluster cluster = new SolrCloudTestCase.Builder(2, createTempDir())
-        .addConfig("config", TEST_PATH().resolve("collection1").resolve("conf"))
-        .withSolrXml(getFile("solr/solr.xml").toPath())
+    MiniSolrCloudCluster cluster = new SolrCloudTestCase.Builder(2, SolrTestUtil.createTempDir())
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("collection1").resolve("conf"))
+        .withSolrXml(SolrTestUtil.getFile("solr/solr.xml").toPath())
         .build();
     CollectionAdminRequest.setClusterProperty(ZkStateReader.SAMPLE_PERCENTAGE, "100.0")
         .process(cluster.getSolrClient());
@@ -74,11 +76,11 @@ public class TestJaegerConfigurator extends SolrTestCaseJ4 {
   public void testRequiredParameters() throws IOException {
     JaegerTracerConfigurator configurator = new JaegerTracerConfigurator();
     NamedList initArgs = new NamedList();
-    IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    IllegalArgumentException exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(AGENT_HOST) || exc.getMessage().contains(AGENT_PORT));
     initArgs.add(AGENT_HOST, "localhost");
 
-    exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(AGENT_PORT));
     initArgs.add(AGENT_PORT, 5775);
 
@@ -100,34 +102,34 @@ public class TestJaegerConfigurator extends SolrTestCaseJ4 {
     initArgs.add(AGENT_HOST, 100);
     initArgs.add(AGENT_PORT, 5775);
 
-    IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    IllegalArgumentException exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(AGENT_HOST));
 
     initArgs.clear();
     initArgs.add(AGENT_HOST, "localhost");
     initArgs.add(AGENT_PORT, "5775");
-    exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(AGENT_PORT));
 
     initArgs.clear();
     initArgs.add(AGENT_HOST, "localhost");
     initArgs.add(AGENT_PORT, 5775);
     initArgs.add(LOG_SPANS, 10);
-    SolrException solrExc = expectThrows(SolrException.class, () -> configurator.init(initArgs));
+    SolrException solrExc = SolrTestCaseUtil.expectThrows(SolrException.class, () -> configurator.init(initArgs));
     assertTrue(solrExc.getMessage().contains(LOG_SPANS));
 
     initArgs.clear();
     initArgs.add(AGENT_HOST, "localhost");
     initArgs.add(AGENT_PORT, 5775);
     initArgs.add(FLUSH_INTERVAL, "10");
-    exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(FLUSH_INTERVAL));
 
     initArgs.clear();
     initArgs.add(AGENT_HOST, "localhost");
     initArgs.add(AGENT_PORT, 5775);
     initArgs.add(MAX_QUEUE_SIZE, "10");
-    exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
+    exc = SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
     assertTrue(exc.getMessage().contains(MAX_QUEUE_SIZE));
 
   }
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
index 5f8232f..3fb9e6b 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.core.SolrCore;
@@ -37,7 +38,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    initCore("solrconfig-languageidentifier.xml", "schema.xml", getFile("langid/solr").getAbsolutePath());
+    initCore("solrconfig-languageidentifier.xml", "schema.xml", SolrTestUtil.getFile("langid/solr").getAbsolutePath());
     SolrCore core = h.getCore();
     UpdateRequestProcessorChain chained = core.getUpdateProcessingChain("lang_id_tika");
     assertNotNull(chained);
diff --git a/solr/contrib/ltr/src/java/org/apache/solr/ltr/search/LTRQParserPlugin.java b/solr/contrib/ltr/src/java/org/apache/solr/ltr/search/LTRQParserPlugin.java
index a834165..f30c1fb 100644
--- a/solr/contrib/ltr/src/java/org/apache/solr/ltr/search/LTRQParserPlugin.java
+++ b/solr/contrib/ltr/src/java/org/apache/solr/ltr/search/LTRQParserPlugin.java
@@ -193,7 +193,7 @@ public class LTRQParserPlugin extends QParserPlugin implements ResourceLoaderAwa
    * A learning to rank Query, will incapsulate a learning to rank model, and delegate to it the rescoring
    * of the documents.
    **/
-  public class LTRQuery extends AbstractReRankQuery {
+  public static class LTRQuery extends AbstractReRankQuery {
     private final LTRScoringQuery scoringQuery;
 
     public LTRQuery(LTRScoringQuery scoringQuery, int reRankDocs) {
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java
index df7d9a5..05f2ed5 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRQParserPlugin.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.ltr;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.junit.After;
 import org.junit.Before;
@@ -41,7 +42,7 @@ public class TestLTRQParserPlugin extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void ltrModelIdMissingTest() throws Exception {
     final String solrQuery = "_query_:{!edismax qf='title' mm=100% v='bloomberg' tie=0.1}";
     final SolrQuery query = new SolrQuery();
@@ -56,7 +57,7 @@ public class TestLTRQParserPlugin extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void ltrModelIdDoesNotExistTest() throws Exception {
     final String solrQuery = "_query_:{!edismax qf='title' mm=100% v='bloomberg' tie=0.1}";
     final SolrQuery query = new SolrQuery();
@@ -71,7 +72,7 @@ public class TestLTRQParserPlugin extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void ltrBadRerankDocsTest() throws Exception {
     final String solrQuery = "_query_:{!edismax qf='title' mm=100% v='bloomberg' tie=0.1}";
     final SolrQuery query = new SolrQuery();
@@ -86,7 +87,7 @@ public class TestLTRQParserPlugin extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void ltrMoreResultsThanReRankedTest() throws Exception {
     final String solrQuery = "_query_:{!edismax qf='title' mm=100% v='bloomberg' tie=0.1}";
     final SolrQuery query = new SolrQuery();
@@ -120,7 +121,7 @@ public class TestLTRQParserPlugin extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void ltrNoResultsTest() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("title:bloomberg23");
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRReRankingPipeline.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRReRankingPipeline.java
index 039a881..e23229a 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRReRankingPipeline.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRReRankingPipeline.java
@@ -41,6 +41,7 @@ import org.apache.lucene.search.ScoreMode;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.ltr.feature.Feature;
@@ -63,7 +64,7 @@ public class TestLTRReRankingPipeline extends SolrTestCase {
     final boolean wrapWithAssertions = false;
      // 'no' to asserting wrap because lucene AssertingWeight
      // cannot be cast to solr LTRScoringQuery$ModelWeight
-    final IndexSearcher searcher = newSearcher(r, maybeWrap, wrapWithAssertions);
+    final IndexSearcher searcher = LuceneTestCase.newSearcher(r, maybeWrap, wrapWithAssertions);
 
     return searcher;
   }
@@ -107,22 +108,22 @@ public class TestLTRReRankingPipeline extends SolrTestCase {
 
   @Test
   public void testRescorer() throws IOException {
-    final Directory dir = newDirectory();
+    final Directory dir = LuceneTestCase.newDirectory();
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
 
     Document doc = new Document();
-    doc.add(newStringField("id", "0", Field.Store.YES));
-    doc.add(newTextField("field", "wizard the the the the the oz",
+    doc.add(LuceneTestCase.newStringField("id", "0", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard the the the the the oz",
         Field.Store.NO));
-    doc.add(newStringField("final-score", "F", Field.Store.YES)); // TODO: change to numeric field
+    doc.add(LuceneTestCase.newStringField("final-score", "F", Field.Store.YES)); // TODO: change to numeric field
 
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "1", Field.Store.YES));
+    doc.add(LuceneTestCase.newStringField("id", "1", Field.Store.YES));
     // 1 extra token, but wizard and oz are close;
-    doc.add(newTextField("field", "wizard oz the the the the the the",
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz the the the the the the",
         Field.Store.NO));
-    doc.add(newStringField("final-score", "T", Field.Store.YES)); // TODO: change to numeric field
+    doc.add(LuceneTestCase.newStringField("final-score", "T", Field.Store.YES)); // TODO: change to numeric field
     w.addDocument(doc);
 
     final IndexReader r = w.getReader();
@@ -161,37 +162,37 @@ public class TestLTRReRankingPipeline extends SolrTestCase {
 
   }
 
-  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-11134")
+  @LuceneTestCase.AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-11134")
   @Test
   public void testDifferentTopN() throws IOException {
-    final Directory dir = newDirectory();
+    final Directory dir = LuceneTestCase.newDirectory();
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
 
     Document doc = new Document();
-    doc.add(newStringField("id", "0", Field.Store.YES));
-    doc.add(newTextField("field", "wizard oz oz oz oz oz", Field.Store.NO));
+    doc.add(LuceneTestCase.newStringField("id", "0", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz oz oz oz oz", Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 1.0f));
     w.addDocument(doc);
 
     doc = new Document();
-    doc.add(newStringField("id", "1", Field.Store.YES));
-    doc.add(newTextField("field", "wizard oz oz oz oz the", Field.Store.NO));
+    doc.add(LuceneTestCase.newStringField("id", "1", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz oz oz oz the", Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 2.0f));
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "2", Field.Store.YES));
-    doc.add(newTextField("field", "wizard oz oz oz the the ", Field.Store.NO));
+    doc.add(LuceneTestCase.newStringField("id", "2", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz oz oz the the ", Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 3.0f));
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "3", Field.Store.YES));
-    doc.add(newTextField("field", "wizard oz oz the the the the ",
+    doc.add(LuceneTestCase.newStringField("id", "3", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz oz the the the the ",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 4.0f));
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "4", Field.Store.YES));
-    doc.add(newTextField("field", "wizard oz the the the the the the",
+    doc.add(LuceneTestCase.newStringField("id", "4", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz the the the the the the",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 5.0f));
     w.addDocument(doc);
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRScoringQuery.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRScoringQuery.java
index b93a21a..bef198c 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRScoringQuery.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestLTRScoringQuery.java
@@ -41,6 +41,7 @@ import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.ltr.feature.Feature;
@@ -56,7 +57,7 @@ import org.junit.Test;
 public class TestLTRScoringQuery extends SolrTestCase {
 
   private IndexSearcher getSearcher(IndexReader r) {
-    final IndexSearcher searcher = newSearcher(r, false, false);
+    final IndexSearcher searcher = LuceneTestCase.newSearcher(r, false, false);
     return searcher;
   }
 
@@ -172,20 +173,20 @@ public class TestLTRScoringQuery extends SolrTestCase {
 
   @Test
   public void testLTRScoringQuery() throws IOException, ModelException {
-    final Directory dir = newDirectory();
+    final Directory dir = LuceneTestCase.newDirectory();
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
 
     Document doc = new Document();
-    doc.add(newStringField("id", "0", Field.Store.YES));
-    doc.add(newTextField("field", "wizard the the the the the oz",
+    doc.add(LuceneTestCase.newStringField("id", "0", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard the the the the the oz",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 1.0f));
 
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "1", Field.Store.YES));
+    doc.add(LuceneTestCase.newStringField("id", "1", Field.Store.YES));
     // 1 extra token, but wizard and oz are close;
-    doc.add(newTextField("field", "wizard oz the the the the the the",
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz the the the the the the",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 2.0f));
     w.addDocument(doc);
@@ -269,23 +270,7 @@ public class TestLTRScoringQuery extends SolrTestCase {
 
     // test normalizers
     features = makeFilterFeatures(mixPositions);
-    final Normalizer norm = new Normalizer() {
-
-      @Override
-      public float normalize(float value) {
-        return 42.42f;
-      }
-
-      @Override
-      public LinkedHashMap<String,Object> paramsToMap() {
-        return null;
-      }
-
-      @Override
-      protected void validate() throws NormalizerException {
-      }
-
-    };
+    final Normalizer norm = new MyNormalizer();
     norms =
         new ArrayList<Normalizer>(
             Collections.nCopies(features.size(),norm));
@@ -306,4 +291,21 @@ public class TestLTRScoringQuery extends SolrTestCase {
 
   }
 
+  private static class MyNormalizer extends Normalizer {
+
+    @Override
+    public float normalize(float value) {
+      return 42.42f;
+    }
+
+    @Override
+    public LinkedHashMap<String,Object> paramsToMap() {
+      return null;
+    }
+
+    @Override
+    protected void validate() throws NormalizerException {
+    }
+
+  }
 }
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
index 7b6db02..99f5967 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestRerankBase.java
@@ -32,7 +32,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
@@ -139,10 +139,10 @@ public class TestRerankBase extends RestTestBase {
   protected static SortedMap<ServletHolder,String>  setupTestInit(
       String solrconfig, String schema,
       boolean isPersistent) throws Exception {
-    tmpSolrHome = createTempDir().toFile();
+    tmpSolrHome = SolrTestUtil.createTempDir().toFile();
     tmpConfDir = new File(tmpSolrHome, CONF_DIR);
     tmpConfDir.deleteOnExit();
-    FileUtils.copyDirectory(new File(TEST_HOME()),
+    FileUtils.copyDirectory(new File(SolrTestUtil.TEST_HOME()),
         tmpSolrHome.getAbsoluteFile());
 
     final File fstore = new File(tmpConfDir, FEATURE_FILE_NAME);
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestSelectiveWeightCreation.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestSelectiveWeightCreation.java
index e6bea7a..84893aa 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestSelectiveWeightCreation.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/TestSelectiveWeightCreation.java
@@ -39,6 +39,7 @@ import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.search.Weight;
 import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.ltr.feature.Feature;
 import org.apache.solr.ltr.feature.ValueFeature;
@@ -49,12 +50,11 @@ import org.apache.solr.ltr.norm.IdentityNormalizer;
 import org.apache.solr.ltr.norm.Normalizer;
 import org.junit.After;
 import org.junit.Before;;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class TestSelectiveWeightCreation extends TestRerankBase {
   private IndexSearcher getSearcher(IndexReader r) {
-    final IndexSearcher searcher = newSearcher(r, false, false);
+    final IndexSearcher searcher = LuceneTestCase.newSearcher(r, false, false);
     return searcher;
   }
 
@@ -118,22 +118,22 @@ public class TestSelectiveWeightCreation extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testScoringQueryWeightCreation() throws IOException, ModelException {
-    final Directory dir = newDirectory();
+    final Directory dir = LuceneTestCase.newDirectory();
     final RandomIndexWriter w = new RandomIndexWriter(random(), dir);
 
     Document doc = new Document();
-    doc.add(newStringField("id", "10", Field.Store.YES));
-    doc.add(newTextField("field", "wizard the the the the the oz",
+    doc.add(LuceneTestCase.newStringField("id", "10", Field.Store.YES));
+    doc.add(LuceneTestCase.newTextField("field", "wizard the the the the the oz",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 1.0f));
 
     w.addDocument(doc);
     doc = new Document();
-    doc.add(newStringField("id", "11", Field.Store.YES));
+    doc.add(LuceneTestCase.newStringField("id", "11", Field.Store.YES));
     // 1 extra token, but wizard and oz are close;
-    doc.add(newTextField("field", "wizard oz the the the the the the",
+    doc.add(LuceneTestCase.newTextField("field", "wizard oz the the the the the the",
         Field.Store.NO));
     doc.add(new FloatDocValuesField("final-score", 2.0f));
     w.addDocument(doc);
@@ -204,7 +204,7 @@ public class TestSelectiveWeightCreation extends TestRerankBase {
 
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testSelectiveWeightsRequestFeaturesFromDifferentStore() throws Exception {
 
 //    final String docs0fv_sparse = FeatureLoggerTestUtils.toFeatureVector(
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestExternalFeatures.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestExternalFeatures.java
index f42cebd..f94711c 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestExternalFeatures.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestExternalFeatures.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.ltr.feature;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.ltr.FeatureLoggerTestUtils;
 import org.apache.solr.ltr.TestRerankBase;
@@ -52,7 +53,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testEfiInTransformerShouldNotChangeOrderOfRerankedResults() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -88,7 +89,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testFeaturesUseStopwordQueryReturnEmptyFeatureVector() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -110,7 +111,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testEfiFeatureExtraction() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -136,7 +137,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void featureExtraction_valueFeatureImplicitlyNotRequired_shouldNotScoreFeature() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -157,7 +158,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void featureExtraction_valueFeatureExplicitlyNotRequired_shouldNotScoreFeature() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -178,7 +179,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void featureExtraction_valueFeatureRequired_shouldThrowException() throws Exception {
     final SolrQuery query = new SolrQuery();
     query.setQuery("*:*");
@@ -191,7 +192,7 @@ public class TestExternalFeatures extends TestRerankBase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void featureExtraction_valueFeatureRequiredInFq_shouldThrowException() throws Exception {
     final String userTitlePhrase1 = "userTitlePhrase1";
     final String userTitlePhrase2 = "userTitlePhrase2";
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestValueFeature.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestValueFeature.java
index 52f4e43..30a6435 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestValueFeature.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/feature/TestValueFeature.java
@@ -19,6 +19,7 @@ package org.apache.solr.ltr.feature;
 import java.util.LinkedHashMap;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.ltr.TestRerankBase;
 import org.apache.solr.ltr.model.LinearModel;
@@ -53,7 +54,7 @@ public class TestValueFeature extends TestRerankBase {
   public void testValueFeatureWithEmptyValue() throws Exception {
     final RuntimeException expectedException =
         new RuntimeException("mismatch: '0'!='500' @ responseHeader/status");
-    RuntimeException e = expectThrows(RuntimeException.class, () -> {
+    RuntimeException e = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> {
       loadFeature("c2", ValueFeature.class.getName(), "{\"value\":\"\"}");
     });
     assertEquals(expectedException.toString(), e.toString());
@@ -63,7 +64,7 @@ public class TestValueFeature extends TestRerankBase {
   public void testValueFeatureWithWhitespaceValue() throws Exception {
     final RuntimeException expectedException =
         new RuntimeException("mismatch: '0'!='500' @ responseHeader/status");
-    RuntimeException e = expectThrows(RuntimeException.class, () -> {
+    RuntimeException e = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> {
       loadFeature("c2", ValueFeature.class.getName(), "{\"value\":\" \"}");
     });
     assertEquals(expectedException.toString(), e.toString());
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestLinearModel.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestLinearModel.java
index c9abced..72dc1e1 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestLinearModel.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestLinearModel.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.ltr.TestRerankBase;
@@ -108,9 +109,8 @@ public class TestLinearModel extends TestRerankBase {
         {"constant1", "constant5"});
     final List<Normalizer> norms =
         new ArrayList<>(Collections.nCopies(features.size(),IdentityNormalizer.INSTANCE));
-    ModelException ex = expectThrows(ModelException.class, () -> {
-      createLinearModel("test2",
-          features, norms, "test", fstore.getFeatures(), null);
+    ModelException ex = SolrTestCaseUtil.expectThrows(ModelException.class, () -> {
+      createLinearModel("test2", features, norms, "test", fstore.getFeatures(), null);
     });
     assertEquals(expectedException.toString(), ex.toString());
   }
@@ -131,9 +131,8 @@ public class TestLinearModel extends TestRerankBase {
 
     Map<String,Object> params = new HashMap<>();
     params.put("weights", weights);
-    SolrException ex = expectThrows(SolrException.class, () -> {
-      final LTRScoringModel ltrScoringModel = createLinearModel("test3",
-          features, norms, "test", fstore.getFeatures(), params);
+    SolrException ex = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+      final LTRScoringModel ltrScoringModel = createLinearModel("test3", features, norms, "test", fstore.getFeatures(), params);
       store.addModel(ltrScoringModel);
       final LTRScoringModel m = store.getModel("test3");
       assertEquals(ltrScoringModel, m);
@@ -156,9 +155,8 @@ public class TestLinearModel extends TestRerankBase {
 
     Map<String,Object> params = new HashMap<>();
     params.put("weights", weights);
-    ModelException ex = expectThrows(ModelException.class, () -> {
-      final LTRScoringModel ltrScoringModel = createLinearModel("test4",
-          features, norms, "test", fstore.getFeatures(), params);
+    ModelException ex = SolrTestCaseUtil.expectThrows(ModelException.class, () -> {
+      final LTRScoringModel ltrScoringModel = createLinearModel("test4", features, norms, "test", fstore.getFeatures(), params);
       store.addModel(ltrScoringModel);
     });
     assertEquals(expectedException.toString(), ex.toString());
@@ -180,9 +178,8 @@ public class TestLinearModel extends TestRerankBase {
 
     Map<String,Object> params = new HashMap<>();
     params.put("weights", weights);
-    ModelException ex = expectThrows(ModelException.class, () -> {
-      createLinearModel("test5",
-          features, norms, "test", fstore.getFeatures(), params);
+    ModelException ex = SolrTestCaseUtil.expectThrows(ModelException.class, () -> {
+      createLinearModel("test5", features, norms, "test", fstore.getFeatures(), params);
     });
     assertEquals(expectedException.toString(), ex.toString());
   }
@@ -200,10 +197,8 @@ public class TestLinearModel extends TestRerankBase {
 
     Map<String,Object> params = new HashMap<>();
     params.put("weights", weights);
-    ModelException ex = expectThrows(ModelException.class, () -> {
-      final LTRScoringModel ltrScoringModel = createLinearModel("test6",
-          features, norms, "test", fstore.getFeatures(),
-          params);
+    ModelException ex = SolrTestCaseUtil.expectThrows(ModelException.class, () -> {
+      final LTRScoringModel ltrScoringModel = createLinearModel("test6", features, norms, "test", fstore.getFeatures(), params);
       store.addModel(ltrScoringModel);
     });
     assertEquals(expectedException.toString(), ex.toString());
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestMultipleAdditiveTreesModel.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestMultipleAdditiveTreesModel.java
index c3a8f5b..db9fd37 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestMultipleAdditiveTreesModel.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestMultipleAdditiveTreesModel.java
@@ -17,6 +17,7 @@
 package org.apache.solr.ltr.model;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.ltr.TestRerankBase;
 import org.junit.After;
@@ -124,9 +125,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoParams() throws Exception {
     final ModelException expectedException =
         new ModelException("no trees declared for model multipleadditivetreesmodel_no_params");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_params.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_params.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -136,9 +136,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestEmptyParams() throws Exception {
     final ModelException expectedException =
         new ModelException("no trees declared for model multipleadditivetreesmodel_no_trees");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_trees.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_trees.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -148,9 +147,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoWeight() throws Exception {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree doesn't contain a weight");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_weight.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_weight.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -160,9 +158,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestTreesParamDoesNotContatinTree() throws Exception {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree doesn't contain a tree");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_tree.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_tree.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -172,9 +169,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoFeaturesSpecified() throws Exception {
     final ModelException expectedException =
         new ModelException("no features declared for model multipleadditivetreesmodel_no_features");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_features.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_features.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -184,9 +180,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoRight() throws Exception {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree node is missing right");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_right.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_right.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -196,9 +191,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoLeft() throws Exception {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree node is missing left");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_left.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_left.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -208,9 +202,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
   public void multipleAdditiveTreesTestNoThreshold() throws Exception {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree node is missing threshold");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_threshold.json",
-          "multipleadditivetreesmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_threshold.json", "multipleadditivetreesmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -221,9 +214,8 @@ public class TestMultipleAdditiveTreesModel extends TestRerankBase {
     final ModelException expectedException =
         new ModelException("MultipleAdditiveTreesModel tree node is leaf with left=-100.0 and right=75.0");
 
-    ModelException ex = expectThrows(ModelException.class, () -> {
-      createModelFromFiles("multipleadditivetreesmodel_no_feature.json",
-          "multipleadditivetreesmodel_features.json");
+    ModelException ex = SolrTestCaseUtil.expectThrows(ModelException.class, () -> {
+      createModelFromFiles("multipleadditivetreesmodel_no_feature.json", "multipleadditivetreesmodel_features.json");
     });
     assertEquals(expectedException.toString(), ex.toString());
   }
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestNeuralNetworkModel.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestNeuralNetworkModel.java
index f542744..c9eb5bb 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestNeuralNetworkModel.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestNeuralNetworkModel.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.ltr.TestRerankBase;
 import org.apache.solr.ltr.feature.Feature;
 import org.apache.solr.ltr.norm.IdentityNormalizer;
@@ -207,9 +208,8 @@ public class TestNeuralNetworkModel extends TestRerankBase {
   public void badActivationTest() throws Exception {
     final ModelException expectedException =
             new ModelException("Invalid activation function (\"sig\") in layer 0 of model \"neuralnetworkmodel_bad_activation\".");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("neuralnetworkmodel_bad_activation.json",
-          "neuralnetworkmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("neuralnetworkmodel_bad_activation.json", "neuralnetworkmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -220,9 +220,8 @@ public class TestNeuralNetworkModel extends TestRerankBase {
     final ModelException expectedException =
             new ModelException("Dimension mismatch in model \"neuralnetworkmodel_mismatch_bias\". " +
                                "Layer 0 has 2 bias weights but 3 weight matrix rows.");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("neuralnetworkmodel_mismatch_bias.json",
-          "neuralnetworkmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("neuralnetworkmodel_mismatch_bias.json", "neuralnetworkmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -233,9 +232,8 @@ public class TestNeuralNetworkModel extends TestRerankBase {
     final ModelException expectedException =
         new ModelException("Dimension mismatch in model \"neuralnetworkmodel_mismatch_input\". The input has " +
                            "4 features, but the weight matrix for layer 0 has 3 columns.");
-    Exception ex = expectThrows(Exception.class,  () -> {
-      createModelFromFiles("neuralnetworkmodel_mismatch_input.json",
-          "neuralnetworkmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("neuralnetworkmodel_mismatch_input.json", "neuralnetworkmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -246,9 +244,8 @@ public class TestNeuralNetworkModel extends TestRerankBase {
     final ModelException expectedException =
         new ModelException("Dimension mismatch in model \"neuralnetworkmodel_mismatch_layers\". The weight matrix " +
                            "for layer 0 has 2 rows, but the weight matrix for layer 1 has 3 columns.");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("neuralnetworkmodel_mismatch_layers.json",
-          "neuralnetworkmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("neuralnetworkmodel_mismatch_layers.json", "neuralnetworkmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
@@ -259,9 +256,8 @@ public class TestNeuralNetworkModel extends TestRerankBase {
     final ModelException expectedException =
         new ModelException("Dimension mismatch in model \"neuralnetworkmodel_too_many_rows\". " +
                            "Layer 1 has 1 bias weights but 2 weight matrix rows.");
-    Exception ex = expectThrows(Exception.class, () -> {
-      createModelFromFiles("neuralnetworkmodel_too_many_rows.json",
-          "neuralnetworkmodel_features.json");
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
+      createModelFromFiles("neuralnetworkmodel_too_many_rows.json", "neuralnetworkmodel_features.json");
     });
     Throwable rootError = getRootCause(ex);
     assertEquals(expectedException.toString(), rootError.toString());
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
index b31a6ba..3b25e3b 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.ltr.TestRerankBase;
 import org.apache.solr.ltr.feature.Feature;
 import org.apache.solr.ltr.feature.ValueFeature;
@@ -68,13 +69,13 @@ public class TestWrapperModel extends TestRerankBase {
     // wrapper model with features
     WrapperModel wrapperModelWithFeatures = new StubWrapperModel("testModel",
         Collections.singletonList(new ValueFeature("val", Collections.emptyMap())), Collections.emptyList());
-    ModelException e = expectThrows(ModelException.class, wrapperModelWithFeatures::validate);
+    ModelException e = SolrTestCaseUtil.expectThrows(ModelException.class, wrapperModelWithFeatures::validate);
     assertEquals("features must be empty for the wrapper model testModel", e.getMessage());
 
     // wrapper model with norms
     WrapperModel wrapperModelWithNorms = new StubWrapperModel("testModel",
         Collections.emptyList(), Collections.singletonList(IdentityNormalizer.INSTANCE));
-    e = expectThrows(ModelException.class, wrapperModelWithNorms::validate);
+    e = SolrTestCaseUtil.expectThrows(ModelException.class, wrapperModelWithNorms::validate);
     assertEquals("norms must be empty for the wrapper model testModel", e.getMessage());
 
     assumeWorkingMockito();
@@ -104,7 +105,7 @@ public class TestWrapperModel extends TestRerankBase {
                   IdentityNormalizer.INSTANCE,
                   IdentityNormalizer.INSTANCE)
               );
-      e = expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
+      e = SolrTestCaseUtil.expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
       assertEquals("wrapper feature store name (_DEFAULT_) must match the wrapped feature store name (wrappedFeatureStore)", e.getMessage());
     }
 
@@ -117,7 +118,7 @@ public class TestWrapperModel extends TestRerankBase {
                   IdentityNormalizer.INSTANCE,
                   IdentityNormalizer.INSTANCE)
               );
-      e = expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
+      e = SolrTestCaseUtil.expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
       assertEquals("no features declared for model testModel", e.getMessage());
     }
 
@@ -130,7 +131,7 @@ public class TestWrapperModel extends TestRerankBase {
                   new ValueFeature("v2", Collections.emptyMap())),
               Collections.emptyList()
               );
-      e = expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
+      e = SolrTestCaseUtil.expectThrows(ModelException.class, () -> wrapperModel.updateModel(wrappedModel));
       assertEquals("counted 2 features and 0 norms in model testModel", e.getMessage());
     }
   }
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestMinMaxNormalizer.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestMinMaxNormalizer.java
index fb50993..c492404 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestMinMaxNormalizer.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestMinMaxNormalizer.java
@@ -21,7 +21,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.solr.SolrTestCase;
-import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -102,7 +102,7 @@ public class TestMinMaxNormalizer extends SolrTestCase {
     final NormalizerException expectedException =
         new NormalizerException("MinMax Normalizer delta must not be zero "
             + "| min = 10.0,max = 10.0,delta = 0.0");
-    NormalizerException ex = SolrTestCaseJ4.expectThrows(NormalizerException.class,
+    NormalizerException ex = SolrTestCaseUtil.expectThrows(NormalizerException.class,
         () -> implTestMinMax(params, 10.0f, 10.0f)
     );
     assertEquals(expectedException.toString(), ex.toString());
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestStandardNormalizer.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestStandardNormalizer.java
index bea3d28..9305ef4 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestStandardNormalizer.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/norm/TestStandardNormalizer.java
@@ -21,7 +21,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.solr.SolrTestCase;
-import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -73,7 +73,7 @@ public class TestStandardNormalizer extends SolrTestCase {
     final NormalizerException expectedException =
         new NormalizerException("Standard Normalizer standard deviation must be positive "
             + "| avg = 0.0,std = 0.0");
-    NormalizerException ex = SolrTestCaseJ4.expectThrows(NormalizerException.class,
+    NormalizerException ex = SolrTestCaseUtil.expectThrows(NormalizerException.class,
         () -> implTestStandard(params, 0.0f, 0.0f)
     );
     assertEquals(expectedException.toString(), ex.toString());
@@ -87,7 +87,7 @@ public class TestStandardNormalizer extends SolrTestCase {
         new NormalizerException("Standard Normalizer standard deviation must be positive "
             + "| avg = 0.0,std = -1.0");
 
-    NormalizerException ex = SolrTestCaseJ4.expectThrows(NormalizerException.class,
+    NormalizerException ex = SolrTestCaseUtil.expectThrows(NormalizerException.class,
         () -> implTestStandard(params, 0.0f, -1f)
     );
     assertEquals(expectedException.toString(), ex.toString());
@@ -102,7 +102,7 @@ public class TestStandardNormalizer extends SolrTestCase {
         new NormalizerException("Standard Normalizer standard deviation must be positive "
             + "| avg = 1.0,std = 0.0");
 
-    NormalizerException ex = SolrTestCaseJ4.expectThrows(NormalizerException.class,
+    NormalizerException ex = SolrTestCaseUtil.expectThrows(NormalizerException.class,
         () -> implTestStandard(params, 1f, 0f)
     );
     assertEquals(expectedException.toString(), ex.toString());
diff --git a/solr/contrib/ltr/src/test/org/apache/solr/ltr/store/rest/TestManagedFeatureStore.java b/solr/contrib/ltr/src/test/org/apache/solr/ltr/store/rest/TestManagedFeatureStore.java
index 9257e9c..85b61e3 100644
--- a/solr/contrib/ltr/src/test/org/apache/solr/ltr/store/rest/TestManagedFeatureStore.java
+++ b/solr/contrib/ltr/src/test/org/apache/solr/ltr/store/rest/TestManagedFeatureStore.java
@@ -20,6 +20,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.ltr.feature.Feature;
 import org.apache.solr.ltr.feature.FeatureException;
 import org.apache.solr.ltr.feature.OriginalScoreFeature;
@@ -142,7 +143,7 @@ public class TestManagedFeatureStore extends SolrTestCaseJ4 {
     final String nonExistingClassName = "org.apache.solr.ltr.feature.LOLFeature";
     final ClassNotFoundException expectedException =
         new ClassNotFoundException(nonExistingClassName);
-    Exception ex = expectThrows(Exception.class, () -> {
+    Exception ex = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
       fstore.addFeature(createMap("test", nonExistingClassName, null), "testFstore2");
     });
     Throwable rootError = getRootCause(ex);
diff --git a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/PrometheusExporterTestBase.java b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/PrometheusExporterTestBase.java
index 31d70cb..c2fba24 100644
--- a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/PrometheusExporterTestBase.java
+++ b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/PrometheusExporterTestBase.java
@@ -18,6 +18,7 @@
 package org.apache.solr.prometheus;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.prometheus.utils.Helpers;
@@ -27,7 +28,7 @@ public class PrometheusExporterTestBase extends SolrCloudTestCase {
 
   public static final String COLLECTION = "collection1";
   public static final String CONF_NAME = COLLECTION + "_config";
-  public static final String CONF_DIR = getFile("solr/" + COLLECTION + "/conf").getAbsolutePath();
+  public static final String CONF_DIR = SolrTestUtil.getFile("solr/" + COLLECTION + "/conf").getAbsolutePath();
   public static final int NUM_SHARDS = 2;
   public static final int NUM_REPLICAS = 2;
   public static final int MAX_SHARDS_PER_NODE = 3;
@@ -60,7 +61,7 @@ public class PrometheusExporterTestBase extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(NUM_NODES)
-        .addConfig(CONF_NAME, getFile(CONF_DIR).toPath())
+        .addConfig(CONF_NAME, SolrTestUtil.getFile(CONF_DIR).toPath())
         .configure();
 
     CollectionAdminRequest
diff --git a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
index 144a413..a35530a 100644
--- a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
+++ b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/scraper/SolrStandaloneScraperTest.java
@@ -20,6 +20,7 @@ package org.apache.solr.prometheus.scraper;
 import io.prometheus.client.Collector;
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.NoOpResponseParser;
 import org.apache.solr.common.ParWork;
@@ -51,9 +52,9 @@ public class SolrStandaloneScraperTest extends RestTestBase {
 
   @Before
   public void setUp() throws Exception {
-    File tmpSolrHome = createTempDir().toFile();
+    File tmpSolrHome = SolrTestUtil.createTempDir().toFile();
 
-    FileUtils.copyDirectory(new File(TEST_HOME()), tmpSolrHome.getAbsoluteFile());
+    FileUtils.copyDirectory(new File(SolrTestUtil.TEST_HOME()), tmpSolrHome.getAbsoluteFile());
 
     createJettyAndHarness(
         tmpSolrHome.getAbsolutePath(),
@@ -64,7 +65,7 @@ public class SolrStandaloneScraperTest extends RestTestBase {
         null);
 
     executor = ParWork.getMyPerThreadExecutor();
-    configuration = Helpers.loadConfiguration(TEST_PATH().resolve("..").resolve("conf").resolve("prometheus-solr-exporter-scraper-test-config.xml").toString());
+    configuration = Helpers.loadConfiguration(SolrTestUtil.TEST_PATH().resolve("..").resolve("conf").resolve("prometheus-solr-exporter-scraper-test-config.xml").toString());
 
     solrClient = getHttpSolrClient(restTestHarness.getAdminURL());
     solrScraper = new SolrStandaloneScraper(solrClient, executor);
diff --git a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/utils/Helpers.java b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/utils/Helpers.java
index 5dcfb71..9f14129 100644
--- a/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/utils/Helpers.java
+++ b/solr/contrib/prometheus-exporter/src/test/org/apache/solr/prometheus/utils/Helpers.java
@@ -23,7 +23,7 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Objects;
 
-import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.ContentStreamUpdateRequest;
@@ -44,7 +44,7 @@ public class Helpers {
   }
 
   public static void indexAllDocs(SolrClient client) throws IOException, SolrServerException {
-    File exampleDocsDir = new File(SolrTestCaseJ4.getFile("exampledocs").getAbsolutePath());
+    File exampleDocsDir = new File(SolrTestUtil.getFile("exampledocs").getAbsolutePath());
     File[] xmlFiles = Objects.requireNonNull(exampleDocsDir.listFiles((dir, name) -> name.endsWith(".xml")));
     for (File xml : xmlFiles) {
       ContentStreamUpdateRequest req = new ContentStreamUpdateRequest("/update");
diff --git a/solr/contrib/velocity/src/test/org/apache/solr/velocity/VelocityResponseWriterTest.java b/solr/contrib/velocity/src/test/org/apache/solr/velocity/VelocityResponseWriterTest.java
index ad37064..d39a38c 100644
--- a/solr/contrib/velocity/src/test/org/apache/solr/velocity/VelocityResponseWriterTest.java
+++ b/solr/contrib/velocity/src/test/org/apache/solr/velocity/VelocityResponseWriterTest.java
@@ -22,7 +22,9 @@ import java.io.StringWriter;
 import java.security.AccessControlException;
 import java.util.Properties;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrQueryRequest;
@@ -39,7 +41,7 @@ import org.junit.Test;
 public class VelocityResponseWriterTest extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
-    initCore("solrconfig.xml", "schema.xml", getFile("velocity/solr").getAbsolutePath());
+    initCore("solrconfig.xml", "schema.xml", SolrTestUtil.getFile("velocity/solr").getAbsolutePath());
   }
 
   @AfterClass
@@ -63,7 +65,7 @@ public class VelocityResponseWriterTest extends SolrTestCaseJ4 {
   public void testSecureUberspector() throws Exception {
     VelocityResponseWriter vrw = new VelocityResponseWriter();
     NamedList<String> nl = new NamedList<>();
-    nl.add("template.base.dir", getFile("velocity").getAbsolutePath());
+    nl.add("template.base.dir", SolrTestUtil.getFile("velocity").getAbsolutePath());
     vrw.init(nl);
     SolrQueryRequest req = req(VelocityResponseWriter.TEMPLATE,"outside_the_box");
     SolrQueryResponse rsp = new SolrQueryResponse();
@@ -75,10 +77,10 @@ public class VelocityResponseWriterTest extends SolrTestCaseJ4 {
   @Test
   @Ignore("SOLR-14025: Velocity's SecureUberspector addresses this")
   public void testTemplateSandbox() throws Exception {
-    assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
+    LuceneTestCase.assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
     VelocityResponseWriter vrw = new VelocityResponseWriter();
     NamedList<String> nl = new NamedList<>();
-    nl.add("template.base.dir", getFile("velocity").getAbsolutePath());
+    nl.add("template.base.dir", SolrTestUtil.getFile("velocity").getAbsolutePath());
     vrw.init(nl);
     SolrQueryRequest req = req(VelocityResponseWriter.TEMPLATE,"outside_the_box");
     SolrQueryResponse rsp = new SolrQueryResponse();
@@ -96,10 +98,10 @@ public class VelocityResponseWriterTest extends SolrTestCaseJ4 {
   @Test
   @Ignore("SOLR-14025: Velocity's SecureUberspector addresses this")
   public void testSandboxIntersection() throws Exception {
-    assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
+    LuceneTestCase.assumeTrue("This test only works with security manager", System.getSecurityManager() != null);
     VelocityResponseWriter vrw = new VelocityResponseWriter();
     NamedList<String> nl = new NamedList<>();
-    nl.add("template.base.dir", getFile("velocity").getAbsolutePath());
+    nl.add("template.base.dir", SolrTestUtil.getFile("velocity").getAbsolutePath());
     vrw.init(nl);
     SolrQueryRequest req = req(VelocityResponseWriter.TEMPLATE,"sandbox_intersection");
     SolrQueryResponse rsp = new SolrQueryResponse();
@@ -118,7 +120,7 @@ public class VelocityResponseWriterTest extends SolrTestCaseJ4 {
   public void testFileResourceLoader() throws Exception {
     VelocityResponseWriter vrw = new VelocityResponseWriter();
     NamedList<String> nl = new NamedList<>();
-    nl.add("template.base.dir", getFile("velocity").getAbsolutePath());
+    nl.add("template.base.dir", SolrTestUtil.getFile("velocity").getAbsolutePath());
     vrw.init(nl);
     SolrQueryRequest req = req(VelocityResponseWriter.TEMPLATE,"file");
     SolrQueryResponse rsp = new SolrQueryResponse();
diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
index f38d2da..0716783 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
@@ -74,7 +74,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.BiConsumer;
diff --git a/solr/core/src/java/org/apache/solr/cloud/ReplicateFromLeader.java b/solr/core/src/java/org/apache/solr/cloud/ReplicateFromLeader.java
index eb6c062..0a941fd 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ReplicateFromLeader.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ReplicateFromLeader.java
@@ -31,7 +31,6 @@ import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrConfig;
 import org.apache.solr.core.SolrCore;
-import org.apache.solr.handler.IndexFetcher;
 import org.apache.solr.handler.ReplicationHandler;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateShardCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateShardCmd.java
index bb1d69b..e274390 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateShardCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateShardCmd.java
@@ -146,44 +146,57 @@ public class CreateShardCmd implements OverseerCollectionMessageHandler.Cmd {
     log.info("Finished create command on all shards for collection: {}", collectionName);
     AddReplicaCmd.Response response = new AddReplicaCmd.Response();
 
-    response.asyncFinalRunner = new OverseerCollectionMessageHandler.Finalize() {
-      @Override
-      public AddReplicaCmd.Response call() {
-        try {
-          shardRequestTracker.processResponses(results, shardHandler, false, null, Collections.emptySet());
-        } catch (KeeperException e) {
-          log.error("", e);
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-        } catch (InterruptedException e) {
-          ParWork.propagateInterrupt(e);
-          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
-        }
-        //  nocommit - put this in finalizer and finalizer after all calls to allow parallel and forward momentum
-
-        if (resp.asyncFinalRunner != null) {
-          try {
-            resp.asyncFinalRunner.call();
-          } catch (Exception e) {
-            log.error("Exception waiting for active replicas", e);
-          }
-        }
+    response.asyncFinalRunner = new MyFinalize(shardRequestTracker, results, shardHandler, resp);
 
-        @SuppressWarnings({"rawtypes"}) boolean failure = results.get("failure") != null && ((SimpleOrderedMap) results.get("failure")).size() > 0;
-        if (failure) {
+    response.clusterState = clusterState;
+    return response;
+  }
+
+  private static class MyFinalize implements OverseerCollectionMessageHandler.Finalize {
+    private final OverseerCollectionMessageHandler.ShardRequestTracker shardRequestTracker;
+    private final NamedList results;
+    private final ShardHandler shardHandler;
+    private final AddReplicaCmd.Response resp;
+
+    public MyFinalize(OverseerCollectionMessageHandler.ShardRequestTracker shardRequestTracker, NamedList results, ShardHandler shardHandler, AddReplicaCmd.Response resp) {
+      this.shardRequestTracker = shardRequestTracker;
+      this.results = results;
+      this.shardHandler = shardHandler;
+      this.resp = resp;
+    }
 
-        } else {
+    @Override
+    public AddReplicaCmd.Response call() {
+      try {
+        shardRequestTracker.processResponses(results, shardHandler, false, null, Collections.emptySet());
+      } catch (KeeperException e) {
+        log.error("", e);
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
+      } catch (InterruptedException e) {
+        ParWork.propagateInterrupt(e);
+        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
+      }
+      //  nocommit - put this in finalizer and finalizer after all calls to allow parallel and forward momentum
 
+      if (resp.asyncFinalRunner != null) {
+        try {
+          resp.asyncFinalRunner.call();
+        } catch (Exception e) {
+          log.error("Exception waiting for active replicas", e);
         }
+      }
+
+      @SuppressWarnings({"rawtypes"}) boolean failure = results.get("failure") != null && ((SimpleOrderedMap) results.get("failure")).size() > 0;
+      if (failure) {
+
+      } else {
 
-        //ocmh.zkStateReader.waitForActiveCollection(collectionName, 10, TimeUnit.SECONDS, shardNames.size(), finalReplicaPositions.size());
-        AddReplicaCmd.Response response = new AddReplicaCmd.Response();
-        return response;
       }
 
-    };
+      //ocmh.zkStateReader.waitForActiveCollection(collectionName, 10, TimeUnit.SECONDS, shardNames.size(), finalReplicaPositions.size());
+      AddReplicaCmd.Response response = new AddReplicaCmd.Response();
+      return response;
+    }
 
-    response.clusterState = clusterState;
-    return response;
   }
-
 }
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/DimensionalRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/DimensionalRoutedAlias.java
index 499642a..df9d583 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/DimensionalRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/DimensionalRoutedAlias.java
@@ -185,7 +185,7 @@ public class DimensionalRoutedAlias extends RoutedAlias {
         max = subCol.getCreationType();
       }
     }
-    return new CandidateCollection(max,destCol.toString(),col2Create.toString());
+    return new CandidateCollection(max, destCol.toString(), col2Create.toString());
   }
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
index 9ec8ec1..65243d6 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
@@ -166,20 +166,7 @@ public class MoveReplicaCmd implements OverseerCollectionMessageHandler.Cmd {
     AddReplicaCmd.Response response = new AddReplicaCmd.Response();
 
     OverseerCollectionMessageHandler.Finalize finalizer = resp.asyncFinalRunner;
-    response.asyncFinalRunner = new OverseerCollectionMessageHandler.Finalize() {
-      @Override
-      public AddReplicaCmd.Response call() {
-        if (finalizer != null) {
-          try {
-            finalizer.call();
-          } catch (Exception e) {
-            log.error("Exception during MoveReplica", e);
-          }
-        }
-        AddReplicaCmd.Response response = new AddReplicaCmd.Response();
-        return response;
-      }
-    };
+    response.asyncFinalRunner = new MyFinalize(finalizer);
 
     response.clusterState = null;
 
@@ -343,4 +330,25 @@ public class MoveReplicaCmd implements OverseerCollectionMessageHandler.Cmd {
     
     return finalResponse;
   }
+
+  private static class MyFinalize implements OverseerCollectionMessageHandler.Finalize {
+    private final OverseerCollectionMessageHandler.Finalize finalizer;
+
+    public MyFinalize(OverseerCollectionMessageHandler.Finalize finalizer) {
+      this.finalizer = finalizer;
+    }
+
+    @Override
+    public AddReplicaCmd.Response call() {
+      if (finalizer != null) {
+        try {
+          finalizer.call();
+        } catch (Exception e) {
+          log.error("Exception during MoveReplica", e);
+        }
+      }
+      AddReplicaCmd.Response response = new AddReplicaCmd.Response();
+      return response;
+    }
+  }
 }
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 30b5920..e207775 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
@@ -281,7 +281,7 @@ public abstract class RoutedAlias {
 
   abstract CandidateCollection findCandidateGivenValue(AddUpdateCommand cmd);
 
-  class CandidateCollection {
+  static class CandidateCollection {
     private final CreationType creationType;
     private final String destinationCollection;
     private final String creationCollection;
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
index c4f168a..de71894 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
@@ -518,8 +518,7 @@ public class TimeRoutedAlias extends RoutedAlias {
               String destinationCollection = candidate.getDestinationCollection(); // dest doesn't change
               String creationCollection = calcNextCollection(mostRecentCol);
               return new CandidateCollection(ASYNC_PREEMPTIVE, // add next collection
-                  destinationCollection,
-                  creationCollection);
+                  destinationCollection, creationCollection);
             }
           }
           return candidate;
diff --git a/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
index 789f53b..808a4de 100644
--- a/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/CachingDirectoryFactory.java
@@ -19,7 +19,6 @@ package org.apache.solr.core;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.LockFactory;
 import org.apache.lucene.util.IOUtils;
-import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
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 03b9385..2208130 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -49,7 +49,6 @@ import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.CloseTracker;
 import org.apache.solr.common.util.ExecutorUtil;
-import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.ObjectCache;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.OrderedExecutor;
diff --git a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
index d9ab29a..b228ce3 100644
--- a/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/StandardDirectoryFactory.java
@@ -29,7 +29,6 @@ import java.nio.file.StandardCopyOption;
 import java.util.Comparator;
 import java.util.Locale;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.IOContext;
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 12ba2c0..05fcab2 100644
--- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
@@ -173,22 +173,7 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
           QParser qparser = QParser.getParser(StrUtils.formatString(q, blobName, version), req);
           final TopDocs docs = req.getSearcher().search(qparser.parse(), 1, new Sort(new SortField("version", SortField.Type.LONG, true)));
           if (docs.totalHits.value > 0) {
-            rsp.add(ReplicationHandler.FILE_STREAM, new SolrCore.RawWriter() {
-
-              @Override
-              public void write(OutputStream os) throws IOException {
-                Document doc = req.getSearcher().doc(docs.scoreDocs[0].doc);
-                IndexableField sf = doc.getField("blob");
-                FieldType fieldType = req.getSchema().getField("blob").getType();
-                ByteBuffer buf = (ByteBuffer) fieldType.toObject(sf);
-                if (buf == null) {
-                  //should never happen unless a user wrote this document directly
-                  throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "Invalid document . No field called blob");
-                } else {
-                  os.write(buf.array(), 0, buf.limit());
-                }
-              }
-            });
+            rsp.add(ReplicationHandler.FILE_STREAM, new MyRawWriter(req, docs));
 
           } else {
             throw new SolrException(SolrException.ErrorCode.NOT_FOUND,
@@ -313,4 +298,29 @@ public class BlobHandler extends RequestHandlerBase implements PluginInfoInitial
     }
 
   }
+
+  private static class MyRawWriter implements SolrCore.RawWriter {
+
+    private final SolrQueryRequest req;
+    private final TopDocs docs;
+
+    public MyRawWriter(SolrQueryRequest req, TopDocs docs) {
+      this.req = req;
+      this.docs = docs;
+    }
+
+    @Override
+    public void write(OutputStream os) throws IOException {
+      Document doc = req.getSearcher().doc(docs.scoreDocs[0].doc);
+      IndexableField sf = doc.getField("blob");
+      FieldType fieldType = req.getSchema().getField("blob").getType();
+      ByteBuffer buf = (ByteBuffer) fieldType.toObject(sf);
+      if (buf == null) {
+        //should never happen unless a user wrote this document directly
+        throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "Invalid document . No field called blob");
+      } else {
+        os.write(buf.array(), 0, buf.limit());
+      }
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/CalciteJDBCStream.java b/solr/core/src/java/org/apache/solr/handler/CalciteJDBCStream.java
index fd76cbf..c6e0705 100644
--- a/solr/core/src/java/org/apache/solr/handler/CalciteJDBCStream.java
+++ b/solr/core/src/java/org/apache/solr/handler/CalciteJDBCStream.java
@@ -49,28 +49,38 @@ public class CalciteJDBCStream extends JDBCStream {
       final String columnName = metadata.getColumnLabel(columnNumber);
       final String className = metadata.getColumnClassName(columnNumber);
       if (Array.class.getName().equals(className)) {
-        valueSelector = new ResultSetValueSelector() {
-          @Override
-          public Object selectValue(ResultSet resultSet) throws SQLException {
-            Object o = resultSet.getObject(columnNumber);
-            if (resultSet.wasNull()) {
-              return null;
-            }
-            if (o instanceof Array) {
-              Array array = (Array) o;
-              return array.getArray();
-            } else {
-              return o;
-            }
-          }
-
-          @Override
-          public String getColumnName() {
-            return columnName;
-          }
-        };
+        valueSelector = new MyResultSetValueSelector(columnNumber, columnName);
       }
     }
     return valueSelector;
   }
+
+  private static class MyResultSetValueSelector implements ResultSetValueSelector {
+    private final int columnNumber;
+    private final String columnName;
+
+    public MyResultSetValueSelector(int columnNumber, String columnName) {
+      this.columnNumber = columnNumber;
+      this.columnName = columnName;
+    }
+
+    @Override
+    public Object selectValue(ResultSet resultSet) throws SQLException {
+      Object o = resultSet.getObject(columnNumber);
+      if (resultSet.wasNull()) {
+        return null;
+      }
+      if (o instanceof Array) {
+        Array array = (Array) o;
+        return array.getArray();
+      } else {
+        return o;
+      }
+    }
+
+    @Override
+    public String getColumnName() {
+      return columnName;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java b/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
index 2408a75..9427fff 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
@@ -48,7 +48,6 @@ import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.cloud.CloudDescriptor;
-import org.apache.solr.cloud.LeaderElector;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentBase;
diff --git a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
index 0f63fc4..1163d41 100644
--- a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
@@ -426,23 +426,7 @@ public class JsonLoader extends ContentStreamLoader {
       final Map<String, Object> map = (Map) ObjectBuilder.getVal(parser);
 
       // SolrParams currently expects string values...
-      SolrParams p = new SolrParams() {
-        @Override
-        public String get(String param) {
-          Object o = map.get(param);
-          return o == null ? null : o.toString();
-        }
-
-        @Override
-        public String[] getParams(String param) {
-          return new String[]{get(param)};
-        }
-
-        @Override
-        public Iterator<String> getParameterNamesIterator() {
-          return map.keySet().iterator();
-        }
-      };
+      SolrParams p = new MySolrParams(map);
 
       RequestHandlerUtils.validateCommitParams(p);
       p = SolrParams.wrapDefaults(p, req.getParams());   // default to the normal request params for commit options
@@ -640,6 +624,30 @@ public class JsonLoader extends ContentStreamLoader {
       }
       return val instanceof Map;
     }
+
+    private static class MySolrParams extends SolrParams {
+      private final Map<String,Object> map;
+
+      public MySolrParams(Map<String,Object> map) {
+        this.map = map;
+      }
+
+      @Override
+      public String get(String param) {
+        Object o = map.get(param);
+        return o == null ? null : o.toString();
+      }
+
+      @Override
+      public String[] getParams(String param) {
+        return new String[]{get(param)};
+      }
+
+      @Override
+      public Iterator<String> getParameterNamesIterator() {
+        return map.keySet().iterator();
+      }
+    }
   }
 
   @SuppressWarnings({"unchecked", "rawtypes"})
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 bb46574..9b32e21 100644
--- a/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
@@ -248,13 +248,7 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
    * @param request The SolrQueryRequest
    */
   protected QueryScorer getSpanQueryScorer(Query query, String fieldName, TokenStream tokenStream, SolrQueryRequest request) {
-    QueryScorer scorer = new QueryScorer(query,
-        request.getParams().getFieldBool(fieldName, HighlightParams.FIELD_MATCH, false) ? fieldName : null) {
-      @Override
-      protected WeightedSpanTermExtractor newTermExtractor(String defaultField) {
-        return new CustomSpanTermExtractor(defaultField);
-      }
-    };
+    QueryScorer scorer = new MyQueryScorer(query, request, fieldName);
     scorer.setExpandMultiTermQuery(request.getParams().getBool(HighlightParams.HIGHLIGHT_MULTI_TERM, true));
 
     boolean defaultPayloads = true;//overwritten below
@@ -502,28 +496,7 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
       fieldHighlights = null;
     } else if (useFastVectorHighlighter(params, schemaField)) {
       if (fvhContainer.fieldQuery == null) {
-        FastVectorHighlighter fvh = new FastVectorHighlighter(
-            // FVH cannot process hl.usePhraseHighlighter parameter per-field basis
-            params.getBool(HighlightParams.USE_PHRASE_HIGHLIGHTER, true),
-            // FVH cannot process hl.requireFieldMatch parameter per-field basis
-            params.getBool(HighlightParams.FIELD_MATCH, false)) {
-          @Override
-          public FieldQuery getFieldQuery(Query query, IndexReader reader) throws IOException {
-            return new FieldQuery(query, reader, phraseHighlight, fieldMatch) {
-              @Override
-              protected void flatten(Query sourceQuery, IndexReader reader, Collection<Query> flatQueries, float boost) throws IOException {
-                if (sourceQuery instanceof ToParentBlockJoinQuery) {
-                  Query childQuery = ((ToParentBlockJoinQuery) sourceQuery).getChildQuery();
-                  if (childQuery != null) {
-                    flatten(childQuery, reader, flatQueries, boost);
-                  }
-                } else {
-                  super.flatten(sourceQuery, reader, flatQueries, boost);
-                }
-              }
-            };
-          }
-        };
+        FastVectorHighlighter fvh = new MyFastVectorHighlighter(params);
         fvh.setPhraseLimit(params.getInt(HighlightParams.PHRASE_LIMIT, SolrHighlighter.DEFAULT_PHRASE_LIMIT));
         fvhContainer.fvh = fvh;
         fvhContainer.fieldQuery = fvh.getFieldQuery(query, reader);
@@ -842,6 +815,40 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
       this.fieldQuery = fieldQuery;
     }
   }
+
+  private static class MyQueryScorer extends QueryScorer {
+    public MyQueryScorer(Query query, SolrQueryRequest request, String fieldName) {
+      super(query, request.getParams().getFieldBool(fieldName, HighlightParams.FIELD_MATCH, false) ? fieldName : null);
+    }
+
+    @Override
+    protected WeightedSpanTermExtractor newTermExtractor(String defaultField) {
+      return new CustomSpanTermExtractor(defaultField);
+    }
+  }
+
+  private static class MyFastVectorHighlighter extends FastVectorHighlighter {
+    public MyFastVectorHighlighter(SolrParams params) {
+      super(params.getBool(HighlightParams.USE_PHRASE_HIGHLIGHTER, true), params.getBool(HighlightParams.FIELD_MATCH, false));
+    }
+
+    @Override
+    public FieldQuery getFieldQuery(Query query, IndexReader reader) throws IOException {
+      return new FieldQuery(query, reader, phraseHighlight, fieldMatch) {
+        @Override
+        protected void flatten(Query sourceQuery, IndexReader reader, Collection<Query> flatQueries, float boost) throws IOException {
+          if (sourceQuery instanceof ToParentBlockJoinQuery) {
+            Query childQuery = ((ToParentBlockJoinQuery) sourceQuery).getChildQuery();
+            if (childQuery != null) {
+              flatten(childQuery, reader, flatQueries, boost);
+            }
+          } else {
+            super.flatten(sourceQuery, reader, flatQueries, boost);
+          }
+        }
+      };
+    }
+  }
 }
 
 /** Orders Tokens in a window first by their startOffset ascending.
diff --git a/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java b/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
index 4963503..433b168 100644
--- a/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
+++ b/solr/core/src/java/org/apache/solr/logging/log4j2/Log4j2Watcher.java
@@ -48,7 +48,7 @@ public class Log4j2Watcher extends LogWatcher<LogEvent> {
   private final static String LOG4J2_WATCHER_APPENDER = "Log4j2WatcherAppender";
 
   @SuppressForbidden(reason = "class is specific to log4j2")
-  protected class Log4j2Appender extends AbstractAppender {
+  protected static class Log4j2Appender extends AbstractAppender {
 
     private Log4j2Watcher watcher;
     private ThresholdFilter filter;
@@ -78,7 +78,7 @@ public class Log4j2Watcher extends LogWatcher<LogEvent> {
   }
 
   @SuppressForbidden(reason = "class is specific to log4j2")
-  protected class Log4j2Info extends LoggerInfo {
+  protected static class Log4j2Info extends LoggerInfo {
     final Level level;
 
     Log4j2Info(String name, Level level) {
diff --git a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
index c864d03..ff04ea8 100644
--- a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java
@@ -182,21 +182,11 @@ public class IntervalFacets implements Iterable<FacetInterval> {
             break;
           case FLOAT:
             // TODO: this bit flipping should probably be moved to tie-break in the PQ comparator
-            longs = new FilterNumericDocValues(DocValues.getNumeric(ctx.reader(), fieldName)) {
-              @Override
-              public long longValue() throws IOException {
-                return NumericUtils.sortableFloatBits((int)super.longValue());
-              }
-            };
+            longs = new MyFilterNumericDocValues(ctx, fieldName);
             break;
           case DOUBLE:
             // TODO: this bit flipping should probably be moved to tie-break in the PQ comparator
-            longs = new FilterNumericDocValues(DocValues.getNumeric(ctx.reader(), fieldName)) {
-              @Override
-              public long longValue() throws IOException {
-               return NumericUtils.sortableDoubleBits(super.longValue());
-              }
-            };
+            longs = new DoubleFilterNumericDocValues(ctx, fieldName);
             break;
           default:
             throw new AssertionError();
@@ -933,4 +923,26 @@ public class IntervalFacets implements Iterable<FacetInterval> {
       return startComparison;
     }
   }
+
+  private static class MyFilterNumericDocValues extends FilterNumericDocValues {
+    public MyFilterNumericDocValues(LeafReaderContext ctx, String fieldName) throws IOException {
+      super(DocValues.getNumeric(ctx.reader(), fieldName));
+    }
+
+    @Override
+    public long longValue() throws IOException {
+      return NumericUtils.sortableFloatBits((int)super.longValue());
+    }
+  }
+
+  private static class DoubleFilterNumericDocValues extends FilterNumericDocValues {
+    public DoubleFilterNumericDocValues(LeafReaderContext ctx, String fieldName) throws IOException {
+      super(DocValues.getNumeric(ctx.reader(), fieldName));
+    }
+
+    @Override
+    public long longValue() throws IOException {
+     return NumericUtils.sortableDoubleBits(super.longValue());
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
index aca4a6f..d63a056 100644
--- a/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
+++ b/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
@@ -120,7 +120,7 @@ public class LocalSolrQueryRequest extends SolrQueryRequestBase {
   public void setUserPrincipalName(String s) {
     this.userPrincipalName = s;
   }
-  private final class LocalPrincipal implements Principal {
+  private static final class LocalPrincipal implements Principal {
     private final String user;
     public LocalPrincipal(String user) {
       this.user = user;
diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
index 4884ca7..230f774 100644
--- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
@@ -358,12 +358,7 @@ public class SimpleFacets {
 
     final Set<String> excludeTerms = new HashSet<>(StrUtils.splitSmart(exclude, ",", true));
 
-    return new Predicate<BytesRef>() {
-      @Override
-      public boolean test(BytesRef bytesRef) {
-        return !excludeTerms.contains(bytesRef.utf8ToString());
-      }
-    };
+    return new BytesRefPredicate(excludeTerms);
   }
 
   /**
@@ -765,13 +760,7 @@ public class SimpleFacets {
     if (sf != null && !sf.hasDocValues() && !sf.multiValued() && sf.getType().getNumberType() != null) {
       // it's a single-valued numeric field: we must currently create insanity :(
       // there isn't a GroupedFacetCollector that works on numerics right now...
-      return new FilterCollector(collector) {
-        @Override
-        public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
-          LeafReader insane = Insanity.wrapInsanity(context.reader(), field);
-          return in.getLeafCollector(insane.getContext());
-        }
-      };
+      return new MyFilterCollector(collector, field);
     } else {
       return collector;
     }
@@ -1235,4 +1224,32 @@ public class SimpleFacets {
   public ResponseBuilder getResponseBuilder() {
     return rb;
   }
+
+  private static class BytesRefPredicate implements Predicate<BytesRef> {
+    private final Set<String> excludeTerms;
+
+    public BytesRefPredicate(Set<String> excludeTerms) {
+      this.excludeTerms = excludeTerms;
+    }
+
+    @Override
+    public boolean test(BytesRef bytesRef) {
+      return !excludeTerms.contains(bytesRef.utf8ToString());
+    }
+  }
+
+  private static class MyFilterCollector extends FilterCollector {
+    private final String field;
+
+    public MyFilterCollector(Collector collector, String field) {
+      super(collector);
+      this.field = field;
+    }
+
+    @Override
+    public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
+      LeafReader insane = Insanity.wrapInsanity(context.reader(), field);
+      return in.getLeafCollector(insane.getContext());
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java b/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java
index e89d15e..e7aef9d 100644
--- a/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java
@@ -55,8 +55,7 @@ public class JSONResponseWriter implements QueryResponseWriter {
 
     final JSONWriter w;
     if (namedListStyle.equals(JsonTextWriter.JSON_NL_ARROFNTV)) {
-      w = new ArrayOfNameTypeValueJSONWriter(
-          writer, req, rsp, wrapperFunction, namedListStyle, true);
+      w = new ArrayOfNameTypeValueJSONWriter(writer, req, rsp, wrapperFunction, namedListStyle, true);
     } else {
       w = new JSONWriter(
           writer, req, rsp, wrapperFunction, namedListStyle);
@@ -92,7 +91,7 @@ public class JSONResponseWriter implements QueryResponseWriter {
  *      {"name":"bar","type":"str","value":"foo"},
  *      {"name":null,"type":"float","value":3.4}]
  */
-class ArrayOfNameTypeValueJSONWriter extends JSONWriter {
+static class ArrayOfNameTypeValueJSONWriter extends JSONWriter {
   protected boolean writeTypeAndValueKey = false;
   private final boolean writeNullName;
 
diff --git a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
index b0f91f5..80596df 100644
--- a/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
+++ b/solr/core/src/java/org/apache/solr/rest/schema/analysis/ManagedSynonymFilterFactory.java
@@ -349,7 +349,7 @@ public class ManagedSynonymFilterFactory extends BaseManagedTokenFilterFactory {
    * mappings from the managed JSON in this class during SynonymMap
    * building.
    */
-  private class ManagedSynonymParser extends SynonymMap.Parser {
+  private static class ManagedSynonymParser extends SynonymMap.Parser {
 
     SynonymManager synonymManager;
     
@@ -426,8 +426,7 @@ public class ManagedSynonymFilterFactory extends BaseManagedTokenFilterFactory {
           (ResourceLoader loader, String cname, boolean dedup, Analyzer analyzer)
           throws IOException, ParseException {
 
-        ManagedSynonymParser parser =
-            new ManagedSynonymParser((SynonymManager)res, dedup, analyzer);
+        ManagedSynonymParser parser = new ManagedSynonymParser((SynonymManager) res, dedup, analyzer);
         // null is safe here because there's no actual parsing done against a input Reader
         parser.parse(null);
         return parser.build(); 
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 d9f9f0e..ceb495c 100644
--- a/solr/core/src/java/org/apache/solr/schema/BoolField.java
+++ b/solr/core/src/java/org/apache/solr/schema/BoolField.java
@@ -82,29 +82,7 @@ public class BoolField extends PrimitiveFieldType {
   protected final static Analyzer boolAnalyzer = new SolrAnalyzer() {
     @Override
     public TokenStreamComponents createComponents(String fieldName) {
-      Tokenizer tokenizer = new Tokenizer() {
-        final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
-        boolean done = false;
-
-        @Override
-        public void reset() throws IOException {
-          super.reset();
-          done = false;
-        }
-
-        @Override
-        public boolean incrementToken() throws IOException {
-          clearAttributes();
-          if (done) return false;
-          done = true;
-          int ch = input.read();
-          if (ch==-1) return false;
-          termAtt.copyBuffer(
-                  ((ch=='t' || ch=='T' || ch=='1') ? TRUE_TOKEN : FALSE_TOKEN)
-                  ,0,1);
-          return true;
-        }
-      };
+      Tokenizer tokenizer = new MyTokenizer();
 
       return new TokenStreamComponents(tokenizer);
     }
@@ -248,48 +226,7 @@ public class BoolField extends PrimitiveFieldType {
 
       final int trueOrd = tord;
 
-      return new BoolDocValues(this) {
-
-        private int getOrdForDoc(int doc) throws IOException {
-          if (doc > sindex.docID()) {
-            sindex.advance(doc);
-          }
-          if (doc == sindex.docID()) {
-            return sindex.ordValue();
-          } else {
-            return -1;
-          }
-        }
-
-        @Override
-        public boolean boolVal(int doc) throws IOException {
-          return getOrdForDoc(doc) == trueOrd;
-        }
-
-        @Override
-        public boolean exists(int doc) throws IOException {
-          return getOrdForDoc(doc) != -1;
-        }
-
-        @Override
-        public ValueFiller getValueFiller() {
-          return new ValueFiller() {
-            private final MutableValueBool mval = new MutableValueBool();
-
-            @Override
-            public MutableValue getValue() {
-              return mval;
-            }
-
-            @Override
-            public void fillValue(int doc) throws IOException {
-              int ord = getOrdForDoc(doc);
-              mval.value = (ord == trueOrd);
-              mval.exists = (ord != -1);
-            }
-          };
-        }
-      };
+      return new MyBoolDocValues(sindex, trueOrd);
     }
 
     @Override
@@ -304,6 +241,81 @@ public class BoolField extends PrimitiveFieldType {
       return hcode + field.hashCode();
     }
 
+    private class MyBoolDocValues extends BoolDocValues {
+
+      private final SortedDocValues sindex;
+      private final int trueOrd;
+
+      public MyBoolDocValues(SortedDocValues sindex, int trueOrd) {
+        super(BoolFieldSource.this);
+        this.sindex = sindex;
+        this.trueOrd = trueOrd;
+      }
+
+      private int getOrdForDoc(int doc) throws IOException {
+        if (doc > sindex.docID()) {
+          sindex.advance(doc);
+        }
+        if (doc == sindex.docID()) {
+          return sindex.ordValue();
+        } else {
+          return -1;
+        }
+      }
+
+      @Override
+      public boolean boolVal(int doc) throws IOException {
+        return getOrdForDoc(doc) == trueOrd;
+      }
+
+      @Override
+      public boolean exists(int doc) throws IOException {
+        return getOrdForDoc(doc) != -1;
+      }
+
+      @Override
+      public ValueFiller getValueFiller() {
+        return new ValueFiller() {
+          private final MutableValueBool mval = new MutableValueBool();
+
+          @Override
+          public MutableValue getValue() {
+            return mval;
+          }
+
+          @Override
+          public void fillValue(int doc) throws IOException {
+            int ord = getOrdForDoc(doc);
+            mval.value = (ord == trueOrd);
+            mval.exists = (ord != -1);
+          }
+        };
+      }
+    }
+  }
+
+  private static class MyTokenizer extends Tokenizer {
+    final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
+    boolean done = false;
+
+    @Override
+    public void reset() throws IOException {
+      super.reset();
+      done = false;
+    }
+
+    @Override
+    public boolean incrementToken() throws IOException {
+      clearAttributes();
+      if (done) return false;
+      done = true;
+      int ch = input.read();
+      if (ch==-1) return false;
+      termAtt.copyBuffer(
+              ((ch=='t' || ch=='T' || ch=='1') ? TRUE_TOKEN : FALSE_TOKEN)
+              ,0,1);
+      return true;
+    }
   }
 }
 
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 44bb420..4e7a9b9 100644
--- a/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
+++ b/solr/core/src/java/org/apache/solr/schema/RandomSortField.java
@@ -108,53 +108,7 @@ public class RandomSortField extends FieldType {
   private static FieldComparatorSource randomComparatorSource = new FieldComparatorSource() {
     @Override
     public FieldComparator<Integer> newComparator(final String fieldname, final int numHits, int sortPos, boolean reversed) {
-      return new SimpleFieldComparator<Integer>() {
-        int seed;
-        private final int[] values = new int[numHits];
-        int bottomVal;
-        int topVal;
-
-        @Override
-        public int compare(int slot1, int slot2) {
-          return values[slot1] - values[slot2];  // values will be positive... no overflow possible.
-        }
-
-        @Override
-        public void setBottom(int slot) {
-          bottomVal = values[slot];
-        }
-
-        @Override
-        public void setTopValue(Integer value) {
-          topVal = value.intValue();
-        }
-
-        @Override
-        public int compareBottom(int doc) {
-          return bottomVal - hash(doc+seed);
-        }
-
-        @Override
-        public void copy(int slot, int doc) {
-          values[slot] = hash(doc+seed);
-        }
-
-        @Override
-        protected void doSetNextReader(LeafReaderContext context) {
-          seed = getSeed(fieldname, context);
-        }
-
-        @Override
-        public Integer value(int slot) {
-          return values[slot];
-        }
-
-        @Override
-        public int compareTop(int doc) {
-          // values will be positive... no overflow possible.
-          return topVal - hash(doc+seed);
-        }
-      };
+      return new IntegerSimpleFieldComparator(numHits, fieldname);
     }
   };
 
@@ -195,6 +149,62 @@ public class RandomSortField extends FieldType {
       return field.hashCode();
     };
   }
+
+  private static class IntegerSimpleFieldComparator extends SimpleFieldComparator<Integer> {
+    private final int numHits;
+    private final String fieldname;
+    int seed;
+    private final int[] values;
+    int bottomVal;
+    int topVal;
+
+    public IntegerSimpleFieldComparator(int numHits, String fieldname) {
+      this.numHits = numHits;
+      this.fieldname = fieldname;
+      values = new int[numHits];
+    }
+
+    @Override
+    public int compare(int slot1, int slot2) {
+      return values[slot1] - values[slot2];  // values will be positive... no overflow possible.
+    }
+
+    @Override
+    public void setBottom(int slot) {
+      bottomVal = values[slot];
+    }
+
+    @Override
+    public void setTopValue(Integer value) {
+      topVal = value.intValue();
+    }
+
+    @Override
+    public int compareBottom(int doc) {
+      return bottomVal - hash(doc+seed);
+    }
+
+    @Override
+    public void copy(int slot, int doc) {
+      values[slot] = hash(doc+seed);
+    }
+
+    @Override
+    protected void doSetNextReader(LeafReaderContext context) {
+      seed = getSeed(fieldname, context);
+    }
+
+    @Override
+    public Integer value(int slot) {
+      return values[slot];
+    }
+
+    @Override
+    public int compareTop(int doc) {
+      // values will be positive... no overflow possible.
+      return topVal - hash(doc+seed);
+    }
+  }
 }
 
 
diff --git a/solr/core/src/java/org/apache/solr/schema/RptWithGeometrySpatialField.java b/solr/core/src/java/org/apache/solr/schema/RptWithGeometrySpatialField.java
index abb3f0d..a63257e 100644
--- a/solr/core/src/java/org/apache/solr/schema/RptWithGeometrySpatialField.java
+++ b/solr/core/src/java/org/apache/solr/schema/RptWithGeometrySpatialField.java
@@ -151,40 +151,7 @@ public class RptWithGeometrySpatialField extends AbstractSpatialFieldType<Compos
         return targetFuncValues; // no caching; no configured cache
       }
 
-      return new ShapeValues() {
-        int docId = -1;
-
-        @Override
-        public Shape value() throws IOException {
-          //lookup in cache
-          IndexReader.CacheHelper cacheHelper = readerContext.reader().getCoreCacheHelper();
-          if (cacheHelper == null) {
-            throw new IllegalStateException("Leaf " + readerContext.reader() + " is not suited for caching");
-          }
-          PerSegCacheKey key = new PerSegCacheKey(cacheHelper.getKey(), docId);
-          Shape shape = cache.computeIfAbsent(key, k -> {
-            try {
-              return targetFuncValues.value();
-            } catch (IOException e) {
-              return null;
-            }
-          });
-          if (shape != null) {
-            //optimize shape on a cache hit if possible. This must be thread-safe and it is.
-            if (shape instanceof JtsGeometry) {
-              ((JtsGeometry) shape).index(); // TODO would be nice if some day we didn't have to cast
-            }
-          }
-          return shape;
-        }
-
-        @Override
-        public boolean advanceExact(int doc) throws IOException {
-          this.docId = doc;
-          return targetFuncValues.advanceExact(doc);
-        }
-
-      };
+      return new MyShapeValues(readerContext, cache, targetFuncValues);
 
     }
 
@@ -193,6 +160,50 @@ public class RptWithGeometrySpatialField extends AbstractSpatialFieldType<Compos
       return targetValueSource.isCacheable(ctx);
     }
 
+    private static class MyShapeValues extends ShapeValues {
+      private final LeafReaderContext readerContext;
+      private final SolrCache<PerSegCacheKey,Shape> cache;
+      private final ShapeValues targetFuncValues;
+      int docId;
+
+      public MyShapeValues(LeafReaderContext readerContext, SolrCache<PerSegCacheKey,Shape> cache, ShapeValues targetFuncValues) {
+        this.readerContext = readerContext;
+        this.cache = cache;
+        this.targetFuncValues = targetFuncValues;
+        docId = -1;
+      }
+
+      @Override
+      public Shape value() throws IOException {
+        //lookup in cache
+        IndexReader.CacheHelper cacheHelper = readerContext.reader().getCoreCacheHelper();
+        if (cacheHelper == null) {
+          throw new IllegalStateException("Leaf " + readerContext.reader() + " is not suited for caching");
+        }
+        PerSegCacheKey key = new PerSegCacheKey(cacheHelper.getKey(), docId);
+        Shape shape = cache.computeIfAbsent(key, k -> {
+          try {
+            return targetFuncValues.value();
+          } catch (IOException e) {
+            return null;
+          }
+        });
+        if (shape != null) {
+          //optimize shape on a cache hit if possible. This must be thread-safe and it is.
+          if (shape instanceof JtsGeometry) {
+            ((JtsGeometry) shape).index(); // TODO would be nice if some day we didn't have to cast
+          }
+        }
+        return shape;
+      }
+
+      @Override
+      public boolean advanceExact(int doc) throws IOException {
+        this.docId = doc;
+        return targetFuncValues.advanceExact(doc);
+      }
+
+    }
   }
 
   public static final String CACHE_KEY_PREFIX = "perSegSpatialFieldCache_";//then field name
diff --git a/solr/core/src/java/org/apache/solr/search/BoolQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/BoolQParserPlugin.java
index 04a9d5a..87d57e6 100644
--- a/solr/core/src/java/org/apache/solr/search/BoolQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/BoolQParserPlugin.java
@@ -35,36 +35,42 @@ public class BoolQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() throws SyntaxError {
-        BooleanQuery.Builder builder = new BooleanQuery.Builder();
-        SolrParams solrParams = SolrParams.wrapDefaults(localParams, params);
-        addQueries(builder, solrParams.getParams("must"), BooleanClause.Occur.MUST);
-        addQueries(builder, solrParams.getParams("must_not"), BooleanClause.Occur.MUST_NOT);
-        addQueries(builder, solrParams.getParams("filter"), BooleanClause.Occur.FILTER);
-        addQueries(builder, solrParams.getParams("should"), BooleanClause.Occur.SHOULD);
-        return builder.build();
-      }
+    return new MyQParser(qstr, localParams, params, req);
+  }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() throws SyntaxError {
+      BooleanQuery.Builder builder = new BooleanQuery.Builder();
+      SolrParams solrParams = SolrParams.wrapDefaults(localParams, params);
+      addQueries(builder, solrParams.getParams("must"), BooleanClause.Occur.MUST);
+      addQueries(builder, solrParams.getParams("must_not"), BooleanClause.Occur.MUST_NOT);
+      addQueries(builder, solrParams.getParams("filter"), BooleanClause.Occur.FILTER);
+      addQueries(builder, solrParams.getParams("should"), BooleanClause.Occur.SHOULD);
+      return builder.build();
+    }
 
-      private void addQueries(BooleanQuery.Builder builder, String[] subQueries, BooleanClause.Occur occur) throws SyntaxError {
-        if (subQueries != null) {
-          for (String subQuery : subQueries) {
-            final QParser subParser = subQuery(subQuery, null);
-            Query extQuery;
-            if (BooleanClause.Occur.FILTER.equals(occur)) {
-              extQuery = subParser.getQuery();
-              if (!(extQuery instanceof ExtendedQuery) || (
-                  ((ExtendedQuery) extQuery).getCache())) {
-                  extQuery = new FilterQuery(extQuery);
-              }
-            } else {
-              extQuery = subParser.parse();
+    private void addQueries(BooleanQuery.Builder builder, String[] subQueries, BooleanClause.Occur occur) throws SyntaxError {
+      if (subQueries != null) {
+        for (String subQuery : subQueries) {
+          final QParser subParser = subQuery(subQuery, null);
+          Query extQuery;
+          if (BooleanClause.Occur.FILTER.equals(occur)) {
+            extQuery = subParser.getQuery();
+            if (!(extQuery instanceof ExtendedQuery) || (
+                ((ExtendedQuery) extQuery).getCache())) {
+                extQuery = new FilterQuery(extQuery);
             }
-            builder.add(extQuery, occur);
+          } else {
+            extQuery = subParser.parse();
           }
+          builder.add(extQuery, occur);
         }
       }
-    };
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/BoostQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/BoostQParserPlugin.java
index 70e08a6..a84d56a 100644
--- a/solr/core/src/java/org/apache/solr/search/BoostQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/BoostQParserPlugin.java
@@ -42,46 +42,50 @@ public class BoostQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      QParser baseParser;
-      ValueSource vs;
-      String b;
+    return new MyQParser(qstr, localParams, params, req);
+  }
 
-      @Override
-      public Query parse() throws SyntaxError {
-        b = localParams.get(BOOSTFUNC);
-        baseParser = subQuery(localParams.get(QueryParsing.V), null);
-        Query q = baseParser.getQuery();
+  private static class MyQParser extends QParser {
+    QParser baseParser;
+    ValueSource vs;
+    String b;
 
-        if (b == null) return q;
-        Query bq = subQuery(b, FunctionQParserPlugin.NAME).getQuery();
-        if (bq instanceof FunctionQuery) {
-          vs = ((FunctionQuery)bq).getValueSource();
-        } else {
-          vs = new QueryValueSource(bq, 0.0f);
-        }
-        return FunctionScoreQuery.boostByValue(q, vs.asDoubleValuesSource());
-      }
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
 
+    @Override
+    public Query parse() throws SyntaxError {
+      b = localParams.get(BOOSTFUNC);
+      baseParser = subQuery(localParams.get(QueryParsing.V), null);
+      Query q = baseParser.getQuery();
 
-      @Override
-      public String[] getDefaultHighlightFields() {
-        return baseParser.getDefaultHighlightFields();
-      }
-                                           
-      @Override
-      public Query getHighlightQuery() throws SyntaxError {
-        return baseParser.getHighlightQuery();
+      if (b == null) return q;
+      Query bq = subQuery(b, FunctionQParserPlugin.NAME).getQuery();
+      if (bq instanceof FunctionQuery) {
+        vs = ((FunctionQuery)bq).getValueSource();
+      } else {
+        vs = new QueryValueSource(bq, 0.0f);
       }
+      return FunctionScoreQuery.boostByValue(q, vs.asDoubleValuesSource());
+    }
 
-      @Override
-      public void addDebugInfo(NamedList<Object> debugInfo) {
-        // encapsulate base debug info in a sub-list?
-        baseParser.addDebugInfo(debugInfo);
-        debugInfo.add("boost_str",b);
-        debugInfo.add("boost_parsed",vs);
-      }
-    };
-  }
+    @Override
+    public String[] getDefaultHighlightFields() {
+      return baseParser.getDefaultHighlightFields();
+    }
+
+    @Override
+    public Query getHighlightQuery() throws SyntaxError {
+      return baseParser.getHighlightQuery();
+    }
 
+    @Override
+    public void addDebugInfo(NamedList<Object> debugInfo) {
+      // encapsulate base debug info in a sub-list?
+      baseParser.addDebugInfo(debugInfo);
+      debugInfo.add("boost_str",b);
+      debugInfo.add("boost_parsed",vs);
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
index b9e8eb9..11fe017 100644
--- a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
@@ -1320,19 +1320,9 @@ public class CollapsingQParserPlugin extends QParserPlugin {
           @SuppressWarnings("resource")
           final LeafReader uninvertingReader = getTopFieldCacheReader(searcher, collapseField);
 
-          docValuesProducer = new EmptyDocValuesProducer() {
-              @Override
-              public SortedDocValues getSorted(FieldInfo ignored) throws IOException {
-                return uninvertingReader.getSortedDocValues(collapseField);
-              }
-            };
+          docValuesProducer = new MyEmptyDocValuesProducer(uninvertingReader, collapseField);
         } else {
-          docValuesProducer = new EmptyDocValuesProducer() {
-              @Override
-              public SortedDocValues getSorted(FieldInfo ignored) throws IOException {
-                return DocValues.getSorted(searcher.getSlowAtomicReader(), collapseField);
-              }
-            };
+          docValuesProducer = new NoHintEmptyDocValuesProducer(searcher, collapseField);
         }
       } else {
         if(HINT_TOP_FC.equals(hint)) {
@@ -1445,6 +1435,36 @@ public class CollapsingQParserPlugin extends QParserPlugin {
 
       }
     }
+
+    private static class MyEmptyDocValuesProducer extends EmptyDocValuesProducer {
+      private final LeafReader uninvertingReader;
+      private final String collapseField;
+
+      public MyEmptyDocValuesProducer(LeafReader uninvertingReader, String collapseField) {
+        this.uninvertingReader = uninvertingReader;
+        this.collapseField = collapseField;
+      }
+
+      @Override
+      public SortedDocValues getSorted(FieldInfo ignored) throws IOException {
+        return uninvertingReader.getSortedDocValues(collapseField);
+      }
+    }
+
+    private static class NoHintEmptyDocValuesProducer extends EmptyDocValuesProducer {
+      private final SolrIndexSearcher searcher;
+      private final String collapseField;
+
+      public NoHintEmptyDocValuesProducer(SolrIndexSearcher searcher, String collapseField) {
+        this.searcher = searcher;
+        this.collapseField = collapseField;
+      }
+
+      @Override
+      public SortedDocValues getSorted(FieldInfo ignored) throws IOException {
+        return DocValues.getSorted(searcher.getSlowAtomicReader(), collapseField);
+      }
+    }
   }
 
   public static final class CollapseScore {
diff --git a/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
index 097f1fc..5102605 100644
--- a/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
@@ -62,7 +62,7 @@ public class ExportQParserPlugin extends QParserPlugin {
     }
   }
 
-  public class ExportQuery extends RankQuery {
+  public static class ExportQuery extends RankQuery {
     private Query mainQuery;
     private Object id;
 
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 0103d3d..47a8045 100644
--- a/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java
+++ b/solr/core/src/java/org/apache/solr/search/FloatPayloadValueSource.java
@@ -86,52 +86,7 @@ public class FloatPayloadValueSource extends ValueSource {
         if (docs == null) {
           // dummy PostingsEnum so floatVal() can work
           // when would this be called?  if field/val did not match?  this is called for every doc?  create once and cache?
-          docs = new PostingsEnum() {
-            @Override
-            public int freq() {
-              return 0;
-            }
-
-            @Override
-            public int nextPosition() throws IOException {
-              return -1;
-            }
-
-            @Override
-            public int startOffset() throws IOException {
-              return -1;
-            }
-
-            @Override
-            public int endOffset() throws IOException {
-              return -1;
-            }
-
-            @Override
-            public BytesRef getPayload() throws IOException {
-              return null;
-            }
-
-            @Override
-            public int docID() {
-              return DocIdSetIterator.NO_MORE_DOCS;
-            }
-
-            @Override
-            public int nextDoc() {
-              return DocIdSetIterator.NO_MORE_DOCS;
-            }
-
-            @Override
-            public int advance(int target) {
-              return DocIdSetIterator.NO_MORE_DOCS;
-            }
-
-            @Override
-            public long cost() {
-              return 0;
-            }
-          };
+          docs = new MyPostingsEnum();
         }
         atDoc = -1;
       }
@@ -223,4 +178,51 @@ public class FloatPayloadValueSource extends ValueSource {
     result = 31 * result + defaultValueSource.hashCode();
     return result;
   }
+
+  private static class MyPostingsEnum extends PostingsEnum {
+    @Override
+    public int freq() {
+      return 0;
+    }
+
+    @Override
+    public int nextPosition() throws IOException {
+      return -1;
+    }
+
+    @Override
+    public int startOffset() throws IOException {
+      return -1;
+    }
+
+    @Override
+    public int endOffset() throws IOException {
+      return -1;
+    }
+
+    @Override
+    public BytesRef getPayload() throws IOException {
+      return null;
+    }
+
+    @Override
+    public int docID() {
+      return DocIdSetIterator.NO_MORE_DOCS;
+    }
+
+    @Override
+    public int nextDoc() {
+      return DocIdSetIterator.NO_MORE_DOCS;
+    }
+
+    @Override
+    public int advance(int target) {
+      return DocIdSetIterator.NO_MORE_DOCS;
+    }
+
+    @Override
+    public long cost() {
+      return 0;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java
index 45f39c7..dcb9b4d 100644
--- a/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/PayloadScoreQParserPlugin.java
@@ -47,46 +47,52 @@ public class PayloadScoreQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() throws SyntaxError {
-        String field = localParams.get(QueryParsing.F);
-        String value = localParams.get(QueryParsing.V);
-        String func = localParams.get("func");
-        String operator = localParams.get("operator", DEFAULT_OPERATOR);
-        if (!(operator.equalsIgnoreCase(DEFAULT_OPERATOR) || operator.equalsIgnoreCase("or"))) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Supported operators are : or , phrase");
-        }
-        boolean includeSpanScore = localParams.getBool("includeSpanScore", false);
+    return new MyQParser(qstr, localParams, params, req);
+  }
 
-        if (field == null) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'f' not specified");
-        }
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
 
-        if (value == null) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "query string missing");
-        }
+    @Override
+    public Query parse() throws SyntaxError {
+      String field = localParams.get(QueryParsing.F);
+      String value = localParams.get(QueryParsing.V);
+      String func = localParams.get("func");
+      String operator = localParams.get("operator", DEFAULT_OPERATOR);
+      if (!(operator.equalsIgnoreCase(DEFAULT_OPERATOR) || operator.equalsIgnoreCase("or"))) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Supported operators are : or , phrase");
+      }
+      boolean includeSpanScore = localParams.getBool("includeSpanScore", false);
 
-        FieldType ft = req.getCore().getLatestSchema().getFieldType(field);
-        Analyzer analyzer = ft.getQueryAnalyzer();
-        SpanQuery query;
-        try {
-          query = PayloadUtils.createSpanQuery(field, value, analyzer, operator);
-        } catch (IOException e) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,e);
-        }
+      if (field == null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "'f' not specified");
+      }
 
-        if (query == null) {
-          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "SpanQuery is null");
-        }
+      if (value == null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "query string missing");
+      }
 
-        // note: this query(/parser) does not support func=first; 'first' is a payload() value source feature only
-        PayloadFunction payloadFunction = PayloadUtils.getPayloadFunction(func);
-        if (payloadFunction == null) throw new SyntaxError("Unknown payload function: " + func);
+      FieldType ft = req.getCore().getLatestSchema().getFieldType(field);
+      Analyzer analyzer = ft.getQueryAnalyzer();
+      SpanQuery query;
+      try {
+        query = PayloadUtils.createSpanQuery(field, value, analyzer, operator);
+      } catch (IOException e) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,e);
+      }
 
-        PayloadDecoder payloadDecoder = req.getCore().getLatestSchema().getPayloadDecoder(field);
-        return new PayloadScoreQuery(query, payloadFunction, payloadDecoder, includeSpanScore);
+      if (query == null) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "SpanQuery is null");
       }
-    };
+
+      // note: this query(/parser) does not support func=first; 'first' is a payload() value source feature only
+      PayloadFunction payloadFunction = PayloadUtils.getPayloadFunction(func);
+      if (payloadFunction == null) throw new SyntaxError("Unknown payload function: " + func);
+
+      PayloadDecoder payloadDecoder = req.getCore().getLatestSchema().getPayloadDecoder(field);
+      return new PayloadScoreQuery(query, payloadFunction, payloadDecoder, includeSpanScore);
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java
index 8e52884..c32170a 100644
--- a/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/PrefixQParserPlugin.java
@@ -33,13 +33,19 @@ public class PrefixQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() {
-        SchemaField sf = req.getSchema().getField(localParams.get(QueryParsing.F));
-        return sf.getType().getPrefixQuery(this, sf, localParams.get(QueryParsing.V));
-      }
-    };
+    return new MyQParser(qstr, localParams, params, req);
+  }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() {
+      SchemaField sf = req.getSchema().getField(localParams.get(QueryParsing.F));
+      return sf.getType().getPrefixQuery(this, sf, localParams.get(QueryParsing.V));
+    }
   }
 }
 
diff --git a/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java
index c3d2dd2..30f6879 100644
--- a/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/RawQParserPlugin.java
@@ -37,11 +37,17 @@ public class RawQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() {
-        return new TermQuery(new Term(localParams.get(QueryParsing.F), localParams.get(QueryParsing.V)));
-      }
-    };
+    return new MyQParser(qstr, localParams, params, req);
+  }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() {
+      return new TermQuery(new Term(localParams.get(QueryParsing.F), localParams.get(QueryParsing.V)));
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
index 221501b..b857737 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
@@ -92,7 +92,7 @@ public class ReRankQParserPlugin extends QParserPlugin {
     }
   }
 
-  private final class ReRankQuery extends AbstractReRankQuery {
+  private static final class ReRankQuery extends AbstractReRankQuery {
     final private Query reRankQuery;
     final private double reRankWeight;
 
diff --git a/solr/core/src/java/org/apache/solr/search/SwitchQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/SwitchQParserPlugin.java
index d3ecddd..49f57f3 100644
--- a/solr/core/src/java/org/apache/solr/search/SwitchQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/SwitchQParserPlugin.java
@@ -153,42 +153,48 @@ public class SwitchQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      QParser subParser;
+    return new MyQParser(qstr, localParams, params, req);
+  }
 
-      @Override
-      public Query parse() throws SyntaxError {
-        String val = localParams.get(QueryParsing.V);
+  private static class MyQParser extends QParser {
+    QParser subParser;
 
-        // we don't want to wrapDefaults arround params, because then 
-        // clients could add their own switch options 
-        String subQ = localParams.get(SWITCH_DEFAULT);
-        subQ = StringUtils.isBlank(val)
-          ? localParams.get(SWITCH_CASE, subQ)
-          : localParams.get(SWITCH_CASE + "." + val.trim(), subQ);
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
 
-        if (null == subQ) {
-          throw new SyntaxError("No "+SWITCH_DEFAULT+", and no switch case matching specified query string: \"" + val + "\"");
-        }
+    @Override
+    public Query parse() throws SyntaxError {
+      String val = localParams.get(QueryParsing.V);
 
-        subParser = subQuery(subQ, null);
-        return subParser.getQuery();
-      }
+      // we don't want to wrapDefaults arround params, because then
+      // clients could add their own switch options
+      String subQ = localParams.get(SWITCH_DEFAULT);
+      subQ = StringUtils.isBlank(val)
+        ? localParams.get(SWITCH_CASE, subQ)
+        : localParams.get(SWITCH_CASE + "." + val.trim(), subQ);
 
-      @Override
-      public String[] getDefaultHighlightFields() {
-        return subParser.getDefaultHighlightFields();
-      }
-                                           
-      @Override
-      public Query getHighlightQuery() throws SyntaxError {
-        return subParser.getHighlightQuery();
+      if (null == subQ) {
+        throw new SyntaxError("No "+SWITCH_DEFAULT+", and no switch case matching specified query string: \"" + val + "\"");
       }
 
-      @Override
-      public void addDebugInfo(NamedList<Object> debugInfo) {
-        subParser.addDebugInfo(debugInfo);
-      }
-    };
+      subParser = subQuery(subQ, null);
+      return subParser.getQuery();
+    }
+
+    @Override
+    public String[] getDefaultHighlightFields() {
+      return subParser.getDefaultHighlightFields();
+    }
+
+    @Override
+    public Query getHighlightQuery() throws SyntaxError {
+      return subParser.getHighlightQuery();
+    }
+
+    @Override
+    public void addDebugInfo(NamedList<Object> debugInfo) {
+      subParser.addDebugInfo(debugInfo);
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java
index 89b3d28..cb4a5ce 100644
--- a/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/TermQParserPlugin.java
@@ -44,26 +44,32 @@ public class TermQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() {
-        String fname = localParams.get(QueryParsing.F);
-        FieldType ft = req.getSchema().getFieldTypeNoEx(fname);
-        String val = localParams.get(QueryParsing.V);
-        BytesRefBuilder term;
-        if (ft != null) {
-          if (ft.isPointField()) {
-            return ft.getFieldQuery(this, req.getSchema().getField(fname), val);
-          } else {
-            term = new BytesRefBuilder();
-            ft.readableToIndexed(val, term);
-          }
+    return new MyQParser(qstr, localParams, params, req);
+  }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() {
+      String fname = localParams.get(QueryParsing.F);
+      FieldType ft = req.getSchema().getFieldTypeNoEx(fname);
+      String val = localParams.get(QueryParsing.V);
+      BytesRefBuilder term;
+      if (ft != null) {
+        if (ft.isPointField()) {
+          return ft.getFieldQuery(this, req.getSchema().getField(fname), val);
         } else {
           term = new BytesRefBuilder();
-          term.copyChars(val);
+          ft.readableToIndexed(val, term);
         }
-        return new TermQuery(new Term(fname, term.get()));
+      } else {
+        term = new BytesRefBuilder();
+        term.copyChars(val);
       }
-    };
+      return new TermQuery(new Term(fname, term.get()));
+    }
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java
index 1d92b7c..78d52a0 100644
--- a/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/TermsQParserPlugin.java
@@ -119,50 +119,7 @@ public class TermsQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() throws SyntaxError {
-        String fname = localParams.get(QueryParsing.F);
-        FieldType ft = req.getSchema().getFieldType(fname);
-        String separator = localParams.get(SEPARATOR, ",");
-        String qstr = localParams.get(QueryParsing.V);//never null
-        Method method = Method.valueOf(localParams.get(METHOD, Method.termsFilter.name()));
-        //TODO pick the default method based on various heuristics from benchmarks
-        //TODO pick the default using FieldType.getSetQuery
-
-        //if space then split on all whitespace & trim, otherwise strictly interpret
-        final boolean sepIsSpace = separator.equals(" ");
-        if (sepIsSpace)
-          qstr = qstr.trim();
-        if (qstr.length() == 0)
-          return new MatchNoDocsQuery();
-        final String[] splitVals = sepIsSpace ? qstr.split("\\s+") : qstr.split(Pattern.quote(separator), -1);
-        assert splitVals.length > 0;
-        
-        if (ft.isPointField()) {
-          if (localParams.get(METHOD) != null) {
-            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
-                String.format(Locale.ROOT, "Method '%s' not supported in TermsQParser when using PointFields", localParams.get(METHOD)));
-          }
-          return ((PointField)ft).getSetQuery(this, req.getSchema().getField(fname), Arrays.asList(splitVals));
-        }
-
-        BytesRef[] bytesRefs = new BytesRef[splitVals.length];
-        BytesRefBuilder term = new BytesRefBuilder();
-        for (int i = 0; i < splitVals.length; i++) {
-          String stringVal = splitVals[i];
-          //logic same as TermQParserPlugin
-          if (ft != null) {
-            ft.readableToIndexed(stringVal, term);
-          } else {
-            term.copyChars(stringVal);
-          }
-          bytesRefs[i] = term.toBytesRef();
-        }
-
-        return method.makeFilter(fname, bytesRefs);
-      }
-    };
+    return new MyQParser(qstr, localParams, params, req);
   }
 
   private static class TopLevelDocValuesTermsQuery extends DocValuesTermsQuery {
@@ -260,4 +217,53 @@ public class TermsQParserPlugin extends QParserPlugin {
       return -(low + 1);  // key not found.
     }
   }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() throws SyntaxError {
+      String fname = localParams.get(QueryParsing.F);
+      FieldType ft = req.getSchema().getFieldType(fname);
+      String separator = localParams.get(SEPARATOR, ",");
+      String qstr = localParams.get(QueryParsing.V);//never null
+      Method method = Method.valueOf(localParams.get(METHOD, Method.termsFilter.name()));
+      //TODO pick the default method based on various heuristics from benchmarks
+      //TODO pick the default using FieldType.getSetQuery
+
+      //if space then split on all whitespace & trim, otherwise strictly interpret
+      final boolean sepIsSpace = separator.equals(" ");
+      if (sepIsSpace)
+        qstr = qstr.trim();
+      if (qstr.length() == 0)
+        return new MatchNoDocsQuery();
+      final String[] splitVals = sepIsSpace ? qstr.split("\\s+") : qstr.split(Pattern.quote(separator), -1);
+      assert splitVals.length > 0;
+
+      if (ft.isPointField()) {
+        if (localParams.get(METHOD) != null) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
+              String.format(Locale.ROOT, "Method '%s' not supported in TermsQParser when using PointFields", localParams.get(METHOD)));
+        }
+        return ((PointField)ft).getSetQuery(this, req.getSchema().getField(fname), Arrays.asList(splitVals));
+      }
+
+      BytesRef[] bytesRefs = new BytesRef[splitVals.length];
+      BytesRefBuilder term = new BytesRefBuilder();
+      for (int i = 0; i < splitVals.length; i++) {
+        String stringVal = splitVals[i];
+        //logic same as TermQParserPlugin
+        if (ft != null) {
+          ft.readableToIndexed(stringVal, term);
+        } else {
+          term.copyChars(stringVal);
+        }
+        bytesRefs[i] = term.toBytesRef();
+      }
+
+      return method.makeFilter(fname, bytesRefs);
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java b/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
index 428c229..c7b5f0a 100644
--- a/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
+++ b/solr/core/src/java/org/apache/solr/search/TopLevelJoinQuery.java
@@ -90,23 +90,7 @@ public class TopLevelJoinQuery extends JoinQuery {
           }
 
           final int docBase = context.docBase;
-          return new ConstantScoreScorer(this, this.score(), scoreMode, new TwoPhaseIterator(toApproximation) {
-            public boolean matches() throws IOException {
-              final boolean hasDoc = topLevelToDocValues.advanceExact(docBase + approximation.docID());
-              if (hasDoc) {
-                for (long ord = topLevelToDocValues.nextOrd(); ord != -1L; ord = topLevelToDocValues.nextOrd()) {
-                  if (toOrdBitSet.get(ord)) {
-                    return true;
-                  }
-                }
-              }
-              return false;
-            }
-
-            public float matchCost() {
-              return 10.0F;
-            }
-          });
+          return new ConstantScoreScorer(this, this.score(), scoreMode, new MyTwoPhaseIterator(toApproximation, topLevelToDocValues, docBase, toOrdBitSet));
 
         }
 
@@ -120,17 +104,7 @@ public class TopLevelJoinQuery extends JoinQuery {
   }
 
   private Weight createNoMatchesWeight(float boost) {
-    return new ConstantScoreWeight(this, boost) {
-      @Override
-      public Scorer scorer(LeafReaderContext context) throws IOException {
-        return null;
-      }
-
-      @Override
-      public boolean isCacheable(LeafReaderContext ctx) {
-        return false;
-      }
-    };
+    return new MyConstantScoreWeight(boost);
   }
 
   private SortedSetDocValues validateAndFetchDocValues(SolrIndexSearcher solrSearcher, String fieldName, String querySide) throws IOException {
@@ -218,4 +192,49 @@ public class TopLevelJoinQuery extends JoinQuery {
       this.upper = upper;
     }
   }
+
+  private static class MyTwoPhaseIterator extends TwoPhaseIterator {
+    private final SortedSetDocValues topLevelToDocValues;
+    private final int docBase;
+    private final LongBitSet toOrdBitSet;
+
+    public MyTwoPhaseIterator(DocIdSetIterator toApproximation, SortedSetDocValues topLevelToDocValues, int docBase, LongBitSet toOrdBitSet) {
+      super(toApproximation);
+      this.topLevelToDocValues = topLevelToDocValues;
+      this.docBase = docBase;
+      this.toOrdBitSet = toOrdBitSet;
+    }
+
+    public boolean matches() throws IOException {
+      final boolean hasDoc = topLevelToDocValues.advanceExact(docBase + approximation.docID());
+      if (hasDoc) {
+        for (long ord = topLevelToDocValues.nextOrd(); ord != -1L; ord = topLevelToDocValues.nextOrd()) {
+          if (toOrdBitSet.get(ord)) {
+            return true;
+          }
+        }
+      }
+      return false;
+    }
+
+    public float matchCost() {
+      return 10.0F;
+    }
+  }
+
+  private class MyConstantScoreWeight extends ConstantScoreWeight {
+    public MyConstantScoreWeight(float boost) {
+      super(TopLevelJoinQuery.this, boost);
+    }
+
+    @Override
+    public Scorer scorer(LeafReaderContext context) throws IOException {
+      return null;
+    }
+
+    @Override
+    public boolean isCacheable(LeafReaderContext ctx) {
+      return false;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/facet/AvgAgg.java b/solr/core/src/java/org/apache/solr/search/facet/AvgAgg.java
index 7036c30..40b84ab 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/AvgAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/AvgAgg.java
@@ -89,7 +89,7 @@ public class AvgAgg extends SimpleAggValueSource {
     }
   }
 
-  class AvgSortedNumericAcc extends DocValuesAcc.DoubleSortedNumericDVAcc {
+  static class AvgSortedNumericAcc extends DocValuesAcc.DoubleSortedNumericDVAcc {
     int[] counts;
 
     public AvgSortedNumericAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
@@ -140,7 +140,7 @@ public class AvgAgg extends SimpleAggValueSource {
     }
   }
 
-  class AvgSortedSetAcc extends DocValuesAcc.DoubleSortedSetDVAcc {
+  static class AvgSortedSetAcc extends DocValuesAcc.DoubleSortedSetDVAcc {
     int[] counts;
 
     public AvgSortedSetAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
@@ -195,7 +195,7 @@ public class AvgAgg extends SimpleAggValueSource {
     }
   }
 
-  class AvgUnInvertedFieldAcc extends UnInvertedFieldAcc.DoubleUnInvertedFieldAcc {
+  static class AvgUnInvertedFieldAcc extends UnInvertedFieldAcc.DoubleUnInvertedFieldAcc {
     int[] counts;
 
     public AvgUnInvertedFieldAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
diff --git a/solr/core/src/java/org/apache/solr/search/facet/CountValsAgg.java b/solr/core/src/java/org/apache/solr/search/facet/CountValsAgg.java
index 6415ff6..ac8d93b 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/CountValsAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/CountValsAgg.java
@@ -67,7 +67,7 @@ public class CountValsAgg extends SimpleAggValueSource {
     return new FacetModule.FacetLongMerger();
   }
 
-  class CountValSlotAcc extends SlotAcc.LongFuncSlotAcc {
+  static class CountValSlotAcc extends SlotAcc.LongFuncSlotAcc {
 
     public CountValSlotAcc(ValueSource values, FacetContext fcontext, int numSlots) {
       super(values, fcontext, numSlots, 0);
@@ -81,7 +81,7 @@ public class CountValsAgg extends SimpleAggValueSource {
     }
   }
 
-  class CountSortedNumericDVAcc extends DocValuesAcc.LongSortedNumericDVAcc {
+  static class CountSortedNumericDVAcc extends DocValuesAcc.LongSortedNumericDVAcc {
 
     public CountSortedNumericDVAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
       super(fcontext, sf, numSlots, 0);
@@ -93,7 +93,7 @@ public class CountValsAgg extends SimpleAggValueSource {
     }
   }
 
-  class CountSortedSetDVAcc extends DocValuesAcc.LongSortedSetDVAcc {
+  static class CountSortedSetDVAcc extends DocValuesAcc.LongSortedSetDVAcc {
 
     public CountSortedSetDVAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
       super(fcontext, sf, numSlots, 0);
@@ -107,7 +107,7 @@ public class CountValsAgg extends SimpleAggValueSource {
     }
   }
 
-  class CountMultiValuedAcc extends UnInvertedFieldAcc {
+  static class CountMultiValuedAcc extends UnInvertedFieldAcc {
     private int currentSlot;
     long[] result;
 
diff --git a/solr/core/src/java/org/apache/solr/search/facet/DocValuesAcc.java b/solr/core/src/java/org/apache/solr/search/facet/DocValuesAcc.java
index 547040e..a656d9d 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/DocValuesAcc.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/DocValuesAcc.java
@@ -63,7 +63,7 @@ public abstract class DocValuesAcc extends SlotAcc {
   /**
    * Accumulator for {@link NumericDocValues}
    */
-  abstract class NumericDVAcc extends DocValuesAcc {
+  abstract static class NumericDVAcc extends DocValuesAcc {
     NumericDocValues values;
 
     public NumericDVAcc(FacetContext fcontext, SchemaField sf) throws IOException {
@@ -255,7 +255,7 @@ public abstract class DocValuesAcc extends SlotAcc {
   /**
    * Accumulator for {@link SortedDocValues}
    */
-  abstract class SortedDVAcc extends DocValuesAcc {
+  abstract static class SortedDVAcc extends DocValuesAcc {
     SortedDocValues values;
 
     public SortedDVAcc(FacetContext fcontext, SchemaField sf) throws IOException {
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 42ed3de..f352cd7 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
@@ -337,7 +337,7 @@ public class FacetModule extends SearchComponent {
   // TODO: perhaps factor out some sort of root/parent facet object that doesn't depend
 // on stuff like ResponseBuilder, but contains request parameters,
 // root filter lists (for filter exclusions), etc?
-  class FacetComponentState {
+  static class FacetComponentState {
     ResponseBuilder rb;
     Map<String, Object> facetCommands;
     FacetRequest facetRequest;
diff --git a/solr/core/src/java/org/apache/solr/search/facet/MinMaxAgg.java b/solr/core/src/java/org/apache/solr/search/facet/MinMaxAgg.java
index 828fbe6..034a912 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/MinMaxAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/MinMaxAgg.java
@@ -349,7 +349,7 @@ public class MinMaxAgg extends SimpleAggValueSource {
   }
 
 
-  abstract class OrdAcc extends SlotAcc {
+  abstract static class OrdAcc extends SlotAcc {
     final static int MISSING = -1;
     SchemaField field;
     int[] slotOrd;
diff --git a/solr/core/src/java/org/apache/solr/search/facet/MissingAgg.java b/solr/core/src/java/org/apache/solr/search/facet/MissingAgg.java
index b1b630a..3eae91d 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/MissingAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/MissingAgg.java
@@ -64,7 +64,7 @@ public class MissingAgg extends SimpleAggValueSource {
     return new FacetModule.FacetLongMerger();
   }
 
-  class MissingSlotAcc extends SlotAcc.LongFuncSlotAcc {
+  static class MissingSlotAcc extends SlotAcc.LongFuncSlotAcc {
 
     public MissingSlotAcc(ValueSource values, FacetContext fcontext, int numSlots) {
       super(values, fcontext, numSlots, 0);
diff --git a/solr/core/src/java/org/apache/solr/search/facet/SumsqAgg.java b/solr/core/src/java/org/apache/solr/search/facet/SumsqAgg.java
index cecb9b8..320b009 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/SumsqAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/SumsqAgg.java
@@ -99,7 +99,7 @@ public class SumsqAgg extends SimpleAggValueSource {
     }
   }
 
-  class SumSqUnInvertedFieldAcc extends UnInvertedFieldAcc.DoubleUnInvertedFieldAcc {
+  static class SumSqUnInvertedFieldAcc extends UnInvertedFieldAcc.DoubleUnInvertedFieldAcc {
 
     public SumSqUnInvertedFieldAcc(FacetContext fcontext, SchemaField sf, int numSlots) throws IOException {
       super(fcontext, sf, numSlots, 0);
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..4873542 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
@@ -104,19 +104,7 @@ public class ReverseOrdFieldSource extends ValueSource {
     final SortedDocValues sindex = SortedSetSelector.wrap(DocValues.getSortedSet(r, field), SortedSetSelector.Type.MIN);
     final int end = sindex.getValueCount();
 
-    return new IntDocValues(this) {
-      @Override
-      public int intVal(int doc) throws IOException {
-        if (doc+off > sindex.docID()) {
-          sindex.advance(doc+off);
-        }
-        if (doc+off == sindex.docID()) {
-          return (end - sindex.ordValue() - 1);
-        } else {
-          return end;
-        }
-      }
-    };
+    return new MyIntDocValues(off, sindex, end);
   }
 
   @Override
@@ -132,4 +120,28 @@ public class ReverseOrdFieldSource extends ValueSource {
     return hcode + field.hashCode();
   }
 
+  private class MyIntDocValues extends IntDocValues {
+    private final int off;
+    private final SortedDocValues sindex;
+    private final int end;
+
+    public MyIntDocValues(int off, SortedDocValues sindex, int end) {
+      super(ReverseOrdFieldSource.this);
+      this.off = off;
+      this.sindex = sindex;
+      this.end = end;
+    }
+
+    @Override
+    public int intVal(int doc) throws IOException {
+      if (doc+ off > sindex.docID()) {
+        sindex.advance(doc+ off);
+      }
+      if (doc+ off == sindex.docID()) {
+        return (end - sindex.ordValue() - 1);
+      } else {
+        return end;
+      }
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
index 064faee..3e2ae06 100644
--- a/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/join/ScoreJoinQParserPlugin.java
@@ -205,64 +205,7 @@ public class ScoreJoinQParserPlugin extends QParserPlugin {
 
   @Override
   public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
-    return new QParser(qstr, localParams, params, req) {
-      @Override
-      public Query parse() throws SyntaxError {
-        final String fromField = localParams.get("from");
-        final String fromIndex = localParams.get("fromIndex");
-        final String toField = localParams.get("to");
-        final ScoreMode scoreMode = ScoreModeParser.parse(getParam(SCORE));
-
-        final String v = localParams.get(CommonParams.VALUE);
-
-        final Query q = createQuery(fromField, v, fromIndex, toField, scoreMode,
-            CommonParams.TRUE.equals(localParams.get("TESTenforceSameCoreAsAnotherOne")));
-
-        return q;
-      }
-
-      private Query createQuery(final String fromField, final String fromQueryStr,
-                                String fromIndex, final String toField, final ScoreMode scoreMode,
-                                boolean byPassShortCircutCheck) throws SyntaxError {
-
-        final String myCore = req.getCore().getCoreDescriptor().getName();
-
-        if (fromIndex != null && (!fromIndex.equals(myCore) || byPassShortCircutCheck)) {
-          CoreContainer container = req.getCore().getCoreContainer();
-
-          final String coreName = getCoreName(fromIndex, container);
-          final SolrCore fromCore = container.getCore(coreName);
-          RefCounted<SolrIndexSearcher> fromHolder = null;
-
-          if (fromCore == null) {
-            throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Cross-core join: no such core " + coreName);
-          }
-
-          long fromCoreOpenTime = 0;
-          LocalSolrQueryRequest otherReq = new LocalSolrQueryRequest(fromCore, params);
-
-          try {
-            QParser fromQueryParser = QParser.getParser(fromQueryStr, otherReq);
-            Query fromQuery = fromQueryParser.getQuery();
-
-            fromHolder = fromCore.getRegisteredSearcher();
-            if (fromHolder != null) {
-              fromCoreOpenTime = fromHolder.get().getOpenNanoTime();
-            }
-            return new OtherCoreJoinQuery(fromQuery, fromField, coreName, fromCoreOpenTime,
-                scoreMode, toField);
-          } finally {
-            otherReq.close();
-            fromCore.close();
-            if (fromHolder != null) fromHolder.decref();
-          }
-        } else {
-          QParser fromQueryParser = subQuery(fromQueryStr, null);
-          final Query fromQuery = fromQueryParser.getQuery();
-          return new SameCoreJoinQuery(fromQuery, fromField, toField, scoreMode);
-        }
-      }
-    };
+    return new MyQParser(qstr, localParams, params, req);
   }
 
   /**
@@ -332,6 +275,69 @@ public class ScoreJoinQParserPlugin extends QParserPlugin {
 
     return fromReplica;
   }
+
+  private static class MyQParser extends QParser {
+    public MyQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {
+      super(qstr, localParams, params, req);
+    }
+
+    @Override
+    public Query parse() throws SyntaxError {
+      final String fromField = localParams.get("from");
+      final String fromIndex = localParams.get("fromIndex");
+      final String toField = localParams.get("to");
+      final ScoreMode scoreMode = ScoreModeParser.parse(getParam(SCORE));
+
+      final String v = localParams.get(CommonParams.VALUE);
+
+      final Query q = createQuery(fromField, v, fromIndex, toField, scoreMode,
+          CommonParams.TRUE.equals(localParams.get("TESTenforceSameCoreAsAnotherOne")));
+
+      return q;
+    }
+
+    private Query createQuery(final String fromField, final String fromQueryStr,
+                              String fromIndex, final String toField, final ScoreMode scoreMode,
+                              boolean byPassShortCircutCheck) throws SyntaxError {
+
+      final String myCore = req.getCore().getCoreDescriptor().getName();
+
+      if (fromIndex != null && (!fromIndex.equals(myCore) || byPassShortCircutCheck)) {
+        CoreContainer container = req.getCore().getCoreContainer();
+
+        final String coreName = getCoreName(fromIndex, container);
+        final SolrCore fromCore = container.getCore(coreName);
+        RefCounted<SolrIndexSearcher> fromHolder = null;
+
+        if (fromCore == null) {
+          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Cross-core join: no such core " + coreName);
+        }
+
+        long fromCoreOpenTime = 0;
+        LocalSolrQueryRequest otherReq = new LocalSolrQueryRequest(fromCore, params);
+
+        try {
+          QParser fromQueryParser = QParser.getParser(fromQueryStr, otherReq);
+          Query fromQuery = fromQueryParser.getQuery();
+
+          fromHolder = fromCore.getRegisteredSearcher();
+          if (fromHolder != null) {
+            fromCoreOpenTime = fromHolder.get().getOpenNanoTime();
+          }
+          return new OtherCoreJoinQuery(fromQuery, fromField, coreName, fromCoreOpenTime,
+              scoreMode, toField);
+        } finally {
+          otherReq.close();
+          fromCore.close();
+          if (fromHolder != null) fromHolder.decref();
+        }
+      } else {
+        QParser fromQueryParser = subQuery(fromQueryStr, null);
+        final Query fromQuery = fromQueryParser.getQuery();
+        return new SameCoreJoinQuery(fromQuery, fromField, toField, scoreMode);
+      }
+    }
+  }
 }
 
 
diff --git a/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java b/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java
index 70ce4e4..f9cfc62 100644
--- a/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java
+++ b/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java
@@ -186,8 +186,7 @@ public class CloudMLTQParser extends QParser {
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.add(ID, id);
 
-    SolrQueryRequestBase request = new SolrQueryRequestBase(core, params) {
-    };
+    SolrQueryRequestBase request = new MySolrQueryRequestBase(core, params);
 
     core.getRequestHandler("/get").handleRequest(request, rsp);
     @SuppressWarnings({"rawtypes"})
@@ -209,4 +208,9 @@ public class CloudMLTQParser extends QParser {
     return new Term(field, bytesRefBuilder.toBytesRef());
   }
 
+  private static class MySolrQueryRequestBase extends SolrQueryRequestBase {
+    public MySolrQueryRequestBase(SolrCore core, ModifiableSolrParams params) {
+      super(core, params);
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index 6d7bc0a..388ff85 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -269,7 +269,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
   }
   
   @Contract(threading = ThreadingBehavior.IMMUTABLE)
-  private class BasicAuthUserPrincipal implements Principal, Serializable {
+  private static class BasicAuthUserPrincipal implements Principal, Serializable {
     private String username;
     private final String password;
 
diff --git a/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingInfixLookupFactory.java b/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingInfixLookupFactory.java
index 89df295..8d8ed2e 100644
--- a/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingInfixLookupFactory.java
+++ b/solr/core/src/java/org/apache/solr/spelling/suggest/fst/AnalyzingInfixLookupFactory.java
@@ -117,27 +117,7 @@ public class AnalyzingInfixLookupFactory extends LookupFactory {
     : AnalyzingInfixSuggester.DEFAULT_HIGHLIGHT;
 
     try {
-      return new AnalyzingInfixSuggester(FSDirectory.open(new File(indexPath).toPath()), indexAnalyzer,
-                                         queryAnalyzer, minPrefixChars, true, 
-                                         allTermsRequired, highlight) {
-        @Override
-        public List<LookupResult> lookup(CharSequence key, Set<BytesRef> contexts, int num, boolean allTermsRequired, boolean doHighlight) throws IOException {
-          List<LookupResult> res = super.lookup(key, contexts, num, allTermsRequired, doHighlight);
-          if (doHighlight) {
-            List<LookupResult> res2 = new ArrayList<>();
-            for(LookupResult hit : res) {
-              res2.add(new LookupResult(hit.highlightKey.toString(),
-                                        hit.highlightKey,
-                                        hit.value,
-                                        hit.payload,
-                                        hit.contexts));
-            }
-            res = res2;
-          }
-
-          return res;
-        }
-        };
+      return new MyAnalyzingInfixSuggester(indexPath, indexAnalyzer, queryAnalyzer, minPrefixChars, allTermsRequired, highlight);
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
@@ -147,4 +127,28 @@ public class AnalyzingInfixLookupFactory extends LookupFactory {
   public String storeFileName() {
     return FILENAME;
   }
+
+  private static class MyAnalyzingInfixSuggester extends AnalyzingInfixSuggester {
+    public MyAnalyzingInfixSuggester(String indexPath, Analyzer indexAnalyzer, Analyzer queryAnalyzer, int minPrefixChars, boolean allTermsRequired, boolean highlight) throws IOException {
+      super(FSDirectory.open(new File(indexPath).toPath()), indexAnalyzer, queryAnalyzer, minPrefixChars, true, allTermsRequired, highlight);
+    }
+
+    @Override
+    public List<LookupResult> lookup(CharSequence key, Set<BytesRef> contexts, int num, boolean allTermsRequired, boolean doHighlight) throws IOException {
+      List<LookupResult> res = super.lookup(key, contexts, num, allTermsRequired, doHighlight);
+      if (doHighlight) {
+        List<LookupResult> res2 = new ArrayList<>();
+        for(LookupResult hit : res) {
+          res2.add(new LookupResult(hit.highlightKey.toString(),
+                                    hit.highlightKey,
+                                    hit.value,
+                                    hit.payload,
+                                    hit.contexts));
+        }
+        res = res2;
+      }
+
+      return res;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/spelling/suggest/fst/BlendedInfixLookupFactory.java b/solr/core/src/java/org/apache/solr/spelling/suggest/fst/BlendedInfixLookupFactory.java
index 7ca5aaa..d553e44 100644
--- a/solr/core/src/java/org/apache/solr/spelling/suggest/fst/BlendedInfixLookupFactory.java
+++ b/solr/core/src/java/org/apache/solr/spelling/suggest/fst/BlendedInfixLookupFactory.java
@@ -113,28 +113,7 @@ public class BlendedInfixLookupFactory extends AnalyzingInfixLookupFactory {
     Double exponent = params.get(EXPONENT) == null ? null : Double.valueOf(params.get(EXPONENT).toString());
 
     try {
-      return new BlendedInfixSuggester(FSDirectory.open(new File(indexPath).toPath()),
-                                       indexAnalyzer, queryAnalyzer, minPrefixChars,
-                                       blenderType, numFactor, exponent, true,
-                                       allTermsRequired, highlight) {
-        @Override
-        public List<LookupResult> lookup(CharSequence key, Set<BytesRef> contexts, int num, boolean allTermsRequired, boolean doHighlight) throws IOException {
-          List<LookupResult> res = super.lookup(key, contexts, num, allTermsRequired, doHighlight);
-          if (doHighlight) {
-            List<LookupResult> res2 = new ArrayList<>();
-            for(LookupResult hit : res) {
-              res2.add(new LookupResult(hit.highlightKey.toString(),
-                                        hit.highlightKey,
-                                        hit.value,
-                                        hit.payload,
-                                        hit.contexts));
-            }
-            res = res2;
-          }
-
-          return res;
-        }
-      };
+      return new MyBlendedInfixSuggester(indexPath, indexAnalyzer, queryAnalyzer, minPrefixChars, blenderType, numFactor, exponent, allTermsRequired, highlight);
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
@@ -153,4 +132,29 @@ public class BlendedInfixLookupFactory extends AnalyzingInfixLookupFactory {
     }
     return blenderType;
   }
+
+  private static class MyBlendedInfixSuggester extends BlendedInfixSuggester {
+    public MyBlendedInfixSuggester(String indexPath, Analyzer indexAnalyzer, Analyzer queryAnalyzer, int minPrefixChars, BlenderType blenderType, int numFactor, Double exponent,
+        boolean allTermsRequired, boolean highlight) throws IOException {
+      super(FSDirectory.open(new File(indexPath).toPath()), indexAnalyzer, queryAnalyzer, minPrefixChars, blenderType, numFactor, exponent, true, allTermsRequired, highlight);
+    }
+
+    @Override
+    public List<LookupResult> lookup(CharSequence key, Set<BytesRef> contexts, int num, boolean allTermsRequired, boolean doHighlight) throws IOException {
+      List<LookupResult> res = super.lookup(key, contexts, num, allTermsRequired, doHighlight);
+      if (doHighlight) {
+        List<LookupResult> res2 = new ArrayList<>();
+        for(LookupResult hit : res) {
+          res2.add(new LookupResult(hit.highlightKey.toString(),
+                                    hit.highlightKey,
+                                    hit.value,
+                                    hit.payload,
+                                    hit.contexts));
+        }
+        res = res2;
+      }
+
+      return res;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
index e6e8fda..dcce167 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
@@ -507,18 +507,7 @@ public class FieldCacheImpl implements FieldCache {
       }
       
       // otherwise a no-op uninvert!
-      Uninvert u = new Uninvert(true) {
-        @Override
-        protected TermsEnum termsEnum(Terms terms) throws IOException {
-          throw new AssertionError();
-        }
-
-        @Override
-        protected void visitTerm(BytesRef term) {}
-
-        @Override
-        protected void visitDoc(int docID) {}
-      };
+      Uninvert u = new MyUninvert();
       u.uninvert(reader, field);
       return new BitsEntry(u.docsWithField);
     }
@@ -571,6 +560,23 @@ public class FieldCacheImpl implements FieldCache {
       }
       return new BitsEntry(res);
     }
+
+    private static class MyUninvert extends Uninvert {
+      public MyUninvert() {
+        super(true);
+      }
+
+      @Override
+      protected TermsEnum termsEnum(Terms terms) throws IOException {
+        throw new AssertionError();
+      }
+
+      @Override
+      protected void visitTerm(BytesRef term) {}
+
+      @Override
+      protected void visitDoc(int docID) {}
+    }
   }
 
   @Override
@@ -707,46 +713,7 @@ public class FieldCacheImpl implements FieldCache {
 
       final HoldsOneThing<GrowableWriterAndMinValue> valuesRef = new HoldsOneThing<>();
 
-      Uninvert u = new Uninvert(parser instanceof PointParser) {
-          private long minValue;
-          private long currentValue;
-          private GrowableWriter values;
-
-          @Override
-          public void visitTerm(BytesRef term) {
-            currentValue = parser.parseValue(term);
-            if (values == null) {
-              // Lazy alloc so for the numeric field case
-              // (which will hit a NumberFormatException
-              // when we first try the DEFAULT_INT_PARSER),
-              // we don't double-alloc:
-              int startBitsPerValue;
-              // Make sure than missing values (0) can be stored without resizing
-              if (currentValue < 0) {
-                minValue = currentValue;
-                startBitsPerValue = minValue == Long.MIN_VALUE ? 64 : PackedInts.bitsRequired(-minValue);
-              } else {
-                minValue = 0;
-                startBitsPerValue = PackedInts.bitsRequired(currentValue);
-              }
-              values = new GrowableWriter(startBitsPerValue, reader.maxDoc(), PackedInts.FAST);
-              if (minValue != 0) {
-                values.fill(0, values.size(), -minValue); // default value must be 0
-              }
-              valuesRef.set(new GrowableWriterAndMinValue(values, minValue));
-            }
-          }
-
-          @Override
-          public void visitDoc(int docID) {
-            values.set(docID, currentValue - minValue);
-          }
-          
-          @Override
-          protected TermsEnum termsEnum(Terms terms) throws IOException {
-            return parser.termsEnum(terms);
-          }
-        };
+      Uninvert u = new MyUninvert2(parser, reader, valuesRef);
 
       u.uninvert(reader, key.field);
       wrapper.setDocsWithField(reader, key.field, u.docsWithField, parser);
@@ -757,6 +724,57 @@ public class FieldCacheImpl implements FieldCache {
       }
       return new LongsFromArray(key.field, values.writer.getMutable(), values.minValue, docsWithField);
     }
+
+    private static class MyUninvert2 extends Uninvert {
+      private final Parser parser;
+      private final LeafReader reader;
+      private final HoldsOneThing<GrowableWriterAndMinValue> valuesRef;
+      private long minValue;
+      private long currentValue;
+      private GrowableWriter values;
+
+      public MyUninvert2(Parser parser, LeafReader reader, HoldsOneThing<GrowableWriterAndMinValue> valuesRef) {
+        super(parser instanceof PointParser);
+        this.parser = parser;
+        this.reader = reader;
+        this.valuesRef = valuesRef;
+      }
+
+      @Override
+      public void visitTerm(BytesRef term) {
+        currentValue = parser.parseValue(term);
+        if (values == null) {
+          // Lazy alloc so for the numeric field case
+          // (which will hit a NumberFormatException
+          // when we first try the DEFAULT_INT_PARSER),
+          // we don't double-alloc:
+          int startBitsPerValue;
+          // Make sure than missing values (0) can be stored without resizing
+          if (currentValue < 0) {
+            minValue = currentValue;
+            startBitsPerValue = minValue == Long.MIN_VALUE ? 64 : PackedInts.bitsRequired(-minValue);
+          } else {
+            minValue = 0;
+            startBitsPerValue = PackedInts.bitsRequired(currentValue);
+          }
+          values = new GrowableWriter(startBitsPerValue, reader.maxDoc(), PackedInts.FAST);
+          if (minValue != 0) {
+            values.fill(0, values.size(), -minValue); // default value must be 0
+          }
+          valuesRef.set(new GrowableWriterAndMinValue(values, minValue));
+        }
+      }
+
+      @Override
+      public void visitDoc(int docID) {
+        values.set(docID, currentValue - minValue);
+      }
+
+      @Override
+      protected TermsEnum termsEnum(Terms terms) throws IOException {
+        return parser.termsEnum(terms);
+      }
+    }
   }
 
   public static class SortedDocValuesImpl implements Accountable {
@@ -1175,22 +1193,32 @@ public class FieldCacheImpl implements FieldCache {
       }
 
       final PackedInts.Reader offsetReader = docToOffset.getMutable();
-      Bits docsWithField = new Bits() {
-        @Override
-        public boolean get(int index) {
-          return offsetReader.get(index) != 0;
-        }
-
-        @Override
-        public int length() {
-          return maxDoc;
-        }
-      };
+      Bits docsWithField = new MyBits(offsetReader, maxDoc);
 
       wrapper.setDocsWithField(reader, key.field, docsWithField, null);
       // maybe an int-only impl?
       return new BinaryDocValuesImpl(bytes.freeze(true), offsetReader, docsWithField);
     }
+
+    private static class MyBits implements Bits {
+      private final PackedInts.Reader offsetReader;
+      private final int maxDoc;
+
+      public MyBits(PackedInts.Reader offsetReader, int maxDoc) {
+        this.offsetReader = offsetReader;
+        this.maxDoc = maxDoc;
+      }
+
+      @Override
+      public boolean get(int index) {
+        return offsetReader.get(index) != 0;
+      }
+
+      @Override
+      public int length() {
+        return maxDoc;
+      }
+    }
   }
 
   // TODO: this if DocTermsIndex was already created, we
diff --git a/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java b/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
index d83e70e..5d5ebac 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/UninvertingReader.java
@@ -196,12 +196,7 @@ public class UninvertingReader extends FilterLeafReader {
     final Function<String, Type> mapper;
     
     public UninvertingDirectoryReader(DirectoryReader in, final Function<String, Type> mapper) throws IOException {
-      super(in, new FilterDirectoryReader.SubReaderWrapper() {
-        @Override
-        public LeafReader wrap(LeafReader reader) {
-          return UninvertingReader.wrap(reader, mapper);
-        }
-      });
+      super(in, new MySubReaderWrapper(mapper));
       this.mapper = mapper;
     }
 
@@ -218,6 +213,19 @@ public class UninvertingReader extends FilterLeafReader {
     public CacheHelper getReaderCacheHelper() {
       return in.getReaderCacheHelper();
     }
+
+    private static class MySubReaderWrapper extends SubReaderWrapper {
+      private final Function<String,Type> mapper;
+
+      public MySubReaderWrapper(Function<String,Type> mapper) {
+        this.mapper = mapper;
+      }
+
+      @Override
+      public LeafReader wrap(LeafReader reader) {
+        return UninvertingReader.wrap(reader, mapper);
+      }
+    }
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/update/TransactionLog.java b/solr/core/src/java/org/apache/solr/update/TransactionLog.java
index f052b53..4bbc041 100644
--- a/solr/core/src/java/org/apache/solr/update/TransactionLog.java
+++ b/solr/core/src/java/org/apache/solr/update/TransactionLog.java
@@ -200,9 +200,6 @@ public class TransactionLog implements Closeable {
           return;
         }
 
-        if (start > 0) {
-          raf.setLength(0);
-        }
         addGlobalStrings(globalStrings);
       }
 
@@ -934,7 +931,7 @@ public class TransactionLog implements Closeable {
 
   }
 
-  class ChannelFastInputStream extends FastInputStream {
+  static class ChannelFastInputStream extends FastInputStream {
     private FileChannel ch;
 
     public ChannelFastInputStream(FileChannel ch, long chPosition) {
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 cae28c1..fab2429 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
@@ -34,7 +34,6 @@ import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.CloudDescriptor;
-import org.apache.solr.cloud.LeaderElector;
 import org.apache.solr.cloud.Overseer;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.cloud.ZkShardTerms;
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 9e02384..27a339b 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
@@ -100,12 +100,18 @@ public class UUIDUpdateProcessorFactory extends UpdateRequestProcessorFactory {
       fieldName = schemaField.getName();
     }
 
-    return new AbstractDefaultValueUpdateProcessorFactory.DefaultValueUpdateProcessor(fieldName, next) {
-      @Override
-      public Object getDefaultValue() {
-        return UUID.randomUUID().toString().toLowerCase(Locale.ROOT);
-      }
-    };
+    return new MyDefaultValueUpdateProcessor(fieldName, next);
+  }
+
+  private static class MyDefaultValueUpdateProcessor extends AbstractDefaultValueUpdateProcessorFactory.DefaultValueUpdateProcessor {
+    public MyDefaultValueUpdateProcessor(String fieldName, UpdateRequestProcessor next) {
+      super(fieldName, next);
+    }
+
+    @Override
+    public Object getDefaultValue() {
+      return UUID.randomUUID().toString().toLowerCase(Locale.ROOT);
+    }
   }
 }
 
diff --git a/solr/core/src/test/org/apache/solr/AnalysisAfterCoreReloadTest.java b/solr/core/src/test/org/apache/solr/AnalysisAfterCoreReloadTest.java
index 4941bd1..d098205 100644
--- a/solr/core/src/test/org/apache/solr/AnalysisAfterCoreReloadTest.java
+++ b/solr/core/src/test/org/apache/solr/AnalysisAfterCoreReloadTest.java
@@ -41,8 +41,8 @@ public class AnalysisAfterCoreReloadTest extends SolrTestCaseJ4 {
   
   @BeforeClass
   public static void beforeClass() throws Exception {
-    tmpSolrHome = createTempDir().toFile().getAbsolutePath();
-    FileUtils.copyDirectory(new File(TEST_HOME()), new File(tmpSolrHome).getAbsoluteFile());
+    tmpSolrHome = SolrTestUtil.createTempDir().toFile().getAbsolutePath();
+    FileUtils.copyDirectory(new File(SolrTestUtil.TEST_HOME()), new File(tmpSolrHome).getAbsoluteFile());
     initCore("solrconfig.xml", "schema.xml", new File(tmpSolrHome).getAbsolutePath());
   }
 
diff --git a/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java b/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
index d9cf23a..f81f7b3 100644
--- a/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
+++ b/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
@@ -359,9 +359,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
 
     // test that malformed numerics cause client error not server error
     for (String field : FIELDS) {
-      SolrException e1 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a bad date: " + field,
-          () -> h.update(add( doc("id","100", field, BAD_VALUE))));
+      SolrException e1 = SolrTestCaseUtil.expectThrows(SolrException.class, "Didn't encounter an error trying to add a bad date: " + field, () -> h.update(add(doc("id", "100", field, BAD_VALUE))));
       String msg1 = e1.getMessage();
       // nocommit
 //      assertTrue("not an (update) client error on field: " + field +" : "+ msg1,
@@ -376,20 +374,15 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
       if (!sf.hasDocValues() && !sf.indexed()) {
         continue;
       }
-      SolrException e2 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a bad date: " + field,
-          () -> query(req("q",field + ":" + BAD_VALUE))
-      );
+      SolrException e2 = SolrTestCaseUtil.expectThrows(SolrException.class, "Didn't encounter an error trying to add a bad date: " + field, () -> query(req("q", field + ":" + BAD_VALUE)));
       String msg2 = e2.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg2,
           400 <= e2.code() && e2.code() < 500);
       assertTrue("(search) client error does not mention bad value: " + msg2,
           msg2.contains(BAD_VALUE));
 
-      SolrException e3 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a bad date: " + field,
-          () -> query(req("q",field + ":[NOW TO " + BAD_VALUE + "]"))
-      );
+      SolrException e3 = SolrTestCaseUtil
+          .expectThrows(SolrException.class, "Didn't encounter an error trying to add a bad date: " + field, () -> query(req("q", field + ":[NOW TO " + BAD_VALUE + "]")));
       String msg3 = e3.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg3,
           400 <= e3.code() && e3.code() < 500);
@@ -417,9 +410,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
 
     // test that malformed numerics cause client error not server error
     for (String field : FIELDS) {
-      SolrException e1 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a non-number: " + field,
-          () -> h.update(add( doc("id","100", field, BAD_VALUE))));
+      SolrException e1 = SolrTestCaseUtil.expectThrows(SolrException.class, "Didn't encounter an error trying to add a non-number: " + field, () -> h.update(add(doc("id", "100", field, BAD_VALUE))));
       String msg1 = e1.toString();
       // nocommit
 //      assertTrue("not an (update) client error on field: " + field +" : "+ msg1,
@@ -435,20 +426,15 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
         continue;
       }
 
-      SolrException e2 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a non-number: " + field,
-          () -> query(req("q",field + ":" + BAD_VALUE))
-      );
+      SolrException e2 = SolrTestCaseUtil.expectThrows(SolrException.class, "Didn't encounter an error trying to add a non-number: " + field, () -> query(req("q", field + ":" + BAD_VALUE)));
       String msg2 = e2.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg2,
           400 <= e2.code() && e2.code() < 500);
       assertTrue("(search) client error does not mention bad value: " + msg2,
           msg2.contains(BAD_VALUE));
 
-      SolrException e3 = expectThrows(SolrException.class,
-          "Didn't encounter an error trying to add a non-number: " + field,
-          () -> query(req("q",field + ":[10 TO " + BAD_VALUE + "]"))
-      );
+      SolrException e3 = SolrTestCaseUtil
+          .expectThrows(SolrException.class, "Didn't encounter an error trying to add a non-number: " + field, () -> query(req("q", field + ":[10 TO " + BAD_VALUE + "]")));
       String msg3 = e3.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg3,
           400 <= e3.code() && e3.code() < 500);
@@ -891,9 +877,9 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     
     // a ridiculoulsy long date math expression that's still equivalent to july4
     final StringBuilder july4Long = new StringBuilder(july4);
-    final int iters = atLeast(10);
+    final int iters = SolrTestUtil.atLeast(10);
     for (int i = 0; i < iters; i++) {
-      final String val = String.valueOf(atLeast(1));
+      final String val = String.valueOf(SolrTestUtil.atLeast(1));
       july4Long.append("+" + val + "SECONDS-" + val + "SECONDS");
     }
 
@@ -1009,13 +995,10 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     assertU(commit());
 
     for (String f : Arrays.asList("sortabuse_not_uninvertible", "sortabuse_t")) {
-      RuntimeException outerEx = expectThrows(RuntimeException.class, () -> {
-          ignoreException("sortabuse");
-          assertQ("sort on something that shouldn't work",
-                  req("q", "*:*",
-                      "sort", f+ " asc"),
-                  "*[count(//doc)=2]");
-        });
+      RuntimeException outerEx = SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> {
+        ignoreException("sortabuse");
+        assertQ("sort on something that shouldn't work", req("q", "*:*", "sort", f + " asc"), "*[count(//doc)=2]");
+      });
       Throwable root = getRootCause(outerEx);
       assertEquals("sort exception root cause",
                    SolrException.class, root.getClass());
diff --git a/solr/core/src/test/org/apache/solr/CursorPagingTest.java b/solr/core/src/test/org/apache/solr/CursorPagingTest.java
index 6e67c7e..c755f89 100644
--- a/solr/core/src/test/org/apache/solr/CursorPagingTest.java
+++ b/solr/core/src/test/org/apache/solr/CursorPagingTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.SentinelIntSet;
 import org.apache.lucene.util.TestUtil;
 import org.apache.lucene.util.mutable.MutableValueInt;
@@ -504,7 +505,7 @@ public class CursorPagingTest extends SolrTestCaseJ4 {
   /**
    * test that our assumptions about how caches are affected hold true
    */
-  @Nightly // can randomly hit:
+  @LuceneTestCase.Nightly // can randomly hit:
 //  java.lang.UnsupportedOperationException
 //  at __randomizedtesting.SeedInfo.seed([4ECEFFACB197503C:3CC812D4842EB732]:0)
 //  at org.apache.lucene.queries.function.FunctionValues.longVal(FunctionValues.java:49)
@@ -563,12 +564,12 @@ public class CursorPagingTest extends SolrTestCaseJ4 {
 
   /** randomized testing of a non-trivial number of docs using assertFullWalkNoDups 
    */
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testRandomSortsOnLargeIndex() throws Exception {
     final Collection<String> allFieldNames = getAllSortFieldNames();
 
     final int initialDocs = TestUtil.nextInt(random(), 100, TEST_NIGHTLY ? 200 : 102);
-    final int totalDocs = TEST_NIGHTLY ? atLeast(500) : 105;
+    final int totalDocs = TEST_NIGHTLY ? LuceneTestCase.atLeast(500) : 105;
 
     // start with a smallish number of documents, and test that we can do a full walk using a 
     // sort on *every* field in the schema...
@@ -599,7 +600,7 @@ public class CursorPagingTest extends SolrTestCaseJ4 {
     }
     assertU(commit());
 
-    final int numRandomSorts = atLeast(TEST_NIGHTLY ? 3 : 1);
+    final int numRandomSorts = LuceneTestCase.atLeast(TEST_NIGHTLY ? 3 : 1);
     for (int i = 0; i < numRandomSorts; i++) {
       final String sort = buildRandomSort(allFieldNames);
       final String rows = "" + TestUtil.nextInt(random(), 63, TEST_NIGHTLY ? 113 : 73);
@@ -707,7 +708,7 @@ public class CursorPagingTest extends SolrTestCaseJ4 {
   /**
    * test faceting with deep paging
    */
-  @Nightly // slow
+  @LuceneTestCase.Nightly // slow
   public void testFacetingWithRandomSorts() throws Exception {
     final int numDocs = TestUtil.nextInt(random(), 1000, 3000);
     String[] fieldsToFacetOn = { "int", "long", "str" };
@@ -852,7 +853,7 @@ public class CursorPagingTest extends SolrTestCaseJ4 {
     throws Exception {
 
     try {
-      SolrException e = expectThrows(SolrException.class, () -> {
+      SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
         ignoreException(expSubstr);
         assertJQ(req(p));
       });
diff --git a/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java b/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
index d3cd0f4..fe49e90 100644
--- a/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
+++ b/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
@@ -108,7 +108,7 @@ public class DistributedIntervalFacetingTest extends
     // Fields to use for interval faceting
     String[] fields = new String[]{"test_s_dv", "test_i_dv", "test_l_dv", "test_f_dv", "test_d_dv",
         "test_ss_dv", "test_is_dv", "test_fs_dv", "test_ls_dv", "test_ds_dv"};
-    for (int i = 0; i < atLeast(TEST_NIGHTLY ? 500 : 50); i++) {
+    for (int i = 0; i < SolrTestUtil.atLeast(TEST_NIGHTLY ? 500 : 50); i++) {
       if (random().nextInt(50) == 0) {
         //have some empty docs
         indexr("id", String.valueOf(i));
@@ -157,7 +157,7 @@ public class DistributedIntervalFacetingTest extends
     handle.put("maxScore", SKIPVAL);
 
 
-    for (int i = 0; i < atLeast(TEST_NIGHTLY ? 100 : 15); i++) {
+    for (int i = 0; i < SolrTestUtil.atLeast(TEST_NIGHTLY ? 100 : 15); i++) {
       doTestQuery(cardinality, fields);
     }
 
diff --git a/solr/core/src/test/org/apache/solr/HelloWorldSolrCloudTestCase.java b/solr/core/src/test/org/apache/solr/HelloWorldSolrCloudTestCase.java
index 4592010..bc7afa5 100644
--- a/solr/core/src/test/org/apache/solr/HelloWorldSolrCloudTestCase.java
+++ b/solr/core/src/test/org/apache/solr/HelloWorldSolrCloudTestCase.java
@@ -50,7 +50,7 @@ public class HelloWorldSolrCloudTestCase extends SolrCloudTestCase {
 
     // create and configure cluster
     configureCluster(3)
-        .addConfig("conf", configset("cloud-dynamic"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-dynamic"))
         .configure();
 
     // create an empty collection
diff --git a/solr/core/src/test/org/apache/solr/SolrTestCaseJ4Test.java b/solr/core/src/test/org/apache/solr/SolrTestCaseJ4Test.java
index 38b9934..b955854 100644
--- a/solr/core/src/test/org/apache/solr/SolrTestCaseJ4Test.java
+++ b/solr/core/src/test/org/apache/solr/SolrTestCaseJ4Test.java
@@ -22,9 +22,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.core.SolrCore;
 import org.junit.After;
-import org.junit.AfterClass;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 
@@ -36,11 +34,11 @@ public class SolrTestCaseJ4Test extends SolrTestCaseJ4 {
   public void beforeTest() throws Exception {
     // Create a temporary directory that holds a core NOT named "collection1". Use the smallest configuration sets
     // we can so we don't copy that much junk around.
-    tmpSolrHome = createTempDir().toFile().getAbsolutePath();
+    tmpSolrHome = SolrTestUtil.createTempDir().toFile().getAbsolutePath();
 
     File subHome = new File(new File(tmpSolrHome, "core0"), "conf");
     assertTrue("Failed to make subdirectory ", subHome.mkdirs());
-    String top = SolrTestCaseJ4.TEST_HOME() + "/collection1/conf";
+    String top = SolrTestUtil.TEST_HOME() + "/collection1/conf";
     FileUtils.copyFile(new File(top, "schema-tiny.xml"), new File(subHome, "schema-tiny.xml"));
     FileUtils.copyFile(new File(top, "solrconfig-minimal.xml"), new File(subHome, "solrconfig-minimal.xml"));
     FileUtils.copyFile(new File(top, "solrconfig.snippet.randomindexconfig.xml"), new File(subHome, "solrconfig.snippet.randomindexconfig.xml"));
@@ -51,7 +49,7 @@ public class SolrTestCaseJ4Test extends SolrTestCaseJ4 {
     FileUtils.touch(new File(tmpSolrHome, "core0/core.properties"));
     FileUtils.touch(new File(tmpSolrHome, "core1/core.properties"));
 
-    FileUtils.copyFile(getFile("solr/solr.xml"), new File(tmpSolrHome, "solr.xml"));
+    FileUtils.copyFile(SolrTestUtil.getFile("solr/solr.xml"), new File(tmpSolrHome, "solr.xml"));
 
     initCore("solrconfig-minimal.xml", "schema-tiny.xml", tmpSolrHome, "core1");
   }
@@ -79,11 +77,11 @@ public class SolrTestCaseJ4Test extends SolrTestCaseJ4 {
     params.add("rows", "42");
     assertEquals(params.toString(), params("q", "*:*", "rows", "42").toString());
 
-    expectThrows(RuntimeException.class, () -> {
+    SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> {
       params("parameterWithoutValue");
     });
 
-    expectThrows(RuntimeException.class, () -> {
+    SolrTestCaseUtil.expectThrows(RuntimeException.class, () -> {
       params("q", "*:*", "rows", "42", "parameterWithoutValue");
     });
   }
diff --git a/solr/core/src/test/org/apache/solr/TestCrossCoreJoin.java b/solr/core/src/test/org/apache/solr/TestCrossCoreJoin.java
index 57ad11a..59ac498 100644
--- a/solr/core/src/test/org/apache/solr/TestCrossCoreJoin.java
+++ b/solr/core/src/test/org/apache/solr/TestCrossCoreJoin.java
@@ -48,7 +48,7 @@ public class TestCrossCoreJoin extends SolrTestCaseJ4 {
 
     // File testHome = createTempDir().toFile();
     // FileUtils.copyDirectory(getFile("solrj/solr"), testHome);
-    initCore("solrconfig.xml", "schema12.xml", TEST_HOME(), "collection1");
+    initCore("solrconfig.xml", "schema12.xml", SolrTestUtil.TEST_HOME(), "collection1");
     final CoreContainer coreContainer = h.getCoreContainer();
 
     fromCore = coreContainer.create("fromCore", ImmutableMap.of("configSet", "minimal"));
diff --git a/solr/core/src/test/org/apache/solr/TestCursorMarkWithoutUniqueKey.java b/solr/core/src/test/org/apache/solr/TestCursorMarkWithoutUniqueKey.java
index 7424ec8..029e396 100644
--- a/solr/core/src/test/org/apache/solr/TestCursorMarkWithoutUniqueKey.java
+++ b/solr/core/src/test/org/apache/solr/TestCursorMarkWithoutUniqueKey.java
@@ -56,10 +56,8 @@ public class TestCursorMarkWithoutUniqueKey extends SolrTestCaseJ4 {
 
     try {
       ignoreException("Cursor functionality is not available unless the IndexSchema defines a uniqueKey field");
-      expectThrows(RuntimeException.class,
-          "No exception when querying with a cursorMark with no uniqueKey defined.",
-          () -> assertQ(req("q", "*:*", "sort", "fld desc", "cursorMark", CURSOR_MARK_START))
-      );
+      SolrTestCaseUtil.expectThrows(RuntimeException.class, "No exception when querying with a cursorMark with no uniqueKey defined.",
+          () -> assertQ(req("q", "*:*", "sort", "fld desc", "cursorMark", CURSOR_MARK_START)));
     } finally {
       unIgnoreException("Cursor functionality is not available unless the IndexSchema defines a uniqueKey field");
     }
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
index 220f62c..fb79226 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
@@ -283,10 +283,7 @@ public class TestDistributedGrouping extends BaseDistributedSearchTestCase {
         "sort", i1 + " asc, id asc");
 
     ignoreException("'group.offset' parameter cannot be negative");
-    SolrException exception = expectThrows(SolrException.class, () -> query("q", "*:*",
-        "group", "true",
-        "group.query", t1 + ":kings OR " + t1 + ":eggs", "group.offset", "-1")
-    );
+    SolrException exception = SolrTestCaseUtil.expectThrows(SolrException.class, () -> query("q", "*:*", "group", "true", "group.query", t1 + ":kings OR " + t1 + ":eggs", "group.offset", "-1"));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
     assertThat(exception.getMessage(), containsString("'group.offset' parameter cannot be negative"));
     resetExceptionIgnores();
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
index d94e7f4..4ee2e5b 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
@@ -81,8 +81,8 @@ public class TestDistributedSearch extends BaseDistributedSearchTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   String t1="a_t";
-  String i1 = pickRandom("a_i1", "a_i_p", "a_i_ni_p");
-  String nint = pickRandom("n_i", "n_is_p", "n_is_ni_p");
+  String i1 = SolrTestCaseUtil.pickRandom("a_i1", "a_i_p", "a_i_ni_p");
+  String nint = SolrTestCaseUtil.pickRandom("n_i", "n_is_p", "n_is_ni_p");
   String tint = "n_ti";
   String tlong = "other_tl1";
   String tdate_a = "a_n_tdt";
@@ -406,7 +406,7 @@ public class TestDistributedSearch extends BaseDistributedSearchTestCase {
     query("q", "toyata", "fl", "id,lowerfilt", "spellcheck", true, "spellcheck.q", "toyata", "qt", "/spellCheckCompRH_Direct", "shards.qt", "/spellCheckCompRH_Direct");
 
     stress=0;  // turn off stress... we want to tex max combos in min time
-    for (int i=0; i<(TEST_NIGHTLY ? 25 : 5)*RANDOM_MULTIPLIER; i++) {
+    for (int i=0; i<(TEST_NIGHTLY ? 25 : 5)*LuceneTestCase.RANDOM_MULTIPLIER; i++) {
       String f = fieldNames[random().nextInt(fieldNames.length)];
       if (random().nextBoolean()) f = t1;  // the text field is a really interesting one to facet on (and it's multi-valued too)
 
@@ -1285,28 +1285,28 @@ public class TestDistributedSearch extends BaseDistributedSearchTestCase {
   private void validateCommonQueryParameters() throws Exception {
     ignoreException("parameter cannot be negative");
 
-    SolrException e1 = expectThrows(SolrException.class, () -> {
+    SolrException e1 = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       SolrQuery query = new SolrQuery();
       query.setParam("start", "non_numeric_value").setQuery("*");
       QueryResponse resp = query(query);
     });
     assertEquals(ErrorCode.BAD_REQUEST.code, e1.code());
 
-    SolrException e2 = expectThrows(SolrException.class, () -> {
+    SolrException e2 = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       SolrQuery query = new SolrQuery();
       query.setStart(-1).setQuery("*");
       QueryResponse resp = query(query);
     });
     assertEquals(ErrorCode.BAD_REQUEST.code, e2.code());
 
-    SolrException e3 = expectThrows(SolrException.class, () -> {
+    SolrException e3 = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       SolrQuery query = new SolrQuery();
       query.setRows(-1).setStart(0).setQuery("*");
       QueryResponse resp = query(query);
     });
     assertEquals(ErrorCode.BAD_REQUEST.code, e3.code());
 
-    SolrException e4 = expectThrows(SolrException.class, () -> {
+    SolrException e4 = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       SolrQuery query = new SolrQuery();
       query.setParam("rows", "non_numeric_value").setQuery("*");
       QueryResponse resp = query(query);
diff --git a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
index 0224aba..74c16eb 100644
--- a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
@@ -127,7 +127,7 @@ public class TestGroupingSearch extends SolrTestCaseJ4 {
         , "//arr[@name='groups']/lst[2]/result/doc/*[@name='id'][.='5']"
     );
 
-    SolrException exception = expectThrows(SolrException.class, () -> {
+    SolrException exception = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       h.query(req("q", "title:title", "group", "true", "group.field", "group_i", "group.offset", "-1"));
     });
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
@@ -752,12 +752,12 @@ public class TestGroupingSearch extends SolrTestCaseJ4 {
      assertJQ(req("q","id:"+doc.id), "/response/numFound==1");
     **/
 
-    int indexIter=atLeast(10);  // make >0 to enable test
-    int queryIter=atLeast(50);
+    int indexIter= SolrTestUtil.atLeast(10);  // make >0 to enable test
+    int queryIter= SolrTestUtil.atLeast(50);
 
     while (--indexIter >= 0) {
 
-      int indexSize = random().nextInt(25 * RANDOM_MULTIPLIER);
+      int indexSize = random().nextInt(25 * LuceneTestCase.RANDOM_MULTIPLIER);
 //indexSize=2;
       List<FldType> types = new ArrayList<>();
       types.add(new FldType("id",ONE_ONE, new SVal('A','Z',4,4)));
diff --git a/solr/core/src/test/org/apache/solr/TestJoin.java b/solr/core/src/test/org/apache/solr/TestJoin.java
index 29e0dd8..ee39980 100644
--- a/solr/core/src/test/org/apache/solr/TestJoin.java
+++ b/solr/core/src/test/org/apache/solr/TestJoin.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.Utils;
@@ -154,13 +155,13 @@ public class TestJoin extends SolrTestCaseJ4 {
     ModifiableSolrParams p = params("sort","id asc");
 
     // "from" field missing docValues
-    expectThrows(SolrException.class, () -> {
-      query(req(p, "q", "{!join from=nodocvalues_s to=dept_ss_dv method=topLevelDV}*:*", "fl","id"));
+    SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+      query(req(p, "q", "{!join from=nodocvalues_s to=dept_ss_dv method=topLevelDV}*:*", "fl", "id"));
     });
 
     // "to" field missing docValues
-    expectThrows(SolrException.class, () -> {
-      query(req(p, "q", "{!join from=dept_ss_dv to=nodocvalues_s method=topLevelDV}*:*", "fl","id"));
+    SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+      query(req(p, "q", "{!join from=dept_ss_dv to=nodocvalues_s method=topLevelDV}*:*", "fl", "id"));
     });
   }
 
@@ -185,8 +186,8 @@ public class TestJoin extends SolrTestCaseJ4 {
 
   @Test
   public void testRandomJoin() throws Exception {
-    int indexIter= TEST_NIGHTLY ? 50 : 5 * RANDOM_MULTIPLIER;
-    int queryIter= TEST_NIGHTLY ? 50 : 5 * RANDOM_MULTIPLIER;
+    int indexIter= TEST_NIGHTLY ? 50 : 5 * LuceneTestCase.RANDOM_MULTIPLIER;
+    int queryIter= TEST_NIGHTLY ? 50 : 5 * LuceneTestCase.RANDOM_MULTIPLIER;
 
     // groups of fields that have any chance of matching... used to
     // increase test effectiveness by avoiding 0 resultsets much of the time.
@@ -197,7 +198,7 @@ public class TestJoin extends SolrTestCaseJ4 {
 
 
     while (--indexIter >= 0) {
-      int indexSize = random().nextInt(20 * RANDOM_MULTIPLIER);
+      int indexSize = random().nextInt(20 * LuceneTestCase.RANDOM_MULTIPLIER);
 
       List<FldType> types = new ArrayList<>();
       types.add(new FldType("id",ONE_ONE, new SVal('A','Z',4,4)));
diff --git a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
index ebbfef7..68f2284 100644
--- a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
+++ b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -156,7 +157,7 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 {
   @Test
   public void testRandomFaceting() throws Exception {
     Random rand = random();
-    int iter = atLeast(TEST_NIGHTLY ? 100 : 10);
+    int iter = SolrTestUtil.atLeast(TEST_NIGHTLY ? 100 : 10);
     init();
     addMoreDocs(0);
     
@@ -211,7 +212,7 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 {
       }
 
       if (rand.nextInt(100) < 20) {
-        if(rarely()) {
+        if(LuceneTestCase.rarely()) {
           params.add("facet.limit", "-1");
         } else {
           int limit = TEST_NIGHTLY ? 100 : 10;
diff --git a/solr/core/src/test/org/apache/solr/TestRandomFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
index 2d6df31..7910d8f 100644
--- a/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
+++ b/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
@@ -153,7 +153,7 @@ public class TestRandomFaceting extends SolrTestCaseJ4 {
   @Test
   public void testRandomFaceting() throws Exception {
     Random rand = random();
-    int iter = atLeast(100);
+    int iter = SolrTestUtil.atLeast(100);
     init();
     addMoreDocs(0);
     
diff --git a/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java b/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
index 09efba1..bf4faea 100644
--- a/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
+++ b/solr/core/src/test/org/apache/solr/TestSolrCoreProperties.java
@@ -49,7 +49,7 @@ public class TestSolrCoreProperties extends SolrJettyTestBase {
 
   @BeforeClass
   public static void beforeTestSolrCoreProperties() throws Exception {
-    File homeDir = createTempDir().toFile();
+    File homeDir = SolrTestUtil.createTempDir().toFile();
 
     File collDir = new File(homeDir, "collection1");
     File dataDir = new File(collDir, "data");
@@ -60,8 +60,8 @@ public class TestSolrCoreProperties extends SolrJettyTestBase {
     dataDir.mkdirs();
     confDir.mkdirs();
 
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME(), "solr.xml"), new File(homeDir, "solr.xml"));
-    String src_dir = TEST_HOME() + "/collection1/conf";
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME(), "solr.xml"), new File(homeDir, "solr.xml"));
+    String src_dir = SolrTestUtil.TEST_HOME() + "/collection1/conf";
     FileUtils.copyFile(new File(src_dir, "schema-tiny.xml"), 
                        new File(confDir, "schema.xml"));
     FileUtils.copyFile(new File(src_dir, "solrconfig-solcoreproperties.xml"), 
@@ -82,7 +82,7 @@ public class TestSolrCoreProperties extends SolrJettyTestBase {
     Properties nodeProperties = new Properties();
     // this sets the property for jetty starting SolrDispatchFilter
     if (System.getProperty("solr.data.dir") == null && System.getProperty("solr.hdfs.home") == null) {
-      nodeProperties.setProperty("solr.data.dir", createTempDir().toFile().getCanonicalPath());
+      nodeProperties.setProperty("solr.data.dir", SolrTestUtil.createTempDir().toFile().getCanonicalPath());
     }
     jetty = new JettySolrRunner(homeDir.getAbsolutePath(), nodeProperties, buildJettyConfig("/solr"));
 
diff --git a/solr/core/src/test/org/apache/solr/TestTolerantSearch.java b/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
index e6a5cd5..a175d83 100644
--- a/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestTolerantSearch.java
@@ -47,20 +47,20 @@ public class TestTolerantSearch extends SolrJettyTestBase {
   private static File solrHome;
   
   private File createSolrHome() throws Exception {
-    File workDir = createTempDir().toFile();
+    File workDir = SolrTestUtil.createTempDir().toFile();
     setupJettyTestHome(workDir, "collection1");
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/solrconfig-tolerant-search.xml"), new File(workDir, "collection1/conf/solrconfig.xml"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/solrconfig.snippet.randomindexconfig.xml"), new File(workDir, "configsets/collection1/conf/solrconfig.snippet.randomindexconfig.xml"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/schema.xml"), new File(workDir, "collection1/conf/schema.xml"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/enumsConfig.xml"), new File(workDir, "collection1/conf/enumsConfig.xml"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/currency.xml"), new File(workDir, "collection1/conf/currency.xml"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/open-exchange-rates.json"), new File(workDir, "collection1/conf/open-exchange-rates.json"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/old_synonyms.txt"), new File(workDir, "collection1/conf/old_synonyms.txt"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/mapping-ISOLatin1Accent.txt"), new File(workDir, "configsets/collection1/conf/mapping-ISOLatin1Accent.txt"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/protwords.txt"), new File(workDir, "collection1/conf/protwords.txt"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/synonyms.txt"), new File(workDir, "collection1/conf/synonyms.txt"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/stopwords.txt"), new File(workDir, "collection1/conf/stopwords.txt"));
-    FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME() + "/collection1/conf/old_synonyms.txt"), new File(workDir, "collection1/conf/old_synonyms.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/solrconfig-tolerant-search.xml"), new File(workDir, "collection1/conf/solrconfig.xml"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/solrconfig.snippet.randomindexconfig.xml"), new File(workDir, "configsets/collection1/conf/solrconfig.snippet.randomindexconfig.xml"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/schema.xml"), new File(workDir, "collection1/conf/schema.xml"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/enumsConfig.xml"), new File(workDir, "collection1/conf/enumsConfig.xml"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/currency.xml"), new File(workDir, "collection1/conf/currency.xml"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/open-exchange-rates.json"), new File(workDir, "collection1/conf/open-exchange-rates.json"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/old_synonyms.txt"), new File(workDir, "collection1/conf/old_synonyms.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/mapping-ISOLatin1Accent.txt"), new File(workDir, "configsets/collection1/conf/mapping-ISOLatin1Accent.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/protwords.txt"), new File(workDir, "collection1/conf/protwords.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/synonyms.txt"), new File(workDir, "collection1/conf/synonyms.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/stopwords.txt"), new File(workDir, "collection1/conf/stopwords.txt"));
+    FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME() + "/collection1/conf/old_synonyms.txt"), new File(workDir, "collection1/conf/old_synonyms.txt"));
 
     FileUtils.copyDirectory(new File(workDir, "collection1"), new File(workDir, "collection2"));
     return workDir;
@@ -150,7 +150,7 @@ public class TestTolerantSearch extends SolrJettyTestBase {
     
     //ignoreException("Dummy exception in BadResponseWriter");
 
-    expectThrows(SolrException.class, () -> collection1.query(query));
+    SolrTestCaseUtil.expectThrows(SolrException.class, () -> collection1.query(query));
 
     query.set(ShardParams.SHARDS_TOLERANT, "true");
     QueryResponse response = collection1.query(query);
@@ -195,7 +195,7 @@ public class TestTolerantSearch extends SolrJettyTestBase {
     
     ignoreException("Dummy exception in BadResponseWriter");
 
-    expectThrows(Exception.class, () -> collection1.query(query));
+    SolrTestCaseUtil.expectThrows(Exception.class, () -> collection1.query(query));
 
     query.set(ShardParams.SHARDS_TOLERANT, "true");
     QueryResponse response = collection1.query(query);
diff --git a/solr/core/src/test/org/apache/solr/TestTrie.java b/solr/core/src/test/org/apache/solr/TestTrie.java
index 55d405e..61f5857 100644
--- a/solr/core/src/test/org/apache/solr/TestTrie.java
+++ b/solr/core/src/test/org/apache/solr/TestTrie.java
@@ -20,6 +20,7 @@ import java.text.SimpleDateFormat;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.FieldType;
@@ -216,7 +217,7 @@ public class TestTrie extends SolrTestCaseJ4 {
   @Test
   public void testTrieFacet_PrecisionStep() throws Exception {
     if (Boolean.getBoolean(NUMERIC_POINTS_SYSPROP)) {
-      assumeTrue("Skipping test: Points+facets require docValues, but randomizer: points=true && DV=false",
+      LuceneTestCase.assumeTrue("Skipping test: Points+facets require docValues, but randomizer: points=true && DV=false",
                  Boolean.getBoolean(NUMERIC_DOCVALUES_SYSPROP));
     }
     
diff --git a/solr/core/src/test/org/apache/solr/analysis/ProtectedTermFilterFactoryTest.java b/solr/core/src/test/org/apache/solr/analysis/ProtectedTermFilterFactoryTest.java
index c663b3c..3d7c23b 100644
--- a/solr/core/src/test/org/apache/solr/analysis/ProtectedTermFilterFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/analysis/ProtectedTermFilterFactoryTest.java
@@ -24,6 +24,7 @@ import org.apache.lucene.analysis.BaseTokenStreamTestCase;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.miscellaneous.ProtectedTermFilterFactory;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.BeforeClass;
 
@@ -41,7 +42,7 @@ public class ProtectedTermFilterFactoryTest extends SolrTestCaseJ4 {
     args.put("protected", "protected-1.txt,protected-2.txt");  // Protected: foobar, jaxfopbuz, golden, compote
     args.put("wrappedFilters", "lowercase");
 
-    try (SolrResourceLoader loader = new SolrResourceLoader(TEST_PATH().resolve("collection1"))) {
+    try (SolrResourceLoader loader = new SolrResourceLoader(SolrTestUtil.TEST_PATH().resolve("collection1"))) {
       ProtectedTermFilterFactory factory = new ProtectedTermFilterFactory(args);
       factory.inform(loader);
 
diff --git a/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java b/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java
index a642647..067cf29 100644
--- a/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/analysis/TestWordDelimiterFilterFactory.java
@@ -22,9 +22,9 @@ import java.util.Map;
 import org.apache.lucene.analysis.BaseTokenStreamTestCase;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.miscellaneous.WordDelimiterFilterFactory;
-import org.apache.lucene.analysis.util.ResourceLoader;
 import org.apache.lucene.util.Version;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.core.SolrResourceLoader;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -196,7 +196,7 @@ public class TestWordDelimiterFilterFactory extends SolrTestCaseJ4 {
   @Test
   public void testCustomTypes() throws Exception {
     String testText = "I borrowed $5,400.00 at 25% interest-rate";
-    try (SolrResourceLoader loader = new SolrResourceLoader(TEST_PATH().resolve("collection1"))) {
+    try (SolrResourceLoader loader = new SolrResourceLoader(SolrTestUtil.TEST_PATH().resolve("collection1"))) {
       Map<String,String> args = new HashMap<>();
       args.put("luceneMatchVersion", Version.LATEST.toString());
       args.put("generateWordParts", "1");
diff --git a/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java b/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
index 6a953a9..d17f49e 100644
--- a/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
+++ b/solr/core/src/test/org/apache/solr/backcompat/TestLuceneIndexBackCompat.java
@@ -33,6 +33,7 @@ import org.apache.lucene.index.TestBackwardsCompatibility;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.util.TestHarness;
 import org.junit.BeforeClass;
@@ -70,7 +71,7 @@ public class TestLuceneIndexBackCompat extends SolrTestCaseJ4 {
     if (h != null) {
       h.close();
     }
-    Path solrHome = createTempDir(coreName).toAbsolutePath();
+    Path solrHome = SolrTestUtil.createTempDir(coreName).toAbsolutePath();
     Files.createDirectories(solrHome);
     Path coreDir = solrHome.resolve(coreName);
     Path confDir = coreDir.resolve("conf");
@@ -79,8 +80,8 @@ public class TestLuceneIndexBackCompat extends SolrTestCaseJ4 {
     Path indexDir = dataDir.resolve("index");
     Files.createDirectories(indexDir);
 
-    Files.copy(getFile("solr/solr.xml").toPath(), solrHome.resolve("solr.xml"));
-    FileUtils.copyDirectory(configset("backcompat").toFile(), confDir.toFile());
+    Files.copy(SolrTestUtil.getFile("solr/solr.xml").toPath(), solrHome.resolve("solr.xml"));
+    FileUtils.copyDirectory(SolrTestUtil.configset("backcompat").toFile(), confDir.toFile());
 
     try (Writer writer = new OutputStreamWriter(Files.newOutputStream(coreDir.resolve("core.properties")), StandardCharsets.UTF_8)) {
       Properties coreProps = new Properties();
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerAdminHandler.java b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerAdminHandler.java
index 8549f74..f150855 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerAdminHandler.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerAdminHandler.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -36,8 +37,8 @@ public class TestEmbeddedSolrServerAdminHandler extends SolrTestCaseJ4 {
     @Test
     public void testPathIsAddedToContext() throws IOException, SolrServerException {
 
-        final NodeConfig config = new NodeConfig.NodeConfigBuilder("testnode", TEST_PATH())
-                .setConfigSetBaseDirectory(TEST_PATH().resolve("configsets").toString())
+        final NodeConfig config = new NodeConfig.NodeConfigBuilder("testnode", SolrTestUtil.TEST_PATH())
+                .setConfigSetBaseDirectory(SolrTestUtil.TEST_PATH().resolve("configsets").toString())
                 .build();
 
         try (final EmbeddedSolrServer server = new EmbeddedSolrServer(config, "collection1")) {
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java
index 64cf753..f4a1acd 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerConstructors.java
@@ -20,7 +20,9 @@ import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.common.SolrInputDocument;
@@ -30,21 +32,21 @@ import org.junit.Test;
 public class TestEmbeddedSolrServerConstructors extends SolrTestCaseJ4 {
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testPathConstructor() throws IOException {
-    Path path = Paths.get(TEST_HOME());
+    Path path = Paths.get(SolrTestUtil.TEST_HOME());
     try (EmbeddedSolrServer server = new EmbeddedSolrServer(path, "collection1")) {
 
     }
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testNodeConfigConstructor() throws Exception {
-    Path path = createTempDir();
+    Path path = SolrTestUtil.createTempDir();
 
     NodeConfig config = new NodeConfig.NodeConfigBuilder("testnode", path)
-        .setConfigSetBaseDirectory(Paths.get(TEST_HOME()).resolve("configsets").toString())
+        .setConfigSetBaseDirectory(Paths.get(SolrTestUtil.TEST_HOME()).resolve("configsets").toString())
         .build();
 
     try (EmbeddedSolrServer server = new EmbeddedSolrServer(config, "newcore")) {
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerSchemaAPI.java b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerSchemaAPI.java
index 88b7177..bd2cbbf 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerSchemaAPI.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestEmbeddedSolrServerSchemaAPI.java
@@ -22,7 +22,9 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.api.ApiBag;
 import org.apache.solr.client.solrj.request.schema.SchemaRequest;
 import org.apache.solr.client.solrj.response.schema.SchemaResponse;
@@ -53,7 +55,7 @@ public class TestEmbeddedSolrServerSchemaAPI extends SolrTestCaseJ4 {
     System.setProperty("managed.schema.mutable", ""+
       random().nextBoolean()
     );
-    Path tmpHome = createTempDir("tmp-home");
+    Path tmpHome = SolrTestUtil.createTempDir("tmp-home");
     Path coreDir = tmpHome.resolve(DEFAULT_TEST_CORENAME);
     copyMinConf(coreDir.toFile(), null, "solrconfig-managed-schema.xml");
     initCore("solrconfig.xml" /*it's renamed to to*/, "schema.xml", tmpHome.toAbsolutePath().toString());
@@ -71,13 +73,13 @@ public class TestEmbeddedSolrServerSchemaAPI extends SolrTestCaseJ4 {
 
   @Before
   public void thereIsNoFieldYet() {
-    SolrException ex = expectThrows(SolrException.class, () -> new SchemaRequest.Field(fieldName).process(server));
+    SolrException ex = LuceneTestCase.expectThrows(SolrException.class, () -> new SchemaRequest.Field(fieldName).process(server));
     assertTrue(ex.getMessage().contains("No") && ex.getMessage().contains("VerificationTest"));
   }
   
   @Test
   public void testSchemaAddFieldAndVerifyExistence() throws Exception {
-    assumeTrue("it needs to ammend schema", Boolean.getBoolean("managed.schema.mutable"));
+    LuceneTestCase.assumeTrue("it needs to ammend schema", Boolean.getBoolean("managed.schema.mutable"));
     SchemaResponse.UpdateResponse addFieldResponse = new SchemaRequest.AddField(fieldAttributes).process(server);
 
     assertEquals(addFieldResponse.toString(), 0, addFieldResponse.getStatus());
@@ -93,15 +95,15 @@ public class TestEmbeddedSolrServerSchemaAPI extends SolrTestCaseJ4 {
 
   @Test 
   public void  testSchemaAddFieldAndFailOnImmutable() {
-    assumeFalse("it needs a readonly schema", Boolean.getBoolean("managed.schema.mutable"));
+    LuceneTestCase.assumeFalse("it needs a readonly schema", Boolean.getBoolean("managed.schema.mutable"));
 
     SchemaRequest.AddField addFieldUpdateSchemaRequest = new SchemaRequest.AddField(fieldAttributes);
     assertFailedSchemaResponse(() -> addFieldUpdateSchemaRequest.process(server),
         "schema is not editable");
   }
 
-  private static void assertFailedSchemaResponse(ThrowingRunnable runnable, String expectedErrorMessage) {
-    ApiBag.ExceptionWithErrObject e = expectThrows(ApiBag.ExceptionWithErrObject.class, runnable);
+  private static void assertFailedSchemaResponse(LuceneTestCase.ThrowingRunnable runnable, String expectedErrorMessage) {
+    ApiBag.ExceptionWithErrObject e = LuceneTestCase.expectThrows(ApiBag.ExceptionWithErrObject.class, runnable);
     String msg = e.getErrs().get(0).get("errorMessages").toString();
     assertTrue(msg.contains(expectedErrorMessage));
   }
diff --git a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestJettySolrRunner.java b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestJettySolrRunner.java
index 280a9c6..92ea4e7 100644
--- a/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestJettySolrRunner.java
+++ b/solr/core/src/test/org/apache/solr/client/solrj/embedded/TestJettySolrRunner.java
@@ -18,6 +18,7 @@ package org.apache.solr.client.solrj.embedded;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.request.CoreAdminRequest;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
@@ -41,10 +42,10 @@ public class TestJettySolrRunner extends SolrTestCaseJ4 {
     // We set a non-standard coreRootDirectory, create a core, and check that it has been
     // built in the correct place
 
-    Path solrHome = createTempDir();
-    Path coresDir = createTempDir("crazy_path_to_cores");
+    Path solrHome = SolrTestUtil.createTempDir();
+    Path coresDir = SolrTestUtil.createTempDir("crazy_path_to_cores");
 
-    Path configsets = Paths.get(TEST_HOME()).resolve("configsets");
+    Path configsets = Paths.get(SolrTestUtil.TEST_HOME()).resolve("configsets");
 
     String solrxml
         = "<solr><str name=\"configSetBaseDir\">CONFIGSETS</str><str name=\"coreRootDirectory\">COREROOT</str></solr>"
@@ -77,7 +78,7 @@ public class TestJettySolrRunner extends SolrTestCaseJ4 {
   @SuppressWarnings("ThrowableNotThrown")
   @Test
   public void testLookForBindException() throws IOException {
-    Path solrHome = createTempDir();
+    Path solrHome = SolrTestUtil.createTempDir();
     Files.write(solrHome.resolve("solr.xml"), MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML.getBytes(Charset.defaultCharset()));
 
     JettyConfig config = JettyConfig.builder().build();
diff --git a/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
index b5c2161..4c259dc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AddReplicaTest.java
@@ -24,6 +24,7 @@ import java.util.EnumSet;
 import java.util.LinkedHashSet;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
@@ -34,7 +35,6 @@ import org.apache.solr.common.cloud.Replica;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +51,7 @@ public class AddReplicaTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(3)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/AliasIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/AliasIntegrationTest.java
index cdf3e10..80d3d3d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AliasIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AliasIntegrationTest.java
@@ -32,6 +32,8 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.util.EntityUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -72,7 +74,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
@@ -207,7 +209,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
 
   @Test
   public void testModifyPropertiesV2() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     ZkStateReader zkStateReader = createColectionsAndAlias(aliasName);
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     //TODO fix Solr test infra so that this /____v2/ becomes /api/
@@ -229,7 +231,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
   @Test
   public void testModifyPropertiesV1() throws Exception {
     // note we don't use TZ in this test, thus it's UTC
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     ZkStateReader zkStateReader = createColectionsAndAlias(aliasName);
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=ALIASPROP" +
@@ -244,7 +246,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
   @Test
   public void testModifyPropertiesCAR() throws Exception {
     // note we don't use TZ in this test, thus it's UTC
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     ZkStateReader zkStateReader = createColectionsAndAlias(aliasName);
     CollectionAdminRequest.SetAliasProperty setAliasProperty = CollectionAdminRequest.setAliasProperty(aliasName);
     setAliasProperty.addProperty("foo","baz");
@@ -270,7 +272,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
 
   @Test
   public void testClusterStateProviderAPI() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     
     // pick an arbitrary node, and use it's cloudManager to assert that (an instance of)
     // the ClusterStateProvider API reflects alias changes made by remote clients
@@ -327,10 +329,10 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
     stateProvider = cloudManager.getClusterStateProvider();
     assertTrue("should be a routed alias", stateProvider.isRoutedAlias(aliasName));
 
-    expectThrows(SolrException.class, () -> {
+    SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       String resolved = cloudManager.getClusterStateProvider().resolveSimpleAlias(aliasName);
       fail("this is not a simple alias but it resolved to " + resolved);
-      });
+    });
   }
 
   /** 
@@ -702,7 +704,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
       lastVersion = waitForAliasesUpdate(lastVersion, zkStateReader);
     }
 
-    SolrException e = expectThrows(SolrException.class, () -> {
+    SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
       SolrQuery q = new SolrQuery("*:*");
       q.set("collection", "testalias1");
       cluster.getSolrClient().query(q);
@@ -764,19 +766,16 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
     SolrTestCaseJ4.ignoreException(".");
 
     // Invalid Alias name
-    SolrException e = expectThrows(SolrException.class, () ->
-        CollectionAdminRequest.createAlias("test:alias", "testErrorChecks-collection").process(cluster.getSolrClient()));
+    SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> CollectionAdminRequest.createAlias("test:alias", "testErrorChecks-collection").process(cluster.getSolrClient()));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST, SolrException.ErrorCode.getErrorCode(e.code()));
 
     // Target collection doesn't exists
-    e = expectThrows(SolrException.class, () ->
-        CollectionAdminRequest.createAlias("testalias", "doesnotexist").process(cluster.getSolrClient()));
+    e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> CollectionAdminRequest.createAlias("testalias", "doesnotexist").process(cluster.getSolrClient()));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST, SolrException.ErrorCode.getErrorCode(e.code()));
     assertTrue(e.getMessage().contains("Can't create collection alias for collections='doesnotexist', 'doesnotexist' is not an existing collection or alias"));
 
     // One of the target collections doesn't exist
-    e = expectThrows(SolrException.class, () ->
-        CollectionAdminRequest.createAlias("testalias", "testErrorChecks-collection,doesnotexist").process(cluster.getSolrClient()));
+    e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> CollectionAdminRequest.createAlias("testalias", "testErrorChecks-collection,doesnotexist").process(cluster.getSolrClient()));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST, SolrException.ErrorCode.getErrorCode(e.code()));
     assertTrue(e.getMessage().contains("Can't create collection alias for collections='testErrorChecks-collection,doesnotexist', 'doesnotexist' is not an existing collection or alias"));
 
@@ -786,8 +785,7 @@ public class AliasIntegrationTest extends SolrCloudTestCase {
     CollectionAdminRequest.createAlias("testalias2", "testalias").process(cluster.getSolrClient());
 
     // Alias + invalid
-    e = expectThrows(SolrException.class, () ->
-        CollectionAdminRequest.createAlias("testalias3", "testalias2,doesnotexist").process(cluster.getSolrClient()));
+    e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> CollectionAdminRequest.createAlias("testalias3", "testalias2,doesnotexist").process(cluster.getSolrClient()));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST, SolrException.ErrorCode.getErrorCode(e.code()));
     SolrTestCaseJ4.unIgnoreException(".");
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/AssignBackwardCompatibilityTest.java b/solr/core/src/test/org/apache/solr/cloud/AssignBackwardCompatibilityTest.java
index 31ba78d..e18453d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/AssignBackwardCompatibilityTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/AssignBackwardCompatibilityTest.java
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
@@ -50,7 +51,7 @@ public class AssignBackwardCompatibilityTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(4)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
         .configure();
     CollectionAdminRequest.createCollection(COLLECTION, 1, 4)
         .setMaxShardsPerNode(1000)
diff --git a/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java b/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java
index b39ca3a..b2fecb5 100644
--- a/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java
+++ b/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZk2Test.java
@@ -19,6 +19,8 @@ package org.apache.solr.cloud;
 import org.apache.lucene.mockfile.FilterPath;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -107,7 +109,7 @@ public class BasicDistributedZk2Test extends AbstractFullDistribZkTestBase {
       long docId = testUpdateAndDelete();
       
       // index a bad doc...
-      expectThrows(SolrException.class, () -> indexr(t1, "a doc with no id"));
+      SolrTestCaseUtil.expectThrows(SolrException.class, () -> indexr(t1, "a doc with no id"));
       
       // TODO: bring this to its own method?
       // try indexing to a leader that has no replicas up
@@ -255,10 +257,8 @@ public class BasicDistributedZk2Test extends AbstractFullDistribZkTestBase {
     CloudJettyRunner deadShard = chaosMonkey.stopShard(SHARD1, 0);
 
     // ensure shard is dead
-    expectThrows(SolrServerException.class,
-        "This server should be down and this update should have failed",
-        () -> index_specific(deadShard.client.solrClient, id, 999, i1, 107, t1, "specific doc!")
-    );
+    SolrTestCaseUtil.expectThrows(SolrServerException.class, "This server should be down and this update should have failed",
+        () -> index_specific(deadShard.client.solrClient, id, 999, i1, 107, t1, "specific doc!"));
     
     commit();
     
@@ -382,7 +382,7 @@ public class BasicDistributedZk2Test extends AbstractFullDistribZkTestBase {
       params.set("qt", ReplicationHandler.PATH);
       params.set("command", "backup");
       params.set("name", backupName);
-      Path location = createTempDir();
+      Path location = SolrTestUtil.createTempDir();
       location = FilterPath.unwrap(location).toRealPath();
       params.set("location", location.toString());
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
index 17cb183..968e29e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
@@ -21,6 +21,8 @@ import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -533,8 +535,8 @@ public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
   }
 
   private void testTokenizedGrouping() throws Exception {
-    SolrException ex = expectThrows(SolrException.class, () -> {
-      query(false, new String[]{"q", "*:*", "group", "true", "group.field", t1});
+    SolrException ex = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+      query(false, new String[] {"q", "*:*", "group", "true", "group.field", t1});
     });
     assertTrue("Expected error from server that SortableTextFields are required", ex.getMessage().contains("Sorting on a tokenized field that is not a SortableTextField is not supported in cloud mode"));
   }
@@ -830,7 +832,7 @@ public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
     final ModifiableSolrParams updateParams = new ModifiableSolrParams();
     updateParams.add(UpdateParams.UPDATE_CHAIN, chain);
     
-    final int numLoops = atLeast(50);
+    final int numLoops = SolrTestUtil.atLeast(50);
     
     for (int i = 1; i < numLoops; i++) {
       // add doc to random client
@@ -872,7 +874,7 @@ public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
 
     ignoreException("version conflict");
     for (SolrClient client : clients) {
-      SolrException e = expectThrows(SolrException.class, () -> client.add(sd));
+      SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> client.add(sd));
       assertEquals(409, e.code());
     }
     unIgnoreException("version conflict");
@@ -906,8 +908,7 @@ public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
 
 
     NamedList<Object> result = clients.get(0).request(
-        new StreamingUpdateRequest("/update",
-            getFile("books_numeric_ids.csv"), "application/csv")
+        new StreamingUpdateRequest("/update", SolrTestUtil.getFile("books_numeric_ids.csv"), "application/csv")
             .setCommitWithin(900000)
             .setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true));
     
@@ -1159,7 +1160,7 @@ public class BasicDistributedZkTest extends AbstractFullDistribZkTestBase {
         if (shardId == null) {
           createCmd.setNumShards(2);
         }
-        createCmd.setDataDir(getDataDir(createTempDir(collection).toFile().getAbsolutePath()));
+        createCmd.setDataDir(getDataDir(SolrTestUtil.createTempDir(collection).toFile().getAbsolutePath()));
         if (shardId != null) {
           createCmd.setShardId(shardId);
         }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java
index fa45c05..e05c5ae 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java
@@ -65,7 +65,7 @@ public class ChaosMonkeyNothingIsSafeWithPullReplicasTest extends AbstractFullDi
   @BeforeClass
   public static void beforeSuperClass() {
     schemaString = "schema15.xml";      // we need a string id
-    if (usually()) {
+    if (LuceneTestCase.usually()) {
       System.setProperty("solr.autoCommit.maxTime", "15000");
     }
     System.clearProperty("solr.httpclient.retries");
@@ -189,7 +189,7 @@ public class ChaosMonkeyNothingIsSafeWithPullReplicasTest extends AbstractFullDi
         searchThread.start();
       }
       
-      if (usually()) {
+      if (LuceneTestCase.usually()) {
         StoppableCommitThread commitThread = new StoppableCommitThread(cloudClient, 1000, false);
         threads.add(commitThread);
         commitThread.start();
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
index 4936fdc..fcfbe77 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase.CloudJettyRunner;
 import org.apache.solr.cloud.api.collections.ShardSplitTest;
@@ -88,11 +89,11 @@ public class ChaosMonkeyShardSplitTest extends ShardSplitTest {
       indexThread = new Thread() {
         @Override
         public void run() {
-          int max = atLeast(401);
+          int max = SolrTestUtil.atLeast(401);
           for (int id = 101; id < max; id++) {
             try {
               indexAndUpdateCount(router, ranges, docCounts, String.valueOf(id), id, documentIds);
-              Thread.sleep(atLeast(25));
+              Thread.sleep(SolrTestUtil.atLeast(25));
             } catch (Exception e) {
               log.error("Exception while adding doc", e);
             }
diff --git a/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java b/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
index e6050ac..612c992 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.util.TimeOut;
@@ -33,7 +34,6 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.SnapShooter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 @LuceneTestCase.Slow
@@ -56,7 +56,7 @@ public class CleanupOldIndexTest extends SolrCloudTestCase {
 
     useFactory(null);
     configureCluster(2)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
index 01e8394..7253046 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CloudExitableDirectoryReaderTest.java
@@ -22,6 +22,7 @@ import com.codahale.metrics.MetricRegistry;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -83,7 +84,7 @@ public class CloudExitableDirectoryReaderTest extends SolrCloudTestCase {
 
     // create one more node then shard, so that we also test the case of proxied requests.
     Builder clusterBuilder = configureCluster(3)
-        .addConfig("conf", TEST_PATH().resolve("configsets").resolve("exitable-directory").resolve("conf"));
+        .addConfig("conf", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("exitable-directory").resolve("conf"));
     clusterBuilder.withMetrics(true);
     clusterBuilder
         .configure();
@@ -267,7 +268,7 @@ public class CloudExitableDirectoryReaderTest extends SolrCloudTestCase {
         throw ae;
       }
     }
-    int numBites = atLeast(100);
+    int numBites = SolrTestUtil.atLeast(100);
     for(int bite=0; bite<numBites; bite++) {
       int boundary = random().nextInt(creep);
       boolean omitHeader = random().nextBoolean();
diff --git a/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java b/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java
index e671acb..1184200 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java
@@ -22,6 +22,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.ClusterState;
@@ -43,7 +44,7 @@ public class ClusterStateUpdateTest extends SolrCloudTestCase  {
   public void setUp() throws Exception {
     super.setUp();
     configureCluster(3).formatZk(true)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java
index 0913722..b903458 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java
@@ -30,6 +30,7 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.common.cloud.CollectionProperties;
@@ -38,7 +39,6 @@ import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.zookeeper.KeeperException;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,13 +47,14 @@ import org.slf4j.LoggerFactory;
 @SolrTestCaseJ4.SuppressSSL
 //@LuceneTestCase.Nightly // too flakey atm, and ugly sleeps as well
 public class CollectionPropsTest extends SolrCloudTestCase {
+
   private String collectionName;
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   @BeforeClass
   public static void setupClass() throws Exception {
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal")).formatZk(true)
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal")).formatZk(true)
         .configure();
   }
 
@@ -162,7 +163,7 @@ public class CollectionPropsTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly // ugly retry - properties should be implemented better than this ...
+  @LuceneTestCase.Nightly // ugly retry - properties should be implemented better than this ...
   public void testWatcher() throws KeeperException, InterruptedException, IOException {
     final ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader();
     CollectionProperties collectionProps = new CollectionProperties(cluster.getSolrClient().getZkStateReader());
@@ -201,7 +202,7 @@ public class CollectionPropsTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testMultipleWatchers() throws InterruptedException, IOException {
     final ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader();
     CollectionProperties collectionProps = new CollectionProperties(cluster.getSolrClient().getZkStateReader());
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
index 14b3bc8..57955b7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionStateZnodeTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -30,7 +31,7 @@ public class CollectionStateZnodeTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(4).formatZk(true)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
   
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
index 4c3e278..ed4213c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
@@ -30,8 +30,10 @@ import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.ImmutableList;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -84,8 +86,8 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
   public static void beforeCollectionsAPISolrJTest() throws Exception {
     System.setProperty("solr.suppressDefaultConfigBootstrap", "false");
     configureCluster( TEST_NIGHTLY ? 4 : 2).formatZk(true)
-            .addConfig("conf", configset("cloud-minimal"))
-            .addConfig("conf2", configset("cloud-dynamic"))
+            .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
+            .addConfig("conf2", SolrTestUtil.configset("cloud-dynamic"))
             .configure();
   }
 
@@ -125,7 +127,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testCreateCollWithDefaultClusterPropertiesNewFormat() throws Exception {
     String COLL_NAME = "CollWithDefaultClusterProperties";
       V2Response rsp = new V2Request.Builder("/cluster")
@@ -379,7 +381,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
     String collectionName = "solrj_test_core_props";
 
-    Path tmpDir = createTempDir("testPropertyParamsForCreate");
+    Path tmpDir = SolrTestUtil.createTempDir("testPropertyParamsForCreate");
     Path dataDir = tmpDir.resolve("dataDir-" + TestUtil.randomSimpleString(random(), 1, 5));
     Path ulogDir = tmpDir.resolve("ulogDir-" + TestUtil.randomSimpleString(random(), 1, 5));
 
@@ -508,7 +510,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testColStatus() throws Exception {
     final String collectionName = "collectionStatusTest";
     CollectionAdminRequest.createCollection(collectionName, "conf2", 2, 2)
@@ -573,7 +575,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
   }
 
   @Test
-  @AwaitsFix(bugUrl = "Alias issue")
+  @LuceneTestCase.AwaitsFix(bugUrl = "Alias issue")
   public void testRenameCollection() throws Exception {
     doTestRenameCollection(true);
     CollectionAdminRequest.deleteAlias("col1").process(cluster.getSolrClient());
@@ -827,21 +829,21 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
     waitForState("Expecting attribute 'router' to be deleted", collection,
         (n, c) -> null == c.get("router"));
 
-    expectThrows(IllegalArgumentException.class,
+    LuceneTestCase.expectThrows(IllegalArgumentException.class,
         "An attempt to set unknown collection attribute should have failed",
         () -> CollectionAdminRequest.modifyCollection(collection, null)
             .setAttribute("non_existent_attr", 25)
             .process(cluster.getSolrClient())
     );
 
-    expectThrows(IllegalArgumentException.class,
+    LuceneTestCase.expectThrows(IllegalArgumentException.class,
         "An attempt to set null value should have failed",
         () -> CollectionAdminRequest.modifyCollection(collection, null)
             .setAttribute("non_existent_attr", null)
             .process(cluster.getSolrClient())
     );
 
-    expectThrows(IllegalArgumentException.class,
+    LuceneTestCase.expectThrows(IllegalArgumentException.class,
         "An attempt to unset unknown collection attribute should have failed",
         () -> CollectionAdminRequest.modifyCollection(collection, null)
             .unsetAttribute("non_existent_attr")
diff --git a/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java b/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
index 3f86e60..66e4a53 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
@@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
@@ -48,7 +49,7 @@ public class ConcurrentCreateRoutedAliasTest extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(4, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(4, SolrTestUtil.createTempDir(), buildJettyConfig("/solr"));
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/cloud/ConfigSetsAPITest.java b/solr/core/src/test/org/apache/solr/cloud/ConfigSetsAPITest.java
index 005824e..0b312e5 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ConfigSetsAPITest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ConfigSetsAPITest.java
@@ -16,7 +16,9 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
 import org.apache.solr.common.SolrException;
@@ -34,8 +36,8 @@ public class ConfigSetsAPITest extends SolrCloudTestCase {
     System.setProperty("shareSchema", "true");  // see testSharedSchema
 
     configureCluster(1) // some tests here assume 1 node
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
-        .addConfig("cShare", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("cShare", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .formatZk(true).configure();
   }
   @After
@@ -56,13 +58,13 @@ public class ConfigSetsAPITest extends SolrCloudTestCase {
     // TODO - check exception response!
     ConfigSetAdminRequest.Delete deleteConfigRequest = new ConfigSetAdminRequest.Delete();
     deleteConfigRequest.setConfigSetName("conf1");
-    expectThrows(SolrException.class, () -> {
+    LuceneTestCase.expectThrows(SolrException.class, () -> {
       deleteConfigRequest.process(cluster.getSolrClient());
     });
   }
 
   @Test
-  @Nightly // TODO speedup
+  @LuceneTestCase.Nightly // TODO speedup
   public void testSharedSchema() throws Exception {
     CollectionAdminRequest.createCollection("col1", "cShare", 1, 1)
         .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
diff --git a/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java b/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
index 0e190d7..3f78321 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CreateCollectionCleanupTest.java
@@ -27,6 +27,8 @@ import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -68,7 +70,7 @@ public class CreateCollectionCleanupTest extends SolrCloudTestCase {
   public static void createCluster() throws Exception {
     useFactory(null);
     configureCluster(1)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .formatZk(true).withSolrXml(CLOUD_SOLR_XML_WITH_10S_CREATE_COLL_WAIT)
         .configure();
   }
@@ -82,12 +84,12 @@ public class CreateCollectionCleanupTest extends SolrCloudTestCase {
     CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(collectionName,"conf1",1,1);
 
     Properties properties = new Properties();
-    Path tmpDir = createTempDir();
+    Path tmpDir = SolrTestUtil.createTempDir();
     tmpDir = tmpDir.resolve("foo");
     Files.createFile(tmpDir);
     properties.put(CoreAdminParams.DATA_DIR, tmpDir.toString());
     create.setProperties(properties);
-    expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
+    LuceneTestCase.expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
       create.process(cloudClient);
     });
 
@@ -105,7 +107,7 @@ public class CreateCollectionCleanupTest extends SolrCloudTestCase {
   
   @Test
   // TODO: this won't fail as async as that won't wait for the point this data dir issue is hit
-  @Nightly // TODO why does this take 10+ seconds?
+  @LuceneTestCase.Nightly // TODO why does this take 10+ seconds?
   public void testAsyncCreateCollectionCleanup() throws Exception {
     final CloudHttp2SolrClient cloudClient = cluster.getSolrClient();
     String collectionName = "foo2";
@@ -115,7 +117,7 @@ public class CreateCollectionCleanupTest extends SolrCloudTestCase {
     CollectionAdminRequest.Create create = CollectionAdminRequest.createCollection(collectionName,"conf1",1,1);
 
     Properties properties = new Properties();
-    Path tmpDir = createTempDir();
+    Path tmpDir = SolrTestUtil.createTempDir();
     tmpDir = tmpDir.resolve("foo2");
     Files.createFile(tmpDir);
     properties.put(CoreAdminParams.DATA_DIR, tmpDir.toString());
diff --git a/solr/core/src/test/org/apache/solr/cloud/CreateRoutedAliasTest.java b/solr/core/src/test/org/apache/solr/cloud/CreateRoutedAliasTest.java
index 9f61915..4f267e3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CreateRoutedAliasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CreateRoutedAliasTest.java
@@ -26,6 +26,7 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.util.EntityUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
@@ -82,7 +83,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
   @Test
   public void testV2() throws Exception {
     // note we don't use TZ in this test, thus it's UTC
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
 
     String createNode = cluster.getRandomJetty(random()).getNodeName();
 
@@ -162,7 +163,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
 
   @Test
   public void testV1() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     Instant start = Instant.now().truncatedTo(ChronoUnit.HOURS); // mostly make sure no millis
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
@@ -204,7 +205,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
   // TZ should not affect the first collection name if absolute date given for start
   @Test
   public void testTimezoneAbsoluteDate() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     try (SolrClient client = SolrTestCaseJ4.getCloudSolrClient(cluster)) {
       CollectionAdminRequest.createTimeRoutedAlias(
           aliasName,
@@ -231,7 +232,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
         "&wt=json" +
-        "&name=" + getTestName() +
+        "&name=" + SolrTestUtil.getTestName() +
         "&collections=collection1meta,collection2meta" +
         "&router.field=evt_dt" +
         "&router.name=time" +
@@ -259,7 +260,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
 
   @Test
   public void testRandomRouterNameFails() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
         "&wt=json" +
@@ -275,7 +276,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
 
   @Test
   public void testTimeStampWithMsFails() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
         "&wt=json" +
@@ -291,7 +292,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
 
   @Test
   public void testBadDateMathIntervalFails() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
         "&wt=json" +
@@ -308,7 +309,7 @@ public class CreateRoutedAliasTest extends SolrCloudTestCase {
 
   @Test
   public void testNegativeFutureFails() throws Exception {
-    final String aliasName = getSaferTestName();
+    final String aliasName = SolrTestUtil.getTestName();
     final String baseUrl = cluster.getRandomJetty(random()).getBaseUrl().toString();
     HttpGet get = new HttpGet(baseUrl + "/admin/collections?action=CREATEALIAS" +
         "&wt=json" +
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
index 4fa2f79..5b5d462 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteInactiveReplicaTest.java
@@ -16,13 +16,13 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
-import org.eclipse.jetty.util.Jetty;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -40,7 +40,7 @@ public class DeleteInactiveReplicaTest extends SolrCloudTestCase {
   public static void setupCluster() throws Exception {
     useFactory(null);
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
index 1256593..1429cde 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteLastCustomShardedReplicaTest.java
@@ -16,11 +16,11 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class DeleteLastCustomShardedReplicaTest extends SolrCloudTestCase {
@@ -28,7 +28,7 @@ public class DeleteLastCustomShardedReplicaTest extends SolrCloudTestCase {
   @Before
   public void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteNodeTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteNodeTest.java
index 7032686..9734bba 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteNodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteNodeTest.java
@@ -17,7 +17,8 @@
 
 package org.apache.solr.cloud;
 
-import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.ClusterState;
@@ -41,7 +42,7 @@ public class DeleteNodeTest extends SolrCloudTestCase {
   public static void setupCluster() throws Exception {
     useFactory(null);
     configureCluster(TEST_NIGHTLY ? 6 : 3)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
         .formatZk(true).configure();
   }
 
@@ -59,7 +60,7 @@ public class DeleteNodeTest extends SolrCloudTestCase {
     ArrayList<String> l = new ArrayList<>(liveNodes);
     Collections.shuffle(l, random());
     // NOTE: must be more than a single nrt replica or it will not let you delete a node
-    CollectionAdminRequest.Create create = SolrTestCaseJ4.pickRandom(
+    CollectionAdminRequest.Create create = SolrTestCaseUtil.pickRandom(
         CollectionAdminRequest.createCollection(coll, "conf1", 5, 2, 0, 0),
         CollectionAdminRequest.createCollection(coll, "conf1", 5, 2, 1, 0),
         CollectionAdminRequest.createCollection(coll, "conf1", 5, 2, 1, 1),
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
index 1d9fa03..3552bf4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
@@ -30,7 +30,9 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest.Create;
@@ -83,7 +85,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
     
     // these tests need to be isolated, so we dont share the minicluster
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
   
@@ -181,7 +183,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
 
     CollectionAdminRequest.deleteReplicasFromShard(collectionName, "s1", 2).process(cluster.getSolrClient());
 
-    SolrException e = expectThrows(SolrException.class,
+    SolrException e = LuceneTestCase.expectThrows(SolrException.class,
         "Can't delete the last replica by count",
         () -> CollectionAdminRequest.deleteReplicasFromShard(collectionName, "s1", 1).process(cluster.getSolrClient())
     );
@@ -194,7 +196,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
 
   @Test
   // commented out on: 17-Feb-2019   @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // annotated on: 24-Dec-2018
-  @Nightly
+  @LuceneTestCase.Nightly
   public void deleteReplicaByCountForAllShards() throws Exception {
     final String collectionName = "deleteByCountNew";
     Create req = CollectionAdminRequest.createCollection(collectionName, "conf", 2, 2);
@@ -203,7 +205,7 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
   }
 
   @Test
-  @AwaitsFix(bugUrl = "Currently disabled due to negative behavior of UnloadCoreOnDeletedWatcher and it's semi disable")
+  @LuceneTestCase.AwaitsFix(bugUrl = "Currently disabled due to negative behavior of UnloadCoreOnDeletedWatcher and it's semi disable")
   public void deleteReplicaFromClusterState() throws Exception {
     final String collectionName = "deleteFromClusterStateCollection";
     CollectionAdminRequest.createCollection(collectionName, "conf", 1, 3)
@@ -256,9 +258,9 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Slow
+  @LuceneTestCase.Slow
   // commented out on: 17-Feb-2019   @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // annotated on: 24-Dec-2018
-  @Nightly // TODO look at performance of this - need lower connection timeouts for test?
+  @LuceneTestCase.Nightly // TODO look at performance of this - need lower connection timeouts for test?
   public void raceConditionOnDeleteAndRegisterReplica() throws Exception {
     final String collectionName = "raceDeleteReplicaCollection";
     CollectionAdminRequest.createCollection(collectionName, "conf", 1, 2)
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
index bb45f69..dc5f5e7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteShardTest.java
@@ -20,9 +20,10 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.DistributedQueue;
-import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.CoreStatus;
 import org.apache.solr.cloud.overseer.OverseerAction;
@@ -36,7 +37,6 @@ import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.FileUtils;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class DeleteShardTest extends SolrCloudTestCase {
@@ -46,7 +46,7 @@ public class DeleteShardTest extends SolrCloudTestCase {
   @Before
   public void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
   
@@ -72,7 +72,7 @@ public class DeleteShardTest extends SolrCloudTestCase {
     assertEquals(State.ACTIVE, state.getSlice("s2").getState());
 
     // Can't delete an ACTIVE shard
-    expectThrows(Exception.class, () -> {
+    LuceneTestCase.expectThrows(Exception.class, () -> {
       CollectionAdminRequest.deleteShard(collection, "s1").process(cluster.getSolrClient());
     });
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DeleteStatusTest.java b/solr/core/src/test/org/apache/solr/cloud/DeleteStatusTest.java
index ab8209f..bb841de 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteStatusTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteStatusTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -36,7 +37,7 @@ public class DeleteStatusTest extends SolrCloudTestCase {
   @BeforeClass
   public static void createCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .formatZk(true).configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java b/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
index 7f6bf9c..8eb1dbd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
@@ -23,6 +23,7 @@ import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.CursorPagingTest;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.LukeRequest;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -538,7 +539,7 @@ public class DistribCursorPagingTest extends SolrCloudBridgeTestCase {
     final Collection<String> allFieldNames = getAllSortFieldNames();
 
     final int numInitialDocs = TestUtil.nextInt(random(), 100, 200);
-    final int totalDocs = atLeast(500);
+    final int totalDocs = SolrTestUtil.atLeast(500);
 
     // start with a smallish number of documents, and test that we can do a full walk using a 
     // sort on *every* field in the schema...
@@ -595,7 +596,7 @@ public class DistribCursorPagingTest extends SolrCloudBridgeTestCase {
     }
     commit();
 
-    final int numRandomSorts = atLeast(3);
+    final int numRandomSorts = SolrTestUtil.atLeast(3);
     for (int i = 0; i < numRandomSorts; i++) {
       final String sort = CursorPagingTest.buildRandomSort(allFieldNames);
       final String rows = "" + TestUtil.nextInt(random(), 63, 113);
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 e28a204..d7a0e18 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
@@ -31,6 +31,8 @@ import static java.util.Collections.singletonList;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
@@ -92,7 +94,7 @@ public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
   public void setupCluster(boolean security) throws Exception {
     // we want at most one core per node to force lots of network traffic to try and tickle distributed bugs
     final Builder b = configureCluster(4)
-      .addConfig("conf", TEST_PATH().resolve("configsets").resolve("doc-expiry").resolve("conf"));
+      .addConfig("conf", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("doc-expiry").resolve("conf"));
 
     COLLECTION = "expiring";
     if (security) {
@@ -132,20 +134,15 @@ public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
 
     // sanity check that our cluster really does require authentication
     assertEquals("sanity check of non authenticated request",
-                 401,
-                 expectThrows(SolrException.class, () -> {
-                     final long ignored = cluster.getSolrClient().query
-                       (COLLECTION,
-                        params("q", "*:*",
-                               "rows", "0",
-                               "_trace", "no_auth_sanity_check")).getResults().getNumFound();
-                   }).code());
+                 401, SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
+          final long ignored = cluster.getSolrClient().query(COLLECTION, params("q", "*:*", "rows", "0", "_trace", "no_auth_sanity_check")).getResults().getNumFound();
+        }).code());
     
     runTest();
   }
   
   private void runTest() throws Exception {
-    final int totalNumDocs = atLeast(50);
+    final int totalNumDocs = SolrTestUtil.atLeast(50);
     
     // Add a bunch of docs; some with extremely short expiration, some with no expiration
     // these should be randomly distributed to each shard
diff --git a/solr/core/src/test/org/apache/solr/cloud/DistribJoinFromCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/DistribJoinFromCollectionTest.java
index d74233f..3b9b2ea 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribJoinFromCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribJoinFromCollectionTest.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -67,7 +68,7 @@ public class DistribJoinFromCollectionTest extends SolrCloudTestCase{
   
   @BeforeClass
   public static void setupCluster() throws Exception {
-    final Path configDir = Paths.get(TEST_HOME(), "collection1", "conf");
+    final Path configDir = Paths.get(SolrTestUtil.TEST_HOME(), "collection1", "conf");
 
     String configName = "solrCloudCollectionConfig";
     int nodeCount = 5;
diff --git a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
index 42fc5a3..c04d3f7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
@@ -33,6 +33,7 @@ import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -70,7 +71,7 @@ public class DistributedVersionInfoTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(3)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java b/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
index 02807a8..b85f0e4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DocValuesNotIndexedTest.java
@@ -18,6 +18,7 @@
 package org.apache.solr.cloud;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -76,7 +77,7 @@ public class DocValuesNotIndexedTest extends SolrCloudTestCase {
     SolrTestCaseJ4.randomizeNumericTypesProperties();
     System.setProperty("managed.schema.mutable", "true");
     configureCluster(2)
-        .addConfig("conf1", configset("cloud-managed"))
+        .addConfig("conf1", SolrTestUtil.configset("cloud-managed"))
         .configure();
 
     // Need enough shards that we have some shards that don't have any docs on them.
diff --git a/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java b/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
index 5c8dd16..e354d00 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import com.carrotsearch.randomizedtesting.annotations.Nightly;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.SocketProxy;
@@ -72,7 +73,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
    * Tests that FORCELEADER can get an active leader even only replicas with term lower than leader's term are live
    */
   @Test
-  @Slow
+  @LuceneTestCase.Slow
   public void testReplicasInLowerTerms() throws Exception {
     handle.put("maxScore", SKIPVAL);
     handle.put("timestamp", SKIPVAL);
@@ -248,7 +249,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
 
   private void assertSendDocFails(int docId) throws Exception {
     // sending a doc in this state fails
-    expectThrows(SolrException.class,
+    LuceneTestCase.expectThrows(SolrException.class,
         "Should've failed indexing during a down state.",
         () -> sendDoc(docId));
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
index db44bf0..99acd6a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
@@ -163,7 +163,7 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
     CollectionAdminRequest.deleteCollection(collectionName).process(cluster.getSolrClient());
   }
 
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testThatCantForwardToLeaderFails() throws Exception {
     final CloudHttp2SolrClient cloudClient = cluster.getSolrClient();
     final String collectionName = "test_collection_" + NAME_COUNTER.getAndIncrement();
@@ -227,7 +227,7 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
           log.info("Closing leaderToPartition's proxy: {}", proxy);
           proxy.close(); // NOTE: can't use halfClose, won't ensure a garunteed failure
           
-          final SolrException e = expectThrows(SolrException.class, () -> {
+          final SolrException e = LuceneTestCase.expectThrows(SolrException.class, () -> {
               // start at 50 so that we have some "updates" to previous docs and some "adds"...
               for (int i = 50; i < 250; i++) {
                 // Pure random odds of all of these docs belonging to the live shard are 1 in 2**200...
@@ -309,7 +309,7 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
     
     // index
     long docId = 42;
-    int topDocsNum = atLeast(TEST_NIGHTLY ? 5 : 2);
+    int topDocsNum = LuceneTestCase.atLeast(TEST_NIGHTLY ? 5 : 2);
     int childsNum = (TEST_NIGHTLY ? 5 : 2)+random().nextInt(TEST_NIGHTLY ? 5 : 2);
     for (int i = 0; i < topDocsNum; ++i) {
       UpdateRequest uReq = new UpdateRequest();
@@ -386,7 +386,7 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
     final CloudHttp2SolrClient cloudClient = cluster.getSolrClient();
     final String collectionName = createAndSetNewDefaultCollection();
     
-    final int numDocs = atLeast(TEST_NIGHTLY ? 50 : 15);
+    final int numDocs = LuceneTestCase.atLeast(TEST_NIGHTLY ? 50 : 15);
     for (int i = 0; i < numDocs; i++) {
       UpdateRequest uReq;
       uReq = new UpdateRequest();
@@ -404,8 +404,8 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
     final CloudHttp2SolrClient cloudClient = cluster.getSolrClient();
     final String collectionName = createAndSetNewDefaultCollection();
 
-    final int numDocsPerBatch = atLeast(5);
-    final int numBatchesPerThread = atLeast(5);
+    final int numDocsPerBatch = LuceneTestCase.atLeast(5);
+    final int numBatchesPerThread = LuceneTestCase.atLeast(5);
     AtomicInteger expectedDocCount = new AtomicInteger();
       
     final CountDownLatch abort = new CountDownLatch(1);
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
index 0302145..131193c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionContextKeyTest.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
@@ -46,7 +47,7 @@ public class LeaderElectionContextKeyTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(1)
-        .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
 
     for (int i = 1; i <= 2; i++) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
index b4a15b8..2e215f0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeoutException;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -48,7 +49,7 @@ public class LeaderElectionIntegrationTest extends SolrCloudTestCase {
     useFactory(null);
     super.setUp();
     configureCluster(6)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
index 8075912..8474225 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.OnReconnect;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -76,7 +77,7 @@ public class LeaderElectionTest extends SolrTestCaseJ4 {
   @Override
   public void setUp() throws Exception {
     super.setUp();
-    Path zkDir = createTempDir("zkData");
+    Path zkDir = SolrTestUtil.createTempDir("zkData");
 
     server = new ZkTestServer(zkDir);
     server.setTheTickTime(1000);
@@ -460,7 +461,7 @@ public class LeaderElectionTest extends SolrTestCaseJ4 {
     Thread scheduleThread = new Thread() {
       @Override
       public void run() {
-        int count = atLeast(5);
+        int count = SolrTestUtil.atLeast(5);
         for (int i = 1; i < count; i++) {
           int launchIn = random().nextInt(500);
           ClientThread thread = null;
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderTragicEventTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderTragicEventTest.java
index bf51e5e..e26b28f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderTragicEventTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderTragicEventTest.java
@@ -28,6 +28,7 @@ import java.util.List;
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.store.MockDirectoryWrapper;
 import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient.RemoteSolrException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
@@ -61,7 +62,7 @@ public class LeaderTragicEventTest extends SolrCloudTestCase {
     System.setProperty(MockDirectoryFactory.SOLR_TESTS_USING_MOCK_DIRECTORY_WRAPPER, "true");
 
     configureCluster(2)
-        .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderVoteWaitTimeoutTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderVoteWaitTimeoutTest.java
index 01137c2..aab8e05 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderVoteWaitTimeoutTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderVoteWaitTimeoutTest.java
@@ -27,8 +27,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.SocketProxy;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -44,7 +46,6 @@ import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -83,7 +84,7 @@ public class LeaderVoteWaitTimeoutTest extends SolrCloudTestCase {
   @Before
   public void setupTest() throws Exception {
     configureCluster(NODE_COUNT)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
 
     // Add proxies
@@ -115,7 +116,7 @@ public class LeaderVoteWaitTimeoutTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void basicTest() throws Exception {
     final String collectionName = "basicTest";
     CollectionAdminRequest.createCollection(collectionName, 1, 1)
@@ -168,7 +169,7 @@ public class LeaderVoteWaitTimeoutTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void testMostInSyncReplicasCanWinElection() throws Exception {
     final String collectionName = "collection1";
     CollectionAdminRequest.createCollection(collectionName, 1, 3)
diff --git a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
index 8c86c56..2e74732 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
@@ -21,9 +21,9 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
@@ -65,7 +65,7 @@ public class MetricsHistoryIntegrationTest extends SolrCloudTestCase {
     System.setProperty("solr.suppressDefaultConfigBootstrap", "false");
 
     configureCluster(1)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
     cloudManager = cluster.getJettySolrRunner(0).getCoreContainer().getZkController().getSolrCloudManager();
     solrClient = cluster.getSolrClient();
diff --git a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
index 7bf1b88..79e1076 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
@@ -69,7 +70,7 @@ public class MetricsHistoryWithAuthIntegrationTest extends SolrCloudTestCase {
         "<metrics>\n" + SOLR_XML_HISTORY_CONFIG);
     // Spin up a cluster with a protected /admin/metrics handler, and a 2 seconds metrics collectPeriod
     configureCluster(1)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .withSecurityJson(SECURITY_JSON)
         .withSolrXml(solrXml)
         .configure();
diff --git a/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java b/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java
index 7065d24..104df73 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
@@ -49,7 +50,7 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
@@ -89,7 +90,7 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
     CollectionAdminRequest.createCollection(targetCollection, "conf", 1, 1)
         .process(cluster.getSolrClient());
 
-    BaseHttpSolrClient.RemoteSolrException remoteSolrException = expectThrows(BaseHttpSolrClient.RemoteSolrException.class,
+    BaseHttpSolrClient.RemoteSolrException remoteSolrException = LuceneTestCase.expectThrows(BaseHttpSolrClient.RemoteSolrException.class,
         "Expected an exception in case split.key is not specified", () -> {
           CollectionAdminRequest.migrateData(sourceCollection, targetCollection, "")
               .setForwardTimeout(45)
@@ -99,7 +100,7 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Nightly
+  @LuceneTestCase.Nightly
   public void multipleShardMigrateTest() throws Exception  {
 
     CollectionAdminRequest.createCollection("sourceCollection", "conf", 2, 1).process(cluster.getSolrClient());
diff --git a/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java b/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java
index addc405..718c39d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -59,7 +60,7 @@ public class MissingSegmentRecoveryTest extends SolrCloudTestCase {
     System.setProperty("solr.skipCommitOnClose", "false");
     useFactory(null);
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSFailoverTest.java b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSFailoverTest.java
index 8f2f58b..9024f5c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSFailoverTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSFailoverTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -44,13 +45,13 @@ public class MoveReplicaHDFSFailoverTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupClass() throws Exception {
     configureCluster(2)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
         .configure();
 
-    dfsCluster = HdfsTestUtil.setupClass(createTempDir().toFile().getAbsolutePath());
+    dfsCluster = HdfsTestUtil.setupClass(SolrTestUtil.createTempDir().toFile().getAbsolutePath());
 
     ZkConfigManager configManager = new ZkConfigManager(zkClient());
-    configManager.uploadConfigDir(configset("cloud-hdfs"), "conf1");
+    configManager.uploadConfigDir(SolrTestUtil.configset("cloud-hdfs"), "conf1");
   }
 
   @AfterClass
diff --git a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSTest.java b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSTest.java
index 511a4c6..cc4a821 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaHDFSTest.java
@@ -22,6 +22,7 @@ import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.AwaitsFix;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.TimeUnits;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.cloud.hdfs.HdfsTestUtil;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -36,7 +37,7 @@ public class MoveReplicaHDFSTest extends MoveReplicaTest {
 
   @BeforeClass
   public static void setupClass() throws Exception {
-    dfsCluster = HdfsTestUtil.setupClass(createTempDir().toFile().getAbsolutePath());
+    dfsCluster = HdfsTestUtil.setupClass(SolrTestUtil.createTempDir().toFile().getAbsolutePath());
   }
 
   @AfterClass
@@ -66,7 +67,7 @@ public class MoveReplicaHDFSTest extends MoveReplicaTest {
   // commented 4-Sep-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 23-Aug-2018
   //commented 20-Sep-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 6-Sep-2018
   //Commented 14-Oct-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // added 20-Sep-2018
-  @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 14-Oct-2018
+  @LuceneTestCase.BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 14-Oct-2018
   public void testNormalFailedMove() throws Exception {
     inPlaceMove = false;
     testFailedMove();
diff --git a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
index 4362e75..24ae3d3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -54,7 +55,7 @@ public class MoveReplicaTest extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   // used by MoveReplicaHDFSTest
-  protected boolean inPlaceMove = true;
+  protected boolean inPlaceMove = false;
 
   protected String getConfigSet() {
     return "cloud-dynamic";
@@ -67,12 +68,12 @@ public class MoveReplicaTest extends SolrCloudTestCase {
 
   @Before
   public void beforeTest() throws Exception {
-    inPlaceMove = true;
+    inPlaceMove = false;
 
     configureCluster(4)
-        .addConfig("conf1", configset(getConfigSet()))
-        .addConfig("conf2", configset(getConfigSet()))
-        .withSolrXml(TEST_PATH().resolve("solr.xml"))
+        .addConfig("conf1", SolrTestUtil.configset(getConfigSet()))
+        .addConfig("conf2", SolrTestUtil.configset(getConfigSet()))
+        .withSolrXml(SolrTestUtil.TEST_PATH().resolve("solr.xml"))
         .configure();
 
     NamedList<Object> overSeerStatus = cluster.getSolrClient().request(CollectionAdminRequest.getOverseerStatus());
@@ -101,7 +102,7 @@ public class MoveReplicaTest extends SolrCloudTestCase {
   @Test
   // commented out on: 17-Feb-2019   @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // annotated on: 24-Dec-2018
   public void test() throws Exception {
-    String coll = getTestClass().getSimpleName() + "_coll_" + inPlaceMove;
+    String coll = SolrTestUtil.getTestName() + "_coll_" + inPlaceMove;
     if (log.isInfoEnabled()) {
       log.info("total_jettys: {}", cluster.getJettySolrRunners().size());
     }
@@ -181,9 +182,9 @@ public class MoveReplicaTest extends SolrCloudTestCase {
   // 12-Jun-2018 @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 17-Mar-2018 This JIRA is fixed, but this test still fails
   //17-Aug-2018 commented  @LuceneTestCase.BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // 2-Aug-2018
   // commented out on: 17-Feb-2019   @BadApple(bugUrl="https://issues.apache.org/jira/browse/SOLR-12028") // annotated on: 24-Dec-2018
-  @Nightly // may be flakey as well ...
+  @LuceneTestCase.Nightly // may be flakey as well ...
   public void testFailedMove() throws Exception {
-    String coll = getTestClass().getSimpleName() + "_failed_coll_" + inPlaceMove;
+    String coll = LuceneTestCase.getTestClass().getSimpleName() + "_failed_coll_" + inPlaceMove;
     int REPLICATION = 2;
 
     CloudHttp2SolrClient cloudClient = cluster.getSolrClient();
diff --git a/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java b/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
index 1ca2ad4..0994a7b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/NestedShardedAtomicUpdateTest.java
@@ -22,6 +22,7 @@ import java.lang.invoke.MethodHandles;
 import java.util.List;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -202,10 +203,7 @@ public class NestedShardedAtomicUpdateTest extends SolrCloudBridgeTestCase {
         )
     );
 
-    SolrException e = expectThrows(SolrException.class,
-        "wrong \"_route_\" param should throw an exception",
-        () -> indexDocAndRandomlyCommit(aClient, wrongRootParams, grandChildDoc)
-    );
+    SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, "wrong \"_route_\" param should throw an exception", () -> indexDocAndRandomlyCommit(aClient, wrongRootParams, grandChildDoc));
 
     assertTrue("message should suggest the wrong \"_route_\" param was supplied",
         e.getMessage().contains("perhaps the wrong \"_route_\" param was supplied"));
diff --git a/solr/core/src/test/org/apache/solr/cloud/OutOfBoxZkACLAndCredentialsProvidersTest.java b/solr/core/src/test/org/apache/solr/cloud/OutOfBoxZkACLAndCredentialsProvidersTest.java
index 4011f17..e15fa58 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OutOfBoxZkACLAndCredentialsProvidersTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OutOfBoxZkACLAndCredentialsProvidersTest.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.SecurityAwareZkACLProvider;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.zookeeper.CreateMode;
@@ -31,7 +32,6 @@ import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,11 +64,11 @@ public class OutOfBoxZkACLAndCredentialsProvidersTest extends SolrTestCaseJ4 {
   public void setUp() throws Exception {
     super.setUp();
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_START {}", getTestName());
+      log.info("####SETUP_START {}", SolrTestUtil.getTestName());
     }
-    createTempDir();
+    SolrTestUtil.createTempDir();
 
-    zkDir = createTempDir().resolve("zookeeper/server1/data");
+    zkDir = SolrTestUtil.createTempDir().resolve("zookeeper/server1/data");
     log.info("ZooKeeper dataDir:{}", zkDir);
     zkServer = new ZkTestServer(zkDir);
     zkServer.run();
@@ -90,7 +90,7 @@ public class OutOfBoxZkACLAndCredentialsProvidersTest extends SolrTestCaseJ4 {
     zkClient.close();
 
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_END {}", getTestName());
+      log.info("####SETUP_END {}", SolrTestUtil.getTestName());
     }
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverriddenZkACLAndCredentialsProvidersTest.java b/solr/core/src/test/org/apache/solr/cloud/OverriddenZkACLAndCredentialsProvidersTest.java
index ee8a39f..db24893 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverriddenZkACLAndCredentialsProvidersTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverriddenZkACLAndCredentialsProvidersTest.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.StringUtils;
 import org.apache.solr.common.cloud.DefaultZkCredentialsProvider;
 import org.apache.solr.common.cloud.SecurityAwareZkACLProvider;
@@ -67,11 +68,11 @@ public class OverriddenZkACLAndCredentialsProvidersTest extends SolrTestCaseJ4 {
   public void setUp() throws Exception {
     super.setUp();
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_START {}", getTestName());
+      log.info("####SETUP_START {}", SolrTestUtil.getTestName());
     }
-    createTempDir();
+    SolrTestUtil.createTempDir();
     
-    zkDir =createTempDir().resolve("zookeeper/server1/data");
+    zkDir = SolrTestUtil.createTempDir().resolve("zookeeper/server1/data");
     log.info("ZooKeeper dataDir:{}", zkDir);
     zkServer = new ZkTestServer(zkDir);
     zkServer.run(false);
@@ -98,7 +99,7 @@ public class OverriddenZkACLAndCredentialsProvidersTest extends SolrTestCaseJ4 {
     zkClient.close();
 
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_END {}", getTestName());
+      log.info("####SETUP_END {}", SolrTestUtil.getTestName());
     }
   }
   
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
index 8de68c1..4c7fd13 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
@@ -19,6 +19,8 @@ package org.apache.solr.cloud;
 
 import java.util.Map;
 
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.GenericSolrRequest;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -26,7 +28,6 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.KeeperException;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
@@ -37,8 +38,8 @@ public class OverseerModifyCollectionTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf1", configset("cloud-minimal"))
-        .addConfig("conf2", configset("cloud-minimal"))
+        .addConfig("conf1", SolrTestUtil.configset("cloud-minimal"))
+        .addConfig("conf2", SolrTestUtil.configset("cloud-minimal"))
         .formatZk(true).configure();
   }
 
@@ -65,7 +66,7 @@ public class OverseerModifyCollectionTest extends SolrCloudTestCase {
     p2.add("collection", collName);
     p2.add("action", "MODIFYCOLLECTION");
     p2.add("collection.configName", "notARealConfigName");
-    Exception e = expectThrows(Exception.class, () -> {
+    Exception e = SolrTestCaseUtil.expectThrows(Exception.class, () -> {
       cluster.getSolrClient().request(new GenericSolrRequest(POST, COLLECTIONS_HANDLER_PATH, p2));
     });
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
index 05a1732..d2bf476 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
@@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.overseer.OverseerAction;
@@ -50,7 +51,7 @@ public class OverseerRolesTest extends SolrCloudTestCase {
   @Before
   public void setupCluster() throws Exception {
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java
index 7e56784..b086736 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.params.CollectionParams;
@@ -31,7 +33,7 @@ public class OverseerStatusTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(2)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();;
   }
 
@@ -61,7 +63,7 @@ public class OverseerStatusTest extends SolrCloudTestCase {
     SimpleOrderedMap<Object> reload = (SimpleOrderedMap<Object>) collection_operations.get(CollectionParams.CollectionAction.RELOAD.toLower());
     assertEquals("No stats for reload in OverseerCollectionProcessor", 1, reload.get("requests"));
 
-    BaseHttpSolrClient.RemoteSolrException e = expectThrows(BaseHttpSolrClient.RemoteSolrException.class,
+    BaseHttpSolrClient.RemoteSolrException e = LuceneTestCase.expectThrows(BaseHttpSolrClient.RemoteSolrException.class,
         "Split shard for non existent collection should have failed",
         () -> CollectionAdminRequest
             .splitShard("non_existent_collection")
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index 5305559..f885669 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -20,6 +20,7 @@ import com.codahale.metrics.Snapshot;
 import com.codahale.metrics.Timer;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -269,7 +270,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
 
     System.setProperty("solr.zkclienttimeout", "30000");
 
-    Path zkDir = createTempDir("zkData");
+    Path zkDir = SolrTestUtil.createTempDir("zkData");
 
     server = new ZkTestServer(zkDir);
     server.run();
@@ -813,7 +814,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
       // Create collection znode before repeatedly trying to enqueue the Cluster state change message
       zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/" + COLLECTION, false, true);
 
-      for (int i = 0; i < atLeast(4); i++) {
+      for (int i = 0; i < SolrTestUtil.atLeast(4); i++) {
         killCounter.incrementAndGet(); // for each round allow 1 kill
 
         mockController = new MockZKController(server.getZkAddress(), "node1", overseers);
diff --git a/solr/core/src/test/org/apache/solr/cloud/PackageManagerCLITest.java b/solr/core/src/test/org/apache/solr/cloud/PackageManagerCLITest.java
index 1f724a9..eff41ee 100644
--- a/solr/core/src/test/org/apache/solr/cloud/PackageManagerCLITest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/PackageManagerCLITest.java
@@ -21,6 +21,7 @@ import java.lang.invoke.MethodHandles;
 import java.util.Arrays;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.core.TestSolrConfigHandler;
 import org.apache.solr.util.LogLevel;
@@ -56,11 +57,11 @@ public class PackageManagerCLITest extends SolrCloudTestCase {
     System.setProperty("enable.packages", "true");
 
     configureCluster(1)
-    .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
-    .addConfig("conf2", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+    .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+    .addConfig("conf2", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
     .configure();
 
-    repositoryServer = new LocalWebServer(TEST_PATH().resolve("question-answer-repository").toString());
+    repositoryServer = new LocalWebServer(SolrTestUtil.TEST_PATH().resolve("question-answer-repository").toString());
     repositoryServer.start();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java b/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
index 9eba5d2..8af125e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
@@ -18,6 +18,7 @@ package org.apache.solr.cloud;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
@@ -60,7 +61,7 @@ public class RecoveryZkTest extends SolrCloudTestCase {
     System.setProperty("solr.httpclient.defaultSoTimeout", "10000");
 
     configureCluster(2).formatZk(true)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
index 422eb3e..b86f07b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
@@ -28,6 +28,7 @@ import java.util.function.Function;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.cloud.DistribStateManager;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -66,11 +67,11 @@ public class ReindexCollectionTest extends SolrCloudTestCase {
 
     configureCluster(2)
         // only *_s
-        .addConfig("conf1", configset("cloud-minimal"))
+        .addConfig("conf1", SolrTestUtil.configset("cloud-minimal"))
         // every combination of field flags
-        .addConfig("conf2", configset("cloud-dynamic"))
+        .addConfig("conf2", SolrTestUtil.configset("cloud-dynamic"))
         // catch-all * field, indexed+stored
-        .addConfig("conf3", configset("cloud-minimal-inplace-updates"))
+        .addConfig("conf3", SolrTestUtil.configset("cloud-minimal-inplace-updates"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/RemoteQueryErrorTest.java b/solr/core/src/test/org/apache/solr/cloud/RemoteQueryErrorTest.java
index 2581b9b..30dbb8c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RemoteQueryErrorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RemoteQueryErrorTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -34,7 +36,7 @@ public class RemoteQueryErrorTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(3)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .formatZk(true).configure();
   }
 
@@ -48,7 +50,7 @@ public class RemoteQueryErrorTest extends SolrCloudTestCase {
 
     for (JettySolrRunner jetty : cluster.getJettySolrRunners()) {
       try (SolrClient client = jetty.newClient()) {
-        SolrException e = expectThrows(SolrException.class, () -> {
+        SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
           client.add("collection", new SolrInputDocument());
         });
         assertThat(e.getMessage(), containsString("Document is missing mandatory uniqueKey field: id"));
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 62e6e8e..d14c0ca 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplaceNodeTest.java
@@ -18,6 +18,8 @@
 package org.apache.solr.cloud;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -51,7 +53,7 @@ public class ReplaceNodeTest extends SolrCloudTestCase {
   public static void setupCluster() throws Exception {
     useFactory(null);
     configureCluster(6)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-dynamic").resolve("conf"))
         .configure();
   }
 
@@ -77,15 +79,14 @@ public class ReplaceNodeTest extends SolrCloudTestCase {
     // have to worry about null checking when comparing the Create command with the final Slices
     
     // TODO: tlog replicas do not work correctly in tests due to fault TestInjection#waitForInSyncWithLeader
-    create = pickRandom(
-                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 2,0,0),
-                        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,1,0),
-                        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,1,1),
-                        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,0,1),
-                        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,2,0),
-                        // check also replicationFactor 1
-                        CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,0,0)
-                        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,1,0)
+    create = SolrTestCaseUtil.pickRandom(CollectionAdminRequest.createCollection(coll, "conf1", 5, 2, 0, 0),
+        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,1,0),
+        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,1,1),
+        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 1,0,1),
+        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,2,0),
+        // check also replicationFactor 1
+        CollectionAdminRequest.createCollection(coll, "conf1", 5, 1, 0, 0)
+        //CollectionAdminRequest.createCollection(coll, "conf1", 5, 0,1,0)
     );
     create.setCreateNodeSet(StrUtils.join(l, ',')).setMaxShardsPerNode(100);
     create.processAndWait(cloudClient, 2000);
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java b/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java
index 5aecdc6..266bc1a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java
@@ -502,7 +502,7 @@ public class ReplicationFactorTest extends AbstractFullDistribZkTestBase {
 
   private boolean maybeAddMinRfExplicitly(int minRf, UpdateRequest up) {
     boolean minRfExplicit = false;
-    if (rarely()) {
+    if (LuceneTestCase.rarely()) {
       // test back compat behavior. Remove in Solr 9
       up.setParam(UpdateRequest.MIN_REPFACT, String.valueOf(minRf));
       minRfExplicit = true;
diff --git a/solr/core/src/test/org/apache/solr/cloud/SaslZkACLProviderTest.java b/solr/core/src/test/org/apache/solr/cloud/SaslZkACLProviderTest.java
index da6799f..0f964a9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SaslZkACLProviderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SaslZkACLProviderTest.java
@@ -23,7 +23,9 @@ import java.nio.charset.Charset;
 import java.nio.file.Path;
 
 import org.apache.lucene.util.Constants;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.DefaultZkACLProvider;
 import org.apache.solr.common.cloud.SaslZkACLProvider;
 import org.apache.solr.common.cloud.SecurityAwareZkACLProvider;
@@ -46,9 +48,9 @@ public class SaslZkACLProviderTest extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() {
-    assumeFalse("FIXME: This test fails on Java 9 (https://issues.apache.org/jira/browse/SOLR-8052)", Constants.JRE_IS_MINIMUM_JAVA9);
-    
-    assumeFalse("FIXME: SOLR-7040: This test fails under IBM J9",
+    LuceneTestCase.assumeFalse("FIXME: This test fails on Java 9 (https://issues.apache.org/jira/browse/SOLR-8052)", Constants.JRE_IS_MINIMUM_JAVA9);
+
+    LuceneTestCase.assumeFalse("FIXME: SOLR-7040: This test fails under IBM J9",
                 Constants.JAVA_VENDOR.startsWith("IBM"));
     System.setProperty("solrcloud.skip.autorecovery", "true");
     System.setProperty("hostName", "localhost");
@@ -64,13 +66,13 @@ public class SaslZkACLProviderTest extends SolrTestCaseJ4 {
   public void setUp() throws Exception {
     super.setUp();
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_START {}", getTestName());
+      log.info("####SETUP_START {}", SolrTestUtil.getTestName());
     }
-    createTempDir();
+    SolrTestUtil.createTempDir();
 
-    Path zkDir = createTempDir().resolve("zookeeper/server1/data");
+    Path zkDir = SolrTestUtil.createTempDir().resolve("zookeeper/server1/data");
     log.info("ZooKeeper dataDir:{}", zkDir);
-    zkServer = new SaslZkTestServer(zkDir, createTempDir().resolve("miniKdc"));
+    zkServer = new SaslZkTestServer(zkDir, SolrTestUtil.createTempDir().resolve("miniKdc"));
     zkServer.run();
 
     System.setProperty("zkHost", zkServer.getZkAddress());
@@ -81,7 +83,7 @@ public class SaslZkACLProviderTest extends SolrTestCaseJ4 {
     setupZNodes();
 
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_END {}", getTestName());
+      log.info("####SETUP_END {}", SolrTestUtil.getTestName());
     }
   }
 
@@ -112,7 +114,7 @@ public class SaslZkACLProviderTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-13075")
+  @LuceneTestCase.AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-13075")
   public void testSaslZkACLProvider() throws Exception {
     // Test with Sasl enabled
     SolrZkClient zkClient = new SolrZkClientWithACLs(zkServer.getZkAddress(), AbstractZkTestCase.TIMEOUT);
diff --git a/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java b/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java
index 20aca5b..bcaa16c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SharedFSAutoReplicaFailoverTest.java
@@ -20,6 +20,7 @@ import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -81,7 +82,7 @@ public class SharedFSAutoReplicaFailoverTest extends AbstractFullDistribZkTestBa
   @BeforeClass
   public static void hdfsFailoverBeforeClass() throws Exception {
     System.setProperty("solr.hdfs.blockcache.blocksperbank", "512");
-    dfsCluster = HdfsTestUtil.setupClass(createTempDir().toFile().getAbsolutePath());
+    dfsCluster = HdfsTestUtil.setupClass(SolrTestUtil.createTempDir().toFile().getAbsolutePath());
     System.setProperty("solr.hdfs.blockcache.global", "true"); // always use global cache, this test can create a lot of directories
     schemaString = "schema15.xml"; 
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
index d44eed8..e0fa6fd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java
@@ -33,6 +33,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkMaintenanceUtils;
 import org.apache.solr.util.SolrCLI;
@@ -50,7 +51,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
   public static void setupCluster() throws Exception {
     useFactory(null);
     configureCluster(1)
-        .addConfig("conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("conf1", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .formatZk(true).configure();
     zkAddr = cluster.getZkServer().getZkAddress();
     zkClient = cluster.getZkClient();
@@ -68,14 +69,14 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
   public void testUpconfig() throws Exception {
     // Use a full, explicit path for configset.
 
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "upconfig1", zkAddr);
     // Now do we have that config up on ZK?
     verifyZkLocalPathsMatch(srcPathCheck, "/configs/upconfig1");
 
     // Now just use a name in the configsets directory, do we find it?
-    configSet = TEST_PATH().resolve("configsets");
+    configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
 
     String[] args = new String[]{
         "-confname", "upconfig2",
@@ -109,11 +110,11 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
 
   @Test
   public void testDownconfig() throws Exception {
-    Path tmp = Paths.get(createTempDir("downConfigNewPlace").toAbsolutePath().toString(), "myconfset");
+    Path tmp = Paths.get(SolrTestUtil.createTempDir("downConfigNewPlace").toAbsolutePath().toString(), "myconfset");
 
     // First we need a configset on ZK to bring down. 
     
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "downconfig1", zkAddr);
     // Now do we have that config up on ZK?
@@ -137,7 +138,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
 
     // Now copy it up and back and insure it's still a file in the new place
     AbstractDistribZkTestBase.copyConfigUp(tmp.getParent(), "myconfset", "downconfig2", zkAddr);
-    Path tmp2 = createTempDir("downConfigNewPlace2");
+    Path tmp2 = SolrTestUtil.createTempDir("downConfigNewPlace2");
     downTool = new SolrCLI.ConfigSetDownloadTool();
     args = new String[]{
         "-confname", "downconfig2",
@@ -159,7 +160,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
   public void testCp() throws Exception {
     // First get something up on ZK
 
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "cp1", zkAddr);
@@ -180,7 +181,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
 
 
     // try with zk->local
-    Path tmp = createTempDir("tmpNewPlace2");
+    Path tmp = SolrTestUtil.createTempDir("tmpNewPlace2");
     args = new String[]{
         "-src", "zk:/configs/cp1",
         "-dst", "file:" + tmp.toAbsolutePath().toString(),
@@ -194,7 +195,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
 
 
     // try with zk->local  no file: prefix
-    tmp = createTempDir("tmpNewPlace3");
+    tmp = SolrTestUtil.createTempDir("tmpNewPlace3");
     args = new String[]{
         "-src", "zk:/configs/cp1",
         "-dst", tmp.toAbsolutePath().toString(),
@@ -348,7 +349,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
     verifyZkLocalPathsMatch(srcPathCheck, "/cp7/" + srcPathCheck.getFileName().toString());
 
     // Check for an intermediate ZNODE having content. You know cp7/stopwords is a parent node.
-    tmp = createTempDir("dirdata");
+    tmp = SolrTestUtil.createTempDir("dirdata");
     Path file = Paths.get(tmp.toAbsolutePath().toString(), "zknode.data");
     List<String> lines = new ArrayList<>();
     lines.add("{Some Arbitrary Data}");
@@ -371,7 +372,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
     res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args));
     assertEquals("Copy should have succeeded.", 0, res);
 
-    tmp = createTempDir("cp8");
+    tmp = SolrTestUtil.createTempDir("cp8");
     args = new String[]{
         "-src", "zk:/cp7",
         "-dst", "file:" + tmp.toAbsolutePath().toString(),
@@ -413,7 +414,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
     res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args));
     assertEquals("Copy should have succeeded.", 0, res);
 
-    Path tmp2 = createTempDir("cp9");
+    Path tmp2 = SolrTestUtil.createTempDir("cp9");
     Path emptyDest = Paths.get(tmp2.toAbsolutePath().toString(), "emptyfile");
     args = new String[]{
         "-src", "zk:/cp7/conf/stopwords/emptyfile",
@@ -439,7 +440,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
     assertEquals("Copy should have succeeded.", 0, res);
 
     // Now copy it all back and make sure empty file is still a file when recursively copying.
-    tmp2 = createTempDir("cp10");
+    tmp2 = SolrTestUtil.createTempDir("cp10");
     args = new String[]{
         "-src", "zk:/cp10",
         "-dst", "file:" + tmp2.toAbsolutePath().toString(),
@@ -458,7 +459,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
 
     // First get something up on ZK
 
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "mv1", zkAddr);
@@ -536,7 +537,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
   @Test
   public void testLs() throws Exception {
 
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
 
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "lister", zkAddr);
 
@@ -634,7 +635,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase {
   @Test
   public void testRm() throws Exception {
     
-    Path configSet = TEST_PATH().resolve("configsets");
+    Path configSet = SolrTestUtil.TEST_PATH().resolve("configsets");
     Path srcPathCheck = configSet.resolve("cloud-subdirs").resolve("conf");
 
     AbstractDistribZkTestBase.copyConfigUp(configSet, "cloud-subdirs", "rm1", zkAddr);
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java b/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
index 566e6c9..5e3c9aa 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrCloudBridgeTestCase.java
@@ -42,6 +42,7 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -140,7 +141,7 @@ public abstract class SolrCloudBridgeTestCase extends SolrCloudTestCase {
 
   final Pattern filenameExclusions = Pattern.compile(".*solrconfig(?:-|_).*?\\.xml|.*schema(?:-|_).*?\\.xml");
   
-  public static Path TEST_PATH() { return SolrTestCaseJ4.getFile("solr/collection1").getParentFile().toPath(); }
+  public static Path TEST_PATH() { return SolrTestUtil.getFile("solr/collection1").getParentFile().toPath(); }
   
   @Before
   public void beforeSolrCloudBridgeTestCase() throws Exception {
@@ -156,7 +157,7 @@ public abstract class SolrCloudBridgeTestCase extends SolrCloudTestCase {
     SolrZkClient zkClient = cluster.getSolrClient().getZkStateReader().getZkClient();
 
     if (!zkClient.exists("/configs/_default")) {
-      zkClient.uploadToZK(Paths.get(TEST_HOME()).resolve("collection1").resolve("conf"), "/configs" + "/" + "_default", filenameExclusions);
+      zkClient.uploadToZK(Paths.get(SolrTestUtil.TEST_HOME()).resolve("collection1").resolve("conf"), "/configs" + "/" + "_default", filenameExclusions);
     }
     
     if (schemaString != null) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
index e9fb938..2e530a5 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
@@ -25,6 +25,8 @@ import java.util.Properties;
 import org.apache.commons.io.FileUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
@@ -50,11 +52,11 @@ public class SolrXmlInZkTest extends SolrTestCaseJ4 {
   private NodeConfig cfg;
 
   private void setUpZkAndDiskXml(boolean toZk, boolean leaveOnLocal) throws Exception {
-    Path tmpDir = createTempDir();
+    Path tmpDir = SolrTestUtil.createTempDir();
     Path solrHome = tmpDir.resolve("home");
     copyMinConf(new File(solrHome.toFile(), "myCollect"));
     if (leaveOnLocal) {
-      FileUtils.copyFile(new File(SolrTestCaseJ4.TEST_HOME(), "solr-stress-new.xml"), new File(solrHome.toFile(), "solr.xml"));
+      FileUtils.copyFile(new File(SolrTestUtil.TEST_HOME(), "solr-stress-new.xml"), new File(solrHome.toFile(), "solr.xml"));
     }
 
     ignoreException("No UpdateLog found - cannot sync");
@@ -75,7 +77,7 @@ public class SolrXmlInZkTest extends SolrTestCaseJ4 {
     }
 
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_START {}", getTestName());
+      log.info("####SETUP_START {}", SolrTestUtil.getTestName());
     }
 
     // set some system properties for use by tests
@@ -85,7 +87,7 @@ public class SolrXmlInZkTest extends SolrTestCaseJ4 {
 
     cfg = SolrDispatchFilter.loadNodeConfig(zkClient, solrHome, props);
     if (log.isInfoEnabled()) {
-      log.info("####SETUP_END {}", getTestName());
+      log.info("####SETUP_END {}", SolrTestUtil.getTestName());
     }
   }
 
@@ -136,7 +138,7 @@ public class SolrXmlInZkTest extends SolrTestCaseJ4 {
   @Test
   public void testNotInZkOrOnDisk() throws Exception {
     try {
-      SolrException e = expectThrows(SolrException.class, () -> {
+      SolrException e = SolrTestCaseUtil.expectThrows(SolrException.class, () -> {
         System.setProperty("hostPort", "8787");
         setUpZkAndDiskXml(false, false); // solr.xml not on disk either
       });
diff --git a/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java b/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
index 3600b07..a5fb602 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SplitShardTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -63,7 +64,7 @@ public class SplitShardTest extends SolrCloudTestCase {
   public static void setupCluster() throws Exception {
     System.setProperty("solr.enableMetrics", "true");
     configureCluster(1)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/SystemCollectionCompatTest.java b/solr/core/src/test/org/apache/solr/cloud/SystemCollectionCompatTest.java
index bb1f8cf..ed89ba2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SystemCollectionCompatTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SystemCollectionCompatTest.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -73,7 +74,7 @@ public class SystemCollectionCompatTest extends SolrCloudTestCase {
 
     System.setProperty("managed.schema.mutable", "true");
     configureCluster(2)
-        .addConfig("conf1", configset("cloud-managed"))
+        .addConfig("conf1", SolrTestUtil.configset("cloud-managed"))
         .configure();
     if (! log.isWarnEnabled()) {
       fail("Test requires that log-level is at-least WARN, but WARN is disabled");
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java b/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
index 79b95ff..fe2af01 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
@@ -24,6 +24,8 @@ import java.util.Map;
 
 import org.apache.http.HttpRequestInterceptor;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -61,7 +63,7 @@ public class TestAuthenticationFramework extends SolrCloudTestCase {
   public void setUp() throws Exception {
     System.setProperty("solr.enablePublicKeyHandler", "true");
     setupAuthenticationPlugin();
-    configureCluster(nodeCount).addConfig(configName, configset("cloud-minimal")).configure();
+    configureCluster(nodeCount).addConfig(configName, SolrTestUtil.configset("cloud-minimal")).configure();
     super.setUp();
   }
   
@@ -80,8 +82,7 @@ public class TestAuthenticationFramework extends SolrCloudTestCase {
 
     // Should fail with 401
     try {
-      BaseHttpSolrClient.RemoteSolrException e = expectThrows(BaseHttpSolrClient.RemoteSolrException.class,
-          this::collectionCreateSearchDeleteTwice);
+      BaseHttpSolrClient.RemoteSolrException e = SolrTestCaseUtil.expectThrows(BaseHttpSolrClient.RemoteSolrException.class, this::collectionCreateSearchDeleteTwice);
       assertEquals("Should've returned a 401 error: " +  e.getMessage(), 401, e.code());
     } finally {
       MockAuthenticationPlugin.expectedUsername = null;
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java b/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java
index 30533a1..7ff28d7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestBaseStatsCacheCloud.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import java.util.function.Function;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
@@ -89,7 +90,7 @@ public abstract class TestBaseStatsCacheCloud extends SolrCloudTestCase {
     control = new EmbeddedSolrServer(SolrTestCaseJ4.h.getCore());
     // create cluster
     configureCluster(numNodes) // 2 + random().nextInt(3)
-        .addConfig("conf", configset(configset))
+        .addConfig("conf", SolrTestUtil.configset(configset))
         .configure();
     solrClient = cluster.getSolrClient();
     createTestCollection();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudConsistency.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudConsistency.java
index a42ff4e..c147e9a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudConsistency.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudConsistency.java
@@ -20,6 +20,8 @@ package org.apache.solr.cloud;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.cloud.SocketProxy;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -62,7 +64,7 @@ public class TestCloudConsistency extends SolrCloudTestCase {
     System.setProperty("solr.skipCommitOnClose", "false");
 
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
     // Add proxies
     proxies = new HashMap<>(cluster.getJettySolrRunners().size());
@@ -183,19 +185,17 @@ public class TestCloudConsistency extends SolrCloudTestCase {
 
     // the meat of the test -- wait to see if a different replica become a leader
     // the correct behavior is that this should time out, if it succeeds we have a problem...
-    expectThrows(TimeoutException.class,
-                 "Did not time out waiting for new leader, out of sync replica became leader",
-                 () -> {
-                   cluster.getSolrClient().waitForState(collection, 3, TimeUnit.SECONDS, (l, state) -> {
-            Replica newLeader = state.getSlice("shard1").getLeader();
-            if (newLeader != null && !newLeader.getName().equals(leader.getName()) && newLeader.getState() == Replica.State.ACTIVE) {
-              // this is is the bad case, our "bad" state was found before timeout
-              log.error("WTF: New Leader={} original Leader={}", newLeader, leader);
-              return true;
-            }
-            return false; // still no bad state, wait for timeout
-          });
+    SolrTestCaseUtil.expectThrows(TimeoutException.class, "Did not time out waiting for new leader, out of sync replica became leader", () -> {
+      cluster.getSolrClient().waitForState(collection, 3, TimeUnit.SECONDS, (l, state) -> {
+        Replica newLeader = state.getSlice("shard1").getLeader();
+        if (newLeader != null && !newLeader.getName().equals(leader.getName()) && newLeader.getState() == Replica.State.ACTIVE) {
+          // this is is the bad case, our "bad" state was found before timeout
+          log.error("WTF: New Leader={} original Leader={}", newLeader, leader);
+          return true;
+        }
+        return false; // still no bad state, wait for timeout
       });
+    });
 
     waitForState("Timeout waiting for leader", collection, (liveNodes, collectionState) -> {
       Replica newLeader = collectionState.getLeader("shard1");
@@ -234,19 +234,17 @@ public class TestCloudConsistency extends SolrCloudTestCase {
 
     // the meat of the test -- wait to see if a different replica become a leader
     // the correct behavior is that this should time out, if it succeeds we have a problem...
-    expectThrows(TimeoutException.class,
-                 "Did not time out waiting for new leader, out of sync replica became leader",
-                 () -> {
-                   cluster.getSolrClient().waitForState(collection, 3, TimeUnit.SECONDS, (l, state) -> {
-            Replica newLeader = state.getSlice("shard1").getLeader();
-            if (newLeader != null && !newLeader.getName().equals(leader.getName()) && newLeader.getState() == Replica.State.ACTIVE) {
-              // this is is the bad case, our "bad" state was found before timeout
-              log.error("WTF: New Leader={} Old Leader={}", newLeader, leader);
-              return true;
-            }
-            return false; // still no bad state, wait for timeout
-          });
+    SolrTestCaseUtil.expectThrows(TimeoutException.class, "Did not time out waiting for new leader, out of sync replica became leader", () -> {
+      cluster.getSolrClient().waitForState(collection, 3, TimeUnit.SECONDS, (l, state) -> {
+        Replica newLeader = state.getSlice("shard1").getLeader();
+        if (newLeader != null && !newLeader.getName().equals(leader.getName()) && newLeader.getState() == Replica.State.ACTIVE) {
+          // this is is the bad case, our "bad" state was found before timeout
+          log.error("WTF: New Leader={} Old Leader={}", newLeader, leader);
+          return true;
+        }
+        return false; // still no bad state, wait for timeout
       });
+    });
 
     j1.start();
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
index b20857d..c1f5fd0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudDeleteByQuery.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -114,7 +115,7 @@ public class TestCloudDeleteByQuery extends SolrCloudTestCase {
   private static void createMiniSolrCloudCluster() throws Exception {
     
     final String configName = "solrCloudCollectionConfig";
-    final Path configDir = Paths.get(TEST_HOME(), "collection1", "conf");
+    final Path configDir = Paths.get(SolrTestUtil.TEST_HOME(), "collection1", "conf");
     
     configureCluster(NUM_SERVERS)
       .addConfig(configName, configDir)
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudInspectUtil.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudInspectUtil.java
index 6031e03..83ff9ce 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudInspectUtil.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudInspectUtil.java
@@ -20,6 +20,7 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.junit.After;
@@ -106,9 +107,8 @@ public class TestCloudInspectUtil extends SolrTestCaseJ4 {
     final SolrDocumentList aExpectEx = getDocList("2", "3", "4");
     final SolrDocumentList bExpectEx = getDocList("2", "3", "4");
 
-    expectThrows(IllegalArgumentException.class, "Expected exception because lists have no diff",
-        () -> CloudInspectUtil.checkIfDiffIsLegal(aExpectEx, bExpectEx,
-            "control", "cloud", addFailsExpectEx, deleteFailsExpectEx));
+    SolrTestCaseUtil.expectThrows(IllegalArgumentException.class, "Expected exception because lists have no diff",
+        () -> CloudInspectUtil.checkIfDiffIsLegal(aExpectEx, bExpectEx, "control", "cloud", addFailsExpectEx, deleteFailsExpectEx));
   }
 
   private SolrDocumentList getDocList(String ... ids) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
index d9f7161..a433142 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
@@ -26,9 +26,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -41,8 +43,6 @@ import org.apache.solr.common.util.NamedList;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
-
 /** 
  * A very simple sanity check that Phrase Identification works across a cloud cluster
  * using distributed term stat collection.
@@ -64,13 +64,13 @@ public class TestCloudPhrasesIdentificationComponent extends SolrCloudTestCase {
   public static void createMiniSolrCloudCluster() throws Exception {
     
     // multi replicas should not matter...
-    final int repFactor = usually() ? 1 : 2;
-    // ... but we definitely want to test multiple shards
-    final int numShards = TestUtil.nextInt(random(), 1, (usually() ? 2 :3));
+    final int repFactor = LuceneTestCase.usually() ? 1 : 2;
+    // ... but we definitely want to test multiple shardsLuceneTestCase.
+    final int numShards = TestUtil.nextInt(random(), 1, (LuceneTestCase.usually() ? 2 :3));
     final int numNodes = (numShards * repFactor);
    
     final String configName = DEBUG_LABEL + "_config-set";
-    final Path configDir = Paths.get(TEST_HOME(), "collection1", "conf");
+    final Path configDir = Paths.get(SolrTestUtil.TEST_HOME(), "collection1", "conf");
     
     configureCluster(numNodes).addConfig(configName, configDir).configure();
     
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java
index 902d3b9..e6c0653 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudPivotFacet.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.response.FieldStatsInfo;
 import org.apache.solr.client.solrj.response.PivotField;
@@ -134,7 +135,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
     final Set<String> fieldNameSet = new HashSet<>();
     
     // build up a randomized index
-    final int numDocs = atLeast(TEST_NIGHTLY ? 500 : 50);
+    final int numDocs = SolrTestUtil.atLeast(TEST_NIGHTLY ? 500 : 50);
     log.info("numDocs: {}", numDocs);
 
     for (int i = 1; i <= numDocs; i++) {
@@ -563,7 +564,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
                                         
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(TestUtil.nextInt(random(), 20, 50),
                                       random().nextInt()));
@@ -576,7 +577,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
                                         random().nextLong()));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(TestUtil.nextInt(random(), 5000, 5100),
                                       random().nextLong()));
@@ -589,7 +590,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
                                         random().nextFloat() * random().nextInt()));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(1.0F / random().nextInt(13),
                                       random().nextFloat() * random().nextInt()));
@@ -602,7 +603,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
                                         random().nextDouble() * random().nextInt()));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(1.0D / random().nextInt(19),
                                       random().nextDouble() * random().nextInt()));
@@ -615,7 +616,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
                                         
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(SolrTestCaseJ4.randomSkewedDate(), SolrTestCaseJ4.randomDate()));
                                       
@@ -628,7 +629,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
         doc.addField(prefix+"1", random().nextBoolean() ? "t" : "f");
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, random().nextBoolean() ? "t" : "f");
         }
@@ -640,7 +641,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
             SolrTestCaseJ4.randomXmlUsableUnicodeString()));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, SolrTestCaseJ4.skewed(TestUtil.randomSimpleString(random(), 1, 1),
               SolrTestCaseJ4.randomXmlUsableUnicodeString()));
@@ -657,7 +658,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
         doc.addField(prefix+"1", TestUtil.randomSimpleString(random(), 1, 1));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, TestUtil.randomSimpleString(random(), 1, 1));
         }
@@ -668,7 +669,7 @@ public class TestCloudPivotFacet extends SolrCloudBridgeTestCase {
         doc.addField(prefix+"1", TestUtil.nextInt(random(), 20, 50));
       }
       if (useField()) {
-        int numMulti = atLeast(1);
+        int numMulti = SolrTestUtil.atLeast(1);
         while (0 < numMulti--) {
           doc.addField(prefix, TestUtil.nextInt(random(), 20, 50));
         }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
index 0c460b9..22ff437 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudPseudoReturnFields.java
@@ -30,6 +30,7 @@ import java.util.Random;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -66,14 +67,14 @@ public class TestCloudPseudoReturnFields extends SolrCloudTestCase {
   @BeforeClass
   private static void createMiniSolrCloudCluster() throws Exception {
     // multi replicas should matter...
-    final int repFactor = usually() ? 1 : 2;;
+    final int repFactor = LuceneTestCase.usually() ? 1 : 2;;
     // ... but we definitely want to ensure forwarded requests to other shards work ...
     final int numShards = 2;
     // ... including some forwarded requests from nodes not hosting a shard
     final int numNodes = 1 + (numShards * repFactor);
    
     final String configName = DEBUG_LABEL + "_config-set";
-    final Path configDir = Paths.get(TEST_HOME(), "collection1", "conf");
+    final Path configDir = Paths.get(SolrTestUtil.TEST_HOME(), "collection1", "conf");
     
     configureCluster(numNodes).addConfig(configName, configDir).configure();
     
@@ -727,7 +728,7 @@ public class TestCloudPseudoReturnFields extends SolrCloudTestCase {
     final List<String> fl = Arrays.asList
       ("id","[docid]","[explain]","score","val_*","subj*");
     
-    final int iters = atLeast(random, 10);
+    final int iters = LuceneTestCase.atLeast(random, 10);
     for (int i = 0; i< iters; i++) {
       
       Collections.shuffle(fl, random);
@@ -762,7 +763,7 @@ public class TestCloudPseudoReturnFields extends SolrCloudTestCase {
     final List<String> fl = Arrays.asList
       ("id","[docid]","[explain]","score","val_*","subj*");
     
-    final int iters = atLeast(random, 10);
+    final int iters = LuceneTestCase.atLeast(random, 10);
     for (int i = 0; i< iters; i++) {
       
       Collections.shuffle(fl, random);
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
index 91ba1d3..3048ae2 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
@@ -30,6 +30,7 @@ import java.util.stream.Collectors;
 import org.apache.commons.io.IOUtils;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -71,7 +72,7 @@ public class TestCloudRecovery extends SolrCloudTestCase {
   @Before
   public void beforeTest() throws Exception {
     configureCluster(2)
-        .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
 
     onlyLeaderIndexes = random().nextBoolean();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
index 047a39f..f8e1668 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery2.java
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
@@ -29,7 +30,6 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.cloud.Replica;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,7 +46,7 @@ public class TestCloudRecovery2 extends SolrCloudTestCase {
     System.setProperty("solr.ulog.numRecordsToKeep", "1000");
 
     configureCluster(2)
-        .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
 
     CollectionAdminRequest
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudSearcherWarming.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudSearcherWarming.java
index e37a6d2..1b48b65 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudSearcherWarming.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudSearcherWarming.java
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
@@ -66,7 +67,7 @@ public class TestCloudSearcherWarming extends SolrCloudTestCase {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    configureCluster(1).addConfig("conf", configset("cloud-minimal")).configure();
+    configureCluster(1).addConfig("conf", SolrTestUtil.configset("cloud-minimal")).configure();
   }
   
   @After
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
index 4007c41..7017fe8 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
@@ -49,6 +49,8 @@ import org.apache.commons.io.FileUtils;
 import org.apache.http.client.HttpClient;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -113,7 +115,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(1, SolrTestUtil.createTempDir(), buildJettyConfig("/solr"));
   }
 
   @Override
@@ -130,7 +132,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
   public void testCreateErrors() throws Exception {
     final String baseUrl = solrCluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     final SolrClient solrClient = getHttpSolrClient(baseUrl);
-    solrCluster.uploadConfigSet(configset("configset-2"), "configSet");
+    solrCluster.uploadConfigSet(SolrTestUtil.configset("configset-2"), "configSet");
 
     // no action
     CreateNoErrorChecking createNoAction = new CreateNoErrorChecking();
@@ -177,8 +179,8 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
   }
 
   private void setupBaseConfigSet(String baseConfigSetName, Map<String, String> oldProps) throws Exception {
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
+    final File configDir = SolrTestUtil.getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
+    final File tmpConfigDir = SolrTestUtil.createTempDir().toFile();
     tmpConfigDir.deleteOnExit();
     FileUtils.copyDirectory(configDir, tmpConfigDir);
     if (oldProps != null && oldProps.size() > 0) {
@@ -355,9 +357,8 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
       final String untrustedSuffix = "-untrusted";
       uploadConfigSetWithAssertions("with-script-processor", untrustedSuffix, null, null);
       // try to create a collection with the uploaded configset
-      Throwable thrown = expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
-        createCollection("newcollection2", "with-script-processor" + untrustedSuffix,
-      1, 1, solrCluster.getSolrClient());
+      Throwable thrown = SolrTestCaseUtil.expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
+        createCollection("newcollection2", "with-script-processor" + untrustedSuffix, 1, 1, solrCluster.getSolrClient());
       });
 
     assertThat(thrown.getMessage(), containsString("Underlying core creation failed"));
@@ -381,7 +382,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
     final String untrustedSuffix = "-untrusted";
     uploadConfigSetWithAssertions("with-lib-directive", untrustedSuffix, null, null);
     // try to create a collection with the uploaded configset
-    Throwable thrown = expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
+    Throwable thrown = SolrTestCaseUtil.expectThrows(BaseHttpSolrClient.RemoteSolrException.class, () -> {
       createCollection("newcollection3", "with-lib-directive" + untrustedSuffix, 1, 1, solrCluster.getSolrClient());
     });
 
@@ -499,7 +500,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
     File zipFile = new File(solrCluster.getBaseDir().toFile().getAbsolutePath() +
         File.separator + TestUtil.randomSimpleString(random(), 6, 8) + ".zip");
 
-    File directory = SolrTestCaseJ4.getFile(directoryPath);
+    File directory = SolrTestUtil.getFile(directoryPath);
     if (log.isInfoEnabled()) {
       log.info("Directory: {}", directory.getAbsolutePath());
     }
@@ -635,7 +636,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
 
   private byte[] readFile(String fname) throws IOException {
     byte[] buf = null;
-    try (FileInputStream fis = new FileInputStream(getFile(fname))) {
+    try (FileInputStream fis = new FileInputStream(SolrTestUtil.getFile(fname))) {
       buf = new byte[fis.available()];
       fis.read(buf);
     }
@@ -646,8 +647,8 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
   public void testDeleteErrors() throws Exception {
     final String baseUrl = solrCluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     final SolrClient solrClient = getHttpSolrClient(baseUrl);
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
+    final File configDir = SolrTestUtil.getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
+    final File tmpConfigDir = SolrTestUtil.createTempDir().toFile();
     tmpConfigDir.deleteOnExit();
     // Ensure ConfigSet is immutable
     FileUtils.copyDirectory(configDir, tmpConfigDir);
@@ -672,7 +673,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
 
   private void verifyException(SolrClient solrClient, ConfigSetAdminRequest request,
       String errorContains) throws Exception {
-    Exception e = expectThrows(Exception.class, () -> solrClient.request(request));
+    Exception e = SolrTestCaseUtil.expectThrows(Exception.class, () -> solrClient.request(request));
     assertTrue("Expected exception message to contain: " + errorContains
         + " got: " + e.getMessage(), e.getMessage().contains(errorContains));
   }
@@ -682,7 +683,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
     final String baseUrl = solrCluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     final SolrClient solrClient = getHttpSolrClient(baseUrl);
     final String configSet = "configSet";
-    solrCluster.uploadConfigSet(configset("configset-2"), configSet);
+    solrCluster.uploadConfigSet(SolrTestUtil.configset("configset-2"), configSet);
 
     SolrZkClient zkClient = zkClient();
     ZkConfigManager configManager = new ZkConfigManager(zkClient);
@@ -713,7 +714,7 @@ public class TestConfigSetsAPI extends SolrTestCaseJ4 {
     Set<String> configSets = new HashSet<String>();
     for (int i = 0; i < 5; ++i) {
       String configSet = "configSet" + i;
-      solrCluster.uploadConfigSet(configset("configset-2"), configSet);
+      solrCluster.uploadConfigSet(SolrTestUtil.configset("configset-2"), configSet);
       configSets.add(configSet);
     }
     response = list.process(solrClient);
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
index 65b50a5..9b7c86e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIExclusivity.java
@@ -21,7 +21,9 @@ import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
 import org.apache.solr.client.solrj.request.ConfigSetAdminRequest.Create;
@@ -50,7 +52,7 @@ public class TestConfigSetsAPIExclusivity extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    solrCluster = new MiniSolrCloudCluster(1, createTempDir(), buildJettyConfig("/solr"));
+    solrCluster = new MiniSolrCloudCluster(1, SolrTestUtil.createTempDir(), buildJettyConfig("/solr"));
   }
 
   @Override
@@ -64,7 +66,7 @@ public class TestConfigSetsAPIExclusivity extends SolrTestCaseJ4 {
   }
 
   @Test
-  @AwaitsFix(bugUrl = "overseer does not currently limit")
+  @LuceneTestCase.AwaitsFix(bugUrl = "overseer does not currently limit")
   public void testAPIExclusivity() throws Exception {
     int trials = 20;
     setupBaseConfigSet(GRANDBASE_CONFIGSET_NAME);
@@ -92,7 +94,7 @@ public class TestConfigSetsAPIExclusivity extends SolrTestCaseJ4 {
   }
 
   private void setupBaseConfigSet(String baseConfigSetName) throws Exception {
-    solrCluster.uploadConfigSet(configset("configset-2"), baseConfigSetName);
+    solrCluster.uploadConfigSet(SolrTestUtil.configset("configset-2"), baseConfigSetName);
   }
 
   private Exception getFirstExceptionOrNull(List<Exception> list) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
index 1621051..9dd336e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPIZkFailure.java
@@ -33,7 +33,10 @@ import org.apache.commons.io.FileUtils;
 import org.apache.jute.InputArchive;
 import org.apache.jute.OutputArchive;
 import org.apache.jute.Record;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient.RemoteSolrException;
 import org.apache.solr.client.solrj.request.ConfigSetAdminRequest.Create;
@@ -76,7 +79,7 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    final Path testDir = createTempDir();
+    final Path testDir = SolrTestUtil.createTempDir();
     final Path zkDir = testDir.resolve("zookeeper/server1/data");
     zkTestServer = new ZkTestServer(zkDir);
     zkTestServer.run();
@@ -100,7 +103,7 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
   }
 
   @Test
-  @AwaitsFix(bugUrl = "fragile")
+  @LuceneTestCase.AwaitsFix(bugUrl = "fragile")
   public void testCreateZkFailure() throws Exception {
     final String baseUrl = solrCluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     final SolrClient solrClient = getHttpSolrClient(baseUrl);
@@ -115,7 +118,7 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
 
     Create create = new Create();
     create.setBaseConfigSetName(BASE_CONFIGSET_NAME).setConfigSetName(CONFIGSET_NAME);
-    RemoteSolrException se = expectThrows(RemoteSolrException.class, () -> create.process(solrClient));
+    RemoteSolrException se = SolrTestCaseUtil.expectThrows(RemoteSolrException.class, () -> create.process(solrClient));
     // partial creation should have been cleaned up
     assertFalse(configManager.configExists(CONFIGSET_NAME));
     assertEquals(400, se.code());
@@ -125,8 +128,8 @@ public class TestConfigSetsAPIZkFailure extends SolrTestCaseJ4 {
   }
 
   private void setupBaseConfigSet(String baseConfigSetName, Map<String, String> oldProps) throws Exception {
-    final File configDir = getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
-    final File tmpConfigDir = createTempDir().toFile();
+    final File configDir = SolrTestUtil.getFile("solr").toPath().resolve("configsets/configset-2/conf").toFile();
+    final File tmpConfigDir = SolrTestUtil.createTempDir().toFile();
     tmpConfigDir.deleteOnExit();
     FileUtils.copyDirectory(configDir, tmpConfigDir);
     if (oldProps != null) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestDeleteCollectionOnDownNodes.java b/solr/core/src/test/org/apache/solr/cloud/TestDeleteCollectionOnDownNodes.java
index 87da3a8..01302a9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestDeleteCollectionOnDownNodes.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestDeleteCollectionOnDownNodes.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.junit.After;
@@ -28,7 +29,7 @@ public class TestDeleteCollectionOnDownNodes extends SolrCloudTestCase {
   @Before
   public void beforeTestDeleteCollectionOnDownNodes() throws Exception {
     configureCluster(4)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
 
     CollectionAdminRequest.createCollection("DeleteCollectionOnDownNodes", "conf", 4, 3)
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java b/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
index eef9c1f..0d19779 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestDistributedMap.java
@@ -22,6 +22,7 @@ import java.nio.file.Path;
 import java.util.Locale;
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -36,7 +37,7 @@ public class TestDistributedMap extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void setUpClass() throws Exception {
-    zkDir = createTempDir("TestDistributedMap");
+    zkDir = SolrTestUtil.createTempDir("TestDistributedMap");
     zkServer = new ZkTestServer(zkDir);
     zkServer.run();
   }
@@ -177,7 +178,7 @@ public class TestDistributedMap extends SolrTestCaseJ4 {
   }
 
   protected String getAndMakeInitialPath(SolrZkClient zkClient) throws KeeperException, InterruptedException {
-    String path = String.format(Locale.ROOT, "/%s/%s", getClass().getName(), getSaferTestName());
+    String path = String.format(Locale.ROOT, "/%s/%s", getClass().getName(), SolrTestUtil.getTestName());
     zkClient.makePath(path, false, true);
     return path;
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestDownShardTolerantSearch.java b/solr/core/src/test/org/apache/solr/cloud/TestDownShardTolerantSearch.java
index ab2479f..309d68b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestDownShardTolerantSearch.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestDownShardTolerantSearch.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -42,7 +44,7 @@ public class TestDownShardTolerantSearch extends SolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    configureCluster(2).addConfig("conf", configset("cloud-minimal")).configure();
+    configureCluster(2).addConfig("conf", SolrTestUtil.configset("cloud-minimal")).configure();
   }
 
   @Test
@@ -69,7 +71,7 @@ public class TestDownShardTolerantSearch extends SolrCloudTestCase {
       assertThat(response.getStatus(), is(0));
       assertTrue(response.getResults().getNumFound() > 0);
 
-      Exception e = expectThrows(Exception.class, "Request should have failed because we killed shard1 jetty",
+      Exception e = SolrTestCaseUtil.expectThrows(Exception.class, "Request should have failed because we killed shard1 jetty",
           () -> cluster.getSolrClient().query("tolerant", new SolrQuery("*:*").setRows(1).setParam(ShardParams.SHARDS_TOLERANT, false)));
 
       assertNotNull(e);
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestExclusionRuleCollectionAccess.java b/solr/core/src/test/org/apache/solr/cloud/TestExclusionRuleCollectionAccess.java
index 5bf77c1..5f738a4 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestExclusionRuleCollectionAccess.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestExclusionRuleCollectionAccess.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.junit.BeforeClass;
@@ -26,7 +27,7 @@ public class TestExclusionRuleCollectionAccess extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(1)
-        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf", SolrTestUtil.configset("cloud-minimal"))
         .configure();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
index 512708d..1613693 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.cloud;
 
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -50,7 +51,7 @@ public class TestLeaderElectionWithEmptyReplica extends SolrCloudTestCase {
 
     useFactory(null);
     configureCluster(2)
-        .addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
+        .addConfig("config", SolrTestUtil.TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
         .configure();
 
     CollectionAdminRequest.createCollection(COLLECTION_NAME, "config", 1, 1)
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
index c871665..5559c16 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionZkExpiry.java
@@ -21,6 +21,7 @@ import java.nio.file.Path;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.core.CloudConfig;
 import org.apache.solr.core.CoreContainer;
@@ -39,8 +40,8 @@ public class TestLeaderElectionZkExpiry extends SolrTestCaseJ4 {
 
   @Test
   public void testLeaderElectionWithZkExpiry() throws Exception {
-    Path zkDir = createTempDir("zkData");
-    Path ccDir = createTempDir("testLeaderElectionWithZkExpiry-solr");
+    Path zkDir = SolrTestUtil.createTempDir("zkData");
+    Path ccDir = SolrTestUtil.createTempDir("testLeaderElectionWithZkExpiry-solr");
     CoreContainer cc = createCoreContainer(ccDir, SOLRXML);
     final ZkTestServer server = new ZkTestServer(zkDir);
     server.setTheTickTime(1000);
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudClusterSSL.java b/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudClusterSSL.java
index 2fdbb3a..6319c12 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudClusterSSL.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudClusterSSL.java
@@ -26,8 +26,11 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.lucene.util.Constants;
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.TestRuleRestoreSystemProperties;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.SolrTestCaseUtil;
+import org.apache.solr.SolrTestUtil;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -125,7 +128,7 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
   }
 
   public void testSslAndClientAuth() throws Exception {
-    assumeFalse("SOLR-9039: SSL w/clientAuth does not work on MAC_OS_X", Constants.MAC_OS_X);
+    LuceneTestCase.assumeFalse("SOLR-9039: SSL w/clientAuth does not work on MAC_OS_X", Constants.MAC_OS_X);
     
     final SSLTestConfig sslConfig = new SSLTestConfig(true, true);
 
@@ -157,7 +160,7 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
   private void checkClusterWithNodeReplacement(SSLTestConfig sslConfig) throws Exception {
     
     final JettyConfig config = JettyConfig.builder().withSSLConfig(sslConfig.buildServerSSLConfig()).build();
-    final MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), config);
+    final MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(NUM_SERVERS, SolrTestUtil.createTempDir(), config);
     try {
       checkClusterWithCollectionCreations(cluster, sslConfig);
 
@@ -187,7 +190,7 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
     Http2SolrClient.setDefaultSSLConfig(sslConfig.buildClientSSLConfig());
     System.setProperty(ZkStateReader.URL_SCHEME, "https");
     final JettyConfig config = JettyConfig.builder().withSSLConfig(sslConfig.buildServerSSLConfig()).build();
-    final MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(NUM_SERVERS, createTempDir(), config);
+    final MiniSolrCloudCluster cluster = new MiniSolrCloudCluster(NUM_SERVERS, SolrTestUtil.createTempDir(), config);
     try {
       checkClusterWithCollectionCreations(cluster, sslConfig);
       
@@ -202,13 +205,13 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
       for (JettySolrRunner jetty : jettys) {
         final String baseURL = jetty.getBaseUrl().toString();
         // verify new solr clients validate peer name and can't talk to this server
-        Exception ex = expectThrows(SolrServerException.class, () -> {
-            try (Http2SolrClient client = getRandomizedHttpSolrClient(baseURL)) {
-              CoreAdminRequest req = new CoreAdminRequest();
-              req.setAction( CoreAdminAction.STATUS );
-              client.request(req);
-            }
-          });
+        Exception ex = SolrTestCaseUtil.expectThrows(SolrServerException.class, () -> {
+          try (Http2SolrClient client = getRandomizedHttpSolrClient(baseURL)) {
+            CoreAdminRequest req = new CoreAdminRequest();
+            req.setAction(CoreAdminAction.STATUS);
+            client.request(req);
+          }
+        });
         assertTrue("Expected an root cause SSL Exception, got: " + ex.toString(),
                    ex.getCause() instanceof SSLException);
       }
@@ -236,7 +239,7 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
   public static void checkClusterWithCollectionCreations(final MiniSolrCloudCluster cluster,
                                                          final SSLTestConfig sslConfig) throws Exception {
 
-    cluster.uploadConfigSet(SolrTestCaseJ4.TEST_PATH().resolve("collection1").resolve("conf"), CONF_NAME);
+    cluster.uploadConfigSet(SolrTestUtil.TEST_PATH().resolve("collection1").resolve("conf"), CONF_NAME);
     
     checkCreateCollection(cluster, "first_collection");
     
@@ -311,22 +314,22 @@ public class TestMiniSolrCloudClusterSSL extends SolrTestCaseJ4 {
                                                        (ssl ? "http://" : "https://"));
           
       // verify solr client using wrong protocol can't talk to server
-      expectThrows(SolrServerException.class, () -> {
-          try (Http2SolrClient client = getRandomizedHttpSolrClient(wrongBaseURL)) {
-            CoreAdminRequest req = new CoreAdminRequest();
-            req.setAction( CoreAdminAction.STATUS );
-            client.request(req);
-          }
-        });
+      SolrTestCaseUtil.expectThrows(SolrServerException.class, () -> {
+        try (Http2SolrClient client = getRandomizedHttpSolrClient(wrongBaseURL)) {
+          CoreAdminRequest req = new CoreAdminRequest();
+          req.setAction(CoreAdminAction.STATUS);
+          client.request(req);
+        }
+      });
       
       if (! sslConfig.isClientAuthMode()) {
         // verify simple HTTP(S) client can't do HEAD request for URL with wrong protocol
         try (CloseableHttpClient client = getSslAwareClientWithNoClientCerts()) {
           final String wrongUrl = wrongBaseURL + "/admin/cores";
           // vastly diff exception details between plain http vs https, not worried about details here
-          expectThrows(IOException.class, () -> {
-              doHeadRequest(client, wrongUrl);
-            });
... 23471 lines suppressed ...