You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by md...@apache.org on 2022/08/02 16:08:41 UTC

[solr] branch main updated: SOLR-16304 Remove @Slow test annotation (#951)

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

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


The following commit(s) were added to refs/heads/main by this push:
     new d41ae28c919 SOLR-16304 Remove @Slow test annotation (#951)
d41ae28c919 is described below

commit d41ae28c919bd47ce774a82902757687c296037b
Author: Mike Drob <md...@apache.org>
AuthorDate: Tue Aug 2 11:08:37 2022 -0500

    SOLR-16304 Remove @Slow test annotation (#951)
    
    Removed @LuceneTestCase.Slow test annotation from our code base
    Some tests were re-annotated as Nightly tests because they are too long
    
    Speed up tests:
    * Scope down work in non-nightly runs and full testing in Nightly mode
    * Combined use of cluster in single classes to speed up multiple methods
    * Replaced several polling sleeps with zookeeper watches
    * Replaced slow waits on async calls with sync calls when not explicitly testing async
---
 dev-tools/scripts/reproduceJenkinsFailures.py      |   4 +-
 gradle/testing/randomization.gradle                |   1 -
 help/tests.txt                                     |   8 +-
 solr/CHANGES.txt                                   |   2 +
 .../apache/solr/handler/export/ExportWriter.java   |   2 +-
 .../solr/DistributedIntervalFacetingTest.java      |   2 -
 .../org/apache/solr/TestDistributedGrouping.java   |   2 -
 .../apache/solr/TestDistributedMissingSort.java    |   2 -
 .../org/apache/solr/TestDistributedSearch.java     |   2 -
 .../test/org/apache/solr/TestRandomDVFaceting.java |   2 -
 .../test/org/apache/solr/TestRandomFaceting.java   |   2 -
 .../apache/solr/cloud/BasicDistributedZkTest.java  |   2 -
 .../solr/cloud/ChaosMonkeyNothingIsSafeTest.java   |   2 -
 ...aosMonkeyNothingIsSafeWithPullReplicasTest.java |   4 +-
 .../solr/cloud/ChaosMonkeySafeLeaderTest.java      |   8 +-
 .../ChaosMonkeySafeLeaderWithPullReplicasTest.java |   4 +-
 .../solr/cloud/ChaosMonkeyShardSplitTest.java      |  40 +++----
 .../org/apache/solr/cloud/CleanupOldIndexTest.java |   9 +-
 .../apache/solr/cloud/ClusterStateUpdateTest.java  |  14 +--
 .../org/apache/solr/cloud/CollectionPropsTest.java |   2 -
 .../apache/solr/cloud/CollectionsAPISolrJTest.java |  57 ++++-----
 .../cloud/ConcurrentCreateRoutedAliasTest.java     |   1 -
 .../apache/solr/cloud/ConnectionManagerTest.java   |   2 -
 .../org/apache/solr/cloud/DeleteReplicaTest.java   |   8 --
 .../apache/solr/cloud/DistribCursorPagingTest.java |   2 -
 .../DistribDocExpirationUpdateProcessorTest.java   |  13 +-
 .../solr/cloud/DistributedVersionInfoTest.java     |   4 +-
 .../org/apache/solr/cloud/ForceLeaderTest.java     |   1 -
 .../solr/cloud/FullSolrCloudDistribCmdsTest.java   |   8 +-
 .../org/apache/solr/cloud/HttpPartitionTest.java   |   4 +-
 .../cloud/HttpPartitionWithTlogReplicasTest.java   |   2 -
 .../solr/cloud/LeaderElectionIntegrationTest.java  |   2 -
 .../org/apache/solr/cloud/LeaderElectionTest.java  |  10 --
 .../cloud/LeaderFailoverAfterPartitionTest.java    |   2 -
 .../cloud/LeaderFailureAfterFreshStartTest.java    |  49 +++-----
 .../org/apache/solr/cloud/MigrateRouteKeyTest.java |  14 +--
 .../solr/cloud/MissingSegmentRecoveryTest.java     |   2 -
 .../test/org/apache/solr/cloud/NodeRolesTest.java  |  14 +--
 .../org/apache/solr/cloud/OverseerRolesTest.java   |  12 +-
 .../org/apache/solr/cloud/OverseerStatusTest.java  |   1 -
 .../test/org/apache/solr/cloud/OverseerTest.java   |   4 +-
 .../apache/solr/cloud/PeerSyncReplicationTest.java |  46 ++------
 .../test/org/apache/solr/cloud/RecoveryZkTest.java |   2 -
 .../apache/solr/cloud/ReplicationFactorTest.java   |   4 +-
 .../solr/cloud/RestartWhileUpdatingTest.java       |   2 -
 .../org/apache/solr/cloud/SSLMigrationTest.java    |   2 -
 .../test/org/apache/solr/cloud/SyncSliceTest.java  |  13 +-
 .../solr/cloud/TestAuthenticationFramework.java    |   2 -
 .../TestCloudPhrasesIdentificationComponent.java   |   6 +-
 .../cloud/TestLeaderElectionWithEmptyReplica.java  |   3 +-
 .../org/apache/solr/cloud/TestPullReplica.java     |   2 -
 .../apache/solr/cloud/TestPullReplicaWithAuth.java |   2 -
 .../apache/solr/cloud/TestRebalanceLeaders.java    |   5 +-
 .../cloud/TestStressCloudBlindAtomicUpdates.java   |   2 -
 .../solr/cloud/TestStressInPlaceUpdates.java       |   2 -
 .../org/apache/solr/cloud/TestStressLiveNodes.java |   4 +-
 .../org/apache/solr/cloud/TestTlogReplica.java     |   3 +-
 .../cloud/TlogReplayBufferedWhileIndexingTest.java |   2 -
 .../apache/solr/cloud/UnloadDistributedZkTest.java |  19 +--
 .../org/apache/solr/cloud/ZkControllerTest.java    |   3 -
 .../collections/CollectionTooManyReplicasTest.java |   2 -
 .../CollectionsAPIAsyncDistributedZkTest.java      |   9 +-
 .../CollectionsAPIDistributedZkTest.java           |  13 +-
 .../api/collections/ReplicaPropertiesBase.java     |   5 +-
 .../solr/cloud/api/collections/ShardSplitTest.java |   4 +-
 .../TestCollectionsAPIViaSolrCloudCluster.java     |   2 -
 .../api/collections/TestReplicaProperties.java     |  28 +----
 .../overseer/ZkCollectionPropsCachingTest.java     |   2 -
 .../plugins/AffinityPlacementFactoryTest.java      |   7 +-
 .../core/snapshots/TestSolrCloudSnapshots.java     |   3 +-
 .../solr/core/snapshots/TestSolrCoreSnapshots.java |   2 -
 .../handler/TestHealthCheckHandlerLegacyMode.java  |   2 -
 .../solr/handler/TestReplicationHandler.java       |   4 +-
 .../solr/handler/TestStressIncrementalBackup.java  |   7 +-
 .../component/CustomHighlightComponentTest.java    |   2 +-
 .../component/DistributedMLTComponentTest.java     |   2 -
 .../DistributedSpellCheckComponentTest.java        |   9 --
 .../component/DistributedSuggestComponentTest.java |   2 -
 .../component/MoreLikeThisComponentTest.java       |   2 -
 .../handler/component/SpellCheckComponentTest.java |   5 +-
 .../TestDistributedStatsComponentCardinality.java  |   8 +-
 .../apache/solr/request/TestIntervalFaceting.java  |   8 +-
 ...rceStorage.java => TestManagedFileStorage.java} |  44 ++-----
 .../solr/rest/TestManagedResourceStorage.java      | 102 ++--------------
 .../solr/schema/TestUseDocValuesAsStored.java      |   5 +-
 .../org/apache/solr/search/TestSolrCachePerf.java  |   2 -
 .../solr/search/facet/TestCloudJSONFacetSKG.java   |   2 -
 .../apache/solr/search/facet/TestJsonFacets.java   |  17 ++-
 .../solr/search/mlt/CloudMLTQParserTest.java       |   4 +-
 .../solr/security/TestAuthorizationFramework.java  |  75 +++++-------
 .../solr/spelling/SpellCheckCollatorTest.java      |   2 -
 .../org/apache/solr/update/SoftAutoCommitTest.java |  20 ++--
 .../solr/update/TestInPlaceUpdatesDistrib.java     |   2 -
 .../CategoryRoutedAliasUpdateProcessorTest.java    |   6 -
 .../TimeRoutedAliasUpdateProcessorTest.java        |   3 -
 .../solr/util/MultipleManagedSchemasTest.java      |  16 +--
 .../apache/solr/util/TestSolrCLIRunExample.java    |   3 +-
 .../apache/solr/util/hll/HLLSerializationTest.java |   4 -
 .../hadoop/TestSolrCloudWithDelegationTokens.java  |   2 -
 .../hadoop/TestSolrCloudWithKerberosAlt.java       |   2 -
 .../hdfs/cloud/HdfsBasicDistributedZk2Test.java    |   2 -
 .../hdfs/cloud/HdfsBasicDistributedZkTest.java     |   2 -
 .../cloud/HdfsChaosMonkeyNothingIsSafeTest.java    |   2 -
 .../hdfs/cloud/HdfsChaosMonkeySafeLeaderTest.java  |   2 -
 .../solr/hdfs/cloud/HdfsNameNodeFailoverTest.java  |   4 +-
 .../apache/solr/hdfs/cloud/HdfsRecoveryZkTest.java |   2 -
 .../hdfs/cloud/HdfsRestartWhileUpdatingTest.java   |   2 -
 .../apache/solr/hdfs/cloud/HdfsSyncSliceTest.java  |   2 -
 .../HdfsTlogReplayBufferedWhileIndexingTest.java   |   2 -
 .../hdfs/cloud/HdfsUnloadDistributedZkTest.java    |   2 -
 .../cloud/HdfsWriteToMultipleCollectionsTest.java  |   2 -
 .../solr/hdfs/cloud/MoveReplicaHdfsTest.java       |   2 -
 .../SharedFileSystemAutoReplicaFailoverTest.java   |   2 -
 .../org/apache/solr/hdfs/cloud/StressHdfsTest.java |   2 -
 .../HdfsCollectionsApiDistributedZkTest.java       |  13 +-
 .../apache/solr/handler/sql/TestSQLHandler.java    |   2 -
 .../exporter/SolrExporterIntegrationTest.java      |   3 -
 .../solrj/request/CollectionAdminRequest.java      |   2 +
 .../solr/client/solrj/TestLBHttp2SolrClient.java   |   2 -
 .../solr/client/solrj/TestLBHttpSolrClient.java    |   2 -
 .../SolrExampleStreamingBinaryHttp2Test.java       |   2 -
 .../embedded/SolrExampleStreamingBinaryTest.java   |   2 -
 .../solrj/embedded/SolrExampleStreamingTest.java   |   2 -
 .../solrj/impl/CloudHttp2SolrClientTest.java       |  36 +++---
 .../client/solrj/impl/CloudSolrClientTest.java     | 131 +++++++++++----------
 .../org/apache/solr/client/solrj/io/TestLang.java  |   2 -
 .../client/solrj/io/graph/GraphExpressionTest.java |   2 -
 .../solr/client/solrj/io/graph/GraphTest.java      |   1 -
 .../apache/solr/client/solrj/io/sql/JdbcTest.java  |   2 -
 .../client/solrj/io/stream/MathExpressionTest.java |   2 -
 .../solrj/io/stream/SelectWithEvaluatorsTest.java  |   2 -
 .../solrj/io/stream/StreamDecoratorTest.java       |   2 -
 .../solrj/io/stream/StreamExpressionTest.java      |   2 -
 .../cloud/PerReplicaStatesIntegrationTest.java     |   2 -
 .../apache/solr/BaseDistributedSearchTestCase.java |  10 +-
 .../cloud/AbstractBasicDistributedZkTestBase.java  |   2 +-
 .../AbstractChaosMonkeyNothingIsSafeTestBase.java  |   2 +
 .../AbstractChaosMonkeySafeLeaderTestBase.java     |   2 +
 .../solr/cloud/AbstractFullDistribZkTestBase.java  |  28 +++--
 .../solr/cloud/AbstractRecoveryZkTestBase.java     |   2 -
 .../solr/cloud/AbstractSyncSliceTestBase.java      |  46 +++-----
 .../cloud/AbstractUnloadDistributedZkTestBase.java |  24 +++-
 .../org/apache/solr/cloud/AbstractZkTestCase.java  |   9 --
 .../org/apache/solr/cloud/SolrCloudTestCase.java   |   3 +-
 ...bstractCollectionsAPIDistributedZkTestBase.java |  35 ++----
 .../collections/AbstractIncrementalBackupTest.java |  13 +-
 146 files changed, 423 insertions(+), 886 deletions(-)

diff --git a/dev-tools/scripts/reproduceJenkinsFailures.py b/dev-tools/scripts/reproduceJenkinsFailures.py
index 879e8c01e57..e28ef3aa67c 100644
--- a/dev-tools/scripts/reproduceJenkinsFailures.py
+++ b/dev-tools/scripts/reproduceJenkinsFailures.py
@@ -38,8 +38,8 @@ reGitRev = re.compile(r'Checking out Revision (\S+)\s+\(refs/remotes/origin/([^)
 reAntInvocation = re.compile(r'\bant(?:\.bat)?\s+.*(?:jenkins-(?:hourly|nightly)|nightly-smoke)')
 reAntSysprops = re.compile(r'"-D[^"]+"|-D[^=]+="[^"]*"|-D\S+')
 
-# Method example: NOTE: reproduce with: ant test  -Dtestcase=ZkSolrClientTest -Dtests.method=testMultipleWatchesAsync -Dtests.seed=6EF5AB70F0032849 -Dtests.slow=true -Dtests.locale=he-IL -Dtests.timezone=NST -Dtests.asserts=true -Dtests.file.encoding=UTF-8
-# Suite example:  NOTE: reproduce with: ant test  -Dtestcase=CloudSolrClientTest -Dtests.seed=DB2DF2D8228BAF27 -Dtests.multiplier=3 -Dtests.slow=true -Dtests.locale=es-AR -Dtests.timezone=America/Argentina/Cordoba -Dtests.asserts=true -Dtests.file.encoding=US-ASCII
+# Method example: NOTE: reproduce with: ant test  -Dtestcase=ZkSolrClientTest -Dtests.method=testMultipleWatchesAsync -Dtests.seed=6EF5AB70F0032849 -Dtests.locale=he-IL -Dtests.timezone=NST -Dtests.asserts=true -Dtests.file.encoding=UTF-8
+# Suite example:  NOTE: reproduce with: ant test  -Dtestcase=CloudSolrClientTest -Dtests.seed=DB2DF2D8228BAF27 -Dtests.multiplier=3 -Dtests.locale=es-AR -Dtests.timezone=America/Argentina/Cordoba -Dtests.asserts=true -Dtests.file.encoding=US-ASCII
 reReproLine = re.compile(r'NOTE:\s+reproduce\s+with:(\s+ant\s+test\s+-Dtestcase=(\S+)\s+(?:-Dtests.method=\S+\s+)?(.*))')
 reTestsSeed = re.compile(r'-Dtests.seed=\S+\s*')
 
diff --git a/gradle/testing/randomization.gradle b/gradle/testing/randomization.gradle
index 8d61a35e8e4..044ece428bc 100644
--- a/gradle/testing/randomization.gradle
+++ b/gradle/testing/randomization.gradle
@@ -85,7 +85,6 @@ allprojects {
           [propName: 'tests.timezone', value: "random", description: "Sets the default time zone tests should run with."],
           // filtering
           [propName: 'tests.filter', value: null, description: "Applies a test filter (see :helpTests)."],
-          [propName: 'tests.slow', value: true, description: "Enables or disables @Slow tests."],
           [propName: 'tests.nightly', value: false, description: "Enables or disables @Nightly tests."],
           [propName: 'tests.weekly', value: false, description: "Enables or disables @Weekly tests."],
           [propName: 'tests.monster', value: false, description: "Enables or disables @Monster tests."],
diff --git a/help/tests.txt b/help/tests.txt
index 7022688da08..c1f79cfebc9 100644
--- a/help/tests.txt
+++ b/help/tests.txt
@@ -68,17 +68,17 @@ Test groups
 -----------
 
 Tests can be filtered by an annotation they're marked with.
-Some test group annotations include: @AwaitsFix, @Nightly, @Slow
+Some test group annotations include: @AwaitsFix, @Nightly, @Monster
 
 This uses filtering infrastructure on the *runner* (randomizedtesting), 
 not gradle's built-in mechanisms (but it can be combined with "--tests").
-For example, run all solr-core tests annotated as @Slow:
+For example, run all solr-core tests annotated as @Nightly:
 
-gradlew -p solr/core test -Ptests.filter=@Slow
+gradlew -p solr/core test -Ptests.filter=@Nightly
 
 Test group filters can be combined into Boolean expressions:
 
-gradlew -p solr/core test "default and not(@awaitsfix or @slow)"
+gradlew -p solr/core test -Ptests.filter="default and not(@awaitsfix)"
 
 
 Reiteration ("beasting")
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3e96a905694..1b506740eca 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -141,6 +141,8 @@ Other Changes
 
 * SOLR-16231: Fix ref-guide links across the codebase (Houston Putman)
 
+* SOLR-16304: No more @Slow annotation for tests! (Mike Drob)
+
 Build
 ---------------------
 * SOLR-16204: Change Lucene dependency to Lucene 9.1.0 (Elia Porciani via Alessandro Benedetti)
diff --git a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index c943e1b3ee2..712bc9b4367 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -238,7 +238,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     // obscure a condition to handle as part of this patch, if someone wants to pursue it can be
     // reproduced with:
     // ant test  -Dtestcase=StreamingTest -Dtests.method=testAllValidExportTypes
-    // -Dtests.seed=10F13879D0D1D6AD -Dtests.slow=true -Dtests.locale=es-PA
+    // -Dtests.seed=10F13879D0D1D6AD -Dtests.locale=es-PA
     // -Dtests.timezone=America/Bahia_Banderas -Dtests.asserts=true -Dtests.file.encoding=ISO-8859-1
     // You'll have to uncomment the if below to hit the null pointer exception.
     // This is such an unusual case (i.e. an empty index) that catching this concdition here is
diff --git a/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java b/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
index 4e1053c917a..380f5d9fb28 100644
--- a/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
+++ b/solr/core/src/test/org/apache/solr/DistributedIntervalFacetingTest.java
@@ -18,7 +18,6 @@ package org.apache.solr;
 
 import java.util.Arrays;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.response.IntervalFacet.Count;
@@ -27,7 +26,6 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-9182 - causes OOM")
 // See: https://issues.apache.org/jira/browse/SOLR-12028 Tests cannot remove files on Windows
 // machines occasionally
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
index e91c01124dc..ae55c613c26 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedGrouping.java
@@ -20,7 +20,6 @@ import static org.hamcrest.CoreMatchers.containsString;
 
 import java.io.IOException;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressPointFields;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -39,7 +38,6 @@ import org.junit.Test;
  *
  * @since solr 4.0
  */
-@Slow
 @SuppressPointFields(bugUrl = "https://issues.apache.org/jira/browse/SOLR-10844")
 public class TestDistributedGrouping extends BaseDistributedSearchTestCase {
 
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedMissingSort.java b/solr/core/src/test/org/apache/solr/TestDistributedMissingSort.java
index 6165c4737e8..05f62673e40 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedMissingSort.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedMissingSort.java
@@ -16,12 +16,10 @@
  */
 package org.apache.solr;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.junit.Test;
 
 /** Tests sortMissingFirst and sortMissingLast in distributed sort */
-@Slow
 public class TestDistributedMissingSort extends BaseDistributedSearchTestCase {
 
   public TestDistributedMissingSort() {
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
index e77714f7abb..2d33dced1a2 100644
--- a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
@@ -32,7 +32,6 @@ import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.Future;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -71,7 +70,6 @@ import org.slf4j.LoggerFactory;
  *
  * @since solr 1.3
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-9061")
 public class TestDistributedSearch extends BaseDistributedSearchTestCase {
 
diff --git a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
index 6f6eb41b91c..05479263a3f 100644
--- a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
+++ b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
@@ -22,7 +22,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.request.SolrQueryRequest;
@@ -39,7 +38,6 @@ import org.slf4j.LoggerFactory;
  * and compares the docvalues facet results to the indexed facet results as if it were just another
  * faceting method.
  */
-@Slow
 @SolrTestCaseJ4.SuppressPointFields(
     bugUrl = "Test explicitly compares Trie to Points, randomization defeats the point")
 @SolrTestCaseJ4.SuppressSSL
diff --git a/solr/core/src/test/org/apache/solr/TestRandomFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
index 3a1fbe70279..806dd4f896c 100644
--- a/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
+++ b/solr/core/src/test/org/apache/solr/TestRandomFaceting.java
@@ -29,7 +29,6 @@ import java.util.Random;
 import java.util.Set;
 import java.util.function.Consumer;
 import java.util.regex.Pattern;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -41,7 +40,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 public class TestRandomFaceting extends SolrTestCaseJ4 {
 
   private static final Pattern trieFields = Pattern.compile(".*_t.");
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 aaca894c3cf..7975cfb68d3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/BasicDistributedZkTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.junit.Test;
 
@@ -25,7 +24,6 @@ import org.junit.Test;
  * expected. Implementation moved to AbstractBasicDistributedZkTestBase as it is used by many HDFS
  * contrib tests.
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class BasicDistributedZkTest extends AbstractBasicDistributedZkTestBase {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
index 537a717c249..3fb1bbabc6e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeTest.java
@@ -16,13 +16,11 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 
 /*
  * Implementation moved to AbstractChaosMonkeyNothingIsSafeTestBase.java as it is also
  * used by the HDFS contrib tests.
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class ChaosMonkeyNothingIsSafeTest extends AbstractChaosMonkeyNothingIsSafeTestBase {}
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 fcf450605d3..d27fbe00c1f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyNothingIsSafeWithPullReplicasTest.java
@@ -23,7 +23,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
@@ -42,7 +42,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
+@LuceneTestCase.Nightly
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class ChaosMonkeyNothingIsSafeWithPullReplicasTest extends AbstractFullDistribZkTestBase {
   private static final int FAIL_TOLERANCE = 100;
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
index 3d1ff3e0eee..a4c1ab267d1 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
@@ -16,18 +16,12 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
-
 /*
  * Implementation moved to AbstractChaosMonkeySafeLeaderTestBase as is used by HDFS contrib module test
  */
-@Slow
 public class ChaosMonkeySafeLeaderTest extends AbstractChaosMonkeySafeLeaderTestBase {
-
-  private static final String DIRECTORY_FACTORY = "solr.StandardDirectoryFactory";
-
   @Override
   protected String getDirectoryFactory() {
-    return DIRECTORY_FACTORY;
+    return "solr.StandardDirectoryFactory";
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
index e5b2b90ffef..d98f200ac5f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderWithPullReplicasTest.java
@@ -21,7 +21,7 @@ import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -40,7 +40,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
+@LuceneTestCase.Nightly
 public class ChaosMonkeySafeLeaderWithPullReplicasTest extends AbstractFullDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
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 063ff77f335..6a0b2a5a9a9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeyShardSplitTest.java
@@ -23,12 +23,10 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.cloud.api.collections.ShardSplitTest;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.DocRouter;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
@@ -47,7 +45,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Test split phase that occurs when a Collection API split call is made. */
-@Slow
 @Ignore("SOLR-4944")
 public class ChaosMonkeyShardSplitTest extends ShardSplitTest {
 
@@ -216,28 +213,21 @@ public class ChaosMonkeyShardSplitTest extends ShardSplitTest {
   }
 
   private void waitTillRecovered() throws Exception {
-    for (int i = 0; i < 30; i++) {
-      Thread.sleep(3000);
-      ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-      zkStateReader.forceUpdateCollection("collection1");
-      ClusterState clusterState = zkStateReader.getClusterState();
-      DocCollection collection1 = clusterState.getCollection("collection1");
-      Slice slice = collection1.getSlice("shard1");
-      Collection<Replica> replicas = slice.getReplicas();
-      boolean allActive = true;
-      for (Replica replica : replicas) {
-        if (!clusterState.liveNodesContain(replica.getNodeName())
-            || replica.getState() != Replica.State.ACTIVE) {
-          allActive = false;
-          break;
-        }
-      }
-      if (allActive) {
-        return;
-      }
-    }
-    printLayout();
-    fail("timeout waiting to see recovered node");
+    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
+    zkStateReader.waitForState(
+        "collection1",
+        90,
+        TimeUnit.SECONDS,
+        (n, c) -> {
+          Collection<Replica> replicas = c.getSlice("shard1").getReplicas();
+          for (Replica replica : replicas) {
+            if (n.contains(replica.getNodeName()) == false
+                || replica.getState() != Replica.State.ACTIVE) {
+              return false;
+            }
+          }
+          return true;
+        });
   }
 
   // skip the randoms - they can deadlock...
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 6ff081ae7ab..69c7c0f4eea 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CleanupOldIndexTest.java
@@ -22,7 +22,6 @@ import java.util.Date;
 import java.util.Locale;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.io.FileUtils;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.DocCollection;
@@ -33,7 +32,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@LuceneTestCase.Slow
 public class CleanupOldIndexTest extends SolrCloudTestCase {
 
   @BeforeClass
@@ -64,8 +62,7 @@ public class CleanupOldIndexTest extends SolrCloudTestCase {
     // TODO make this configurable on StoppableIndexingThread
     cluster.getSolrClient().setDefaultCollection(COLLECTION);
 
-    int[] maxDocList = new int[] {300, 500, 700};
-    int maxDoc = maxDocList[random().nextInt(maxDocList.length - 1)];
+    int maxDoc = atLeast(300);
 
     StoppableIndexingThread indexThread =
         new StoppableIndexingThread(null, cluster.getSolrClient(), "1", true, maxDoc, 1, true);
@@ -123,7 +120,7 @@ public class CleanupOldIndexTest extends SolrCloudTestCase {
             TimeUnit.SECONDS,
             (n, c) -> DocCollection.isFullyActive(n, c, 1, 2));
 
-    assertTrue(!oldIndexDir1.isDirectory());
-    assertTrue(!oldIndexDir2.isDirectory());
+    assertFalse(oldIndexDir1.isDirectory());
+    assertFalse(oldIndexDir2.isDirectory());
   }
 }
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 5dc7bc234a7..a238413039d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ClusterStateUpdateTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.cloud;
 
 import java.util.Map;
 import java.util.Set;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.cloud.ClusterState;
@@ -30,22 +29,17 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 public class ClusterStateUpdateTest extends SolrCloudTestCase {
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-    configureCluster(3).addConfig("conf", configset("cloud-minimal")).configure();
-  }
-
   @BeforeClass
-  public static void beforeClass() {
+  public static void beforeClass() throws Exception {
     System.setProperty("solrcloud.skip.autorecovery", "true");
+    configureCluster(3).addConfig("conf", configset("cloud-minimal")).configure();
   }
 
   @AfterClass
-  public static void afterClass() {
+  public static void afterClass() throws Exception {
+    shutdownCluster();
     System.clearProperty("solrcloud.skip.autorecovery");
     System.clearProperty("genericCoreNodeNames");
   }
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 2a5f232618a..7d963ee6b9a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionPropsTest.java
@@ -28,7 +28,6 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
@@ -42,7 +41,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 @SolrTestCaseJ4.SuppressSSL
 public class CollectionPropsTest extends SolrCloudTestCase {
   private static final int TIMEOUT = 5000;
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 babe4e6046e..ecb48c6fae3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
@@ -37,7 +37,6 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -69,19 +68,17 @@ import org.apache.solr.common.util.RetryUtil;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.TimeOut;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 public class CollectionsAPISolrJTest extends SolrCloudTestCase {
   private static final int TIMEOUT = 3000;
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  @Before
-  public void beforeTest() throws Exception {
+  @BeforeClass
+  public static void beforeTest() throws Exception {
     // System.setProperty("metricsEnabled", "true");
     configureCluster(4)
         .addConfig("conf", configset("cloud-minimal"))
@@ -89,17 +86,12 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
         .configure();
   }
 
-  @After
-  public void afterTest() throws Exception {
-    shutdownCluster();
-  }
-
   /**
    * When a config name is not specified during collection creation, the _default should be used.
    */
   @Test
   public void testCreateWithDefaultConfigSet() throws Exception {
-    String collectionName = "solrj_default_configset";
+    String collectionName = getSaferTestName();
     CollectionAdminResponse response =
         CollectionAdminRequest.createCollection(collectionName, 2, 2)
             .setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
@@ -116,6 +108,8 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
       assertEquals(0, (int) status.get("status"));
       assertTrue(status.get("QTime") > 0);
     }
+    // Sometimes multiple cores land on the same node so it's less than 4
+    int nodesCreated = response.getCollectionNodesStatus().size();
     // Use of _default configset should generate a warning for data-driven functionality in
     // production use
     assertTrue(
@@ -127,7 +121,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
     assertEquals(0, response.getStatus());
     assertTrue(response.isSuccess());
     Map<String, NamedList<Integer>> nodesStatus = response.getCollectionNodesStatus();
-    assertEquals(4, nodesStatus.size());
+    assertEquals(nodesStatus.toString(), nodesCreated, nodesStatus.size());
 
     waitForState(
         "Expected " + collectionName + " to disappear from cluster state",
@@ -347,7 +341,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testCreateAndDeleteCollection() throws Exception {
-    String collectionName = "solrj_test";
+    String collectionName = getSaferTestName();
     CollectionAdminResponse response =
         CollectionAdminRequest.createCollection(collectionName, "conf", 2, 2)
             .process(cluster.getSolrClient());
@@ -362,13 +356,16 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
       assertTrue(status.get("QTime") > 0);
     }
 
+    // Sometimes multiple cores land on the same node so it's less than 4
+    int nodesCreated = response.getCollectionNodesStatus().size();
     response =
         CollectionAdminRequest.deleteCollection(collectionName).process(cluster.getSolrClient());
 
     assertEquals(0, response.getStatus());
     assertTrue(response.isSuccess());
     Map<String, NamedList<Integer>> nodesStatus = response.getCollectionNodesStatus();
-    assertEquals(4, nodesStatus.size());
+    // Delete could have been sent before the collection was finished coming online
+    assertEquals(nodesStatus.toString(), nodesCreated, nodesStatus.size());
 
     waitForState(
         "Expected " + collectionName + " to disappear from cluster state",
@@ -392,7 +389,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testCloudInfoInCoreStatus() throws IOException, SolrServerException {
-    String collectionName = "corestatus_test";
+    String collectionName = getSaferTestName();
     CollectionAdminResponse response =
         CollectionAdminRequest.createCollection(collectionName, "conf", 2, 2)
             .process(cluster.getSolrClient());
@@ -492,8 +489,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testSplitShard() throws Exception {
-
-    final String collectionName = "solrj_test_splitshard";
+    String collectionName = getSaferTestName();
     CollectionAdminRequest.createCollection(collectionName, "conf", 2, 1)
         .setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -546,8 +542,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testCreateCollectionWithPropertyParam() throws Exception {
-
-    String collectionName = "solrj_test_core_props";
+    String collectionName = getSaferTestName();
 
     Path tmpDir = createTempDir("testPropertyParamsForCreate");
     Path dataDir = tmpDir.resolve("dataDir-" + TestUtil.randomSimpleString(random(), 1, 5));
@@ -579,8 +574,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testAddAndDeleteReplica() throws Exception {
-
-    final String collectionName = "solrj_replicatests";
+    String collectionName = getSaferTestName();
     CollectionAdminRequest.createCollection(collectionName, "conf", 1, 2)
         .setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -640,16 +634,15 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
     assertEquals(0, response.getStatus());
     assertEquals(
         "Cluster property was not set",
-        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null),
-        "42");
+        "42",
+        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null));
 
     // Unset ClusterProp that we set.
     CollectionAdminRequest.setClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null)
         .process(cluster.getSolrClient());
-    assertEquals(
+    assertNull(
         "Cluster property was not unset",
-        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null),
-        null);
+        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null));
 
     response =
         CollectionAdminRequest.setClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, "1")
@@ -657,13 +650,13 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
     assertEquals(0, response.getStatus());
     assertEquals(
         "Cluster property was not set",
-        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null),
-        "1");
+        "1",
+        props.getClusterProperty(ZkStateReader.MAX_CORES_PER_NODE, null));
   }
 
   @Test
   public void testCollectionProp() throws InterruptedException, IOException, SolrServerException {
-    final String collectionName = "collectionPropTest";
+    String collectionName = getSaferTestName();
     final String propName = "testProperty";
 
     CollectionAdminRequest.createCollection(collectionName, "conf", 2, 2)
@@ -700,7 +693,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testColStatus() throws Exception {
-    final String collectionName = "collectionStatusTest";
+    String collectionName = getSaferTestName();
     CollectionAdminRequest.createCollection(collectionName, "conf2", 2, 2)
         .setPerReplicaState(SolrCloudTestCase.USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -831,7 +824,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
   @Test
   public void testReadOnlyCollection() throws Exception {
-    final String collectionName = "readOnlyTest";
+    String collectionName = getSaferTestName();
     CloudSolrClient solrClient = cluster.getSolrClient();
 
     CollectionAdminRequest.createCollection(collectionName, "conf", 2, 2).process(solrClient);
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 d7a452f7225..3046181c193 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ConcurrentCreateRoutedAliasTest.java
@@ -30,7 +30,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 @LuceneTestCase.AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-12386")
 public class ConcurrentCreateRoutedAliasTest extends SolrTestCaseJ4 {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ConnectionManagerTest.java b/solr/core/src/test/org/apache/solr/cloud/ConnectionManagerTest.java
index 6ca979d3c2e..14dec585f45 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ConnectionManagerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ConnectionManagerTest.java
@@ -21,7 +21,6 @@ import java.nio.file.Path;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeoutException;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.ConnectionManager;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -35,7 +34,6 @@ import org.apache.zookeeper.ZooKeeper;
 import org.junit.Ignore;
 import org.junit.Test;
 
-@Slow
 public class ConnectionManagerTest extends SolrTestCaseJ4 {
 
   static final int TIMEOUT = 3000;
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 37da5c0d651..f5fb02391c7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DeleteReplicaTest.java
@@ -49,7 +49,6 @@ import org.apache.solr.core.ZkContainer;
 import org.apache.solr.util.TimeOut;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,12 +57,6 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  @BeforeClass
-  public static void setupCluster() {
-    System.setProperty("solr.zkclienttimeout", "45000");
-    System.setProperty("distribUpdateSoTimeout", "15000");
-  }
-
   @Before
   @Override
   public void setUp() throws Exception {
@@ -320,7 +313,6 @@ public class DeleteReplicaTest extends SolrCloudTestCase {
   }
 
   @Test
-  @Slow
   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/DistribCursorPagingTest.java b/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
index 593bce0271a..f8de32bba34 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribCursorPagingTest.java
@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.function.Consumer;
 import java.util.stream.IntStream;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.lucene.util.SentinelIntSet;
 import org.apache.solr.CursorPagingTest;
@@ -58,7 +57,6 @@ import org.junit.Test;
  *
  * @see CursorPagingTest
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-9182 - causes OOM")
 public class DistribCursorPagingTest extends AbstractFullDistribZkTestBase {
 
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 1b858be2638..0aa13d8fd5b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistribDocExpirationUpdateProcessorTest.java
@@ -27,7 +27,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
@@ -50,11 +50,12 @@ import org.apache.solr.security.RuleBasedAuthorizationPlugin;
 import org.apache.solr.update.processor.DocExpirationUpdateProcessorFactory;
 import org.apache.solr.util.TimeOut;
 import org.junit.After;
+import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Test of {@link DocExpirationUpdateProcessorFactory} in a cloud setup */
-@Slow // Has to do some sleeping to wait for a future expiration
+@LuceneTestCase.Nightly // Has to do some sleeping to wait for a future expiration
 public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -129,17 +130,19 @@ public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
             (n, c) -> DocCollection.isFullyActive(n, c, 2, 2));
   }
 
+  @Test
   public void testNoAuth() throws Exception {
     setupCluster(false);
     runTest();
   }
 
+  @Test
   public void testBasicAuth() throws Exception {
     setupCluster(true);
 
-    // sanity check that our cluster really does require authentication
+    // check that our cluster really does require authentication
     assertEquals(
-        "sanity check of non authenticated request",
+        "check of unauthenticated request",
         401,
         expectThrows(
                 SolrException.class,
@@ -152,7 +155,7 @@ public class DistribDocExpirationUpdateProcessorTest extends SolrCloudTestCase {
                               params(
                                   "q", "*:*",
                                   "rows", "0",
-                                  "_trace", "no_auth_sanity_check"))
+                                  "_trace", "no_auth_check"))
                           .getResults()
                           .getNumFound();
                 })
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 37fb9b31d5d..ba4379727bc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
@@ -30,7 +30,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
@@ -58,7 +58,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
+@LuceneTestCase.Nightly // Lots of sleeps to introduce timing delays?
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class DistributedVersionInfoTest extends SolrCloudTestCase {
 
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 e4f9ddbacd2..ea4319a67a9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
@@ -65,7 +65,6 @@ public class ForceLeaderTest extends HttpPartitionTest {
    * leader's term are live
    */
   @Test
-  @Slow
   public void testReplicasInLowerTerms() throws Exception {
     handle.put("maxScore", SKIPVAL);
     handle.put("timestamp", SKIPVAL);
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 20fc04b8442..546ea4fbbcd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/FullSolrCloudDistribCmdsTest.java
@@ -27,7 +27,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -57,7 +56,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Super basic testing, no shard restarting or anything. */
-@Slow
 public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static final AtomicInteger NAME_COUNTER = new AtomicInteger(1);
@@ -84,10 +82,10 @@ public class FullSolrCloudDistribCmdsTest extends SolrCloudTestCase {
   public static String createAndSetNewDefaultCollection() throws Exception {
     final CloudSolrClient cloudClient = cluster.getSolrClient();
     final String name = "test_collection_" + NAME_COUNTER.getAndIncrement();
-    assertEquals(
-        RequestStatusState.COMPLETED,
+    assertTrue(
         CollectionAdminRequest.createCollection(name, "_default", 2, 2)
-            .processAndWait(cloudClient, DEFAULT_TIMEOUT));
+            .process(cloudClient)
+            .isSuccess());
     ZkStateReader.from(cloudClient)
         .waitForState(
             name,
diff --git a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
index 9cd5192259a..c7dcbc40e71 100644
--- a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionTest.java
@@ -32,7 +32,7 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
@@ -70,7 +70,7 @@ import org.slf4j.LoggerFactory;
  * Simulates HTTP partitions between a leader and replica but the replica does not lose its
  * ZooKeeper connection.
  */
-@Slow
+@LuceneTestCase.Nightly // there are recovery commands that take a while to time out
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class HttpPartitionTest extends AbstractFullDistribZkTestBase {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionWithTlogReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionWithTlogReplicasTest.java
index b5100e895e6..fb1db0fd770 100644
--- a/solr/core/src/test/org/apache/solr/cloud/HttpPartitionWithTlogReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/HttpPartitionWithTlogReplicasTest.java
@@ -18,10 +18,8 @@
 package org.apache.solr.cloud;
 
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 
-@LuceneTestCase.Slow
 @SolrTestCaseJ4.SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 @ThreadLeakLingering(linger = 10)
 public class HttpPartitionWithTlogReplicasTest extends HttpPartitionTest {
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 bc5fcd2e44a..67868bd4b1b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionIntegrationTest.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -30,7 +29,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 public class LeaderElectionIntegrationTest extends SolrCloudTestCase {
   private static final int NUM_REPLICAS_OF_SHARD1 = 5;
 
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 76c721ff427..70519f1066e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderElectionTest.java
@@ -28,7 +28,6 @@ import java.util.Map;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.OnReconnect;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -42,13 +41,10 @@ import org.apache.zookeeper.KeeperException.NoNodeException;
 import org.apache.zookeeper.KeeperException.SessionExpiredException;
 import org.apache.zookeeper.TestableZooKeeper;
 import org.apache.zookeeper.ZooKeeper;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 public class LeaderElectionTest extends SolrTestCaseJ4 {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -61,12 +57,6 @@ public class LeaderElectionTest extends SolrTestCaseJ4 {
 
   private volatile boolean stopStress = false;
 
-  @BeforeClass
-  public static void beforeClass() {}
-
-  @AfterClass
-  public static void afterClass() {}
-
   @Override
   public void setUp() throws Exception {
     super.setUp();
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
index 8ae28882c9f..ba317ba03de 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
@@ -22,7 +22,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.cloud.SocketProxy;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -38,7 +37,6 @@ import org.slf4j.LoggerFactory;
  * Tests leader-initiated recovery scenarios after a leader node fails and one of the replicas is
  * out-of-sync.
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class LeaderFailoverAfterPartitionTest extends HttpPartitionTest {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
index 92c49e684c7..289950cf850 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
@@ -32,15 +32,11 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.ZkTestServer.LimitViolationAction;
 import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
-import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.TimeSource;
@@ -54,7 +50,6 @@ import org.slf4j.LoggerFactory;
  *
  * <p>This test is modeled after SyncSliceTest
  */
-@Slow
 public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestBase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -210,37 +205,21 @@ public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestB
   }
 
   private void waitTillNodesActive() throws Exception {
-    for (int i = 0; i < 60; i++) {
-      Thread.sleep(3000);
-      ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-      ClusterState clusterState = zkStateReader.getClusterState();
-      DocCollection collection1 = clusterState.getCollection("collection1");
-      Slice slice = collection1.getSlice("shard1");
-      Collection<Replica> replicas = slice.getReplicas();
-      boolean allActive = true;
-
-      Collection<String> nodesDownNames =
-          nodesDown.stream().map(n -> n.coreNodeName).collect(Collectors.toList());
-
-      Collection<Replica> replicasToCheck = null;
-      replicasToCheck =
-          replicas.stream()
+    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
+
+    zkStateReader.waitForState(
+        "collection1",
+        3,
+        TimeUnit.MINUTES,
+        (n, c) -> {
+          Collection<String> nodesDownNames =
+              nodesDown.stream().map(runner -> runner.coreNodeName).collect(Collectors.toList());
+
+          Collection<Replica> replicas = c.getSlice("shard1").getReplicas();
+          return replicas.stream()
               .filter(r -> !nodesDownNames.contains(r.getName()))
-              .collect(Collectors.toList());
-
-      for (Replica replica : replicasToCheck) {
-        if (!clusterState.liveNodesContain(replica.getNodeName())
-            || replica.getState() != Replica.State.ACTIVE) {
-          allActive = false;
-          break;
-        }
-      }
-      if (allActive) {
-        return;
-      }
-    }
-    printLayout();
-    fail("timeout waiting to see all nodes active");
+              .allMatch(r -> r.getState() == Replica.State.ACTIVE && n.contains(r.getNodeName()));
+        });
   }
 
   private List<CloudJettyRunner> getOtherAvailableJetties(CloudJettyRunner leader) {
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 db41e736f9e..eaa64252676 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MigrateRouteKeyTest.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
@@ -41,7 +40,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 public class MigrateRouteKeyTest extends SolrCloudTestCase {
 
   @BeforeClass
@@ -111,7 +109,7 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
 
     final String splitKey = "a";
     final int BIT_SEP = 1;
-    final int[] splitKeyCount = new int[1];
+    int splitKeyCount = 0;
     for (int id = 0; id < 26 * 3; id++) {
       String shardKey =
           "" + (char) ('a' + (id % 26)); // See comment in ShardRoutingTest for hash distribution
@@ -123,9 +121,9 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
       doc.addField("id", key + "!" + id);
       doc.addField("n_ti", id);
       cluster.getSolrClient().add("sourceCollection", doc);
-      if (splitKey.equals(shardKey)) splitKeyCount[0]++;
+      if (splitKey.equals(shardKey)) splitKeyCount++;
     }
-    assertTrue(splitKeyCount[0] > 0);
+    assertTrue(splitKeyCount > 0);
 
     String targetCollection = "migrate_multipleshardtest_targetCollection";
     CollectionAdminRequest.createCollection(targetCollection, "conf", 1, 1)
@@ -152,11 +150,11 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
       long finishTime = System.nanoTime();
 
       indexer.join();
-      splitKeyCount[0] += indexer.getSplitKeyCount();
+      splitKeyCount += indexer.getSplitKeyCount();
 
       try {
         cluster.getSolrClient().deleteById("a/" + BIT_SEP + "!104");
-        splitKeyCount[0]--;
+        splitKeyCount--;
       } catch (Exception e) {
         log.warn("Error deleting document a/{}!104", BIT_SEP, e);
       }
@@ -168,7 +166,7 @@ public class MigrateRouteKeyTest extends SolrCloudTestCase {
       log.info("Response from target collection: {}", response);
       assertEquals(
           "DocCount on target collection does not match",
-          splitKeyCount[0],
+          splitKeyCount,
           response.getResults().getNumFound());
 
       waitForState(
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 8fade264add..4e071f7974f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MissingSegmentRecoveryTest.java
@@ -22,7 +22,6 @@ import java.nio.file.Files;
 import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -38,7 +37,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 public class MissingSegmentRecoveryTest extends SolrCloudTestCase {
   final String collection = getClass().getSimpleName();
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java b/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
index 56556d6a517..2cc9456c6fa 100644
--- a/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/NodeRolesTest.java
@@ -25,21 +25,17 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.V2Request;
 import org.apache.solr.client.solrj.response.V2Response;
 import org.apache.solr.core.NodeRoles;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
 
 public class NodeRolesTest extends SolrCloudTestCase {
 
-  @Before
-  public void setupCluster() throws Exception {
+  @BeforeClass
+  public static void setupCluster() throws Exception {
     configureCluster(1).addConfig("conf", configset("cloud-minimal")).configure();
   }
 
-  @After
-  public void tearDownCluster() throws Exception {
-    shutdownCluster();
-  }
-
+  @Test
   public void testRoleIntegration() throws Exception {
     JettySolrRunner j0 = cluster.getJettySolrRunner(0);
     testSupportedRolesAPI();
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 4fc3c5fb986..0ba30acfff3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerRolesTest.java
@@ -31,8 +31,7 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.util.TimeOut;
 import org.apache.zookeeper.KeeperException;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,16 +40,11 @@ public class OverseerRolesTest extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  @Before
-  public void setupCluster() throws Exception {
+  @BeforeClass
+  public static void setupCluster() throws Exception {
     configureCluster(4).addConfig("conf", configset("cloud-minimal")).configure();
   }
 
-  @After
-  public void tearDownCluster() throws Exception {
-    shutdownCluster();
-  }
-
   public static void waitForNewOverseer(
       int seconds, Predicate<String> state, boolean failOnIntermediateTransition) throws Exception {
     TimeOut timeout = new TimeOut(seconds, TimeUnit.SECONDS, TimeSource.NANO_TIME);
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 947dd8e6310..2332060736d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerStatusTest.java
@@ -29,7 +29,6 @@ public class OverseerStatusTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     configureCluster(2).addConfig("conf", configset("cloud-minimal")).configure();
-    ;
   }
 
   @Test
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 616ee01c8d4..980e29eaf22 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -47,7 +47,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.cloud.DistributedQueue;
@@ -107,7 +106,6 @@ import org.mockito.stubbing.Answer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 @SolrTestCaseJ4.SuppressSSL
 public class OverseerTest extends SolrTestCaseJ4 {
 
@@ -1185,7 +1183,7 @@ public class OverseerTest extends SolrTestCaseJ4 {
       ZkController.createClusterZkNodes(zkClient);
 
       killer = new OverseerRestarter(server.getZkAddress());
-      killerThread = new Thread(killer);
+      killerThread = new Thread(killer, "OverseerRestarter");
       killerThread.start();
 
       reader = new ZkStateReader(zkClient);
diff --git a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
index 227b0ebf9f6..f9ee3b97f0e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
@@ -36,16 +36,12 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.ZkTestServer.LimitViolationAction;
 import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
-import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.TimeSource;
@@ -61,7 +57,6 @@ import org.slf4j.LoggerFactory;
  *
  * <p>This test is modeled after SyncSliceTest
  */
-@Slow
 public class PeerSyncReplicationTest extends AbstractFullDistribZkTestBase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -339,36 +334,19 @@ public class PeerSyncReplicationTest extends AbstractFullDistribZkTestBase {
   }
 
   private void waitTillNodesActive() throws Exception {
-    for (int i = 0; i < 60; i++) {
-      Thread.sleep(3000);
-      ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-      ClusterState clusterState = zkStateReader.getClusterState();
-      DocCollection collection1 = clusterState.getCollection("collection1");
-      Slice slice = collection1.getSlice("shard1");
-      Collection<Replica> replicas = slice.getReplicas();
-      boolean allActive = true;
-
-      Collection<String> nodesDownNames =
-          nodesDown.stream().map(n -> n.coreNodeName).collect(Collectors.toList());
-
-      Collection<Replica> replicasToCheck =
-          replicas.stream()
+    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
+    zkStateReader.waitForState(
+        "collection1",
+        3,
+        TimeUnit.MINUTES,
+        (n, c) -> {
+          Collection<String> nodesDownNames =
+              nodesDown.stream().map(runner -> runner.coreNodeName).collect(Collectors.toList());
+          Collection<Replica> replicas = c.getSlice("shard1").getReplicas();
+          return replicas.stream()
               .filter(r -> !nodesDownNames.contains(r.getName()))
-              .collect(Collectors.toList());
-
-      for (Replica replica : replicasToCheck) {
-        if (!clusterState.liveNodesContain(replica.getNodeName())
-            || replica.getState() != Replica.State.ACTIVE) {
-          allActive = false;
-          break;
-        }
-      }
-      if (allActive) {
-        return;
-      }
-    }
-    printLayout();
-    fail("timeout waiting to see all nodes active");
+              .allMatch(r -> r.getState() == Replica.State.ACTIVE && n.contains(r.getNodeName()));
+        });
   }
 
   private List<CloudJettyRunner> getOtherAvailableJetties(CloudJettyRunner leader) {
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 acf2a3b7f44..6394eb566e0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RecoveryZkTest.java
@@ -16,13 +16,11 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.junit.Test;
 
 /*
  * Implementation moved to AbstractRecoveryZkTestBase as it is used by HDFS contrib tests.
  */
-@Slow
 public class RecoveryZkTest extends AbstractRecoveryZkTestBase {
 
   @Test
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 85da4a37950..3a20e85d6aa 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReplicationFactorTest.java
@@ -27,7 +27,6 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -50,7 +49,6 @@ import org.slf4j.LoggerFactory;
  * Tests a client application's ability to get replication factor information back from the cluster
  * after an add or update.
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class ReplicationFactorTest extends AbstractFullDistribZkTestBase {
 
@@ -324,7 +322,7 @@ public class ReplicationFactorTest extends AbstractFullDistribZkTestBase {
     doDBIdWithRetry(2, 5, "deletes should have propagated to 2 replicas", 1);
 
     // SOLR-13599 sanity check if problem is related to sending a batch
-    List<SolrInputDocument> batch = new ArrayList<SolrInputDocument>(10);
+    List<SolrInputDocument> batch = new ArrayList<SolrInputDocument>(15);
     for (int i = 30; i < 45; i++) {
       SolrInputDocument doc = new SolrInputDocument();
       doc.addField(id, String.valueOf(i));
diff --git a/solr/core/src/test/org/apache/solr/cloud/RestartWhileUpdatingTest.java b/solr/core/src/test/org/apache/solr/cloud/RestartWhileUpdatingTest.java
index 3b2279849ef..1bc74fff254 100644
--- a/solr/core/src/test/org/apache/solr/cloud/RestartWhileUpdatingTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/RestartWhileUpdatingTest.java
@@ -17,14 +17,12 @@
 package org.apache.solr.cloud;
 
 import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.junit.Test;
 
 /**
  * Implementation moved to AbstractRestartWhileUpdatingTestBase because it is used by HDFS contrib
  * module tests
  */
-@Slow
 @Nightly
 public class RestartWhileUpdatingTest extends AbstractRestartWhileUpdatingTestBase {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
index e3c86a8be2f..e79ce92c345 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SSLMigrationTest.java
@@ -23,7 +23,6 @@ import java.util.Map;
 import java.util.Properties;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
@@ -44,7 +43,6 @@ import org.junit.Test;
  * We want to make sure that when migrating between http and https modes the replicas will not be
  * rejoined as new nodes, but rather take off where it left off in the cluster.
  */
-@Slow
 @SuppressSSL
 @AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-12028") // 17-Mar-2018
 public class SSLMigrationTest extends AbstractFullDistribZkTestBase {
diff --git a/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java b/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
index cda512936f5..bdff2a6a477 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SyncSliceTest.java
@@ -16,19 +16,8 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
-import org.junit.Test;
-
 /**
  * Test sync phase that occurs when Leader goes down and a new Leader is elected. Implementation
  * moved to AbstractSyncSliceTestBase.java as it is also used by the HDFS contrib tests.
  */
-@Slow
-public class SyncSliceTest extends AbstractSyncSliceTestBase {
-
-  @Test
-  @Override
-  public void test() throws Exception {
-    super.test();
-  }
-}
+public class SyncSliceTest extends AbstractSyncSliceTestBase {}
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 8372c559176..3b9bdf1b434 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
@@ -22,7 +22,6 @@ import javax.servlet.FilterChain;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.http.HttpRequestInterceptor;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -38,7 +37,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Test of the MiniSolrCloudCluster functionality with authentication enabled. */
-@LuceneTestCase.Slow
 public class TestAuthenticationFramework extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
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 cd969704fb8..c2666db605c 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudPhrasesIdentificationComponent.java
@@ -24,7 +24,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -40,12 +39,11 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
 /**
- * A very simple sanity check that Phrase Identification works across a cloud cluster using
- * distributed term stat collection.
+ * A very simple check that Phrase Identification works across a cloud cluster using distributed
+ * term stat collection.
  *
  * @see org.apache.solr.handler.component.PhrasesIdentificationComponentTest
  */
-@Slow
 public class TestCloudPhrasesIdentificationComponent extends SolrCloudTestCase {
 
   private static final String DEBUG_LABEL = MethodHandles.lookup().lookupClass().getName();
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 6772ceac595..7de9a408e45 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestLeaderElectionWithEmptyReplica.java
@@ -49,8 +49,7 @@ public class TestLeaderElectionWithEmptyReplica extends SolrCloudTestCase {
         .configure();
 
     CollectionAdminRequest.createCollection(COLLECTION_NAME, "config", 1, 1)
-        .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
-
+        .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION_NAME, 1, 1);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java b/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
index 04090868d64..a07e5173dab 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestPullReplica.java
@@ -33,7 +33,6 @@ import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -65,7 +64,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 @LogLevel(
     "org.apache.solr.handler.ReplicationHandler=DEBUG;org.apache.solr.handler.IndexFetcher=DEBUG")
 public class TestPullReplica extends SolrCloudTestCase {
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaWithAuth.java b/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaWithAuth.java
index 75081234545..d87133dd35a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaWithAuth.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestPullReplicaWithAuth.java
@@ -28,7 +28,6 @@ import java.io.IOException;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrResponse;
@@ -50,7 +49,6 @@ import org.apache.solr.security.RuleBasedAuthorizationPlugin;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 public class TestPullReplicaWithAuth extends SolrCloudTestCase {
 
   private static final String USER = "solr";
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestRebalanceLeaders.java b/solr/core/src/test/org/apache/solr/cloud/TestRebalanceLeaders.java
index 0dbc84b9322..611718964a3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestRebalanceLeaders.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestRebalanceLeaders.java
@@ -29,7 +29,6 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -51,7 +50,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 public class TestRebalanceLeaders extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static final String COLLECTION_NAME = "TestColl";
@@ -135,8 +133,9 @@ public class TestRebalanceLeaders extends SolrCloudTestCase {
   }
 
   // We've moved on from a property being tested, we need to check if rebalancing the leaders
-  // actually chantges the leader appropriately.
+  // actually changes the leader appropriately.
   @Test
+  @Nightly
   public void testRebalanceLeaders() throws Exception {
 
     // First let's unbalance the preferredLeader property, do all the leaders get reassigned
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
index 62584324b39..7234809d690 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
@@ -30,7 +30,6 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicLong;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
@@ -68,7 +67,6 @@ import org.slf4j.LoggerFactory;
  * Optimistic Concurrency is not used here because of SOLR-8733, instead we just throw lots of "inc"
  * operations at a numeric field and check that the math works out at the end.
  */
-@Slow
 @SuppressSSL(bugUrl = "SSL overhead seems to cause OutOfMemory when stress testing")
 public class TestStressCloudBlindAtomicUpdates extends SolrCloudTestCase {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
index 1a95c6c178a..bf862c84fcf 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestStressInPlaceUpdates.java
@@ -29,7 +29,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.commons.math3.primes.Primes;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -49,7 +48,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 public class TestStressInPlaceUpdates extends AbstractFullDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressLiveNodes.java b/solr/core/src/test/org/apache/solr/cloud/TestStressLiveNodes.java
index 14f8c875012..fabdab37952 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestStressLiveNodes.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestStressLiveNodes.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -44,7 +44,7 @@ import org.slf4j.LoggerFactory;
  * a ZkStateReader detects the correct set.
  */
 @ThreadLeakLingering(linger = 10)
-@Slow
+@LuceneTestCase.Nightly
 public class TestStressLiveNodes extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
index 6b64278bb3f..c11160aab65 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestTlogReplica.java
@@ -38,7 +38,6 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
 import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -77,7 +76,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 public class TestTlogReplica extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -766,6 +764,7 @@ public class TestTlogReplica extends SolrCloudTestCase {
     waitForNumDocsInAllActiveReplicas(4, 0);
   }
 
+  @Nightly
   public void testRebalanceLeaders() throws Exception {
     createAndWaitForCollection(1, 0, 2, 0);
     CloudSolrClient cloudClient = cluster.getSolrClient();
diff --git a/solr/core/src/test/org/apache/solr/cloud/TlogReplayBufferedWhileIndexingTest.java b/solr/core/src/test/org/apache/solr/cloud/TlogReplayBufferedWhileIndexingTest.java
index ec1bad7ce52..e056c40a893 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TlogReplayBufferedWhileIndexingTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TlogReplayBufferedWhileIndexingTest.java
@@ -17,11 +17,9 @@
 package org.apache.solr.cloud;
 
 import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.junit.Test;
 
-@Slow
 @Nightly
 @SuppressSSL
 /*
diff --git a/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java
index 9c42c25b246..30d3f884b97 100644
--- a/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/UnloadDistributedZkTest.java
@@ -16,29 +16,12 @@
  */
 package org.apache.solr.cloud;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
-import org.junit.Test;
 
 /**
  * This test simply does a bunch of basic things in solrcloud mode and asserts things work as
  * expected. Implementation moved to AbstractUnloadDistributedZkTestBase as it is used by HDFS
  * contrib module tests.
  */
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
-public class UnloadDistributedZkTest extends AbstractUnloadDistributedZkTestBase {
-  public UnloadDistributedZkTest() {
-    super();
-  }
-
-  protected String getSolrXml() {
-    return "solr.xml";
-  }
-
-  @Test
-  @Override
-  public void test() throws Exception {
-    super.test();
-  }
-}
+public class UnloadDistributedZkTest extends AbstractUnloadDistributedZkTestBase {}
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
index 2eaf6f7ef1c..b675541e15b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
@@ -29,7 +29,6 @@ import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.cloud.ClusterProperties;
 import org.apache.solr.common.cloud.SolrZkClient;
@@ -54,7 +53,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SolrTestCaseJ4.SuppressSSL
 public class ZkControllerTest extends SolrTestCaseJ4 {
 
@@ -206,7 +204,6 @@ public class ZkControllerTest extends SolrTestCaseJ4 {
     }
   }
 
-  @Slow
   @LogLevel(value = "org.apache.solr.cloud=DEBUG;org.apache.solr.cloud.overseer=DEBUG")
   public void testPublishAndWaitForDownStates() throws Exception {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
index 67de4ee78ba..eb44e2588df 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionTooManyReplicasTest.java
@@ -19,7 +19,6 @@ package org.apache.solr.cloud.api.collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
@@ -31,7 +30,6 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
-@Slow
 public class CollectionTooManyReplicasTest extends SolrCloudTestCase {
 
   @BeforeClass
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIAsyncDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIAsyncDistributedZkTest.java
index 600b9389659..0807a3ce9bc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIAsyncDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIAsyncDistributedZkTest.java
@@ -24,7 +24,6 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -48,7 +47,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Tests the Cloud Collections API. */
-@Slow
 public class CollectionsAPIAsyncDistributedZkTest extends SolrCloudTestCase {
 
   private static final int MAX_TIMEOUT_SECONDS = 90;
@@ -58,16 +56,13 @@ public class CollectionsAPIAsyncDistributedZkTest extends SolrCloudTestCase {
   @Before
   public void setupCluster() throws Exception {
     // we recreate per test - they need to be isolated to be solid
-    configureCluster(2)
-        .addConfig(
-            "conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
-        .configure();
+    configureCluster(2).addConfig("conf1", configset("cloud-minimal")).configure();
   }
 
   @After
   public void tearDown() throws Exception {
-    super.tearDown();
     shutdownCluster();
+    super.tearDown();
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIDistributedZkTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIDistributedZkTest.java
index 01c0e9f1325..11c04c976cd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIDistributedZkTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/CollectionsAPIDistributedZkTest.java
@@ -16,13 +16,16 @@
  */
 package org.apache.solr.cloud.api.collections;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.junit.BeforeClass;
 
 /** Tests the Cloud Collections API. */
-@Slow
 public class CollectionsAPIDistributedZkTest extends AbstractCollectionsAPIDistributedZkTestBase {
-
-  protected String getConfigSet() {
-    return "cloud-minimal";
+  @BeforeClass
+  public static void createCluster() throws Exception {
+    configureCluster(4)
+        .addConfig("conf", configset("cloud-minimal"))
+        .addConfig("conf2", configset("cloud-minimal"))
+        .withSolrXml(TEST_PATH().resolve("solr.xml"))
+        .configure();
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ReplicaPropertiesBase.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ReplicaPropertiesBase.java
index 0bc08628eb8..15dce24bfc9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ReplicaPropertiesBase.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ReplicaPropertiesBase.java
@@ -40,9 +40,8 @@ public abstract class ReplicaPropertiesBase extends AbstractFullDistribZkTestBas
 
   public static NamedList<Object> doPropertyAction(CloudSolrClient client, String... paramsIn)
       throws IOException, SolrServerException {
-    assertTrue(
-        "paramsIn must be an even multiple of 2, it is: " + paramsIn.length,
-        (paramsIn.length % 2) == 0);
+    assertEquals(
+        "paramsIn must be a multiple of 2, it is: " + paramsIn.length, 0, (paramsIn.length % 2));
     ModifiableSolrParams params = new ModifiableSolrParams();
     for (int idx = 0; idx < paramsIn.length; idx += 2) {
       params.set(paramsIn[idx], paramsIn[idx + 1]);
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
index 96ee4c63a31..68cdbd0338f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
@@ -34,7 +34,7 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -75,7 +75,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
+@LuceneTestCase.Nightly
 @LogLevel(
     "org.apache.solr.cloud.Overseer=DEBUG;org.apache.solr.cloud.overseer=DEBUG;org.apache.solr.cloud.api.collections=DEBUG;org.apache.solr.cloud.OverseerTaskProcessor=DEBUG;org.apache.solr.util.TestInjection=DEBUG")
 public class ShardSplitTest extends BasicDistributedZkTest {
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
index 9136f649ade..ca10867f986 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
@@ -25,7 +25,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -43,7 +42,6 @@ import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.Test;
 
 /** Test of the Collections API with the MiniSolrCloudCluster. */
-@LuceneTestCase.Slow
 public class TestCollectionsAPIViaSolrCloudCluster extends SolrCloudTestCase {
 
   private static final int numShards = 2;
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestReplicaProperties.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestReplicaProperties.java
index 656597aa549..11a5dde4612 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestReplicaProperties.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestReplicaProperties.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
@@ -34,7 +33,6 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.junit.Test;
 
-@Slow
 public class TestReplicaProperties extends ReplicaPropertiesBase {
 
   public static final String COLLECTION_NAME = "testcollection";
@@ -51,10 +49,8 @@ public class TestReplicaProperties extends ReplicaPropertiesBase {
     try (CloudSolrClient client = createCloudClient(null)) {
       // Mix up a bunch of different combinations of shards and replicas in order to exercise
       // boundary cases. shards, replicationFactor
-      int shards = random().nextInt(7);
-      if (shards < 2) shards = 2;
-      int replicationFactor = random().nextInt(4);
-      if (replicationFactor < 2) replicationFactor = 2;
+      int shards = random().nextInt(5) + 2;
+      int replicationFactor = random().nextInt(2) + 2;
       createCollection(null, COLLECTION_NAME, shards, replicationFactor, client, null, "conf1");
     }
 
@@ -156,7 +152,7 @@ public class TestReplicaProperties extends ReplicaPropertiesBase {
       String c1_s1_r1 = replicasList.get(0);
       String c1_s1_r2 = replicasList.get(1);
 
-      addProperty(
+      ReplicaPropertiesBase.doPropertyAction(
           client,
           "action",
           CollectionParams.CollectionAction.ADDREPLICAPROP.toString(),
@@ -171,7 +167,7 @@ public class TestReplicaProperties extends ReplicaPropertiesBase {
           "property.value",
           "true");
 
-      addProperty(
+      ReplicaPropertiesBase.doPropertyAction(
           client,
           "action",
           CollectionParams.CollectionAction.ADDREPLICAPROP.toString(),
@@ -190,7 +186,7 @@ public class TestReplicaProperties extends ReplicaPropertiesBase {
           assertThrows(
               SolrException.class,
               () ->
-                  doPropertyAction(
+                  ReplicaPropertiesBase.doPropertyAction(
                       client,
                       "action",
                       CollectionParams.CollectionAction.BALANCESHARDUNIQUE.toString(),
@@ -281,18 +277,4 @@ public class TestReplicaProperties extends ReplicaPropertiesBase {
     }
     fail(lastFailMsg);
   }
-
-  private void addProperty(CloudSolrClient client, String... paramsIn)
-      throws IOException, SolrServerException {
-    assertTrue(
-        "paramsIn must be an even multiple of 2, it is: " + paramsIn.length,
-        (paramsIn.length % 2) == 0);
-    ModifiableSolrParams params = new ModifiableSolrParams();
-    for (int idx = 0; idx < paramsIn.length; idx += 2) {
-      params.set(paramsIn[idx], paramsIn[idx + 1]);
-    }
-    QueryRequest request = new QueryRequest(params);
-    request.setPath("/admin/collections");
-    client.request(request);
-  }
 }
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkCollectionPropsCachingTest.java b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkCollectionPropsCachingTest.java
index 8e50593e799..f89e4ad54d5 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkCollectionPropsCachingTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkCollectionPropsCachingTest.java
@@ -18,7 +18,6 @@
 package org.apache.solr.cloud.overseer;
 
 import java.io.IOException;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
@@ -29,7 +28,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@LuceneTestCase.Slow
 @SolrTestCaseJ4.SuppressSSL
 public class ZkCollectionPropsCachingTest extends SolrCloudTestCase {
   //
diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/plugins/AffinityPlacementFactoryTest.java b/solr/core/src/test/org/apache/solr/cluster/placement/plugins/AffinityPlacementFactoryTest.java
index 73a81c41c99..40d04aa8e64 100644
--- a/solr/core/src/test/org/apache/solr/cluster/placement/plugins/AffinityPlacementFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/placement/plugins/AffinityPlacementFactoryTest.java
@@ -1067,7 +1067,6 @@ public class AffinityPlacementFactoryTest extends SolrTestCaseJ4 {
   }
 
   @Test
-  @Slow
   public void testScalability() throws Exception {
     // for non-nightly we scale a bit, but retain test speed - for nightly test speed can be 2+
     // minutes
@@ -1089,8 +1088,10 @@ public class AffinityPlacementFactoryTest extends SolrTestCaseJ4 {
     runTestScalability(numNodes, 100, nrtReplicas, tlogReplicas, pullReplicas);
     runTestScalability(numNodes, 200, nrtReplicas, tlogReplicas, pullReplicas);
     runTestScalability(numNodes, 500, nrtReplicas, tlogReplicas, pullReplicas);
-    runTestScalability(numNodes, 1000, nrtReplicas, tlogReplicas, pullReplicas);
-    runTestScalability(numNodes, 2000, nrtReplicas, tlogReplicas, pullReplicas);
+    if (TEST_NIGHTLY) {
+      runTestScalability(numNodes, 1000, nrtReplicas, tlogReplicas, pullReplicas);
+      runTestScalability(numNodes, 2000, nrtReplicas, tlogReplicas, pullReplicas);
+    }
 
     log.info("==== numReplicas ====");
     runTestScalability(numNodes, numShards, TEST_NIGHTLY ? 100 : 10, 0, 0);
diff --git a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
index e50d3b8caf9..ee248178e21 100644
--- a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
+++ b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCloudSnapshots.java
@@ -25,7 +25,6 @@ import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
@@ -60,7 +59,7 @@ import org.slf4j.LoggerFactory;
 // Backups do checksum validation against a footer value not present in 'SimpleText'
 @LuceneTestCase.SuppressCodecs({"SimpleText"})
 @SolrTestCaseJ4.SuppressSSL // Currently, unknown why SSL does not work with this test
-@Slow
+@LuceneTestCase.Nightly
 public class TestSolrCloudSnapshots extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static long docsSeed; // see indexDocs()
diff --git a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCoreSnapshots.java b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCoreSnapshots.java
index a7648e09945..93d74aecfbd 100644
--- a/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCoreSnapshots.java
+++ b/solr/core/src/test/org/apache/solr/core/snapshots/TestSolrCoreSnapshots.java
@@ -30,7 +30,6 @@ import org.apache.lucene.index.IndexNotFoundException;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.NIOFSDirectory;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
@@ -63,7 +62,6 @@ import org.junit.Test;
 // Backups do checksum validation against a footer value not present in 'SimpleText'
 @LuceneTestCase.SuppressCodecs({"SimpleText"})
 @SolrTestCaseJ4.SuppressSSL // Currently, unknown why SSL does not work with this test
-@Slow
 public class TestSolrCoreSnapshots extends SolrCloudTestCase {
   private static long docsSeed; // see indexDocs()
 
diff --git a/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java b/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
index 2c2fd87e209..4027c14a597 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestHealthCheckHandlerLegacyMode.java
@@ -25,7 +25,6 @@ import static org.apache.solr.handler.ReplicationTestHelper.numFound;
 import static org.apache.solr.handler.ReplicationTestHelper.rQuery;
 
 import java.io.IOException;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -40,7 +39,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 /** Test for HealthCheckHandler in legacy mode */
-@Slow
 @SuppressSSL // Currently, unknown why SSL does not work with this test
 public class TestHealthCheckHandlerLegacyMode extends SolrTestCaseJ4 {
   HttpSolrClient leaderClientHealthCheck, followerClientHealthCheck;
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
index ff08ae8812d..ec3a681a054 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
@@ -42,7 +42,7 @@ import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.lucene.store.NIOFSDirectory;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.BaseDistributedSearchTestCase;
@@ -91,7 +91,7 @@ import org.slf4j.LoggerFactory;
  *
  * @since 1.4
  */
-@Slow
+@Nightly
 @SuppressSSL // Currently, unknown why SSL does not work with this test
 public class TestReplicationHandler extends SolrTestCaseJ4 {
 
diff --git a/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java b/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
index b583dcb789b..2f6cb29988d 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestStressIncrementalBackup.java
@@ -38,7 +38,7 @@ import org.junit.Before;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-// @LuceneTestCase.Nightly
+@LuceneTestCase.Nightly
 @LuceneTestCase.SuppressCodecs({"SimpleText"})
 public class TestStressIncrementalBackup extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -56,10 +56,7 @@ public class TestStressIncrementalBackup extends SolrCloudTestCase {
     // bring myself to deal with the nonsense that is SolrJettyTestBase.
 
     // We do however explicitly want a fresh "cluster" every time a test is run
-    configureCluster(1)
-        .addConfig(
-            "conf1", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
-        .configure();
+    configureCluster(1).addConfig("conf1", configset("cloud-minimal")).configure();
 
     assertEquals(
         0,
diff --git a/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
index c6bb670a5b3..aebb03d5a48 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/CustomHighlightComponentTest.java
@@ -116,7 +116,7 @@ public class CustomHighlightComponentTest extends SolrCloudTestCase {
 
     // create an empty collection
     CollectionAdminRequest.createCollection(COLLECTION, "conf", numShards, numReplicas)
-        .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
+        .process(cluster.getSolrClient());
     AbstractDistribZkTestBase.waitForRecoveriesToFinish(
         COLLECTION, cluster.getZkStateReader(), false, true, DEFAULT_TIMEOUT);
   }
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedMLTComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedMLTComponentTest.java
index 1b66c847b4f..bf803e3b2b1 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DistributedMLTComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedMLTComponentTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.handler.component;
 
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.response.QueryResponse;
@@ -38,7 +37,6 @@ import org.junit.Test;
  * @since solr 4.1
  * @see org.apache.solr.handler.component.MoreLikeThisComponent
  */
-@Slow
 public class DistributedMLTComponentTest extends BaseDistributedSearchTestCase {
 
   private String requestHandlerName;
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedSpellCheckComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedSpellCheckComponentTest.java
index 83aea9e73cb..72dc30a4c79 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DistributedSpellCheckComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedSpellCheckComponentTest.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import junit.framework.Assert;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.LuceneTestCase.SuppressTempFileChecks;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.SolrClient;
@@ -37,18 +36,10 @@ import org.junit.Test;
  * @since solr 1.5
  * @see org.apache.solr.handler.component.SpellCheckComponent
  */
-@Slow
 @SuppressTempFileChecks(
     bugUrl = "https://issues.apache.org/jira/browse/SOLR-1877 Spellcheck IndexReader leak bug?")
 public class DistributedSpellCheckComponentTest extends BaseDistributedSearchTestCase {
 
-  public DistributedSpellCheckComponentTest() {
-    // Helpful for debugging
-    // fixShardCount=true;
-    // shardCount=2;
-    // stress=0;
-  }
-
   @BeforeClass
   public static void beforeClass() throws Exception {
     useFactory(null); // need an FS factory
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java
index e84c62cf086..21ebf91d5e1 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DistributedSuggestComponentTest.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import junit.framework.Assert;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.util.NamedList;
@@ -34,7 +33,6 @@ import org.junit.Test;
  *
  * @see org.apache.solr.handler.component.SuggestComponent
  */
-@Slow
 public class DistributedSuggestComponentTest extends BaseDistributedSearchTestCase {
 
   public DistributedSuggestComponentTest() {
diff --git a/solr/core/src/test/org/apache/solr/handler/component/MoreLikeThisComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/MoreLikeThisComponentTest.java
index 28e8f817f57..e11d9b570f8 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/MoreLikeThisComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/MoreLikeThisComponentTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.handler.component;
 
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -32,7 +31,6 @@ import org.junit.Test;
  *
  * @see MoreLikeThisComponent
  */
-@Slow
 public class MoreLikeThisComponentTest extends SolrTestCaseJ4 {
 
   @BeforeClass
diff --git a/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
index 7ae66153096..56911b30a05 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/SpellCheckComponentTest.java
@@ -19,7 +19,6 @@ package org.apache.solr.handler.component;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.LuceneTestCase.SuppressTempFileChecks;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
@@ -41,7 +40,6 @@ import org.junit.Test;
 /**
  * @since solr 1.3
  */
-@Slow
 @SuppressTempFileChecks(
     bugUrl = "https://issues.apache.org/jira/browse/SOLR-1877 Spellcheck IndexReader leak bug?")
 public class SpellCheckComponentTest extends SolrTestCaseJ4 {
@@ -71,10 +69,9 @@ public class SpellCheckComponentTest extends SolrTestCaseJ4 {
 
   @Override
   public void tearDown() throws Exception {
-    super.tearDown();
     assertU(delQ("*:*"));
-    optimize();
     assertU((commit()));
+    super.tearDown();
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java b/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
index 85bcf56d1b5..58fa1736db2 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
@@ -27,7 +27,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.IntStream;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
@@ -36,14 +35,12 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.util.LogLevel;
 import org.apache.solr.util.hll.HLL;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-9062")
-@LogLevel("org.eclipse.jetty.client.HttpConnection=DEBUG")
+// @LogLevel("org.eclipse.jetty.client.HttpConnection=DEBUG")
 public class TestDistributedStatsComponentCardinality extends BaseDistributedSearchTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -161,8 +158,7 @@ public class TestDistributedStatsComponentCardinality extends BaseDistributedSea
       Map<String, FieldStatsInfo> stats = rsp.getFieldStatsInfo();
 
       if (Boolean.getBoolean(NUMERIC_POINTS_SYSPROP)) {
-        log.warn(
-            "SOLR-10918: can't relying on exact match with pre-hashed values when using points");
+        // SOLR-10918: can't rely on exact match with pre-hashed values when using points
       } else {
         for (String f : STAT_FIELDS) {
           // regardless of log2m and regwidth, the estimated cardinality of the
diff --git a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
index 9154044d046..6221f424d93 100644
--- a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
+++ b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
@@ -309,7 +309,6 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
   }
 
   @Test
-  @Slow
   public void testRandom() throws Exception {
     // All field values will be a number between 0 and cardinality
     int cardinality = 10000;
@@ -350,7 +349,8 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
           "test_ds_p",
           "test_dts_p"
         };
-    for (int i = 0; i < atLeast(500); i++) {
+    int docs = atLeast(500);
+    for (int i = 0; i < docs; i++) {
       if (random().nextInt(50) == 0) {
         // have some empty docs
         assertU(adoc("id", String.valueOf(i)));
@@ -399,7 +399,9 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
     }
     assertU(commit());
 
-    for (int i = 0; i < atLeast(10000); i++) {
+    // Scale higher for nightlies than typically
+    int queries = TEST_NIGHTLY ? atLeast(10000) : atLeast(1000);
+    for (int i = 0; i < queries; i++) {
       doTestQuery(cardinality, fields);
     }
   }
diff --git a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java b/solr/core/src/test/org/apache/solr/rest/TestManagedFileStorage.java
similarity index 71%
copy from solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
copy to solr/core/src/test/org/apache/solr/rest/TestManagedFileStorage.java
index c3e66ba33db..8c0fce60c3c 100644
--- a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
+++ b/solr/core/src/test/org/apache/solr/rest/TestManagedFileStorage.java
@@ -17,59 +17,32 @@
 package org.apache.solr.rest;
 
 import java.io.File;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
-import org.apache.solr.cloud.AbstractZkTestCase;
+import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.rest.ManagedResourceStorage.FileStorageIO;
 import org.apache.solr.rest.ManagedResourceStorage.JsonStorage;
 import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
-import org.apache.solr.rest.ManagedResourceStorage.ZooKeeperStorageIO;
 import org.junit.Test;
 
-/** Depends on ZK for testing ZooKeeper backed storage logic. */
-@Slow
-public class TestManagedResourceStorage extends AbstractZkTestCase {
-
-  /** Runs persisted managed resource creation and update tests on Zookeeper storage. */
-  @Test
-  public void testZkBasedJsonStorage() throws Exception {
-
-    // test using ZooKeeper
-    assertTrue("Not using ZooKeeper", h.getCoreContainer().isZooKeeperAware());
-    SolrResourceLoader loader = new SolrResourceLoader(Paths.get("./"));
-    // Solr unit tests can only write to their working directory due to
-    // a custom Java Security Manager installed in the test environment
-    NamedList<String> initArgs = new NamedList<>();
-    try {
-      ZooKeeperStorageIO zkStorageIO = new ZooKeeperStorageIO(zkServer.getZkClient(), "/test");
-      zkStorageIO.configure(loader, initArgs);
-      doStorageTests(loader, zkStorageIO);
-    } finally {
-      loader.close();
-    }
-  }
+public class TestManagedFileStorage extends SolrTestCaseJ4 {
 
   /** Runs persisted managed resource creation and update tests on JSON storage. */
   @Test
   public void testFileBasedJsonStorage() throws Exception {
     File instanceDir = createTempDir("json-storage").toFile();
-    SolrResourceLoader loader = new SolrResourceLoader(instanceDir.toPath());
-    try {
+    try (SolrResourceLoader loader = new SolrResourceLoader(instanceDir.toPath())) {
       NamedList<String> initArgs = new NamedList<>();
       String managedDir = instanceDir.getAbsolutePath() + File.separator + "managed";
       initArgs.add(ManagedResourceStorage.STORAGE_DIR_INIT_ARG, managedDir);
       FileStorageIO fileStorageIO = new FileStorageIO();
       fileStorageIO.configure(loader, initArgs);
-      doStorageTests(loader, fileStorageIO);
-    } finally {
-      loader.close();
+      TestManagedFileStorage.doStorageTests(loader, fileStorageIO);
     }
   }
 
@@ -78,7 +51,8 @@ public class TestManagedResourceStorage extends AbstractZkTestCase {
    * resource.
    */
   @SuppressWarnings("unchecked")
-  private void doStorageTests(SolrResourceLoader loader, StorageIO storageIO) throws Exception {
+  public static void doStorageTests(SolrResourceLoader loader, StorageIO storageIO)
+      throws Exception {
     String resourceId = "/test/foo";
 
     JsonStorage jsonStorage = new JsonStorage(storageIO, loader);
@@ -109,7 +83,7 @@ public class TestManagedResourceStorage extends AbstractZkTestCase {
     assertEquals("true", storedArgs.get("ignoreCase"));
     List<String> storedList = (List<String>) storedMap.get(ManagedResource.MANAGED_JSON_LIST_FIELD);
     assertNotNull(storedList);
-    assertTrue(storedList.size() == managedList.size());
+    assertEquals(managedList.size(), storedList.size());
     assertTrue(storedList.contains("a"));
 
     // now verify you can update existing data
@@ -125,7 +99,7 @@ public class TestManagedResourceStorage extends AbstractZkTestCase {
     assertEquals("someValue", storedArgs.get("anotherArg"));
     storedList = (List<String>) storedMap.get(ManagedResource.MANAGED_JSON_LIST_FIELD);
     assertNotNull(storedList);
-    assertTrue(storedList.size() == managedList.size());
-    assertTrue(storedList.contains("e"));
+    assertEquals(managedList.size(), storedList.size());
+    assertTrue(storedList.contains("f"));
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java b/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
index c3e66ba33db..766d7bbec3c 100644
--- a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
+++ b/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
@@ -16,116 +16,28 @@
  */
 package org.apache.solr.rest;
 
-import java.io.File;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import java.nio.file.Path;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.cloud.AbstractZkTestCase;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrResourceLoader;
-import org.apache.solr.rest.ManagedResourceStorage.FileStorageIO;
-import org.apache.solr.rest.ManagedResourceStorage.JsonStorage;
-import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
 import org.apache.solr.rest.ManagedResourceStorage.ZooKeeperStorageIO;
 import org.junit.Test;
 
 /** Depends on ZK for testing ZooKeeper backed storage logic. */
-@Slow
+@LuceneTestCase.Nightly
 public class TestManagedResourceStorage extends AbstractZkTestCase {
 
   /** Runs persisted managed resource creation and update tests on Zookeeper storage. */
   @Test
   public void testZkBasedJsonStorage() throws Exception {
-
     // test using ZooKeeper
     assertTrue("Not using ZooKeeper", h.getCoreContainer().isZooKeeperAware());
-    SolrResourceLoader loader = new SolrResourceLoader(Paths.get("./"));
-    // Solr unit tests can only write to their working directory due to
-    // a custom Java Security Manager installed in the test environment
-    NamedList<String> initArgs = new NamedList<>();
-    try {
+    Path instanceDir = createTempDir("zk-storage");
+    try (SolrResourceLoader loader = new SolrResourceLoader(instanceDir)) {
       ZooKeeperStorageIO zkStorageIO = new ZooKeeperStorageIO(zkServer.getZkClient(), "/test");
-      zkStorageIO.configure(loader, initArgs);
-      doStorageTests(loader, zkStorageIO);
-    } finally {
-      loader.close();
-    }
-  }
-
-  /** Runs persisted managed resource creation and update tests on JSON storage. */
-  @Test
-  public void testFileBasedJsonStorage() throws Exception {
-    File instanceDir = createTempDir("json-storage").toFile();
-    SolrResourceLoader loader = new SolrResourceLoader(instanceDir.toPath());
-    try {
-      NamedList<String> initArgs = new NamedList<>();
-      String managedDir = instanceDir.getAbsolutePath() + File.separator + "managed";
-      initArgs.add(ManagedResourceStorage.STORAGE_DIR_INIT_ARG, managedDir);
-      FileStorageIO fileStorageIO = new FileStorageIO();
-      fileStorageIO.configure(loader, initArgs);
-      doStorageTests(loader, fileStorageIO);
-    } finally {
-      loader.close();
+      zkStorageIO.configure(loader, new NamedList<>());
+      TestManagedFileStorage.doStorageTests(loader, zkStorageIO);
     }
   }
-
-  /**
-   * Called from tests for each storage type to run creation and update tests on a persisted managed
-   * resource.
-   */
-  @SuppressWarnings("unchecked")
-  private void doStorageTests(SolrResourceLoader loader, StorageIO storageIO) throws Exception {
-    String resourceId = "/test/foo";
-
-    JsonStorage jsonStorage = new JsonStorage(storageIO, loader);
-
-    Map<String, String> managedInitArgs = new HashMap<>();
-    managedInitArgs.put("ignoreCase", "true");
-    managedInitArgs.put("dontIgnoreCase", "false");
-
-    List<String> managedList = new ArrayList<>(); // we need a mutable List for this test
-    managedList.addAll(Arrays.asList("a", "b", "c", "d", "e"));
-
-    Map<String, Object> toStore = new HashMap<>();
-    toStore.put(ManagedResource.INIT_ARGS_JSON_FIELD, managedInitArgs);
-    toStore.put(ManagedResource.MANAGED_JSON_LIST_FIELD, managedList);
-
-    jsonStorage.store(resourceId, toStore);
-
-    String storedResourceId = jsonStorage.getStoredResourceId(resourceId);
-    assertTrue(storedResourceId + " file not found!", storageIO.exists(storedResourceId));
-
-    Object fromStorage = jsonStorage.load(resourceId);
-    assertNotNull(fromStorage);
-
-    Map<String, Object> storedMap = (Map<String, Object>) fromStorage;
-    Map<String, Object> storedArgs =
-        (Map<String, Object>) storedMap.get(ManagedResource.INIT_ARGS_JSON_FIELD);
-    assertNotNull(storedArgs);
-    assertEquals("true", storedArgs.get("ignoreCase"));
-    List<String> storedList = (List<String>) storedMap.get(ManagedResource.MANAGED_JSON_LIST_FIELD);
-    assertNotNull(storedList);
-    assertTrue(storedList.size() == managedList.size());
-    assertTrue(storedList.contains("a"));
-
-    // now verify you can update existing data
-    managedInitArgs.put("anotherArg", "someValue");
-    managedList.add("f");
-    jsonStorage.store(resourceId, toStore);
-    fromStorage = jsonStorage.load(resourceId);
-    assertNotNull(fromStorage);
-
-    storedMap = (Map<String, Object>) fromStorage;
-    storedArgs = (Map<String, Object>) storedMap.get(ManagedResource.INIT_ARGS_JSON_FIELD);
-    assertNotNull(storedArgs);
-    assertEquals("someValue", storedArgs.get("anotherArg"));
-    storedList = (List<String>) storedMap.get(ManagedResource.MANAGED_JSON_LIST_FIELD);
-    assertNotNull(storedList);
-    assertTrue(storedList.size() == managedList.size());
-    assertTrue(storedList.contains("e"));
-  }
 }
diff --git a/solr/core/src/test/org/apache/solr/schema/TestUseDocValuesAsStored.java b/solr/core/src/test/org/apache/solr/schema/TestUseDocValuesAsStored.java
index af908951be8..2bb9d09adb4 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestUseDocValuesAsStored.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestUseDocValuesAsStored.java
@@ -187,7 +187,8 @@ public class TestUseDocValuesAsStored extends AbstractBadConfigTestBase {
 
   @Test
   public void testRandomSingleAndMultiValued() throws Exception {
-    for (int c = 0; c < 10 * RANDOM_MULTIPLIER; ++c) {
+    int iterations = atLeast(5);
+    for (int c = 0; c < iterations; ++c) {
       clearIndex();
       int[] arity = new int[9];
       for (int a = 0; a < arity.length; ++a) {
@@ -252,7 +253,7 @@ public class TestUseDocValuesAsStored extends AbstractBadConfigTestBase {
     if (indexed && stored) suffix = "_dv";
     else if (indexed && !stored) suffix = "_dvo";
     else if (!indexed && !stored) suffix = "_dvo2";
-    else assertTrue("unsupported dv string field combination: stored and not indexed", false);
+    else fail("unsupported dv string field combination: stored and not indexed");
     return base + suffix;
   }
 
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrCachePerf.java b/solr/core/src/test/org/apache/solr/search/TestSolrCachePerf.java
index 1bca6a2ff8c..84d49d22f3b 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolrCachePerf.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolrCachePerf.java
@@ -26,7 +26,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.apache.solr.metrics.SolrMetricsContext;
@@ -35,7 +34,6 @@ import org.junit.Test;
 import org.junit.runners.model.MultipleFailureException;
 
 /** */
-@LuceneTestCase.Slow
 public class TestSolrCachePerf extends SolrTestCaseJ4 {
 
   @SuppressWarnings({"unchecked", "rawtypes"})
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
index 96f9f47d4af..df2f544330d 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKG.java
@@ -31,7 +31,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -76,7 +75,6 @@ import org.slf4j.LoggerFactory;
  * @see TestCloudJSONFacetJoinDomain
  * @see TestCloudJSONFacetSKGEquiv
  */
-@Slow
 public class TestCloudJSONFacetSKG extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
index c17528f7207..6e61334ad79 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
@@ -111,12 +111,19 @@ public class TestJsonFacets extends SolrTestCaseHS {
   @ParametersFactory
   public static Iterable<Object[]> parameters() {
     if (null != TEST_ONLY_ONE_FACET_METHOD) {
-      return Arrays.<Object[]>asList(new Object[] {TEST_ONLY_ONE_FACET_METHOD});
+      return Collections.singleton(new Object[] {TEST_ONLY_ONE_FACET_METHOD});
+    } else if (TEST_NIGHTLY) {
+      // wrap each enum val in an Object[] and return as Iterable
+      return () ->
+          Arrays.stream(FacetField.FacetMethod.values()).map(it -> new Object[] {it}).iterator();
+    } else {
+      // pick a single random method and test it
+      FacetField.FacetMethod[] methods = FacetField.FacetMethod.values();
+
+      // can't use LuceneTestCase.random() because we're not in the runner context yet
+      String seed = System.getProperty("tests.seed", "");
+      return Collections.singleton(new Object[] {methods[seed.hashCode() % methods.length]});
     }
-
-    // wrap each enum val in an Object[] and return as Iterable
-    return () ->
-        Arrays.stream(FacetField.FacetMethod.values()).map(it -> new Object[] {it}).iterator();
   }
 
   public TestJsonFacets(FacetField.FacetMethod defMethod) {
diff --git a/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java b/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java
index 6c6b03c07e8..91975464372 100644
--- a/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java
+++ b/solr/core/src/test/org/apache/solr/search/mlt/CloudMLTQParserTest.java
@@ -39,9 +39,7 @@ public class CloudMLTQParserTest extends SolrCloudTestCase {
 
     final CloudSolrClient client = cluster.getSolrClient();
 
-    CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
-        .processAndWait(client, DEFAULT_TIMEOUT);
-
+    CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1).process(client);
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
 
     String id = "id";
diff --git a/solr/core/src/test/org/apache/solr/security/TestAuthorizationFramework.java b/solr/core/src/test/org/apache/solr/security/TestAuthorizationFramework.java
index 67b1bc79047..81d2dfbafc1 100644
--- a/solr/core/src/test/org/apache/solr/security/TestAuthorizationFramework.java
+++ b/solr/core/src/test/org/apache/solr/security/TestAuthorizationFramework.java
@@ -20,13 +20,11 @@ import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.util.EntityUtils;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
 import org.apache.solr.cloud.AbstractFullDistribZkTestBase;
@@ -39,10 +37,13 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@LuceneTestCase.Slow
 public class TestAuthorizationFramework extends AbstractFullDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
+  public static final byte[] SECURITY_JSON =
+      "{\"authorization\":{\"class\":\"org.apache.solr.security.MockAuthorizationPlugin\"}}"
+          .getBytes(StandardCharsets.UTF_8);
+
   static final int TIMEOUT = 10000;
 
   public void distribSetUp() throws Exception {
@@ -52,54 +53,44 @@ public class TestAuthorizationFramework extends AbstractFullDistribZkTestBase {
       zkStateReader
           .getZkClient()
           .create(
-              ZkStateReader.SOLR_SECURITY_CONF_PATH,
-              "{\"authorization\":{\"class\":\"org.apache.solr.security.MockAuthorizationPlugin\"}}"
-                  .getBytes(StandardCharsets.UTF_8),
-              CreateMode.PERSISTENT,
-              true);
+              ZkStateReader.SOLR_SECURITY_CONF_PATH, SECURITY_JSON, CreateMode.PERSISTENT, true);
     }
   }
 
   @Test
   public void authorizationFrameworkTest() throws Exception {
     MockAuthorizationPlugin.denyUsers.add("user1");
-    MockAuthorizationPlugin.denyUsers.add("user1");
 
-    try {
-      waitForThingsToLevelOut(10, TimeUnit.SECONDS);
-      String baseUrl = jettys.get(0).getBaseUrl().toString();
-      verifySecurityStatus(
-          ((CloudLegacySolrClient) cloudClient).getHttpClient(),
-          baseUrl + "/admin/authorization",
-          "authorization/class",
-          MockAuthorizationPlugin.class.getName(),
-          20);
-      log.info("Starting test");
-      ModifiableSolrParams params = new ModifiableSolrParams();
-      params.add("q", "*:*");
-      // This should work fine.
-      cloudClient.query(params);
-      MockAuthorizationPlugin.protectedResources.add("/select");
+    waitForThingsToLevelOut(10, TimeUnit.SECONDS);
+    String baseUrl = jettys.get(0).getBaseUrl().toString();
+    verifySecurityStatus(
+        ((CloudLegacySolrClient) cloudClient).getHttpClient(),
+        baseUrl + "/admin/authorization",
+        "authorization/class",
+        s -> MockAuthorizationPlugin.class.getName().equals(s),
+        20);
 
-      // This user is disallowed in the mock. The request should return a 403.
-      params.add("uname", "user1");
-      expectThrows(Exception.class, () -> cloudClient.query(params));
-      log.info("Ending test");
-    } finally {
-      MockAuthorizationPlugin.denyUsers.clear();
-      MockAuthorizationPlugin.protectedResources.clear();
-    }
+    // This should work fine.
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add("q", "*:*");
+    cloudClient.query(params);
+
+    // This user is disallowed in the mock. The request should return a 403.
+    MockAuthorizationPlugin.protectedResources.add("/select");
+    params.add("uname", "user1");
+    expectThrows(Exception.class, () -> cloudClient.query(params));
   }
 
   @Override
   public void distribTearDown() throws Exception {
-    super.distribTearDown();
+    MockAuthorizationPlugin.protectedResources.clear();
     MockAuthorizationPlugin.denyUsers.clear();
+    super.distribTearDown();
   }
 
   public static void verifySecurityStatus(
-      HttpClient cl, String url, String objPath, Object expected, int count) throws Exception {
-    boolean success = false;
+      HttpClient cl, String url, String objPath, Predicate<Object> expected, int count)
+      throws Exception {
     String s = null;
     List<String> hierarchy = StrUtils.splitSmart(objPath, '/');
     for (int i = 0; i < count; i++) {
@@ -110,19 +101,11 @@ public class TestAuthorizationFramework extends AbstractFullDistribZkTestBase {
       Map<?, ?> m = (Map<?, ?>) Utils.fromJSONString(s);
 
       Object actual = Utils.getObjectByPath(m, true, hierarchy);
-      if (expected instanceof Predicate) {
-        @SuppressWarnings("unchecked")
-        Predicate<Object> predicate = (Predicate<Object>) expected;
-        if (predicate.test(actual)) {
-          success = true;
-          break;
-        }
-      } else if (Objects.equals(String.valueOf(actual), expected)) {
-        success = true;
-        break;
+      if (expected.test(actual)) {
+        return;
       }
       Thread.sleep(50);
     }
-    assertTrue("No match for " + objPath + " = " + expected + ", full response = " + s, success);
+    fail("No match for " + objPath + " = " + expected + ", full response = " + s);
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java b/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
index 6261a6d89a5..d2843a7ffe8 100644
--- a/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/SpellCheckCollatorTest.java
@@ -19,7 +19,6 @@ package org.apache.solr.spelling;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.LuceneTestCase.SuppressTempFileChecks;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
@@ -41,7 +40,6 @@ import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SuppressTempFileChecks(
     bugUrl = "https://issues.apache.org/jira/browse/SOLR-1877 Spellcheck IndexReader leak bug?")
 public class SpellCheckCollatorTest extends SolrTestCaseJ4 {
diff --git a/solr/core/src/test/org/apache/solr/update/SoftAutoCommitTest.java b/solr/core/src/test/org/apache/solr/update/SoftAutoCommitTest.java
index 589c67823d1..141c45651b8 100644
--- a/solr/core/src/test/org/apache/solr/update/SoftAutoCommitTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SoftAutoCommitTest.java
@@ -24,7 +24,7 @@ import java.lang.invoke.MethodHandles;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.SolrCore;
@@ -33,6 +33,7 @@ import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.util.TestHarness;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,7 +51,7 @@ import org.slf4j.LoggerFactory;
  *       to affect the expectation of how slow B-&gt;C will be
  * </ul>
  */
-@Slow
+@Nightly // we could drop this by testing only one NONE/SOFT/HARD each time based on seed
 public class SoftAutoCommitTest extends SolrTestCaseJ4 {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -82,11 +83,7 @@ public class SoftAutoCommitTest extends SolrTestCaseJ4 {
     monitor.searcher.poll(5000, MILLISECONDS);
   }
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-  }
-
+  @Test
   public void testSoftAndHardCommitMaxDocs() throws Exception {
 
     // NOTE WHEN READING THIS TEST...
@@ -164,14 +161,17 @@ public class SoftAutoCommitTest extends SolrTestCaseJ4 {
     monitor.clear();
   }
 
+  @Test
   public void testSoftAndHardCommitMaxTimeMixedAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeMixedAdds(CommitWithinType.NONE);
   }
 
+  @Test
   public void testSoftCommitWithinAndHardCommitMaxTimeMixedAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeMixedAdds(CommitWithinType.SOFT);
   }
 
+  @Test
   public void testHardCommitWithinAndSoftCommitMaxTimeMixedAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeMixedAdds(CommitWithinType.HARD);
   }
@@ -310,14 +310,17 @@ public class SoftAutoCommitTest extends SolrTestCaseJ4 {
     monitor.searcher.clear();
   }
 
+  @Test
   public void testSoftAndHardCommitMaxTimeDelete() throws Exception {
     doTestSoftAndHardCommitMaxTimeDelete(CommitWithinType.NONE);
   }
 
+  @Test
   public void testSoftCommitWithinAndHardCommitMaxTimeDelete() throws Exception {
     doTestSoftAndHardCommitMaxTimeDelete(CommitWithinType.SOFT);
   }
 
+  @Test
   public void testHardCommitWithinAndSoftCommitMaxTimeDelete() throws Exception {
     doTestSoftAndHardCommitMaxTimeDelete(CommitWithinType.HARD);
   }
@@ -429,14 +432,17 @@ public class SoftAutoCommitTest extends SolrTestCaseJ4 {
     monitor.searcher.clear();
   }
 
+  @Test
   public void testSoftAndHardCommitMaxTimeRapidAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeRapidAdds(CommitWithinType.NONE);
   }
 
+  @Test
   public void testSoftCommitWithinAndHardCommitMaxTimeRapidAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeRapidAdds(CommitWithinType.SOFT);
   }
 
+  @Test
   public void testHardCommitWithinAndSoftCommitMaxTimeRapidAdds() throws Exception {
     doTestSoftAndHardCommitMaxTimeRapidAdds(CommitWithinType.HARD);
   }
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
index 8b80454b028..bfc47dd83cf 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
@@ -34,7 +34,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.NoMergePolicy;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -72,7 +71,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Tests the in-place updates (docValues updates) for a one shard, three replica cluster. */
-@Slow
 public class TestInPlaceUpdatesDistrib extends AbstractFullDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private final boolean onlyLeaderIndexes = random().nextBoolean();
diff --git a/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
index 45d181040c8..ebf912b27b0 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
@@ -89,7 +89,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
   }
 
   @Test
-  @Slow
   public void testNonEnglish() throws Exception {
     // test to document the expected behavior with non-english text for categories
     // the present expectation is that non-latin text and many accented latin characters
@@ -174,7 +173,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
     assertEquals(expected, aliasNumFound);
   }
 
-  @Slow
   @Test
   public void test() throws Exception {
     String configName = getSaferTestName();
@@ -245,7 +243,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
     return ship.replaceAll("\\$", "_");
   }
 
-  @Slow
   @Test
   public void testMustMatch() throws Exception {
     String configName = getSaferTestName();
@@ -299,7 +296,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
     assertInvariants(colVogon, colHoG);
   }
 
-  @Slow
   @Test
   public void testInvalidMustMatch() throws Exception {
     String configName = getSaferTestName();
@@ -339,7 +335,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
         e.getMessage().contains("router.mustMatch must be a valid regular expression"));
   }
 
-  @Slow
   @Test
   public void testMaxCardinality() throws Exception {
     String configName = getSaferTestName();
@@ -397,7 +392,6 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
    *
    * @throws Exception when it blows up unexpectedly :)
    */
-  @Slow
   @Test
   @LogLevel("org.apache.solr.update.processor.TrackingUpdateProcessorFactory=DEBUG")
   public void testSliceRouting() throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
index f68d74b87ed..2725d3d1e11 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
@@ -106,7 +106,6 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     shutdownCluster();
   }
 
-  @Slow
   @Test
   @LogLevel("org.apache.solr.update.processor.TimeRoutedAlias=DEBUG;org.apache.solr.cloud=DEBUG")
   public void test() throws Exception {
@@ -257,7 +256,6 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
    *
    * @throws Exception when it blows up unexpectedly :)
    */
-  @Slow
   @Test
   @LogLevel("org.apache.solr.update.processor.TrackingUpdateProcessorFactory=DEBUG")
   public void testSliceRouting() throws Exception {
@@ -317,7 +315,6 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
   }
 
   @Test
-  @Slow
   public void testPreemptiveCreation() throws Exception {
     String configName = getSaferTestName();
     createConfigSet(configName);
diff --git a/solr/core/src/test/org/apache/solr/util/MultipleManagedSchemasTest.java b/solr/core/src/test/org/apache/solr/util/MultipleManagedSchemasTest.java
index 37a2e71da6a..706cf33afba 100644
--- a/solr/core/src/test/org/apache/solr/util/MultipleManagedSchemasTest.java
+++ b/solr/core/src/test/org/apache/solr/util/MultipleManagedSchemasTest.java
@@ -21,27 +21,17 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.ZkMaintenanceUtils;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class MultipleManagedSchemasTest extends SolrCloudTestCase {
 
-  @Before
-  public void setUp() throws Exception {
-    super.setUp();
+  @BeforeClass
+  public static void setUpCluster() throws Exception {
     System.setProperty("managed.schema.mutable", "false");
     configureCluster(1).configure();
   }
 
-  @After
-  public void tearDown() throws Exception {
-    if (cluster != null) {
-      cluster.shutdown();
-    }
-    super.tearDown();
-  }
-
   @Test
   public void testSameCollectionNameWithMultipleSchemas() throws Exception {
     CloudSolrClient client = cluster.getSolrClient();
diff --git a/solr/core/src/test/org/apache/solr/util/TestSolrCLIRunExample.java b/solr/core/src/test/org/apache/solr/util/TestSolrCLIRunExample.java
index 246ef086a93..2aa20cfb6f2 100644
--- a/solr/core/src/test/org/apache/solr/util/TestSolrCLIRunExample.java
+++ b/solr/core/src/test/org/apache/solr/util/TestSolrCLIRunExample.java
@@ -54,7 +54,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Tests the SolrCLI.RunExampleTool implementation that supports bin/solr -e [example] */
-@LuceneTestCase.Slow
 @SolrTestCaseJ4.SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
 
@@ -312,11 +311,13 @@ public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
   }
 
   @Test
+  @LuceneTestCase.Nightly
   public void testTechproductsExample() throws Exception {
     testExample("techproducts");
   }
 
   @Test
+  @LuceneTestCase.Nightly
   public void testSchemalessExample() throws Exception {
     testExample("schemaless");
   }
diff --git a/solr/core/src/test/org/apache/solr/util/hll/HLLSerializationTest.java b/solr/core/src/test/org/apache/solr/util/hll/HLLSerializationTest.java
index e96ff666b60..0f0de77aa97 100644
--- a/solr/core/src/test/org/apache/solr/util/hll/HLLSerializationTest.java
+++ b/solr/core/src/test/org/apache/solr/util/hll/HLLSerializationTest.java
@@ -42,7 +42,6 @@ public class HLLSerializationTest extends SolrTestCase {
    * parameters.
    */
   @Test
-  @Slow
   @Nightly
   public void serializationSmokeTest() throws Exception {
     final Random random = new Random(randomLong());
@@ -68,7 +67,6 @@ public class HLLSerializationTest extends SolrTestCase {
    * @see #manyValuesHLLSerializationTest
    */
   @Test
-  @Slow
   @Monster("needs roughly -Dtests.heapsize=8g because of the (multiple) massive data structs")
   public void monsterHLLSerializationTest() throws Exception {
     final Random random = new Random(randomLong());
@@ -95,7 +93,6 @@ public class HLLSerializationTest extends SolrTestCase {
    * @see #monsterHLLSerializationTest
    */
   @Test
-  @Slow
   @Monster("may require as much as -Dtests.heapsize=4g depending on random values picked")
   public void manyValuesHLLSerializationTest() {
 
@@ -140,7 +137,6 @@ public class HLLSerializationTest extends SolrTestCase {
    * @see #monsterHLLSerializationTest
    */
   @Test
-  @Slow
   @Monster("can require as much as -Dtests.heapsize=4g because of the massive data structs")
   public void manyValuesMonsterHLLSerializationTest() {
 
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
index 13dfe1ae986..61b47fca84e 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithDelegationTokens.java
@@ -25,7 +25,6 @@ import java.util.Optional;
 import java.util.Set;
 import org.apache.hadoop.util.Time;
 import org.apache.http.HttpStatus;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -54,7 +53,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** Test the delegation token support in the {@link KerberosPlugin}. */
-@LuceneTestCase.Slow
 public class TestSolrCloudWithDelegationTokens extends SolrTestCaseJ4 {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   private static final int NUM_SERVERS = 2;
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithKerberosAlt.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithKerberosAlt.java
index a8601a5e2cf..c9a5bb42df8 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithKerberosAlt.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithKerberosAlt.java
@@ -19,7 +19,6 @@ package org.apache.solr.security.hadoop;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.lang.invoke.MethodHandles;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -42,7 +41,6 @@ import org.slf4j.LoggerFactory;
       QuickPatchThreadsFilter.class,
       BadZookeeperThreadsFilter.class // Zookeeper login leaks TGT renewal threads
     })
-@LuceneTestCase.Slow
 @ThreadLeakLingering(linger = 10000) // minikdc has some lingering threads
 public class TestSolrCloudWithKerberosAlt extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZk2Test.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZk2Test.java
index 3b4509e4f1b..921569ee651 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZk2Test.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZk2Test.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractBasicDistributedZk2TestBase;
@@ -29,7 +28,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZkTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZkTest.java
index 095dc50d521..6b4d8daafa8 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZkTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsBasicDistributedZkTest.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractBasicDistributedZkTestBase;
@@ -30,7 +29,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeyNothingIsSafeTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeyNothingIsSafeTest.java
index 4bba2c90c19..0d9744f0034 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeyNothingIsSafeTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeyNothingIsSafeTest.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractChaosMonkeyNothingIsSafeTestBase;
@@ -30,7 +29,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeySafeLeaderTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeySafeLeaderTest.java
index 5b02ea1e5e1..dbeebf95ffe 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeySafeLeaderTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsChaosMonkeySafeLeaderTest.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractChaosMonkeySafeLeaderTestBase;
@@ -30,7 +29,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsNameNodeFailoverTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsNameNodeFailoverTest.java
index a8959899d49..dd7721d7ed4 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsNameNodeFailoverTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsNameNodeFailoverTest.java
@@ -20,7 +20,7 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractBasicDistributedZkTestBase;
@@ -29,7 +29,7 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
+@LuceneTestCase.Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
     filters = {
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoveryZkTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoveryZkTest.java
index e192446f5a0..456bfb49491 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoveryZkTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRecoveryZkTest.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractRecoveryZkTestBase;
@@ -29,7 +28,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @LuceneTestCase.AwaitsFix(bugUrl = "SOLR-15405")
 @ThreadLeakFilters(
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRestartWhileUpdatingTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRestartWhileUpdatingTest.java
index 5b091e54422..32a973dd841 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRestartWhileUpdatingTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsRestartWhileUpdatingTest.java
@@ -20,7 +20,6 @@ import com.carrotsearch.randomizedtesting.annotations.Nightly;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractRestartWhileUpdatingTestBase;
@@ -29,7 +28,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsSyncSliceTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsSyncSliceTest.java
index 38cdeed6f47..b2dcd1d95c0 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsSyncSliceTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsSyncSliceTest.java
@@ -21,7 +21,6 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.io.IOException;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractSyncSliceTestBase;
@@ -29,7 +28,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTlogReplayBufferedWhileIndexingTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTlogReplayBufferedWhileIndexingTest.java
index 2856d9eae04..8bd94fcd708 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTlogReplayBufferedWhileIndexingTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTlogReplayBufferedWhileIndexingTest.java
@@ -20,7 +20,6 @@ import com.carrotsearch.randomizedtesting.annotations.Nightly;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractTlogReplayBufferedWhileIndexingTestBase;
@@ -28,7 +27,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsUnloadDistributedZkTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsUnloadDistributedZkTest.java
index a980fbd65b8..6cea5b61c0b 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsUnloadDistributedZkTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsUnloadDistributedZkTest.java
@@ -20,7 +20,6 @@ import com.carrotsearch.randomizedtesting.annotations.Nightly;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.AbstractUnloadDistributedZkTestBase;
@@ -28,7 +27,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsWriteToMultipleCollectionsTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsWriteToMultipleCollectionsTest.java
index c4ea95045cd..6eab88e1563 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsWriteToMultipleCollectionsTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsWriteToMultipleCollectionsTest.java
@@ -30,7 +30,6 @@ import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.NRTCachingDirectory;
 import org.apache.lucene.tests.util.LuceneTestCase.Nightly;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.SolrIgnoredThreadsFilter;
@@ -53,7 +52,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/MoveReplicaHdfsTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/MoveReplicaHdfsTest.java
index b125746f85c..3d504762802 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/MoveReplicaHdfsTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/MoveReplicaHdfsTest.java
@@ -22,7 +22,6 @@ import com.carrotsearch.randomizedtesting.annotations.TimeoutSuite;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.LuceneTestCase.AwaitsFix;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.lucene.tests.util.TimeUnits;
 import org.apache.solr.SolrIgnoredThreadsFilter;
@@ -32,7 +31,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/SharedFileSystemAutoReplicaFailoverTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/SharedFileSystemAutoReplicaFailoverTest.java
index d430e2cde11..d73414b3cf3 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/SharedFileSystemAutoReplicaFailoverTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/SharedFileSystemAutoReplicaFailoverTest.java
@@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
@@ -73,7 +72,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Nightly
-@Slow
 @SuppressSSL
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/StressHdfsTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/StressHdfsTest.java
index 065f183c2a0..7449614ff4a 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/StressHdfsTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/StressHdfsTest.java
@@ -32,7 +32,6 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
 import org.apache.hadoop.hdfs.server.namenode.NameNodeAdapter;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.client.solrj.SolrClient;
@@ -55,7 +54,6 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCollectionsApiDistributedZkTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCollectionsApiDistributedZkTest.java
index c3129c806d7..2015e4934e9 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCollectionsApiDistributedZkTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/api/collections/HdfsCollectionsApiDistributedZkTest.java
@@ -20,7 +20,6 @@ import com.carrotsearch.randomizedtesting.annotations.Nightly;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.TimeoutSuite;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
 import org.apache.lucene.tests.util.TimeUnits;
 import org.apache.solr.SolrIgnoredThreadsFilter;
@@ -30,7 +29,6 @@ import org.apache.solr.hdfs.util.BadHdfsThreadsFilter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 
-@Slow
 @Nightly
 @ThreadLeakFilters(
     defaultFilters = true,
@@ -47,6 +45,12 @@ public class HdfsCollectionsApiDistributedZkTest
   @BeforeClass
   public static void setupClass() throws Exception {
     dfsCluster = HdfsTestUtil.setupClass(createTempDir().toFile().getAbsolutePath());
+
+    configureCluster(4)
+        .addConfig("conf", configset("cloud-hdfs"))
+        .addConfig("conf2", configset("cloud-hdfs"))
+        .withSolrXml(TEST_PATH().resolve("solr.xml"))
+        .configure();
   }
 
   @AfterClass
@@ -57,9 +61,4 @@ public class HdfsCollectionsApiDistributedZkTest
       dfsCluster = null;
     }
   }
-
-  @Override
-  protected String getConfigSet() {
-    return "cloud-hdfs";
-  }
 }
diff --git a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
index 0f2a3fb2c20..e714f8da8b2 100644
--- a/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
+++ b/solr/modules/sql/src/test/org/apache/solr/handler/sql/TestSQLHandler.java
@@ -28,7 +28,6 @@ import java.util.Locale;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.stream.ExceptionStream;
@@ -45,7 +44,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SolrTestCaseJ4.SuppressSSL
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class TestSQLHandler extends SolrCloudTestCase {
diff --git a/solr/prometheus-exporter/src/test/org/apache/solr/prometheus/exporter/SolrExporterIntegrationTest.java b/solr/prometheus-exporter/src/test/org/apache/solr/prometheus/exporter/SolrExporterIntegrationTest.java
index 364e4b9aaae..f4965b54ef9 100644
--- a/solr/prometheus-exporter/src/test/org/apache/solr/prometheus/exporter/SolrExporterIntegrationTest.java
+++ b/solr/prometheus-exporter/src/test/org/apache/solr/prometheus/exporter/SolrExporterIntegrationTest.java
@@ -18,12 +18,9 @@ package org.apache.solr.prometheus.exporter;
 
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.junit.Before;
 import org.junit.Test;
 
-// @org.apache.lucene.util.LuceneTestCase.AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/SOLR-13786")
-@Slow
 public class SolrExporterIntegrationTest extends SolrExporterTestBase {
 
   @Override
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index 21380c4a0ac..7f142474faf 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -231,6 +231,7 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
      */
     public RequestStatusState processAndWait(String asyncId, SolrClient client, long timeoutSeconds)
         throws IOException, SolrServerException, InterruptedException {
+      // This is kind of slow, see SOLR-16313
       processAsync(asyncId, client);
       return propagateBasicAuthCreds(requestStatus(asyncId)).waitFor(client, timeoutSeconds);
     }
@@ -1801,6 +1802,7 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
           propagateBasicAuthCreds(deleteAsyncId(requestId)).process(client);
           return state;
         }
+        // This is kind of slow, see SOLR-16313
         TimeUnit.SECONDS.sleep(1);
       }
       return state;
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
index b9ed6f27336..2885f49e0de 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttp2SolrClient.java
@@ -28,7 +28,6 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import junit.framework.Assert;
 import org.apache.commons.io.FileUtils;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
@@ -51,7 +50,6 @@ import org.slf4j.LoggerFactory;
  *
  * @since solr 1.4
  */
-@Slow
 public class TestLBHttp2SolrClient extends SolrTestCaseJ4 {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
index 07abc947cdb..3f2b378193f 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/TestLBHttpSolrClient.java
@@ -29,7 +29,6 @@ import java.util.concurrent.TimeUnit;
 import junit.framework.Assert;
 import org.apache.commons.io.FileUtils;
 import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.util.IOUtils;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.embedded.JettyConfig;
@@ -52,7 +51,6 @@ import org.slf4j.LoggerFactory;
  *
  * @since solr 1.4
  */
-@Slow
 public class TestLBHttpSolrClient extends SolrTestCaseJ4 {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryHttp2Test.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryHttp2Test.java
index aada4bb2a0a..70dbc358f36 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryHttp2Test.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryHttp2Test.java
@@ -19,7 +19,6 @@ package org.apache.solr.client.solrj.embedded;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -33,7 +32,6 @@ import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.Test;
 
-@LuceneTestCase.Slow
 @SolrTestCaseJ4.SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class SolrExampleStreamingBinaryHttp2Test extends SolrExampleStreamingHttp2Test {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryTest.java
index 5da299ae4e7..aae29ac8533 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingBinaryTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.client.solrj.embedded;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -31,7 +30,6 @@ import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrInputDocument;
 import org.junit.Test;
 
-@Slow
 @SuppressSSL(bugUrl = "https://issues.apache.org/jira/browse/SOLR-5776")
 public class SolrExampleStreamingBinaryTest extends SolrExampleStreamingTest {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
index 50a2f761e37..75ad41b9018 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.List;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrExampleTests;
 import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
@@ -33,7 +32,6 @@ import org.junit.BeforeClass;
 /**
  * @since solr 1.3
  */
-@Slow
 public class SolrExampleStreamingTest extends SolrExampleTests {
 
   @BeforeClass
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
index 1b27860fded..d6161adc132 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
@@ -38,7 +38,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -72,22 +71,17 @@ import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.handler.admin.CollectionsHandler;
 import org.apache.solr.handler.admin.ConfigSetsHandler;
 import org.apache.solr.handler.admin.CoreAdminHandler;
-import org.junit.After;
 import org.junit.AfterClass;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** This test would be faster if we simulated the zk state instead. */
-@Slow
 public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private static final String COLLECTION = "collection1";
-  private static final String COLLECTION2 = "2nd_collection";
-
   private static final String id = "id";
 
   private static final int TIMEOUT = 30;
@@ -96,8 +90,8 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
   private static CloudHttp2SolrClient httpBasedCloudSolrClient = null;
   private static CloudHttp2SolrClient zkBasedCloudSolrClient = null;
 
-  @Before
-  public void setupCluster() throws Exception {
+  @BeforeClass
+  public static void setupCluster() throws Exception {
     System.setProperty("metricsEnabled", "true");
     configureCluster(NODE_COUNT)
         .addConfig(
@@ -119,8 +113,8 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
             .build();
   }
 
-  @After
-  public void tearDown() throws Exception {
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
     if (httpBasedCloudSolrClient != null) {
       try {
         httpBasedCloudSolrClient.close();
@@ -137,11 +131,6 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
     }
 
     shutdownCluster();
-    super.tearDown();
-  }
-
-  @AfterClass
-  public static void cleanUpAfterClass() throws Exception {
     httpBasedCloudSolrClient = null;
     zkBasedCloudSolrClient = null;
   }
@@ -154,6 +143,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testParallelUpdateQTime() throws Exception {
+    String COLLECTION = getSaferTestName();
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
@@ -198,6 +188,9 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testAliasHandling() throws Exception {
+    String COLLECTION = getSaferTestName();
+    String COLLECTION2 = "2nd_collection";
+
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
@@ -288,7 +281,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
       try (HttpSolrClient solrClient = getHttpSolrClient(url)) {
         QueryResponse queryResponse = queryRequest.process(solrClient);
         SolrDocumentList docList = queryResponse.getResults();
-        assertTrue(docList.getNumFound() == 1);
+        assertEquals(1, docList.getNumFound());
       }
     }
 
@@ -334,7 +327,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
         try (HttpSolrClient solrClient = getHttpSolrClient(url)) {
           QueryResponse queryResponse = queryRequest.process(solrClient);
           SolrDocumentList docList = queryResponse.getResults();
-          assertTrue(docList.getNumFound() == 1);
+          assertEquals(1, docList.getNumFound());
         }
       }
     }
@@ -746,6 +739,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void stateVersionParamTest() throws Exception {
+    String COLLECTION = getSaferTestName();
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
@@ -913,13 +907,13 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testInitializationWithSolrUrls() throws Exception {
+    String COLLECTION = getSaferTestName();
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
     CloudHttp2SolrClient client = httpBasedCloudSolrClient;
     SolrInputDocument doc = new SolrInputDocument("id", "1", "title_s", "my doc");
-    client.add(COLLECTION, doc);
-    client.commit(COLLECTION);
+    new UpdateRequest().add(doc).commit(client, COLLECTION);
     assertEquals(1, client.query(COLLECTION, params("q", "*:*")).getResults().getNumFound());
   }
 
@@ -1120,7 +1114,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
       assertNotNull(
           ShardParams.SHARDS_INFO + " did not return 'shardAddress' parameter", shardAddress);
       assertTrue(replicaTypeMap.containsKey(shardAddress));
-      assertTrue(preferredTypes.indexOf(replicaTypeMap.get(shardAddress)) == 0);
+      assertEquals(0, preferredTypes.indexOf(replicaTypeMap.get(shardAddress)));
       shardAddresses.add(shardAddress);
     }
     assertTrue("No responses", shardAddresses.size() > 0);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
index f01c5346cd4..8813480e1bf 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientTest.java
@@ -38,7 +38,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -78,9 +77,8 @@ import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.util.LogLevel;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
-import org.junit.After;
 import org.junit.AfterClass;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -88,16 +86,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** This test would be faster if we simulated the zk state instead. */
-@Slow
 @LogLevel(
     "org.apache.solr.cloud.Overseer=INFO;org.apache.solr.common.cloud=INFO;org.apache.solr.cloud.api.collections=INFO;org.apache.solr.cloud.overseer=INFO")
 public class CloudSolrClientTest extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  private static final String COLLECTION = "collection1";
-  private static final String COLLECTION2 = "2nd_collection";
-
   private static final String id = "id";
 
   private static final int TIMEOUT = 30;
@@ -105,8 +99,8 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   private static CloudSolrClient httpBasedCloudSolrClient = null;
 
-  @Before
-  public void setupCluster() throws Exception {
+  @BeforeClass
+  public static void setupCluster() throws Exception {
     System.setProperty("metricsEnabled", "true");
     configureCluster(NODE_COUNT)
         .addConfig(
@@ -124,8 +118,8 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
     httpBasedCloudSolrClient = new CloudLegacySolrClient.Builder(solrUrls).build();
   }
 
-  @After
-  public void tearDown() throws Exception {
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
     if (httpBasedCloudSolrClient != null) {
       try {
         httpBasedCloudSolrClient.close();
@@ -133,14 +127,9 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
         throw new RuntimeException(e);
       }
     }
+    httpBasedCloudSolrClient = null;
 
     shutdownCluster();
-    super.tearDown();
-  }
-
-  @AfterClass
-  public static void cleanUpAfterClass() throws Exception {
-    httpBasedCloudSolrClient = null;
   }
 
   /** Randomly return the cluster's ZK based CSC, or HttpClusterProvider based CSC. */
@@ -150,6 +139,8 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testParallelUpdateQTime() throws Exception {
+    String COLLECTION = getSaferTestName();
+
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .setPerReplicaState(USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -196,6 +187,9 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testAliasHandling() throws Exception {
+    String COLLECTION = getSaferTestName();
+    String COLLECTION2 = "2nd_collection";
+
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .setPerReplicaState(USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -289,7 +283,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
       try (HttpSolrClient solrClient = getHttpSolrClient(url)) {
         QueryResponse queryResponse = queryRequest.process(solrClient);
         SolrDocumentList docList = queryResponse.getResults();
-        assertTrue(docList.getNumFound() == 1);
+        assertEquals(1, docList.getNumFound());
       }
     }
 
@@ -335,7 +329,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
         try (HttpSolrClient solrClient = getHttpSolrClient(url)) {
           QueryResponse queryResponse = queryRequest.process(solrClient);
           SolrDocumentList docList = queryResponse.getResults();
-          assertTrue(docList.getNumFound() == 1);
+          assertEquals(1, docList.getNumFound());
         }
       }
     }
@@ -442,8 +436,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
     int liveNodes = cluster.getJettySolrRunners().size();
 
-    // For this case every shard should have
-    // all its cores on the same node.
+    // For this case every shard should have all its cores on the same node.
     // Hence the below configuration for our collection
     CollectionAdminRequest.createCollection(collectionName, "conf", liveNodes, liveNodes)
         .setPerReplicaState(USE_PER_REPLICA_STATE)
@@ -632,14 +625,16 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testNonRetryableRequests() throws Exception {
+    String collection = getSaferTestName();
+
     try (CloudSolrClient client = getCloudSolrClient(cluster.getZkServer().getZkAddress())) {
       // important to have one replica on each node
       RequestStatusState state =
-          CollectionAdminRequest.createCollection("foo", "conf", 1, NODE_COUNT)
+          CollectionAdminRequest.createCollection(collection, "conf", 1, NODE_COUNT)
               .processAndWait(client, 60);
       if (state == RequestStatusState.COMPLETED) {
-        cluster.waitForActiveCollection("foo", 1, NODE_COUNT);
-        client.setDefaultCollection("foo");
+        cluster.waitForActiveCollection(collection, 1, NODE_COUNT);
+        client.setDefaultCollection(collection);
 
         Map<String, String> adminPathToMbean = new HashMap<>(CommonParams.ADMIN_PATHS.size());
         adminPathToMbean.put(
@@ -655,7 +650,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
             Long numRequests =
                 getNumRequests(
                     runner.getBaseUrl().toString(),
-                    "foo",
+                    collection,
                     "ADMIN",
                     adminPathToMbean.get(adminPath),
                     adminPath,
@@ -682,7 +677,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
             Long numRequests =
                 getNumRequests(
                     runner.getBaseUrl().toString(),
-                    "foo",
+                    collection,
                     "ADMIN",
                     adminPathToMbean.get(adminPath),
                     adminPath,
@@ -750,6 +745,8 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void stateVersionParamTest() throws Exception {
+    String COLLECTION = getSaferTestName();
+
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .process(cluster.getSolrClient());
     cluster.waitForActiveCollection(COLLECTION, 2, 2);
@@ -873,18 +870,19 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testVersionsAreReturned() throws Exception {
-    CollectionAdminRequest.createCollection("versions_collection", "conf", 2, 1)
+    String collection = getSaferTestName();
+
+    CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
         .setPerReplicaState(USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
-    cluster.waitForActiveCollection("versions_collection", 2, 2);
+    cluster.waitForActiveCollection(collection, 2, 2);
 
     // assert that "adds" are returned
     UpdateRequest updateRequest =
         new UpdateRequest().add("id", "1", "a_t", "hello1").add("id", "2", "a_t", "hello2");
     updateRequest.setParam(UpdateParams.VERSIONS, Boolean.TRUE.toString());
 
-    NamedList<Object> response =
-        updateRequest.commit(getRandomClient(), "versions_collection").getResponse();
+    NamedList<Object> response = updateRequest.commit(getRandomClient(), collection).getResponse();
     Object addsObject = response.get("adds");
 
     assertNotNull("There must be a adds parameter", addsObject);
@@ -903,7 +901,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
     assertTrue("Version for id 2 must be a long", object instanceof Long);
     versions.put("2", (Long) object);
 
-    QueryResponse resp = getRandomClient().query("versions_collection", new SolrQuery("*:*"));
+    QueryResponse resp = getRandomClient().query(collection, new SolrQuery("*:*"));
     assertEquals(
         "There should be one document because overwrite=true", 2, resp.getResults().getNumFound());
 
@@ -916,7 +914,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
     // assert that "deletes" are returned
     UpdateRequest deleteRequest = new UpdateRequest().deleteById("1");
     deleteRequest.setParam(UpdateParams.VERSIONS, Boolean.TRUE.toString());
-    response = deleteRequest.commit(getRandomClient(), "versions_collection").getResponse();
+    response = deleteRequest.commit(getRandomClient(), collection).getResponse();
     Object deletesObject = response.get("deletes");
     assertNotNull("There must be a deletes parameter", deletesObject);
     NamedList<?> deletes = (NamedList<?>) deletesObject;
@@ -925,6 +923,8 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
 
   @Test
   public void testInitializationWithSolrUrls() throws Exception {
+    String COLLECTION = getSaferTestName();
+
     CollectionAdminRequest.createCollection(COLLECTION, "conf", 2, 1)
         .setPerReplicaState(USE_PER_REPLICA_STATE)
         .process(cluster.getSolrClient());
@@ -1125,7 +1125,7 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
       assertNotNull(
           ShardParams.SHARDS_INFO + " did not return 'shardAddress' parameter", shardAddress);
       assertTrue(replicaTypeMap.containsKey(shardAddress));
-      assertTrue(preferredTypes.indexOf(replicaTypeMap.get(shardAddress)) == 0);
+      assertEquals(0, preferredTypes.indexOf(replicaTypeMap.get(shardAddress)));
       shardAddresses.add(shardAddress);
     }
     assertTrue("No responses", shardAddresses.size() > 0);
@@ -1149,10 +1149,14 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
   }
 
   public void testPerReplicaStateCollection() throws Exception {
-    CollectionAdminRequest.createCollection("versions_collection", "conf", 2, 1)
+    String collection = getSaferTestName();
+
+    CollectionAdminRequest.createCollection(collection, "conf", 2, 1)
         .process(cluster.getSolrClient());
 
     String testCollection = "perReplicaState_test";
+    String collectionPath = ZkStateReader.getCollectionPath(testCollection);
+
     int liveNodes = cluster.getJettySolrRunners().size();
     CollectionAdminRequest.createCollection(testCollection, "conf", 2, 2)
         .setPerReplicaState(Boolean.TRUE)
@@ -1161,34 +1165,41 @@ public class CloudSolrClientTest extends SolrCloudTestCase {
     final SolrClient clientUnderTest = getRandomClient();
     final SolrPingResponse response = clientUnderTest.ping(testCollection);
     assertEquals("This should be OK", 0, response.getStatus());
+
     DocCollection c = cluster.getZkStateReader().getCollection(testCollection);
     c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
-    PerReplicaStates prs =
-        PerReplicaStates.fetch(
-            ZkStateReader.getCollectionPath(testCollection), cluster.getZkClient(), null);
-    assertEquals(4, prs.states.size());
-    JettySolrRunner jsr = cluster.startJettySolrRunner();
-    // Now let's do an add replica
-    CollectionAdminRequest.addReplicaToShard(testCollection, "shard1")
-        .process(cluster.getSolrClient());
-    prs =
-        PerReplicaStates.fetch(
-            ZkStateReader.getCollectionPath(testCollection), cluster.getZkClient(), null);
-    assertEquals(5, prs.states.size());
-
-    testCollection = "perReplicaState_testv2";
-    new V2Request.Builder("/collections")
-        .withMethod(POST)
-        .withPayload(
-            "{create: {name: perReplicaState_testv2, config : conf, numShards : 2, nrtReplicas : 2, perReplicaState : true, maxShardsPerNode : 5}}")
-        .build()
-        .process(cluster.getSolrClient());
-    cluster.waitForActiveCollection(testCollection, 2, 4);
-    c = cluster.getZkStateReader().getCollection(testCollection);
-    c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
-    prs =
-        PerReplicaStates.fetch(
-            ZkStateReader.getCollectionPath(testCollection), cluster.getZkClient(), null);
+    PerReplicaStates prs = PerReplicaStates.fetch(collectionPath, cluster.getZkClient(), null);
     assertEquals(4, prs.states.size());
+
+    JettySolrRunner jsr = null;
+    try {
+      jsr = cluster.startJettySolrRunner();
+
+      // Now let's do an add replica
+      CollectionAdminRequest.addReplicaToShard(testCollection, "shard1")
+          .process(cluster.getSolrClient());
+      prs = PerReplicaStates.fetch(collectionPath, cluster.getZkClient(), null);
+      assertEquals(5, prs.states.size());
+
+      // create a collection with PRS and v2 API
+      testCollection = "perReplicaState_testv2";
+      collectionPath = ZkStateReader.getCollectionPath(testCollection);
+
+      new V2Request.Builder("/collections")
+          .withMethod(POST)
+          .withPayload(
+              "{create: {name: perReplicaState_testv2, config : conf, numShards : 2, nrtReplicas : 2, perReplicaState : true, maxShardsPerNode : 5}}")
+          .build()
+          .process(cluster.getSolrClient());
+      cluster.waitForActiveCollection(testCollection, 2, 4);
+      c = cluster.getZkStateReader().getCollection(testCollection);
+      c.forEachReplica((s, replica) -> assertNotNull(replica.getReplicaState()));
+      prs = PerReplicaStates.fetch(collectionPath, cluster.getZkClient(), null);
+      assertEquals(4, prs.states.size());
+    } finally {
+      if (jsr != null) {
+        cluster.stopJettySolrRunner(jsr);
+      }
+    }
   }
 }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
index 0417a4721d5..b405c8733e8 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/TestLang.java
@@ -22,7 +22,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Supplier;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCase;
 import org.apache.solr.client.solrj.io.eval.TemporalEvaluatorDay;
 import org.apache.solr.client.solrj.io.eval.TemporalEvaluatorDayOfQuarter;
@@ -39,7 +38,6 @@ import org.apache.solr.client.solrj.io.stream.expr.Expressible;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.junit.Test;
 
-@Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class TestLang extends SolrTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
index 6b3c5a52a67..faf8d681a28 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphExpressionTest.java
@@ -27,7 +27,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
@@ -66,7 +65,6 @@ import org.junit.Test;
  * All base tests will be done with CloudSolrStream. Under the covers CloudSolrStream uses
  * SolrStream so SolrStream will get fully exercised through these tests.
  */
-@Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class GraphExpressionTest extends SolrCloudTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphTest.java
index 5a669611359..660ff504bf2 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/graph/GraphTest.java
@@ -39,7 +39,6 @@ import org.junit.Test;
  * All base tests will be done with CloudSolrStream. Under the covers CloudSolrStream uses
  * SolrStream so SolrStream will get fully exercised through these tests.
  */
-@LuceneTestCase.Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class GraphTest extends SolrCloudTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index d791574d3f2..fef8335b377 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -33,7 +33,6 @@ import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
@@ -50,7 +49,6 @@ import org.junit.Test;
  * All base tests will be done with CloudSolrStream. Under the covers CloudSolrStream uses
  * SolrStream so SolrStream will get fully exercised through these tests.
  */
-@Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class JdbcTest extends SolrCloudTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
index 623e4da003b..f0f97658b31 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/MathExpressionTest.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
@@ -41,7 +40,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class MathExpressionTest extends SolrCloudTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
index 2cfb22ed2b5..e20871dc3fa 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/SelectWithEvaluatorsTest.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.eval.AddEvaluator;
@@ -41,7 +40,6 @@ import org.junit.Test;
  * All base tests will be done with CloudSolrStream. Under the covers CloudSolrStream uses
  * SolrStream so SolrStream will get fully exercised through these tests.
  */
-@Slow
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class SelectWithEvaluatorsTest extends SolrCloudTestCase {
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
index b67bc9addca..34fee1bd09f 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamDecoratorTest.java
@@ -27,7 +27,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -72,7 +71,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SolrTestCaseJ4.SuppressSSL
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 public class StreamDecoratorTest extends SolrCloudTestCase {
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index 5e3d2454c00..9f09bfd252d 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -35,7 +35,6 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.zip.GZIPOutputStream;
 import org.apache.lucene.tests.util.LuceneTestCase;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
@@ -66,7 +65,6 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-@Slow
 @SolrTestCaseJ4.SuppressSSL
 @LuceneTestCase.SuppressCodecs({"Lucene3x", "Lucene40", "Lucene41", "Lucene42", "Lucene45"})
 @ThreadLeakLingering(linger = 0)
diff --git a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
index 0202e94f15a..393a10c77c2 100644
--- a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
@@ -24,7 +24,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -37,7 +36,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /** This test would be faster if we simulated the zk state instead. */
-@Slow
 @LogLevel(
     "org.apache.solr.common.cloud.PerReplicaStatesOps=DEBUG;org.apache.solr.cloud.Overseer=INFO;org.apache.solr.common.cloud=INFO;org.apache.solr.cloud.api.collections=INFO;org.apache.solr.cloud.overseer=INFO")
 public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
diff --git a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
index d8982b75351..9ea477e8140 100644
--- a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
@@ -78,8 +78,9 @@ import org.slf4j.LoggerFactory;
 /**
  * Helper base class for distributed search test cases
  *
- * <p>By default, all tests in sub-classes will be executed with 1, 2, ... DEFAULT_MAX_SHARD_COUNT
- * number of shards set up repeatedly.
+ * <p>By default, for Nightly runs, all tests in sub-classes will execute with 1, 2, ...
+ * DEFAULT_MAX_SHARD_COUNT number of shards set up repeatedly. For non-nightly tests, they will
+ * execute with 2 shards, to speed up total execution time.
  *
  * <p>In general, it's preferable to annotate the tests in sub-classes with a
  * {@literal @}ShardsFixed(num = N) or a {@literal @}ShardsRepeat(min = M, max = N) to indicate
@@ -222,6 +223,11 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
     this.context = context;
     this.deadServers =
         new String[] {DEAD_HOST_1 + context, DEAD_HOST_2 + context, DEAD_HOST_3 + context};
+
+    // Speed up the test cycle by only running a single configuration instead of the repeat rule
+    if (TEST_NIGHTLY == false) {
+      fixShardCount(2);
+    }
   }
 
   private static final int DEFAULT_MAX_SHARD_COUNT = 3;
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
index 281cb9a888c..4facbab196c 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractBasicDistributedZkTestBase.java
@@ -1084,7 +1084,7 @@ public abstract class AbstractBasicDistributedZkTestBase extends AbstractFullDis
   }
 
   /** Create a collection in single node */
-  protected void createCollectionInOneInstance(
+  public static void createCollectionInOneInstance(
       final SolrClient client,
       String nodeName,
       ThreadPoolExecutor executor,
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeyNothingIsSafeTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeyNothingIsSafeTestBase.java
index 36557655385..8b819e1fd34 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeyNothingIsSafeTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeyNothingIsSafeTestBase.java
@@ -21,6 +21,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -30,6 +31,7 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+@LuceneTestCase.Nightly
 public abstract class AbstractChaosMonkeyNothingIsSafeTestBase
     extends AbstractFullDistribZkTestBase {
   private static final int FAIL_TOLERANCE = 100;
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
index 3d9ba2f2c9c..a5edbcb7fe2 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractChaosMonkeySafeLeaderTestBase.java
@@ -20,6 +20,7 @@ package org.apache.solr.cloud;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -28,6 +29,7 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+@LuceneTestCase.Nightly
 public abstract class AbstractChaosMonkeySafeLeaderTestBase extends AbstractFullDistribZkTestBase {
   private static final Integer RUN_LENGTH =
       Integer.parseInt(System.getProperty("solr.tests.cloud.cm.runlength", "-1"));
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index 3f04a162bca..dfb467a40a2 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -43,7 +43,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -112,7 +111,6 @@ import org.slf4j.LoggerFactory;
  * TODO: we should still test this works as a custom update chain as well as what we test now - the
  * default update chain
  */
-@Slow
 public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTestBase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -303,8 +301,13 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
   }
 
   public AbstractFullDistribZkTestBase() {
-    sliceCount = 2;
-    fixShardCount(4);
+    if (TEST_NIGHTLY) {
+      sliceCount = 2;
+      fixShardCount(4);
+    } else {
+      sliceCount = 1;
+      fixShardCount(2);
+    }
 
     // TODO: for now, turn off stress because it uses regular clients, and we
     // need the cloud client because we kill servers
@@ -1534,7 +1537,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     long num = -1;
     long lastNum = -1;
     String failMessage = null;
-    if (verbose) System.err.println("check const of " + shard);
+    log.debug("check const of {}", shard);
     int cnt = 0;
     ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
     assertEquals(
@@ -1550,8 +1553,9 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
     CloudJettyRunner lastJetty = null;
     for (CloudJettyRunner cjetty : solrJetties) {
       ZkNodeProps props = cjetty.info;
-      if (verbose) System.err.println("client" + cnt++);
-      if (verbose) System.err.println("PROPS:" + props);
+      log.debug("client{}", cnt);
+      log.debug("PROPS:{}", props);
+      cnt++;
 
       try {
         SolrParams query =
@@ -1567,7 +1571,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
         // echoed in logs
         num = cjetty.client.solrClient.query(query).getResults().getNumFound();
       } catch (SolrException | SolrServerException e) {
-        if (verbose) System.err.println("error contacting client: " + e.getMessage() + "\n");
+        log.debug("error contacting client: {}", e);
         continue;
       }
 
@@ -1576,8 +1580,8 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
       if (zkStateReader.getClusterState().liveNodesContain(nodeName)) {
         live = true;
       }
-      if (verbose) System.err.println(" live:" + live);
-      if (verbose) System.err.println(" num:" + num + "\n");
+      log.debug(" live:{}", live);
+      log.debug(" num:{}", num);
 
       boolean active =
           Replica.State.getState(props.getStr(ZkStateReader.STATE_PROP)) == Replica.State.ACTIVE;
@@ -1625,7 +1629,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
 
       for (CloudJettyRunner cjetty : solrJetties) {
         ZkNodeProps props = cjetty.info;
-        System.err.println("PROPS:" + props);
+        log.debug("PROPS:{}", props);
 
         try {
           SolrParams query =
@@ -1642,7 +1646,7 @@ public abstract class AbstractFullDistribZkTestBase extends AbstractDistribZkTes
           // anything except be
           // echoed in logs
           long num = cjetty.client.solrClient.query(query).getResults().getNumFound();
-          System.err.println("DOCS:" + num);
+          log.debug("DOCS:{}", num);
         } catch (SolrServerException | SolrException | IOException e) {
           System.err.println("error contacting client: " + e.getMessage() + "\n");
           continue;
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractRecoveryZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractRecoveryZkTestBase.java
index d3b685ae692..7c8c696fa8a 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractRecoveryZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractRecoveryZkTestBase.java
@@ -20,7 +20,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.CloudLegacySolrClient;
@@ -36,7 +35,6 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Slow
 public abstract class AbstractRecoveryZkTestBase extends SolrCloudTestCase {
 
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
index c106581b961..58c086c96d4 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractSyncSliceTestBase.java
@@ -23,22 +23,23 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.Collectors;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.common.SolrInputDocument;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
-import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionParams.CollectionAction;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.util.LogLevel;
 import org.junit.Test;
 
 /** Test sync phase that occurs when Leader goes down and a new Leader is elected. */
+@LogLevel("org.apache.solr.update.processor.DistributedZkUpdateProcessor=WARN")
 public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTestBase {
   private boolean success = false;
 
@@ -170,9 +171,6 @@ public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTes
     }
 
     commit();
-
-    Thread.sleep(1000);
-
     waitForRecoveriesToFinish(false);
 
     // shard should be inconsistent
@@ -205,28 +203,20 @@ public abstract class AbstractSyncSliceTestBase extends AbstractFullDistribZkTes
     success = true;
   }
 
-  private void waitTillAllNodesActive() throws Exception {
-    for (int i = 0; i < 60; i++) {
-      Thread.sleep(3000);
-      ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
-      ClusterState clusterState = zkStateReader.getClusterState();
-      DocCollection collection1 = clusterState.getCollection("collection1");
-      Slice slice = collection1.getSlice("shard1");
-      Collection<Replica> replicas = slice.getReplicas();
-      boolean allActive = true;
-      for (Replica replica : replicas) {
-        if (!clusterState.liveNodesContain(replica.getNodeName())
-            || replica.getState() != Replica.State.ACTIVE) {
-          allActive = false;
-          break;
-        }
-      }
-      if (allActive) {
-        return;
-      }
-    }
-    printLayout();
-    fail("timeout waiting to see all nodes active");
+  private void waitTillAllNodesActive() throws InterruptedException, TimeoutException {
+    ZkStateReader zkStateReader = ZkStateReader.from(cloudClient);
+
+    zkStateReader.waitForState(
+        "collection1",
+        3,
+        TimeUnit.MINUTES,
+        (n, c) -> {
+          Collection<Replica> replicas = c.getSlice("shard1").getReplicas();
+          Set<String> nodes =
+              replicas.stream().map(Replica::getNodeName).collect(Collectors.toSet());
+          return replicas.stream().map(Replica::getState).allMatch(Replica.State.ACTIVE::equals)
+              && n.containsAll(nodes);
+        });
   }
 
   private String waitTillInconsistent() throws Exception, InterruptedException {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractUnloadDistributedZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractUnloadDistributedZkTestBase.java
index 85d40fa56d1..4d2de9eaaa6 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractUnloadDistributedZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractUnloadDistributedZkTestBase.java
@@ -17,6 +17,7 @@
 package org.apache.solr.cloud;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Collections;
@@ -46,15 +47,19 @@ import org.apache.solr.core.SolrPaths;
 import org.apache.solr.util.TestInjection;
 import org.apache.solr.util.TimeOut;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * This test simply does a bunch of basic things in solrcloud mode and asserts things work as
  * expected.
  */
-public abstract class AbstractUnloadDistributedZkTestBase
-    extends AbstractBasicDistributedZkTestBase {
+public abstract class AbstractUnloadDistributedZkTestBase extends AbstractFullDistribZkTestBase {
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   public AbstractUnloadDistributedZkTestBase() {
     super();
+    fixShardCount(4); // needs at least 4 servers
   }
 
   protected String getSolrXml() {
@@ -69,9 +74,11 @@ public abstract class AbstractUnloadDistributedZkTestBase
           allowPath.clear();
           allowPath.add(SolrPaths.ALL_PATH); // Allow non-standard core instance path
         });
+    log.info("###Starting testCoreUnloadAndLeaders");
     testCoreUnloadAndLeaders(); // long
+    log.info("###Starting testUnloadOfCores");
     testUnloadLotsOfCores(); // long
-
+    log.info("###Starting testUnloadShardAndCollection");
     testUnloadShardAndCollection();
   }
 
@@ -391,6 +398,7 @@ public abstract class AbstractUnloadDistributedZkTestBase
 
   private void testUnloadLotsOfCores() throws Exception {
     JettySolrRunner jetty = jettys.get(0);
+    int shards = TEST_NIGHTLY ? 2 : 1;
     try (final HttpSolrClient adminClient = (HttpSolrClient) jetty.newClient(15000, 60000)) {
       int numReplicas = atLeast(3);
       ThreadPoolExecutor executor =
@@ -403,12 +411,18 @@ public abstract class AbstractUnloadDistributedZkTestBase
               new SolrNamedThreadFactory("testExecutor"));
       try {
         // create the cores
-        createCollectionInOneInstance(
-            adminClient, jetty.getNodeName(), executor, "multiunload", 2, numReplicas);
+        AbstractBasicDistributedZkTestBase.createCollectionInOneInstance(
+            adminClient, jetty.getNodeName(), executor, "multiunload", shards, numReplicas);
       } finally {
         ExecutorUtil.shutdownAndAwaitTermination(executor);
       }
 
+      if (TEST_NIGHTLY == false) {
+        // with nightly tests, we can try doing the unloads before the creates are done
+        // it still works, but takes much longer since we end up waiting for a timeout
+        waitForRecoveriesToFinish("multiunload", false);
+      }
+
       executor =
           new ExecutorUtil.MDCAwareThreadPoolExecutor(
               0,
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
index 029de293589..c52ca4e6fc6 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractZkTestCase.java
@@ -64,11 +64,6 @@ public abstract class AbstractZkTestCase extends SolrTestCaseJ4 {
     initCore("solrconfig.xml", "schema.xml");
   }
 
-  @Override
-  public void tearDown() throws Exception {
-    super.tearDown();
-  }
-
   @AfterClass
   public static void azt_afterClass() throws Exception {
 
@@ -90,8 +85,4 @@ public abstract class AbstractZkTestCase extends SolrTestCaseJ4 {
       zkDir = null;
     }
   }
-
-  protected void printLayout() throws Exception {
-    zkServer.printLayout();
-  }
 }
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
index 9c3e1cac5f1..f9a17b86275 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
@@ -89,7 +89,8 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
   }
 
   /**
-   * Call this to configure a cluster of n nodes.
+   * Call this to configure a cluster of n nodes. It will be shut down automatically after the
+   * tests.
    *
    * <p>NB you must call {@link MiniSolrCloudCluster.Builder#configure()} to start the cluster
    *
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
index cc51a857e5f..8cf85dc8505 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractCollectionsAPIDistributedZkTestBase.java
@@ -41,7 +41,6 @@ import java.util.concurrent.TimeUnit;
 import javax.management.MBeanServer;
 import javax.management.MBeanServerFactory;
 import javax.management.ObjectName;
-import org.apache.lucene.tests.util.LuceneTestCase.Slow;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.SolrQuery;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -72,44 +71,28 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrInfoBean.Category;
 import org.apache.solr.util.TestInjection;
 import org.apache.solr.util.TimeOut;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/** Tests the Cloud Collections API. */
-@Slow
+/**
+ * Tests the Cloud Collections API.
+ *
+ * <p>Because the different setups require distinct config-sets, we have to push down cluster
+ * creation to subclasses
+ */
 public abstract class AbstractCollectionsAPIDistributedZkTestBase extends SolrCloudTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-  protected abstract String getConfigSet();
-
-  @Before
-  public void setupCluster() throws Exception {
+  @BeforeClass
+  public static void setupCluster() {
     // we don't want this test to have zk timeouts
     System.setProperty("zkClientTimeout", "60000");
     System.setProperty("createCollectionWaitTimeTillActive", "5");
     TestInjection.randomDelayInCoreCreation = "true:5";
     System.setProperty("validateAfterInactivity", "200");
     System.setProperty("solr.allowPaths", "*");
-
-    configureCluster(4)
-        .addConfig("conf", configset(getConfigSet()))
-        .addConfig("conf2", configset(getConfigSet()))
-        .withSolrXml(TEST_PATH().resolve("solr.xml"))
-        .configure();
-  }
-
-  @After
-  public void tearDownCluster() throws Exception {
-    try {
-      shutdownCluster();
-    } finally {
-      System.clearProperty("createCollectionWaitTimeTillActive");
-      System.clearProperty("solr.allowPaths");
-      super.tearDown();
-    }
   }
 
   @Test
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
index d8763411649..1f77a2b0ba0 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/api/collections/AbstractIncrementalBackupTest.java
@@ -208,7 +208,7 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
           CollectionAdminRequest.backupCollection(backupCollectionName, backupName)
               .setLocation(backupLocation)
               .setRepositoryName(BACKUP_REPO_NAME)
-              .processAndWait(cluster.getSolrClient(), 10 * 1000);
+              .processAndWait(cluster.getSolrClient(), 10);
       assertEquals(RequestStatusState.COMPLETED, result);
     }
     final int secondBatchNumDocs = indexDocs(backupCollectionName, true);
@@ -223,15 +223,14 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
           CollectionAdminRequest.restoreCollection(backupCollectionName, backupName)
               .setLocation(backupLocation)
               .setRepositoryName(BACKUP_REPO_NAME)
-              .processAndWait(cluster.getSolrClient(), 20 * 1000);
+              .processAndWait(cluster.getSolrClient(), 20);
       assertEquals(RequestStatusState.COMPLETED, result);
     }
     assertEquals(firstBatchNumDocs, getNumDocsInCollection(backupCollectionName));
   }
 
   @Test
-  @Slow
-  @SuppressWarnings("rawtypes")
+  @Nightly
   public void testBackupIncremental() throws Exception {
     setTestSuffix("testbackupinc");
     CloudSolrClient solrClient = cluster.getSolrClient();
@@ -272,7 +271,7 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
               .setBackupLocation(backupLocation)
               .setBackupRepository(BACKUP_REPO_NAME)
               .process(cluster.getSolrClient());
-      ArrayList backups = (ArrayList) resp.getResponse().get("backups");
+      List<?> backups = (List<?>) resp.getResponse().get("backups");
       assertEquals(3, backups.size());
 
       // test delete backups
@@ -281,14 +280,14 @@ public abstract class AbstractIncrementalBackupTest extends SolrCloudTestCase {
               .setRepositoryName(BACKUP_REPO_NAME)
               .setLocation(backupLocation)
               .process(cluster.getSolrClient());
-      assertEquals(null, resp.getResponse().get("deleted"));
+      assertNull(resp.getResponse().get("deleted"));
 
       resp =
           CollectionAdminRequest.deleteBackupByRecency(backupName, 3)
               .setRepositoryName(BACKUP_REPO_NAME)
               .setLocation(backupLocation)
               .process(cluster.getSolrClient());
-      assertEquals(null, resp.getResponse().get("deleted"));
+      assertNull(resp.getResponse().get("deleted"));
 
       resp =
           CollectionAdminRequest.deleteBackupByRecency(backupName, 2)