You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2021/01/31 21:05:59 UTC

[lucene-solr] 03/03: @1295 Finish most of test core close issue, some minor cleanup.

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

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

commit d45cb4cb5a5cf41c6a499b658b2cbd304c8267ee
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Sun Jan 31 15:03:37 2021 -0600

    @1295 Finish most of test core close issue, some minor cleanup.
---
 .../legacy/LegacyAbstractAnalyticsTest.java        |  43 ++-
 .../legacy/expression/LegacyFunctionTest.java      |   3 +
 .../facet/LegacyAbstractAnalyticsFacetTest.java    |   4 +-
 .../solr/analytics/value/CastingIntValueTest.java  |   2 +
 .../AbstractDataImportHandlerTestCase.java         |   4 +-
 .../solr/handler/dataimport/TestDocBuilder2.java   |   6 +-
 .../TestFileListWithLineEntityProcessor.java       |   2 +-
 .../dataimport/TestVariableResolverEndToEnd.java   |   4 +-
 .../extraction/ExtractingRequestHandlerTest.java   |  51 +++-
 ...nguageIdentifierUpdateProcessorFactoryTest.java |   5 +-
 ...geIdentifierUpdateProcessorFactoryTestCase.java |   1 +
 ...penNLPLangDetectUpdateProcessorFactoryTest.java |  13 +-
 ...nguageIdentifierUpdateProcessorFactoryTest.java |   5 +-
 .../src/java/org/apache/solr/api/AnnotatedApi.java |   2 +-
 .../client/solrj/embedded/EmbeddedSolrServer.java  |  10 +-
 .../java/org/apache/solr/cloud/ZkShardTerms.java   |  11 +-
 .../src/java/org/apache/solr/core/SolrCore.java    |  43 ++-
 .../org/apache/solr/core/SolrResourceLoader.java   | 117 ++++----
 .../java/org/apache/solr/core/XmlConfigFile.java   |   7 +-
 .../apache/solr/handler/ReplicationHandler.java    |   9 +-
 .../src/java/org/apache/solr/pkg/PackageAPI.java   |   2 +-
 .../apache/solr/request/LocalSolrQueryRequest.java |   2 +-
 .../apache/solr/servlet/SolrDispatchFilter.java    |  15 +-
 .../processor/DistributedUpdateProcessor.java      |   6 +-
 .../processor/DistributedZkUpdateProcessor.java    |   2 +-
 .../java/org/apache/solr/util/SafeXMLParsing.java  |   1 +
 .../solr/util/SolrJacksonAnnotationInspector.java  |   2 +-
 .../org/apache/solr/BasicFunctionalityTest.java    |  25 +-
 .../test/org/apache/solr/ConvertedLegacyTest.java  |  44 +--
 .../org/apache/solr/DisMaxRequestHandlerTest.java  |   4 +-
 solr/core/src/test/org/apache/solr/TestJoin.java   |  28 +-
 .../test/org/apache/solr/TestRandomDVFaceting.java |  43 ++-
 solr/core/src/test/org/apache/solr/TestTrie.java   |   9 +-
 .../TestReversedWildcardFilterFactory.java         |   1 +
 .../solr/cloud/ChaosMonkeySafeLeaderTest.java      |   2 +-
 .../overseer/ZkCollectionPropsCachingTest.java     |   5 +-
 .../org/apache/solr/core/TestCoreContainer.java    |  22 +-
 .../org/apache/solr/handler/JsonLoaderTest.java    |  21 +-
 .../org/apache/solr/handler/TestCSVLoader.java     |   2 +-
 .../org/apache/solr/handler/TestCoreBackup.java    | 142 +++++----
 .../solr/handler/XmlUpdateRequestHandlerTest.java  |   5 +-
 .../handler/admin/CoreAdminCreateDiscoverTest.java |  53 ++--
 .../handler/admin/CoreAdminRequestStatusTest.java  |  25 +-
 .../admin/CoreMergeIndexesAdminHandlerTest.java    |  11 +-
 .../apache/solr/handler/admin/InfoHandlerTest.java |   9 +-
 .../solr/handler/admin/LukeRequestHandlerTest.java |  30 +-
 .../solr/handler/admin/MBeansHandlerTest.java      |  28 +-
 .../admin/PropertiesRequestHandlerTest.java        |   9 +-
 .../handler/admin/ShowFileRequestHandlerTest.java  |   5 +-
 .../solr/handler/component/DebugComponentTest.java |   2 +
 .../handler/component/ResponseBuilderTest.java     |  17 +-
 .../SuggestComponentContextFilterQueryTest.java    |   4 +-
 .../handler/component/TestExpandComponent.java     |  14 +-
 .../solr/handler/export/TestExportWriter.java      | 165 ++++++-----
 .../apache/solr/handler/tagger/TaggerTestCase.java |  14 +-
 .../org/apache/solr/highlight/HighlighterTest.java |   2 +-
 .../highlight/TestPostingsSolrHighlighter.java     |   2 +-
 .../solr/highlight/TestUnifiedSolrHighlighter.java |   2 +-
 .../solr/metrics/SolrMetricsIntegrationTest.java   |  72 ++---
 .../test/org/apache/solr/request/TestFaceting.java |   1 +
 .../apache/solr/request/TestIntervalFaceting.java  | 178 ++++++------
 .../solr/response/TestGeoJSONResponseWriter.java   |  17 +-
 .../solr/response/TestRawResponseWriter.java       |  78 +++--
 .../apache/solr/response/TestRawTransformer.java   |   4 +-
 .../solr/response/TestRetrieveFieldsOptimizer.java |  47 +--
 .../transform/TestChildDocTransformer.java         |   6 +-
 .../transform/TestSubQueryTransformer.java         |   4 +-
 .../test/org/apache/solr/schema/CopyFieldTest.java |  12 +-
 .../org/apache/solr/schema/TestSchemaField.java    |  15 +-
 .../apache/solr/schema/TestSortableTextField.java  | 103 ++++---
 .../org/apache/solr/search/QueryParsingTest.java   |  66 +++--
 .../apache/solr/search/SolrIndexSearcherTest.java  | 232 ++++++++-------
 .../solr/search/TestExtendedDismaxParser.java      |  81 +++---
 .../apache/solr/search/TestHashQParserPlugin.java  |  91 ++++--
 .../solr/search/TestMaxScoreQueryParser.java       |   5 +-
 ...estOverriddenPrefixQueryForCustomFieldType.java |   9 +
 .../org/apache/solr/search/TestSolr4Spatial2.java  |  95 +++---
 .../apache/solr/search/TestSolrQueryParser.java    | 265 ++++++++---------
 .../org/apache/solr/search/TestStressReorder.java  |  20 +-
 .../apache/solr/search/TestStressUserVersions.java |  20 +-
 .../org/apache/solr/search/TestStressVersions.java |  20 +-
 .../apache/solr/search/TestValueSourceCache.java   |   5 +-
 .../solr/search/facet/TestJsonFacetErrors.java     | 168 ++++++-----
 .../solr/search/function/TestFunctionQuery.java    |  37 ++-
 .../apache/solr/servlet/SolrRequestParserTest.java | 207 +++++++-------
 .../solr/spelling/IndexBasedSpellCheckerTest.java  | 317 ++++++++++-----------
 .../org/apache/solr/update/AddBlockUpdateTest.java |   5 +-
 .../apache/solr/update/SolrIndexConfigTest.java    | 102 ++++---
 .../solr/update/TestNestedUpdateProcessor.java     |  13 +-
 .../test/org/apache/solr/update/TestUpdate.java    |  22 +-
 .../AtomicUpdateProcessorFactoryTest.java          |  23 +-
 .../FieldMutatingUpdateProcessorTest.java          |   7 +-
 .../update/processor/NestedAtomicUpdateTest.java   |  18 +-
 .../SignatureUpdateProcessorFactoryTest.java       |  14 +-
 .../SkipExistingDocumentsProcessorFactoryTest.java |  15 +-
 .../processor/TolerantUpdateProcessorTest.java     |  24 +-
 .../UpdateRequestProcessorFactoryTest.java         |  15 +-
 .../solr/client/solrj/impl/Http2SolrClient.java    |   2 +
 .../src/java/org/apache/solr/common/ParWork.java   |   3 +-
 .../solr/client/solrj/io/stream/StreamingTest.java |   5 +
 .../solr/client/solrj/request/SchemaTest.java      |   1 -
 .../src/java/org/apache/solr/SolrTestCase.java     |  20 +-
 .../src/java/org/apache/solr/SolrTestCaseJ4.java   |  52 +++-
 .../update/processor/UpdateProcessorTestBase.java  |   8 +-
 .../solr/cloud/MiniSolrCloudClusterTest.java       |   1 +
 105 files changed, 2001 insertions(+), 1641 deletions(-)

diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
index f7454f8..9eee751 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/LegacyAbstractAnalyticsTest.java
@@ -38,6 +38,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.analytics.util.AnalyticsResponseHeadings;
 import org.apache.solr.analytics.util.MedianCalculator;
 import org.apache.solr.analytics.util.OrdinalCalculator;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.rest.schema.FieldTypeXmlAdapter;
 import org.junit.AfterClass;
@@ -107,22 +108,32 @@ public class LegacyAbstractAnalyticsTest extends SolrTestCaseJ4 {
     // This is a little fragile in that it demands the elements have the same name as type, i.e. when looking for a
     // VAL_TYPE.DOUBLE, the element in question is <double name="blah">47.0</double>.
     sb.append("/").append(type.toString()).append("[@name='").append(name).append("']");
-    String val = h.getCore().getResourceLoader().getXPath().compile(sb.toString()).evaluate(doc, XPathConstants.STRING).toString();
-    try {
-      switch (type) {
-        case INTEGER: return Integer.parseInt(val);
-        case DOUBLE:  return Double.parseDouble(val);
-        case FLOAT:   return Float.parseFloat(val);
-        case LONG:    return Long.parseLong(val);
-        case STRING:  assertTrue(rawResponse, val != null && val.length() > 0 ); return val;
-        case DATE:    assertTrue(rawResponse, val != null && val.length() > 0 ); return val;
+    try (SolrCore core = h.getCore()) {
+      String val = core.getResourceLoader().getXPath().compile(sb.toString()).evaluate(doc, XPathConstants.STRING).toString();
+      try {
+        switch (type) {
+          case INTEGER:
+            return Integer.parseInt(val);
+          case DOUBLE:
+            return Double.parseDouble(val);
+          case FLOAT:
+            return Float.parseFloat(val);
+          case LONG:
+            return Long.parseLong(val);
+          case STRING:
+            assertTrue(rawResponse, val != null && val.length() > 0);
+            return val;
+          case DATE:
+            assertTrue(rawResponse, val != null && val.length() > 0);
+            return val;
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+        fail("Caught exception in getStatResult, xPath = " + sb.toString() + " \nraw data: " + rawResponse);
       }
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail("Caught exception in getStatResult, xPath = " + sb.toString() + " \nraw data: " + rawResponse);
+      fail("Unknown type used in getStatResult");
+      return null; // Really can't get here, but the compiler thinks we can!
     }
-    fail("Unknown type used in getStatResult");
-    return null; // Really can't get here, but the compiler thinks we can!
   }
 
 
@@ -201,7 +212,9 @@ public class LegacyAbstractAnalyticsTest extends SolrTestCaseJ4 {
   }
 
   public static SolrQueryRequest request(String...args){
-    return SolrTestCaseJ4.req( ObjectArrays.concat(BASEPARMS, args,String.class) );
+    SolrQueryRequest req = SolrTestCaseJ4.req(ObjectArrays.concat(BASEPARMS, args, String.class));
+    req.close();
+    return req;
   }
 
   public static SolrQueryRequest request(String[] args, String... additional){
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
index 93bd6e4..bdb12df 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/expression/LegacyFunctionTest.java
@@ -19,6 +19,8 @@ package org.apache.solr.analytics.legacy.expression;
 
 import org.apache.solr.analytics.legacy.LegacyAbstractAnalyticsTest;
 import org.apache.solr.analytics.legacy.facet.LegacyAbstractAnalyticsFacetTest;
+import org.apache.solr.common.util.IOUtils;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -79,6 +81,7 @@ public class LegacyFunctionTest extends LegacyAbstractAnalyticsTest {
     assertU(commit());
 
     setResponse(h.query(request(fileToStringArr(LegacyFunctionTest.class, fileName))));
+
   }
 
   @Test
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/facet/LegacyAbstractAnalyticsFacetTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/facet/LegacyAbstractAnalyticsFacetTest.java
index 086fe09..c26055a 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/facet/LegacyAbstractAnalyticsFacetTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/legacy/facet/LegacyAbstractAnalyticsFacetTest.java
@@ -288,7 +288,9 @@ public class LegacyAbstractAnalyticsFacetTest extends SolrTestCaseJ4 {
   }
 
   public static SolrQueryRequest request(String...args){
-    return SolrTestCaseJ4.req( ObjectArrays.concat(BASEPARMS, args,String.class) );
+    SolrQueryRequest req = SolrTestCaseJ4.req(ObjectArrays.concat(BASEPARMS, args, String.class));
+    req.close();
+    return req;
   }
 
   public static final String[] BASEPARMS = new String[]{ "q", "*:*", "indent", "true", "olap", "true", "rows", "0" };
diff --git a/solr/contrib/analytics/src/test/org/apache/solr/analytics/value/CastingIntValueTest.java b/solr/contrib/analytics/src/test/org/apache/solr/analytics/value/CastingIntValueTest.java
index ebaedf3..6f2f378 100644
--- a/solr/contrib/analytics/src/test/org/apache/solr/analytics/value/CastingIntValueTest.java
+++ b/solr/contrib/analytics/src/test/org/apache/solr/analytics/value/CastingIntValueTest.java
@@ -19,12 +19,14 @@ package org.apache.solr.analytics.value;
 import java.util.Arrays;
 import java.util.Iterator;
 
+import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.analytics.value.AnalyticsValueStream.ExpressionType;
 import org.apache.solr.analytics.value.FillableTestValue.TestIntValue;
 import org.apache.solr.analytics.value.constant.ConstantIntValue;
 import org.junit.Test;
 
+@LuceneTestCase.Nightly
 public class CastingIntValueTest extends SolrTestCaseJ4 {
 
   @Test
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
index 60f908b..bcbc7ec 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
@@ -81,7 +81,7 @@ public abstract class AbstractDataImportHandlerTestCase extends
     LocalSolrQueryRequest request = lrf.makeRequest("command", "full-import",
             "debug", "on", "clean", "true", "commit", "true", "dataConfig",
             dataConfig);
-    return h.query("/dataimport", request);
+    return query("/dataimport", request);
   }
 
   protected void runDeltaImport(String dataConfig) throws Exception {
@@ -130,7 +130,7 @@ public abstract class AbstractDataImportHandlerTestCase extends
       l.add(e.getKey(),e.getValue());
     }
     LocalSolrQueryRequest request = new LocalSolrQueryRequest(h.getCore(), l, true);
-    h.query("/dataimport", request);
+    query("/dataimport", request);
   }
 
   /**
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
index 2941f58..7cc3a0c 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestDocBuilder2.java
@@ -117,7 +117,7 @@ public class TestDocBuilder2 extends AbstractDataImportHandlerTestCase {
             "debug", "on", "clean", "true", "commit", "true",
             "category", "search",
             "dataConfig", REQUEST_PARAM_AS_VARIABLE);
-    h.query("/dataimport", request);
+    query("/dataimport", request);
     assertQ(req("desc:ApacheSolr"), "//*[@numFound='1']");
   }
 
@@ -132,7 +132,7 @@ public class TestDocBuilder2 extends AbstractDataImportHandlerTestCase {
     LocalSolrQueryRequest request = lrf.makeRequest("command", "full-import",
         "debug", "on", "clean", "true", "commit", "true",
         "dataConfig", DATA_CONFIG_WITH_DYNAMIC_FIELD_NAMES);
-    h.query("/dataimport", request);
+    query("/dataimport", request);
     assertQ(req("id:101"), "//*[@numFound='1']", "//*[@name='101_s']");
   }
 
@@ -148,7 +148,7 @@ public class TestDocBuilder2 extends AbstractDataImportHandlerTestCase {
             "debug", "on", "clean", "true", "commit", "true",
             "mypk", "id", "text", "desc",
             "dataConfig", DATA_CONFIG_WITH_TEMPLATIZED_FIELD_NAMES);
-    h.query("/dataimport", request);
+    query("/dataimport", request);
     assertQ(req("id:101"), "//*[@numFound='1']");
   }
 
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
index aad8e30..618c89e 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestFileListWithLineEntityProcessor.java
@@ -39,7 +39,7 @@ public class TestFileListWithLineEntityProcessor extends AbstractDataImportHandl
     LocalSolrQueryRequest request = lrf.makeRequest(
         "command", "full-import", "dataConfig", config,
         "clean", "true", "commit", "true", "synchronous", "true", "indent", "true");
-    h.query("/dataimport", request);
+    query("/dataimport", request);
     
     assertQ(req("*:*"), "//*[@numFound='9']");
     assertQ(req("id:?\\ line\\ one"), "//*[@numFound='3']");
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestVariableResolverEndToEnd.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestVariableResolverEndToEnd.java
index 8ee6878..3390af0 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestVariableResolverEndToEnd.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestVariableResolverEndToEnd.java
@@ -36,11 +36,11 @@ public class TestVariableResolverEndToEnd  extends AbstractDIHJdbcTestCase {
 
   @Test
   public void test() throws Exception {
-    h.query("/dataimport", generateRequest());
+    query("/dataimport", generateRequest());
     SolrQueryRequest req = null;
     try {
       req = req("q", "*:*", "wt", "json", "indent", "true");
-      String response = h.query(req);
+      String response = query(req);
       log.debug(response);
       response = response.replaceAll("\\s","");
       Assert.assertTrue(response.contains("\"numFound\":1"));
diff --git a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
index 953d210..978e9fd 100644
--- a/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
+++ b/solr/contrib/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
@@ -26,6 +26,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -65,7 +66,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testExtraction() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
     loadLocal("extraction/solr-word.pdf",
             "fmap.created", "extractedDate",
@@ -226,7 +229,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testDefaultField() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertNotNull("handler is null and it shouldn't be", handler);
 
     try {
@@ -273,7 +278,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testLiterals() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
     //test literal
     loadLocal("extraction/version_control.xml", "fmap.created", "extractedDate", "fmap.producer", "extractedProducer",
@@ -399,7 +406,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testPlainTextSpecifyingMimeType() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
     // Load plain text specifying MIME type:
@@ -419,7 +428,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testPlainTextSpecifyingResourceName() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
     // Load plain text specifying filename
@@ -439,7 +450,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testCommitWithin() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
     
     SolrQueryRequest req = req("literal.id", "one",
@@ -464,7 +477,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testExtractOnly() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
     SolrQueryResponse rsp = loadLocal("extraction/solr-word.pdf", ExtractingParams.EXTRACT_ONLY, "true");
     assertTrue("rsp is null and it shouldn't be", rsp != null);
@@ -501,7 +516,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testXPath() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
     SolrQueryResponse rsp = loadLocal("extraction/example.html",
             ExtractingParams.XPATH_EXPRESSION, "/xhtml:html/xhtml:body/xhtml:a/descendant::node()",
@@ -528,8 +545,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
   /** test arabic PDF extraction is functional */
   @Test
   public void testArabicPDF() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) 
-      h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
     loadLocal("extraction/arabic.pdf", "fmap.created", "extractedDate", "fmap.producer", "extractedProducer",
@@ -547,8 +565,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testTikaExceptionHandling() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) 
-      h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
     expectThrows(Exception.class, () -> {
@@ -577,7 +596,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
   
   @Test
   public void testWrongStreamType() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
 
     expectThrows(Exception.class, () -> {
@@ -598,7 +619,9 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
   }
 
   public void testLiteralsOverride() throws Exception {
-    ExtractingRequestHandler handler = (ExtractingRequestHandler) h.getCore().getRequestHandler("/update/extract");
+    SolrCore core = h.getCore();
+    ExtractingRequestHandler handler = (ExtractingRequestHandler) core.getRequestHandler("/update/extract");
+    core.close();
     assertTrue("handler is null and it shouldn't be", handler != null);
  
     assertQ(req("*:*"), "//*[@numFound='0']");
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
index 1b6a085..acf6ac6 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LangDetectLanguageIdentifierUpdateProcessorFactoryTest.java
@@ -18,12 +18,15 @@ package org.apache.solr.update.processor;
 
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.junit.Test;
 
 public class LangDetectLanguageIdentifierUpdateProcessorFactoryTest extends LanguageIdentifierUpdateProcessorFactoryTestCase {
   @Override
   protected LanguageIdentifierUpdateProcessor createLangIdProcessor(ModifiableSolrParams parameters) throws Exception {
-    return new LangDetectLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(h.getCore(), parameters, null), resp, null);
+    try (SolrCore core = h.getCore()) {
+      return new LangDetectLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(core, parameters, null), resp, null);
+    }
   }
   
   // this one actually works better it seems with short docs
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
index 5fa010c..5f8232f 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/LanguageIdentifierUpdateProcessorFactoryTestCase.java
@@ -45,6 +45,7 @@ public abstract class LanguageIdentifierUpdateProcessorFactoryTestCase extends S
     assertNotNull(chained);
     chained = core.getUpdateProcessingChain("lang_id_opennlp");
     assertNotNull(chained);
+    core.close();
   }
 
   @Override
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
index 1d9dbeb..dfcb765 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/OpenNLPLangDetectUpdateProcessorFactoryTest.java
@@ -19,6 +19,7 @@ package org.apache.solr.update.processor;
 
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.junit.Test;
 
@@ -33,11 +34,13 @@ public class OpenNLPLangDetectUpdateProcessorFactoryTest extends LanguageIdentif
     if (parameters.get("langid.threshold") == null) { // handle superclass tests that don't provide confidence threshold
       parameters.set("langid.threshold", "0.3");
     }
-    SolrQueryRequest req = _parser.buildRequestFrom(h.getCore(), new ModifiableSolrParams(), null);
-    OpenNLPLangDetectUpdateProcessorFactory factory = new OpenNLPLangDetectUpdateProcessorFactory();
-    factory.init(parameters.toNamedList());
-    factory.inform(h.getCore());
-    return (OpenNLPLangDetectUpdateProcessor)factory.getInstance(req, resp, null);
+    try (SolrCore core = h.getCore()) {
+      SolrQueryRequest req = _parser.buildRequestFrom(core, new ModifiableSolrParams(), null);
+      OpenNLPLangDetectUpdateProcessorFactory factory = new OpenNLPLangDetectUpdateProcessorFactory();
+      factory.init(parameters.toNamedList());
+      factory.inform(core);
+      return (OpenNLPLangDetectUpdateProcessor) factory.getInstance(req, resp, null);
+    }
   }
 
   // this one actually works better it seems with short docs
diff --git a/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java b/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
index d4e68a8..821a0d9 100644
--- a/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
+++ b/solr/contrib/langid/src/test/org/apache/solr/update/processor/TikaLanguageIdentifierUpdateProcessorFactoryTest.java
@@ -18,12 +18,15 @@ package org.apache.solr.update.processor;
 
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.junit.Test;
 
 public class TikaLanguageIdentifierUpdateProcessorFactoryTest extends LanguageIdentifierUpdateProcessorFactoryTestCase {
   @Override
   protected LanguageIdentifierUpdateProcessor createLangIdProcessor(ModifiableSolrParams parameters) throws Exception {
-    return new TikaLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(h.getCore(), parameters, null), resp, null);
+    try (SolrCore core = h.getCore()) {
+      return new TikaLanguageIdentifierUpdateProcessor(_parser.buildRequestFrom(core, parameters, null), resp, null);
+    }
   }
 
 
diff --git a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
index f7c558b..fcf51eb 100644
--- a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
+++ b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
@@ -193,7 +193,7 @@ public class AnnotatedApi extends Api implements PermissionNameProvider {
     final String command;
     final Method method;
     final Object obj;
-    ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper();
+    ObjectMapper mapper = SolrJacksonAnnotationInspector.INSTANCE.createObjectMapper();
     int paramsCount;
     Class c;
     boolean isWrappedInPayloadObj = false;
diff --git a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
index bf7c22b..1fd0b73 100644
--- a/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
+++ b/solr/core/src/java/org/apache/solr/client/solrj/embedded/EmbeddedSolrServer.java
@@ -46,6 +46,7 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.CoreContainer;
@@ -195,9 +196,11 @@ public class EmbeddedSolrServer extends SolrClient {
     // Check for cores action
     SolrQueryRequest req = null;
     SolrCore core = null;
+    boolean closeCore = false;
     try {
       if (req == null) {
         core = coreContainer.getCore(coreName);
+        closeCore = true;
       } else {
         core = req.getCore();
       }
@@ -280,10 +283,9 @@ public class EmbeddedSolrServer extends SolrClient {
       ParWork.propagateInterrupt(ex);
       throw new SolrServerException(ex);
     } finally {
-      if (req != null) {
-        req.close();
-      } else {
-        core.close();
+      IOUtils.closeQuietly(req);
+      if (closeCore) {
+        IOUtils.closeQuietly(core);
       }
       SolrRequestInfo.clearRequestInfo();
     }
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
index fac8d25..6ec7248 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkShardTerms.java
@@ -108,7 +108,7 @@ public class ZkShardTerms implements Closeable {
     this.zkClient = zkClient;
     retryRegisterWatcher();
     if (terms.get() == null) {
-      terms.set(new ShardTerms(new ConcurrentHashMap<>(), -1));
+      terms.set(new ShardTerms(Collections.emptyMap(), -1));
     }
     assert ObjectReleaseTracker.track(this);
   }
@@ -358,7 +358,12 @@ public class ZkShardTerms implements Closeable {
    * Fetch latest terms from ZK
    */
   public void refreshTerms(boolean setWatch, int version) throws KeeperException {
-    lock.lock();
+    try {
+      lock.lockInterruptibly();
+    } catch (InterruptedException e) {
+      ParWork.propagateInterrupt(e);
+      throw new AlreadyClosedException(e);
+    }
     try {
       ShardTerms newTerms;
       Watcher watcher = event -> {
@@ -384,7 +389,7 @@ public class ZkShardTerms implements Closeable {
       try {
         Stat stat = new Stat();
         byte[] data = zkClient.getData(znodePath, setWatch ? watcher : null, stat, true);
-        ConcurrentHashMap<String,Long> values = new ConcurrentHashMap<>((Map<String,Long>) Utils.fromJSON(data));
+        Map<String,Long> values = Collections.unmodifiableMap(new HashMap<>((Map<String,Long>) Utils.fromJSON(data)));
         // nocommit
         log.info("refresh shard terms to zk version {}", stat.getVersion());
         newTerms = new ShardTerms(values, stat.getVersion());
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index cfa1301..c4eb8d3 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -714,7 +714,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   public SolrCore reload(ConfigSet coreConfig) throws IOException, InterruptedException {
     log.info("Reload SolrCore");
 
-    if (coreContainer.isShutDown() || isClosed() || closing) {
+    if (closing) {
       throw new AlreadyClosedException();
     }
     // only one reload at a time
@@ -724,7 +724,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     try {
       if (!locked && reloadyWaiting.get() > 1) {
         log.info("Skipping recovery because there is another already queued");
-        lock.lock();
+        lock.lockInterruptibly();
         lock.unlock();
         return null;
       }
@@ -1731,7 +1731,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
   public void closeAndWait() {
     close();
 
-    int timeouts = 180;
+    int timeouts = 30;
 
     TimeOut timeout = new TimeOut(timeouts, TimeUnit.SECONDS, TimeSource.NANO_TIME);
     int cnt = 0;
@@ -1739,9 +1739,9 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       cnt++;
       try {
         synchronized (closeAndWait) {
-          closeAndWait.wait(1);
+          closeAndWait.wait(250);
         }
-        if (cnt >= 3 && !closing) {
+        if (cnt >= 2 && !closing) {
           close();
         }
         log.warn("close count is {} {} closing={} isClosed={}", name, refCount.get(), closing, isClosed);
@@ -1760,7 +1760,12 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     try {
       if (getUpdateHandler() != null && getUpdateHandler().getSolrCoreState() != null) {
         reloadLock = getUpdateHandler().getSolrCoreState().getReloadLock();
-        reloadLock.lock();
+        try {
+          reloadLock.lockInterruptibly();
+        } catch (InterruptedException e) {
+          ParWork.propagateInterrupt(e);
+          throw new AlreadyClosedException(e);
+        }
       }
 
       if (closing) {
@@ -2307,7 +2312,13 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     }
 
     // use the searcher lock to prevent multiple people from trying to open at once
-    openSearcherLock.lock();
+    try {
+      openSearcherLock.lockInterruptibly();
+    } catch (InterruptedException e) {
+      ParWork.propagateInterrupt(e);
+      throw new AlreadyClosedException(e);
+    }
+
     try {
 
       // try again
@@ -2351,7 +2362,12 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     if (coreContainer.isShutDown()) {
       throw new AlreadyClosedException();
     }
-    openSearcherLock.lock();
+    try {
+      openSearcherLock.lockInterruptibly();
+    } catch (InterruptedException e) {
+      ParWork.propagateInterrupt(e);
+      throw new AlreadyClosedException(e);
+    }
     try {
 
       String newIndexDir = getNewIndexDir();
@@ -2482,7 +2498,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       ParWork.propagateInterrupt(e);
       throw new SolrException(ErrorCode.SERVER_ERROR, "Error opening new searcher", e);
     } finally {
-      openSearcherLock.unlock();
+      if (openSearcherLock != null && openSearcherLock.isHeldByCurrentThread()) openSearcherLock.unlock();
       if (newestSearcher != null) {
         newestSearcher.decref();
       }
@@ -2623,7 +2639,12 @@ public final class SolrCore implements SolrInfoBean, Closeable {
     RefCounted<SolrIndexSearcher> searchHolder = null;
     boolean success = false;
     AtomicBoolean registered = new AtomicBoolean(false);
-    openSearcherLock.lock();
+    try {
+      openSearcherLock.lockInterruptibly();
+    } catch (InterruptedException e) {
+      ParWork.propagateInterrupt(e);
+      throw new AlreadyClosedException(e);
+    }
     Timer.Context timerContext = newSearcherTimer.time();
     try {
       searchHolder = openNewSearcher(updateHandlerReopens, false);
@@ -2797,7 +2818,7 @@ public final class SolrCore implements SolrInfoBean, Closeable {
       } finally {
         // we want to do this after we decrement onDeckSearchers so another thread
         // doesn't increment first and throw a false warning.
-        openSearcherLock.unlock();
+        if (openSearcherLock != null && openSearcherLock.isHeldByCurrentThread()) openSearcherLock.unlock();
       }
     }
 
diff --git a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
index 6e81ce3..019f352 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrResourceLoader.java
@@ -89,8 +89,6 @@ import javax.xml.xpath.XPathExpression;
 public class SolrResourceLoader implements ResourceLoader, Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-
-
   private static final String base = "org.apache.solr";
   private static final String[] packages = {
       "", "analysis.", "schema.", "handler.", "handler.tagger.", "search.", "update.", "core.", "response.", "request.",
@@ -99,27 +97,18 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
   };
   private static final Charset UTF_8 = StandardCharsets.UTF_8;
   public static final URL[] EMPTY_URL_ARRAY = new URL[0];
+  private static XPathFactoryImpl xpathFactory;
   private final SystemIdResolver sysIdResolver;
 
-  public volatile Configuration conf;
-
-  public volatile XPathFactoryImpl xpathFactory;
-
-
-  public XPathExpression shardHandlerFactoryExp;
-  public XPathExpression counterExp;
-  public XPathExpression meterExp;
-  public XPathExpression timerExp;
-  public XPathExpression histoExp;
-  public XPathExpression historyExp;
-  public XPathExpression transientCoreCacheFactoryExp;
-  public XPathExpression tracerConfigExp;
+  public static XPathFactoryImpl getXpathFactory() {
+    return xpathFactory;
+  }
 
-  public XPathExpression coreLoadThreadsExp;
-  public XPathExpression persistentExp;
-  public XPathExpression sharedLibExp;
-  public XPathExpression zkHostExp;
-  public XPathExpression coresExp;
+  static String luceneMatchVersionPath = "/config/" + IndexSchema.LUCENE_MATCH_VERSION_PARAM;
+  static String indexDefaultsPath = "/config/indexDefaults";
+  static String mainIndexPath = "/config/mainIndex";
+  static String nrtModePath = "/config/indexConfig/nrtmode";
+  static String unlockOnStartupPath = "/config/indexConfig/unlockOnStartup";
 
   static String shardHandlerFactoryPath = "solr/shardHandlerFactory";
   static String counterExpPath = "solr/metrics/suppliers/counter";
@@ -136,16 +125,6 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
   static String  zkHostPath = "solr/@zkHost";
   static String  coresPath = "solr/cores";
 
-  public XPathExpression xpathOrExp;
-  public XPathExpression schemaNameExp;
-  public XPathExpression schemaVersionExp;
-  public XPathExpression schemaSimExp;
-  public XPathExpression defaultSearchFieldExp;
-  public XPathExpression solrQueryParserDefaultOpExp;
-  public XPathExpression schemaUniqueKeyExp;
-  public XPathExpression fieldTypeXPathExpressionsExp;
-  public XPathExpression copyFieldsExp;
-
   public static String schemaNamePath = IndexSchema.stepsToPath(IndexSchema.SCHEMA, IndexSchema.AT + IndexSchema.NAME);
   public static String schemaVersionPath = "/schema/@version";
 
@@ -161,29 +140,65 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
 
   public static String schemaUniqueKeyPath = IndexSchema.stepsToPath(IndexSchema.SCHEMA, IndexSchema.UNIQUE_KEY, IndexSchema.TEXT_FUNCTION);
 
-  public XPathExpression luceneMatchVersionExp;
-  public XPathExpression indexDefaultsExp;
-  public XPathExpression mainIndexExp;
-  public XPathExpression nrtModeExp;
-  public XPathExpression unlockOnStartupExp;
-
-  static String luceneMatchVersionPath = "/config/" + IndexSchema.LUCENE_MATCH_VERSION_PARAM;
-  static String indexDefaultsPath = "/config/indexDefaults";
-  static String mainIndexPath = "/config/mainIndex";
-  static String nrtModePath = "/config/indexConfig/nrtmode";
-  static String unlockOnStartupPath = "/config/indexConfig/unlockOnStartup";
 
+  public static XPathExpression shardHandlerFactoryExp;
+  public static XPathExpression counterExp;
+  public static XPathExpression meterExp;
+  public static XPathExpression timerExp;
+  public static XPathExpression histoExp;
+  public static XPathExpression historyExp;
+  public static XPathExpression transientCoreCacheFactoryExp;
+  public static XPathExpression tracerConfigExp;
+
+  public static XPathExpression coreLoadThreadsExp;
+  public static XPathExpression persistentExp;
+  public static XPathExpression sharedLibExp;
+  public static XPathExpression zkHostExp;
+  public static XPathExpression coresExp;
+
+  public static XPathExpression xpathOrExp;
+  public static XPathExpression schemaNameExp;
+  public static XPathExpression schemaVersionExp;
+  public static XPathExpression schemaSimExp;
+  public static XPathExpression defaultSearchFieldExp;
+  public static XPathExpression solrQueryParserDefaultOpExp;
+  public static XPathExpression schemaUniqueKeyExp;
+  public static XPathExpression fieldTypeXPathExpressionsExp;
+  public static XPathExpression copyFieldsExp;
+
+  public static XPathExpression luceneMatchVersionExp;
+  public static XPathExpression indexDefaultsExp;
+  public static XPathExpression mainIndexExp;
+  public static XPathExpression nrtModeExp;
+  public static XPathExpression unlockOnStartupExp;
+
+  private final Configuration ourConf;
+
+  {
+    Configuration conf = Configuration.newConfiguration();
+    conf.setNamePool(this.conf.getNamePool());
+    conf.setDocumentNumberAllocator(this.conf.getDocumentNumberAllocator());
+    ourConf = conf;
+  }
+
+  static volatile Configuration conf;
+  static {
+    refreshConf();
+  }
 
-   {
-    conf = Configuration.newConfiguration();
+  public static void refreshConf() {
+    try {
+      if (conf != null) {
+        conf.close();
+      }
+      conf = Configuration.newConfiguration();
 
-    conf.setValidation(false);
-    conf.setXIncludeAware(true);
-    conf.setExpandAttributeDefaults(true);
+      conf.setValidation(false);
+      conf.setXIncludeAware(true);
+      conf.setExpandAttributeDefaults(true);
 
-    xpathFactory = new XPathFactoryImpl(conf.makePipelineConfiguration().getConfiguration());
+      xpathFactory = new XPathFactoryImpl(conf);
 
-    try {
       XPath xpath = xpathFactory.newXPath();
 
       luceneMatchVersionExp = xpath.compile(luceneMatchVersionPath);
@@ -246,10 +261,10 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
 
     } catch (Exception e) {
       log.error("", e);
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
     }
   }
 
-
   private String name = "";
   protected volatile URLClassLoader classLoader;
   protected volatile URLClassLoader resourceClassLoader;
@@ -371,7 +386,7 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
   }
 
   public Configuration getConf() {
-    return conf;
+    return ourConf;
   }
 
   /**
@@ -996,6 +1011,6 @@ public class SolrResourceLoader implements ResourceLoader, Closeable {
   }
 
   public XPath getXPath() {
-    return xpathFactory.newXPath();
+    return getXpathFactory().newXPath();
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java b/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
index acd84ee..e2568ca 100644
--- a/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
+++ b/solr/core/src/java/org/apache/solr/core/XmlConfigFile.java
@@ -154,6 +154,8 @@ public class XmlConfigFile { // formerly simply "Config"
         ParseOptions po = plc.getParseOptions();
         if (is.getSystemId() != null) {
           po.setEntityResolver(loader.getSysIdResolver());
+        } else {
+          po.setEntityResolver(null);
         }
         po.setXIncludeAware(true);
         po.setCheckEntityReferences(false);
@@ -162,7 +164,10 @@ public class XmlConfigFile { // formerly simply "Config"
         po.setPleaseCloseAfterUse(true);
         Sender.send(source, builder, po);
         docTree = (TinyDocumentImpl) builder.getCurrentRoot();
-      } finally {
+      } catch (Exception e) {
+        log.error("Exception handling xml doc", e);
+        throw e;
+      }  finally {
         builder.close();
         builder.reset();
       }
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index a154061..a0500dc 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -175,8 +175,6 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
 
   private final ReentrantLock indexFetchLock = new ReentrantLock(true);
 
-  private final ExecutorService restoreExecutor = ParWork.getMyPerThreadExecutor();
-
   private volatile Future<Boolean> restoreFuture;
 
   private volatile String currentRestoreName;
@@ -407,7 +405,12 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
 
     String masterUrl = solrParams == null ? null : solrParams.get(MASTER_URL);
 
-    indexFetchLock.lock();
+    try {
+      indexFetchLock.lockInterruptibly();
+    } catch (InterruptedException e) {
+      ParWork.propagateInterrupt(e);
+      throw new org.apache.solr.common.AlreadyClosedException(e);
+    }
     log.info("Got index fetch lock");
 
     try {
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
index 42eebb6..fbc2588 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -70,7 +70,7 @@ public class PackageAPI {
   public static final String ERR_MSG = "Package loading is not enabled , Start your nodes with -Denable.packages=true";
 
   final CoreContainer coreContainer;
-  private final ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper();
+  private final ObjectMapper mapper = SolrJacksonAnnotationInspector.INSTANCE.createObjectMapper();
   private final PackageLoader packageLoader;
   Packages pkgs;
 
diff --git a/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
index db07c36..aca4a6f 100644
--- a/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
+++ b/solr/core/src/java/org/apache/solr/request/LocalSolrQueryRequest.java
@@ -74,7 +74,7 @@ public class LocalSolrQueryRequest extends SolrQueryRequestBase {
   public LocalSolrQueryRequest(SolrCore core, NamedList args, boolean closeCore) {
     super(core, args.toSolrParams());
     this.closeCore = closeCore;
-    //assert ObjectReleaseTracker.track(this);
+    assert ObjectReleaseTracker.track(this);
   }
 
   public LocalSolrQueryRequest(SolrCore core, Map<String,String[]> args) {
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
index 0799598..af6eb02 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java
@@ -89,6 +89,7 @@ import org.apache.solr.security.AuditEvent;
 import org.apache.solr.security.AuthenticationPlugin;
 import org.apache.solr.security.PKIAuthenticationPlugin;
 import org.apache.solr.security.PublicKeyHandler;
+import org.apache.solr.util.SolrJacksonAnnotationInspector;
 import org.apache.solr.util.StartupLoggingUtils;
 import org.apache.solr.util.configuration.SSLConfigurationsFactory;
 import org.apache.solr.util.tracing.GlobalTracer;
@@ -109,8 +110,8 @@ public class SolrDispatchFilter extends BaseSolrFilter {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   static {
-    log.warn("expected pre init of xml factories {} {} {}",
-        FieldTypeXmlAdapter.dbf, XMLResponseParser.inputFactory, XMLResponseParser.saxFactory);
+    log.warn("expected pre init of factories {} {} {} {}",
+        FieldTypeXmlAdapter.dbf, XMLResponseParser.inputFactory, XMLResponseParser.saxFactory, SolrJacksonAnnotationInspector.INSTANCE);
   }
 
   private volatile StopRunnable stopRunnable;
@@ -405,7 +406,7 @@ public class SolrDispatchFilter extends BaseSolrFilter {
   
   @Override
   public void destroy() {
-    if (cores.isZooKeeperAware())  {
+    if (cores != null && cores.isZooKeeperAware())  {
       MDCLoggingContext.setNode(cores.getZkController().getNodeName());
     }
     try {
@@ -541,8 +542,12 @@ public class SolrDispatchFilter extends BaseSolrFilter {
         ExecutorUtil.setServerThreadFlag(null);
       }
     } catch(Exception e) {
-      log.error("Solr ran into an unexpected problem and doesn't seem to know more about it.", e);
-      response.sendError(500, e.getMessage());
+      log.error("Solr ran into an unexpected problem.", e);
+      int code = 500;
+      if (e instanceof SolrException) {
+        code = ((SolrException) e).code();
+      }
+      response.sendError(code, e.getClass().getName() + " " + e.getMessage());
     } finally {
       if (span != null) span.finish();
       if (scope != null) scope.close();
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
index 2b8859a..269a29f 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
@@ -333,9 +333,9 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
         try {
           doLocalAdd(cmd);
         } catch (Exception e) {
-          if (distFuture != null) {
+          if (distFuture != null && isLeader) {
             distFuture.cancel(true);
-            cancelCmds.add(cmd);
+            cancelCmds.add(cloneCmd);
           }
           if (e instanceof RuntimeException) {
             throw (RuntimeException) e;
@@ -960,7 +960,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor {
       } else {
         t = e;
       }
-      if (distFuture != null) {
+      if (distFuture != null && isLeader) {
         distFuture.cancel(true);
         cancelCmds.add(cmd);
       }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
index d7d6d91..e701e26 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
@@ -1338,7 +1338,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
       return;
     }
 
-    if (zkController.getZkClient().isAlive()) {
+    if (!(isLeader || isSubShardLeader) || zkController.getZkClient().isAlive()) {
       return;
     }
 
diff --git a/solr/core/src/java/org/apache/solr/util/SafeXMLParsing.java b/solr/core/src/java/org/apache/solr/util/SafeXMLParsing.java
index 82563a7..f9db583 100644
--- a/solr/core/src/java/org/apache/solr/util/SafeXMLParsing.java
+++ b/solr/core/src/java/org/apache/solr/util/SafeXMLParsing.java
@@ -21,6 +21,7 @@ import org.apache.solr.common.EmptyEntityResolver;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.XMLErrorLogger;
+import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.rest.schema.FieldTypeXmlAdapter;
 import org.slf4j.Logger;
 import org.w3c.dom.Document;
diff --git a/solr/core/src/java/org/apache/solr/util/SolrJacksonAnnotationInspector.java b/solr/core/src/java/org/apache/solr/util/SolrJacksonAnnotationInspector.java
index 1b59dce..8d2ef67 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrJacksonAnnotationInspector.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrJacksonAnnotationInspector.java
@@ -87,7 +87,7 @@ public class SolrJacksonAnnotationInspector extends AnnotationIntrospector {
     return findNameForSerialization(a);
   }
 
-  public static ObjectMapper createObjectMapper(){
+  public ObjectMapper createObjectMapper(){
     ObjectMapper mapper = new ObjectMapper();
     mapper.setAnnotationIntrospector(INSTANCE);
     return mapper;
diff --git a/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java b/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
index f2ecb2a..d9cf23a 100644
--- a/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
+++ b/solr/core/src/test/org/apache/solr/BasicFunctionalityTest.java
@@ -234,6 +234,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     
     assertU(h.simpleTag("rollback"));
     assertU(commit());
+    core.close();
   }
 
 
@@ -369,13 +370,15 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
           msg1.contains(BAD_VALUE));
       assertTrue("client error does not mention document id: " + msg1,
           msg1.contains("[doc=100]"));
-      SchemaField sf = h.getCore().getLatestSchema().getField(field);
+      SolrCore core = h.getCore();
+      SchemaField sf = core.getLatestSchema().getField(field);
+      core.close();
       if (!sf.hasDocValues() && !sf.indexed()) {
         continue;
       }
       SolrException e2 = expectThrows(SolrException.class,
           "Didn't encounter an error trying to add a bad date: " + field,
-          () -> h.query(req("q",field + ":" + BAD_VALUE))
+          () -> query(req("q",field + ":" + BAD_VALUE))
       );
       String msg2 = e2.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg2,
@@ -385,7 +388,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
 
       SolrException e3 = expectThrows(SolrException.class,
           "Didn't encounter an error trying to add a bad date: " + field,
-          () -> h.query(req("q",field + ":[NOW TO " + BAD_VALUE + "]"))
+          () -> query(req("q",field + ":[NOW TO " + BAD_VALUE + "]"))
       );
       String msg3 = e3.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg3,
@@ -425,14 +428,16 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
           msg1.contains(BAD_VALUE));
       assertTrue("client error does not mention document id",
           msg1.contains("[doc=100]"));
-      SchemaField sf = h.getCore().getLatestSchema().getField(field); 
+      SolrCore core = h.getCore();
+      SchemaField sf = core.getLatestSchema().getField(field);
+      core.close();
       if (!sf.hasDocValues() && !sf.indexed()) {
         continue;
       }
 
       SolrException e2 = expectThrows(SolrException.class,
           "Didn't encounter an error trying to add a non-number: " + field,
-          () -> h.query(req("q",field + ":" + BAD_VALUE))
+          () -> query(req("q",field + ":" + BAD_VALUE))
       );
       String msg2 = e2.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg2,
@@ -442,7 +447,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
 
       SolrException e3 = expectThrows(SolrException.class,
           "Didn't encounter an error trying to add a non-number: " + field,
-          () -> h.query(req("q",field + ":[10 TO " + BAD_VALUE + "]"))
+          () -> query(req("q",field + ":[10 TO " + BAD_VALUE + "]"))
       );
       String msg3 = e3.toString();
       assertTrue("not a (search) client error on field: " + field +" : "+ msg3,
@@ -467,7 +472,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     handler.init(new NamedList());
     SolrQueryResponse rsp = new SolrQueryResponse();
     SolrQueryRequest req = req();
-    h.getCore().execute(handler, 
+    req.getCore().execute(handler,
                         req,
                         rsp);
     assertNotNull("should have found an exception", rsp.getException());
@@ -500,7 +505,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     assertQ(req("text:hello")
             ,"//*[@numFound='2']"
             );
-    String resp = h.query(lrf.makeRequest("q", "text:hello", CommonParams.DEBUG_QUERY, "true"));
+    String resp = query(lrf.makeRequest("q", "text:hello", CommonParams.DEBUG_QUERY, "true"));
     //System.out.println(resp);
     // second doc ranked first
     assertTrue( resp.indexOf("\"2\"") < resp.indexOf("\"1\"") );
@@ -519,7 +524,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     assertQ(req("text:hello"),
             "//*[@numFound='2']"
             );
-    String resp = h.query(lrf.makeRequest("q", "text:hello", CommonParams.DEBUG_QUERY, "true"));
+    String resp = query(lrf.makeRequest("q", "text:hello", CommonParams.DEBUG_QUERY, "true"));
     //System.out.println(resp);
     // second doc ranked first
 ;    assertTrue( resp.indexOf("\"2\"") < resp.indexOf("\"1\"") );
@@ -787,6 +792,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     SolrQueryRequest req = req("q", "id:7777", "fl", "id,title,test_hlt");
     SolrQueryResponse rsp = new SolrQueryResponse();
     core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
+    core.close();
 
     DocList dl = ((ResultContext) rsp.getResponse()).getDocList();
     Document d = req.getSearcher().doc(dl.iterator().nextDoc());
@@ -812,6 +818,7 @@ public class BasicFunctionalityTest extends SolrTestCaseJ4 {
     SolrQueryRequest req = req("q", "id:7777", "fl", "id,title");
     SolrQueryResponse rsp = new SolrQueryResponse();
     core.execute(core.getRequestHandler(req.getParams().get(CommonParams.QT)), req, rsp);
+    core.close();
 
     DocList dl = ((ResultContext) rsp.getResponse()).getDocList();
     DocIterator di = dl.iterator();    
diff --git a/solr/core/src/test/org/apache/solr/ConvertedLegacyTest.java b/solr/core/src/test/org/apache/solr/ConvertedLegacyTest.java
index ed560d9..3462079 100644
--- a/solr/core/src/test/org/apache/solr/ConvertedLegacyTest.java
+++ b/solr/core/src/test/org/apache/solr/ConvertedLegacyTest.java
@@ -133,7 +133,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 2, 5 , args);
+                                    "/select", 2, 5 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=1] "
@@ -142,28 +142,28 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 3, 5 , args);
+                                    "/select", 3, 5 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 4, 5 , args);
+                                    "/select", 4, 5 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 25, 5 , args);
+                                    "/select", 25, 5 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 0, 1 , args);
+                                    "/select", 0, 1 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=1] "
@@ -171,7 +171,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 0, 2 , args);
+                                    "/select", 0, 2 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=2] "
@@ -179,7 +179,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 1, 1 , args);
+                                    "/select", 1, 1 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=1] "
@@ -187,28 +187,28 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 3, 1 , args);
+                                    "/select", 3, 1 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 4, 1 , args);
+                                    "/select", 4, 1 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 1, 0 , args);
+                                    "/select", 1, 0 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
             );
     args = new HashMap<>();
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 0, 0 , args);
+                                    "/select", 0, 0 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
@@ -216,7 +216,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("sort","val_s1 asc");
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 0, 0 , args);
+                                    "/select", 0, 0 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
@@ -224,7 +224,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("sort","val_s1 desc");
     req = new LocalSolrQueryRequest(h.getCore(), "val_s:[a TO z]",
-                                    "/select", 0, 0 , args);
+                                    "/select", 0, 0 , args, true);
     assertQ(req
             ,"//*[@numFound='3'] "
             ,"*[count(//doc)=0]"
@@ -1113,7 +1113,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","fname_s,arr_f  ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//str[.='Yonik']  "
             ,"//float[.='1.4142135']"
@@ -1121,7 +1121,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","fname_s,score");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//str[.='Yonik']"
             ,"//float[@name='score' and . > 0]"
@@ -1132,7 +1132,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","score,* ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//str[.='Yonik']  "
             ,"//float[.='1.4142135'] "
@@ -1142,7 +1142,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","*,score ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//str[.='Yonik']  "
             ,"//float[.='1.4142135'] "
@@ -1152,7 +1152,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","* ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//str[.='Yonik']  "
             ,"//float[.='1.4142135'] "
@@ -1164,7 +1164,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args = new HashMap<>();
     args.put("fl","score ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//result[@maxScore>0]"
             );
@@ -1172,14 +1172,14 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args.put("fl","score ");
     args.put("sort","id desc");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//result[@maxScore>0]"
             );
     args = new HashMap<>();
     args.put("fl","score ");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 10, args);
+                                    "/select", 0, 10, args, true);
     assertQ(req
             ,"//@maxScore = //doc/float[@name='score']"
             );
@@ -1195,7 +1195,7 @@ public class ConvertedLegacyTest extends SolrTestCaseJ4 {
     args.put("fl","*,score");
     args.put("sort","id desc");
     req = new LocalSolrQueryRequest(h.getCore(), "id:44",
-                                    "/select", 0, 0 , args);
+                                    "/select", 0, 0 , args, true);
     assertQ(req
             ,"//result[@maxScore>0]"
             );
diff --git a/solr/core/src/test/org/apache/solr/DisMaxRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/DisMaxRequestHandlerTest.java
index dbd4c64..76a9952 100644
--- a/solr/core/src/test/org/apache/solr/DisMaxRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/DisMaxRequestHandlerTest.java
@@ -198,7 +198,7 @@ public class DisMaxRequestHandlerTest extends SolrTestCaseJ4 {
     // surrounded by ()'s in the debug output
     Pattern p = Pattern.compile("subject:hell\\s*subject:cool");
     Pattern p_bool = Pattern.compile("\\(subject:hell\\s*subject:cool\\)");
-    String resp = h.query(req("q", "cool stuff"
+    String resp = query(req("q", "cool stuff"
                 ,"qt", "/dismax"
                 ,CommonParams.VERSION, "2.2"
                 ,"bq", "subject:hell OR subject:cool"
@@ -207,7 +207,7 @@ public class DisMaxRequestHandlerTest extends SolrTestCaseJ4 {
     assertTrue(p.matcher(resp).find());
     assertFalse(p_bool.matcher(resp).find());
 
-    resp = h.query(req("q", "cool stuff"
+    resp = query(req("q", "cool stuff"
                 ,"qt", "/dismax"
                 ,CommonParams.VERSION, "2.2"
                 ,"bq", "subject:hell OR subject:cool"
diff --git a/solr/core/src/test/org/apache/solr/TestJoin.java b/solr/core/src/test/org/apache/solr/TestJoin.java
index c54f162..40dbea0 100644
--- a/solr/core/src/test/org/apache/solr/TestJoin.java
+++ b/solr/core/src/test/org/apache/solr/TestJoin.java
@@ -19,6 +19,7 @@ package org.apache.solr;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.Utils;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.junit.After;
 import org.junit.Before;
@@ -239,16 +240,19 @@ public class TestJoin extends SolrTestCaseJ4 {
           pivot = createJoinMap(model, fromField, toField);
           pivots.put(fromField+"/"+toField, pivot);
         }
-
-        Collection<Doc> fromDocs = model.values();
-        Set<Comparable> docs = join(fromDocs, pivot);
-        List<Doc> docList = new ArrayList<>(docs.size());
-        for (Comparable id : docs) docList.add(model.get(id));
-        Collections.sort(docList, createComparator("_docid_",true,false,false,false));
-        List sortedDocs = new ArrayList();
-        for (Doc doc : docList) {
-          if (sortedDocs.size() >= 10) break;
-          sortedDocs.add(doc.toObject(h.getCore().getLatestSchema()));
+        List<Doc> docList;
+        List sortedDocs;
+        try (SolrCore core = h.getCore()) {
+          Collection<Doc> fromDocs = model.values();
+          Set<Comparable> docs = join(fromDocs, pivot);
+          docList = new ArrayList<>(docs.size());
+          for (Comparable id : docs) docList.add(model.get(id));
+          Collections.sort(docList, createComparator("_docid_", true, false, false, false));
+          sortedDocs = new ArrayList();
+          for (Doc doc : docList) {
+            if (sortedDocs.size() >= 10) break;
+            sortedDocs.add(doc.toObject(core.getLatestSchema()));
+          }
         }
 
         Map<String,Object> resultSet = new LinkedHashMap<>();
@@ -265,7 +269,7 @@ public class TestJoin extends SolrTestCaseJ4 {
                 +"}*:*"
         );
 
-        String strResponse = h.query(req);
+        String strResponse = query(req);
 
         Object realResponse = Utils.fromJSONString(strResponse);
         String err = JSONTestUtil.matchObj("/response", realResponse, resultSet);
@@ -275,7 +279,7 @@ public class TestJoin extends SolrTestCaseJ4 {
           );
 
           // re-execute the request... good for putting a breakpoint here for debugging
-          String rsp = h.query(req);
+          String rsp = query(req);
 
           fail(err);
         }
diff --git a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
index c048e31..ebbfef7 100644
--- a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
+++ b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java
@@ -26,13 +26,13 @@ import java.util.Random;
 import org.apache.lucene.util.TestUtil;
 import org.apache.lucene.util.LuceneTestCase.Slow;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.schema.TrieIntField;
 import org.apache.solr.schema.IntPointField;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,22 +57,15 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 {
     
     initCore("solrconfig-basic.xml","schema-docValuesFaceting.xml");
 
-    assertEquals("DocValues: Schema assumptions are broken",
-                 false, h.getCore().getLatestSchema().getField("foo_i").hasDocValues());
-    assertEquals("DocValues: Schema assumptions are broken",
-                 true, h.getCore().getLatestSchema().getField("foo_i_dv").hasDocValues());
-    assertEquals("DocValues: Schema assumptions are broken",
-                 true, h.getCore().getLatestSchema().getField("foo_i_p").hasDocValues());
-    
-    assertEquals("Type: Schema assumptions are broken",
-                 TrieIntField.class,
-                 h.getCore().getLatestSchema().getField("foo_i").getType().getClass());
-    assertEquals("Type: Schema assumptions are broken",
-                 TrieIntField.class,
-                 h.getCore().getLatestSchema().getField("foo_i_dv").getType().getClass());
-    assertEquals("Type: Schema assumptions are broken",
-                 IntPointField.class,
-                 h.getCore().getLatestSchema().getField("foo_i_p").getType().getClass());
+    try (SolrCore core = h.getCore()) {
+      assertEquals("DocValues: Schema assumptions are broken", false, core.getLatestSchema().getField("foo_i").hasDocValues());
+      assertEquals("DocValues: Schema assumptions are broken", true, core.getLatestSchema().getField("foo_i_dv").hasDocValues());
+      assertEquals("DocValues: Schema assumptions are broken", true, core.getLatestSchema().getField("foo_i_p").hasDocValues());
+
+      assertEquals("Type: Schema assumptions are broken", TrieIntField.class, core.getLatestSchema().getField("foo_i").getType().getClass());
+      assertEquals("Type: Schema assumptions are broken", TrieIntField.class, core.getLatestSchema().getField("foo_i_dv").getType().getClass());
+      assertEquals("Type: Schema assumptions are broken", IntPointField.class, core.getLatestSchema().getField("foo_i_p").getType().getClass());
+    }
     
   }
 
@@ -275,7 +268,7 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 {
 
         // if (random().nextBoolean()) params.set("facet.mincount", "1");  // uncomment to test that validation fails
 
-        String strResponse = h.query(req(params));
+        String strResponse = query(req(params));
         // Object realResponse = ObjectBuilder.fromJSON(strResponse);
         // System.out.println(strResponse);
 
@@ -283,16 +276,16 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 {
       }
       // If there is a PointField option for this test, also test it
       // Don't check points if facet.mincount=0
-      if (h.getCore().getLatestSchema().getFieldOrNull(facet_field + "_p") != null
-          && params.get("facet.mincount") != null
-          && params.getInt("facet.mincount").intValue() > 0) {
-        params.set("facet.field", "{!key="+facet_field+"}"+facet_field+"_p");
-        String strResponse = h.query(req(params));
-        responses.add(strResponse);
+      try (SolrCore core = h.getCore()) {
+        if (core.getLatestSchema().getFieldOrNull(facet_field + "_p") != null && params.get("facet.mincount") != null && params.getInt("facet.mincount").intValue() > 0) {
+          params.set("facet.field", "{!key=" + facet_field + "}" + facet_field + "_p");
+          String strResponse = query(req(params));
+          responses.add(strResponse);
+        }
       }
 
       /**
-      String strResponse = h.query(req(params));
+      String strResponse = query(req(params));
       Object realResponse = ObjectBuilder.fromJSON(strResponse);
       **/
 
diff --git a/solr/core/src/test/org/apache/solr/TestTrie.java b/solr/core/src/test/org/apache/solr/TestTrie.java
index 0f21ff8..5d71669 100644
--- a/solr/core/src/test/org/apache/solr/TestTrie.java
+++ b/solr/core/src/test/org/apache/solr/TestTrie.java
@@ -26,7 +26,6 @@ import org.apache.solr.schema.TrieField;
 import org.apache.solr.util.DateMathParser;
 import org.junit.After;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -38,7 +37,6 @@ import org.junit.Test;
  * @deprecated Trie fields are deprecated as of Solr 7.0
  */
 @Deprecated
-@Ignore // MRM-TEST TODO: finish closing things right
 public class TestTrie extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
@@ -260,12 +258,19 @@ public class TestTrie extends SolrTestCaseJ4 {
             "facet.field", "tfloat",
             "facet.field", "tdouble");
     testFacetField(req, "tint", "0", "2");
+    h.getCore();
     testFacetField(req, "tint", "5", "1");
+    h.getCore();
     testFacetField(req, "tlong", String.valueOf(Integer.MAX_VALUE), "2");
+    h.getCore();
     testFacetField(req, "tlong", String.valueOf(Integer.MAX_VALUE+5L), "1");
+    h.getCore();
     testFacetField(req, "tfloat", String.valueOf(31.11f), "2");
+    h.getCore();
     testFacetField(req, "tfloat", String.valueOf(5*5*31.11f), "1");
+    h.getCore();
     testFacetField(req, "tdouble", String.valueOf(2.33d), "2");
+    h.getCore();
     testFacetField(req, "tdouble", String.valueOf(5*2.33d), "1");
   }
 
diff --git a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java b/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
index 447b830..0486abe 100644
--- a/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
+++ b/solr/core/src/test/org/apache/solr/analysis/TestReversedWildcardFilterFactory.java
@@ -237,5 +237,6 @@ public class TestReversedWildcardFilterFactory extends SolrTestCaseJ4 {
     parser.getReversedWildcardFilterFactory(typeSpy);
     // but it should reach only once 
     verify(typeSpy, times(1)).getIndexAnalyzer();
+    req.close();
   }
 }
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 7079840..0dc7e8f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ChaosMonkeySafeLeaderTest.java
@@ -44,7 +44,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 @Slow
-@LuceneTestCase.Nightly // TODO convert to bridge test class
+@LuceneTestCase.Nightly // MRM TODO: finish compare against control, look at setErrorHook
 public class ChaosMonkeySafeLeaderTest extends SolrCloudBridgeTestCase {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
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 6799001..7964c7b 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
@@ -29,7 +29,6 @@ import org.apache.solr.common.cloud.CollectionProperties;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,12 +72,12 @@ public class ZkCollectionPropsCachingTest extends SolrCloudTestCase {
     collectionProps.setCollectionProperty(collectionName, "property1", "value1");
     checkValue("property1", "value1"); //Should be no cache, so the change should take effect immediately
 
-    zkStateReader.getCollectionProperties(collectionName,900);
+    zkStateReader.getCollectionProperties(collectionName,100);
     zkStateReader.getZkClient().close();
     assertFalse(zkStateReader.isClosed());
     checkValue("property1", "value1"); //Should be cached, so the change should not try to hit zk
 
-    Thread.sleep(1000); // test the timeout feature
+    Thread.sleep(300); // test the timeout feature
     try {
       checkValue("property1", "value1"); //Should not be cached anymore
       fail("cache should have expired, prev line should throw an exception trying to access zookeeper after closed");
diff --git a/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java b/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java
index cdaa9bd..9c18cbc 100644
--- a/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java
+++ b/solr/core/src/test/org/apache/solr/core/TestCoreContainer.java
@@ -102,17 +102,19 @@ public class TestCoreContainer extends SolrTestCaseJ4 {
 
   @Test
   public void testReloadSequential() throws Exception {
-    SolrResourceLoader loader = h.getCore().getResourceLoader();
-    final CoreContainer cc = init(loader, CONFIGSETS_SOLR_XML);
-    try {
-      cc.create("core1", ImmutableMap.of("configSet", "minimal"));
-      cc.reload("core1");
-      cc.reload("core1");
-      cc.reload("core1");
-      cc.reload("core1");
+    try (SolrCore core = h.getCore()) {
+      SolrResourceLoader loader = core.getResourceLoader();
+      final CoreContainer cc = init(loader, CONFIGSETS_SOLR_XML);
+      try {
+        cc.create("core1", ImmutableMap.of("configSet", "minimal"));
+        cc.reload("core1");
+        cc.reload("core1");
+        cc.reload("core1");
+        cc.reload("core1");
 
-    } finally {
-      cc.shutdown();
+      } finally {
+        cc.shutdown();
+      }
     }
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
index 41eef1e..5b87e69 100644
--- a/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/JsonLoaderTest.java
@@ -174,13 +174,15 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     JsonLoader loader = new JsonLoader();
     String invalidJsonString = "}{";
 
-    SolrException ex = expectThrows(SolrException.class, () -> {
-      loader.load(req(), rsp, new ContentStreamBase.StringStream(invalidJsonString), p);
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
-    assertTrue(ex.getMessage().contains("Cannot parse"));
-    assertTrue(ex.getMessage().contains("JSON"));
-    p.close();
+    try (SolrQueryRequest req = req()) {
+      SolrException ex = expectThrows(SolrException.class, () -> {
+        loader.load(req, rsp, new ContentStreamBase.StringStream(invalidJsonString), p);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+      assertTrue(ex.getMessage().contains("Cannot parse"));
+      assertTrue(ex.getMessage().contains("JSON"));
+      p.close();
+    }
   }
 
   public void testSimpleFormatInAdd() throws Exception
@@ -260,6 +262,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
     assertEquals( 2, p.addCommands.size() );
     p.close();
+    req.close();
   }
 
   public void testJsonDocFormat() throws Exception{
@@ -295,6 +298,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
+    req.close();
 
     assertEquals( 2, p.addCommands.size() );
 
@@ -324,6 +328,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(doc), p);
     assertEquals( 2, p.addCommands.size() );
+    req.close();
 
     content = (String) p.addCommands.get(0).solrDoc.getFieldValue("_src_");
     assertNotNull(content);
@@ -343,6 +348,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
     req.getContext().put("path","/update/json/docs");
     rsp = new SolrQueryResponse();
     p.close();
+    req.close();
     p = new BufferingRequestProcessor(null);
     loader = new JsonLoader();
     loader.load(req, rsp, new ContentStreamBase.StringStream(json), p);
@@ -453,6 +459,7 @@ public class JsonLoaderTest extends SolrTestCaseJ4 {
       }
     }
     p.close();
+    req.close();
   }
 
   private static void assertOnlyValue(String expected, SolrInputDocument doc, String field) {
diff --git a/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java b/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java
index 292ffc9..5dabf69 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestCSVLoader.java
@@ -93,7 +93,7 @@ public class TestCSVLoader extends SolrTestCaseJ4 {
     f.setContentType("text/csv");
     cs.add(f);
     req.setContentStreams(cs);
-    h.query("/update",req);
+    query("/update",req);
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/handler/TestCoreBackup.java b/solr/core/src/test/org/apache/solr/handler/TestCoreBackup.java
index bf7bf00..fc17bdf 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestCoreBackup.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestCoreBackup.java
@@ -29,7 +29,9 @@ import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.core.CoreContainer;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.admin.CoreAdminHandler;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.After;
 import org.junit.Before;
@@ -66,10 +68,9 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     final CoreContainer cores = h.getCoreContainer();
     try (final CoreAdminHandler admin = new CoreAdminHandler(cores)) {
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-          (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-              "core", DEFAULT_TEST_COLLECTION_NAME, "name", snapshotName, "location", location)
-              , resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(), "core", DEFAULT_TEST_COLLECTION_NAME, "name", snapshotName, "location", location);
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(location, "snapshot." + snapshotName), 2);
     }
@@ -100,12 +101,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // first a backup before we've ever done *anything*...
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", "empty_backup1",
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "name", "empty_backup1",
+          "location", backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot.empty_backup1"),
                         0, initialEmptyIndexSegmentFileName);
@@ -113,11 +114,11 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
 
     { // Empty (named) snapshot..
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "commitName", "empty_snapshotA"),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "commitName", "empty_snapshotA");
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Snapshot A should have succeeded", resp.getException());
     }
     
@@ -125,12 +126,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
 
     { // second backup w/uncommited docs
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", "empty_backup2",
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "name", "empty_backup2",
+          "location", backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot.empty_backup2"),
                         0, initialEmptyIndexSegmentFileName);
@@ -138,11 +139,11 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // Second empty (named) snapshot..
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "commitName", "empty_snapshotB"),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "commitName", "empty_snapshotB");
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Snapshot A should have succeeded", resp.getException());
     }
 
@@ -158,14 +159,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     for (String snapName : Arrays.asList("empty_snapshotA", "empty_snapshotB")) {
       String name = "empty_backup_from_" + snapName;
       SolrQueryResponse resp = new SolrQueryResponse();
-      
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(), "core", DEFAULT_TEST_COLLECTION_NAME, "name", name,
+          "commitName", snapName, "location", backupDir.getAbsolutePath());
       admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", name,
-             "commitName", snapName,
-             "location", backupDir.getAbsolutePath()),
+        (req,
          resp);
+      req.close();
       assertNull("Backup "+name+" should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot." + name),
                         0, initialEmptyIndexSegmentFileName);
@@ -202,12 +201,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // take an initial 'backup1a' containing our 1 document
       final SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", "backup1a",
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "name", "backup1a",
+          "location", backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot.backup1a"),
                         1, oneDocSegmentFile);
@@ -215,11 +214,9 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // and an initial "snapshot1a' that should eventually match
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "commitName", "snapshot1a"),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(), "core", DEFAULT_TEST_COLLECTION_NAME, "commitName", "snapshot1a");
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Snapshot 1A should have succeeded", resp.getException());
     }
 
@@ -235,12 +232,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     { // we now have an index with two searchable docs, but a new 'backup1b' should still
       // be identical to the previous backup...
       final SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", "backup1b",
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "name", "backup1b",
+          "location", backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot.backup1b"),
                         1, oneDocSegmentFile);
@@ -248,11 +245,11 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // and a second "snapshot1b' should also still be identical
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "commitName", "snapshot1b"),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATESNAPSHOT.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "commitName", "snapshot1b");
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Snapshot 1B should have succeeded", resp.getException());
     }
 
@@ -266,12 +263,12 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     
     { // But we should be able to confirm both docs appear in a new backup (not based on a previous snapshot)
       final SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", "backup2",
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
+          "core", DEFAULT_TEST_COLLECTION_NAME,
+          "name", "backup2",
+          "location", backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot.backup2"), 2);
     }
@@ -282,13 +279,10 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     for (String snapName : Arrays.asList("snapshot1a", "snapshot1b")) {
       String name = "backup_from_" + snapName;
       SolrQueryResponse resp = new SolrQueryResponse();
-      admin.handleRequestBody
-        (req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(),
-             "core", DEFAULT_TEST_COLLECTION_NAME,
-             "name", name,
-             "commitName", snapName,
-             "location", backupDir.getAbsolutePath()),
-         resp);
+      SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.BACKUPCORE.toString(), "core", DEFAULT_TEST_COLLECTION_NAME, "name", name, "commitName", snapName, "location",
+          backupDir.getAbsolutePath());
+      admin.handleRequestBody(req, resp);
+      req.close();
       assertNull("Backup "+name+" should have succeeded", resp.getException());
       simpleBackupCheck(new File(backupDir, "snapshot." + name),
                         1, oneDocSegmentFile);
@@ -331,20 +325,20 @@ public class TestCoreBackup extends SolrTestCaseJ4 {
     // verify it's "searchable" ...
     assertQ(req("q", "id:42"), "//result[@numFound='1']");
 
-    // sanity check what the searcher/reader of this empty index report about current commit
-    IndexCommit oneDoc = h.getCore().withSearcher(s -> {
+    try (SolrCore core = h.getCore()) {
+      // sanity check what the searcher/reader of this empty index report about current commit
+      IndexCommit oneDoc = core.withSearcher(s -> {
         // sanity check this really is the searcher/reader that has the new doc...
         assertEquals(1L, (long) s.getIndexReader().numDocs());
-        
+
         final IndexCommit commit = s.getIndexReader().getIndexCommit();
         // WTF: how/why does this reader still have the same commit generation as before ? ? ? ? ?
-        assertEquals("WTF: This Reader (claims) the same generation as our previous pre-softCommif (empty) reader",
-                     EXPECTED_GEN_OF_EMPTY_INDEX, (long) commit.getGeneration());
+        assertEquals("WTF: This Reader (claims) the same generation as our previous pre-softCommif (empty) reader", EXPECTED_GEN_OF_EMPTY_INDEX, (long) commit.getGeneration());
         return commit;
       });
 
-    assertEquals("WTF: Our two IndexCommits, which we know have different docs, claim to be equals",
-                 empty, oneDoc);
+      assertEquals("WTF: Our two IndexCommits, which we know have different docs, claim to be equals", empty, oneDoc);
+    }
     
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
index 45f93a3..231d961 100644
--- a/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/XmlUpdateRequestHandlerTest.java
@@ -190,8 +190,9 @@ public class XmlUpdateRequestHandlerTest extends SolrTestCaseJ4 {
       p.expectDelete("500", null, -1, 42, "shard1");
 
       XMLLoader loader = new XMLLoader().init(null);
-      loader.load(req(), new SolrQueryResponse(), new ContentStreamBase.StringStream(xml), p);
-
+      SolrQueryRequest req = req();
+      loader.load(req, new SolrQueryResponse(), new ContentStreamBase.StringStream(xml), p);
+      req.close();
       p.assertNoCommandsPending();
       p.close();
     }
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java
index e38e3ca..9926666 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminCreateDiscoverTest.java
@@ -30,6 +30,7 @@ import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.CorePropertiesLocator;
 import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -95,16 +96,13 @@ public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 {
     System.setProperty("DATA_TEST", "data_diff");
 
     SolrQueryResponse resp = new SolrQueryResponse();
+    SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.NAME, coreSysProps, CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}",
+        CoreAdminParams.CONFIG, "${CONFIG_TEST}", CoreAdminParams.SCHEMA, "${SCHEMA_TEST}", CoreAdminParams.DATA_DIR, "${DATA_TEST}");
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.CREATE.toString(),
-            CoreAdminParams.NAME, coreSysProps,
-            CoreAdminParams.INSTANCE_DIR, "${INSTDIR_TEST}",
-            CoreAdminParams.CONFIG, "${CONFIG_TEST}",
-            CoreAdminParams.SCHEMA, "${SCHEMA_TEST}",
-            CoreAdminParams.DATA_DIR, "${DATA_TEST}"),
+        (req,
             resp);
     assertNull("Exception on create", resp.getException());
+    req.close();
 
     // verify props are in persisted file
 
@@ -156,16 +154,13 @@ public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 {
 
     // Create one core
     SolrQueryResponse resp = new SolrQueryResponse();
+    SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.NAME, coreDuplicate, CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(),
+        CoreAdminParams.CONFIG, "solrconfig_ren.xml", CoreAdminParams.SCHEMA, "schema_ren.xml", CoreAdminParams.DATA_DIR, data.getAbsolutePath());
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.CREATE.toString(),
-            CoreAdminParams.NAME, coreDuplicate,
-            CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(),
-            CoreAdminParams.CONFIG, "solrconfig_ren.xml",
-            CoreAdminParams.SCHEMA, "schema_ren.xml",
-            CoreAdminParams.DATA_DIR, data.getAbsolutePath()),
+        (req,
             resp);
     assertNull("Exception on create", resp.getException());
+    req.close();
 
     // Try to create another core with a different name, but the same instance dir
     // nocommit disabled at the moment
@@ -194,23 +189,22 @@ public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 {
 
     // Create one core
     SolrQueryResponse resp = new SolrQueryResponse();
+    SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.NAME, "testInstanceDirAsPropertyParam",
+        "property.instanceDir", workDir.getAbsolutePath(), CoreAdminParams.CONFIG, "solrconfig_ren.xml", CoreAdminParams.SCHEMA, "schema_ren.xml", CoreAdminParams.DATA_DIR, data.getAbsolutePath());
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-                CoreAdminParams.CoreAdminAction.CREATE.toString(),
-                CoreAdminParams.NAME, "testInstanceDirAsPropertyParam",
-                "property.instanceDir", workDir.getAbsolutePath(),
-                CoreAdminParams.CONFIG, "solrconfig_ren.xml",
-                CoreAdminParams.SCHEMA, "schema_ren.xml",
-                CoreAdminParams.DATA_DIR, data.getAbsolutePath()),
+        (req,
             resp);
     assertNull("Exception on create", resp.getException());
+    req.close();
 
     resp = new SolrQueryResponse();
+    req = req(CoreAdminParams.ACTION,
+        CoreAdminParams.CoreAdminAction.STATUS.toString(),
+        CoreAdminParams.CORE, "testInstanceDirAsPropertyParam");
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-                CoreAdminParams.CoreAdminAction.STATUS.toString(),
-                CoreAdminParams.CORE, "testInstanceDirAsPropertyParam"),
+        (req,
             resp);
+    req.close();
     NamedList status = (NamedList) resp.getValues().get("status");
     assertNotNull(status);
     NamedList coreProps = (NamedList) status.get("testInstanceDirAsPropertyParam");
@@ -231,16 +225,13 @@ public class CoreAdminCreateDiscoverTest extends SolrTestCaseJ4 {
     File data = new File(workDir, "data");
 
     SolrQueryResponse resp = new SolrQueryResponse();
+    SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.NAME, coreNormal, CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(),
+        CoreAdminParams.CONFIG, "solrconfig_ren.xml", CoreAdminParams.SCHEMA, "schema_ren.xml", CoreAdminParams.DATA_DIR, data.getAbsolutePath());
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.CREATE.toString(),
-            CoreAdminParams.NAME, coreNormal,
-            CoreAdminParams.INSTANCE_DIR, workDir.getAbsolutePath(),
-            CoreAdminParams.CONFIG, "solrconfig_ren.xml",
-            CoreAdminParams.SCHEMA, "schema_ren.xml",
-            CoreAdminParams.DATA_DIR, data.getAbsolutePath()),
+        (req,
             resp);
     assertNull("Exception on create", resp.getException());
+    req.close();
 
     // verify props are in persisted file
     Properties props = new Properties();
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminRequestStatusTest.java b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminRequestStatusTest.java
index 4152d37..1c600b2 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminRequestStatusTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/CoreAdminRequestStatusTest.java
@@ -26,6 +26,7 @@ import org.apache.solr.common.params.CommonAdminParams;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -58,41 +59,39 @@ public class CoreAdminRequestStatusTest extends SolrTestCaseJ4{
     // create a new core (using CoreAdminHandler) w/ properties
 
     SolrQueryResponse resp = new SolrQueryResponse();
+    SolrQueryRequest req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.CREATE.toString(), CoreAdminParams.INSTANCE_DIR, instPropFile.getAbsolutePath(), CoreAdminParams.NAME,
+        "dummycore", CommonAdminParams.ASYNC, "42");
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.CREATE.toString(),
-            CoreAdminParams.INSTANCE_DIR, instPropFile.getAbsolutePath(),
-            CoreAdminParams.NAME, "dummycore",
-            CommonAdminParams.ASYNC, "42"),
+        (req,
             resp);
+    req.close();
     assertNull("Exception on create", resp.getException());
 
     int maxRetries = 10;
 
     while(maxRetries-- > 0) {
     resp = new SolrQueryResponse();
+    req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.REQUESTSTATUS.toString(), CoreAdminParams.REQUESTID, "42");
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.REQUESTSTATUS.toString(),
-            CoreAdminParams.REQUESTID, "42"),
+        (req,
             resp
         );
+      req.close();
       if(resp.getValues().get("STATUS") != null && resp.getValues().get("STATUS").equals("completed"))
         break;
-      Thread.sleep(1000);
+      Thread.sleep(250);
     }
 
     assertEquals("The status of request was expected to be completed",
                  "completed", resp.getValues().get("STATUS"));
 
     resp = new SolrQueryResponse();
+    req = req(CoreAdminParams.ACTION, CoreAdminParams.CoreAdminAction.REQUESTSTATUS.toString(), CoreAdminParams.REQUESTID, "9999999");
     admin.handleRequestBody
-        (req(CoreAdminParams.ACTION,
-            CoreAdminParams.CoreAdminAction.REQUESTSTATUS.toString(),
-            CoreAdminParams.REQUESTID, "9999999"),
+        (req,
             resp
         );
-
+    req.close();
     assertEquals("Was expecting it to be invalid but found a task with the id.",
                  "notfound", resp.getValues().get("STATUS"));
 
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/CoreMergeIndexesAdminHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/CoreMergeIndexesAdminHandlerTest.java
index 339da22..8f65c2f 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/CoreMergeIndexesAdminHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/CoreMergeIndexesAdminHandlerTest.java
@@ -28,6 +28,7 @@ import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.MockFSDirectoryFactory;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -71,15 +72,15 @@ public class CoreMergeIndexesAdminHandlerTest extends SolrTestCaseJ4 {
       DirectoryFactory df = core.getDirectoryFactory();
       FailingDirectoryFactory dirFactory = (FailingDirectoryFactory) df;
 
-      try {
+      try (SolrQueryRequest req = req(CoreAdminParams.ACTION,
+          CoreAdminParams.CoreAdminAction.MERGEINDEXES.toString(),
+          CoreAdminParams.CORE, "collection1",
+          CoreAdminParams.INDEX_DIR, workDir.getAbsolutePath())) {
         dirFactory.fail = true;
         ignoreException(WRAPPED_FAILING_MSG);
         SolrException e = expectThrows(SolrException.class, () -> {
           admin.handleRequestBody
-              (req(CoreAdminParams.ACTION,
-                  CoreAdminParams.CoreAdminAction.MERGEINDEXES.toString(),
-                  CoreAdminParams.CORE, "collection1",
-                  CoreAdminParams.INDEX_DIR, workDir.getAbsolutePath()),
+              (req,
                   new SolrQueryResponse());
         });
         assertEquals(FailingDirectoryFactory.FailingDirectoryFactoryException.class, e.getCause().getClass());
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
index df86bee..060af71 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
@@ -154,10 +154,11 @@ public class InfoHandlerTest extends SolrTestCaseJ4 {
   private SolrQueryResponse handleRequest(InfoHandler infoHandler, String path)
       throws Exception {
     SolrQueryResponse rsp = new SolrQueryResponse();
-    SolrQueryRequest req = req();
-    req.getContext().put("path", path);
-    infoHandler.handleRequestBody(req, rsp);
-    return rsp;
+    try (SolrQueryRequest req = req()) {
+      req.getContext().put("path", path);
+      infoHandler.handleRequestBody(req, rsp);
+      return rsp;
+    }
   }
 
 }
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
index 878fe06..f75d7c6 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/LukeRequestHandlerTest.java
@@ -22,6 +22,7 @@ import java.util.EnumSet;
 import javax.xml.xpath.XPathConstants;
 
 import org.apache.solr.common.luke.FieldFlag;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.CustomAnalyzerStrField; // jdoc
 import org.apache.solr.schema.IndexSchema;
@@ -116,20 +117,17 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
 
     }
 
-    // diff loop for checking 'index' flags,
-    // only valid for fields that are indexed & stored
-    for (String f : Arrays.asList("solr_t","solr_s","solr_ti",
-        "solr_td","solr_dt","solr_b")) {
-      if (h.getCore().getLatestSchema().getField(f).getType().isPointField()) continue;
-      final String xp = getFieldXPathPrefix(f);
-      assertQ("Not as many index flags as expected ("+numFlags+") for " + f,
-          req("qt","/admin/luke", "fl", f),
-          numFlags+"=string-length("+xp+"[@name='index'])");
+    try (SolrCore core = h.getCore()) {
+      // diff loop for checking 'index' flags,
+      // only valid for fields that are indexed & stored
+      for (String f : Arrays.asList("solr_t", "solr_s", "solr_ti", "solr_td", "solr_dt", "solr_b")) {
+        if (core.getLatestSchema().getField(f).getType().isPointField()) continue;
+        final String xp = getFieldXPathPrefix(f);
+        assertQ("Not as many index flags as expected (" + numFlags + ") for " + f, req("qt", "/admin/luke", "fl", f), numFlags + "=string-length(" + xp + "[@name='index'])");
 
-      final String hxp = getFieldXPathHistogram(f);
-      assertQ("Historgram field should be present for field "+f,
-          req("qt", "/admin/luke", "fl", f),
-          hxp+"[@name='histogram']");
+        final String hxp = getFieldXPathHistogram(f);
+        assertQ("Historgram field should be present for field " + f, req("qt", "/admin/luke", "fl", f), hxp + "[@name='histogram']");
+      }
     }
   }
 
@@ -163,6 +161,7 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
     try {
       // First, determine that the two fields ARE there
       String response = h.query(req);
+      req.close();
       assertNull(TestHarness.validateXPath(solrConfig.getResourceLoader(), response,
           getFieldXPathPrefix("solr_t") + "[@name='index']",
           getFieldXPathPrefix("solr_s") + "[@name='index']"
@@ -181,10 +180,11 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
       response = h.query(req);
       for (String f : Arrays.asList("solr_t", "solr_s", "solr_ti",
           "solr_td", "solr_dt", "solr_b")) {
-        if (h.getCore().getLatestSchema().getField(f).getType().isPointField()) continue;
+        if (req.getCore().getLatestSchema().getField(f).getType().isPointField()) continue;
         assertNull(TestHarness.validateXPath(solrConfig.getResourceLoader(), response,
             getFieldXPathPrefix(f) + "[@name='index']"));
       }
+      req.close();
     } catch (Exception e) {
       fail("Caught unexpected exception " + e.getMessage());
     }
@@ -238,6 +238,7 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
     SolrQueryRequest req = req("qt", "/admin/luke", "show", "schema");
 
     String xml = h.query(req);
+    req.close();
     String r = TestHarness.validateXPath
       (solrConfig.getResourceLoader(), xml,
        field("text") + "/arr[@name='copySources']/str[.='title']",
@@ -268,6 +269,7 @@ public class LukeRequestHandlerTest extends SolrTestCaseJ4 {
 
     SolrQueryRequest req = req("qt", "/admin/luke", "show", "schema", "indent", "on");
     String xml = h.query(req);
+    req.close();
     String result = TestHarness.validateXPath(solrConfig.getResourceLoader(), xml, field("bday") + "/arr[@name='copyDests']/str[.='catchall_t']");
     assertNull(xml, result);
 
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
index 18b75591a..6fa3213 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
@@ -33,6 +33,7 @@ import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrInfoBean;
 import org.apache.solr.metrics.SolrMetricsContext;
 import org.apache.solr.request.LocalSolrQueryRequest;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -49,11 +50,14 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testDiff() throws Exception {
-    String xml = h.query(req(
+    String xml;
+    try (SolrQueryRequest req = req(
         CommonParams.QT,"/admin/mbeans",
         "stats","true",
         CommonParams.WT,"xml"
-    ));
+    )) {
+      xml = h.query(req);
+    }
     List<ContentStream> streams = new ArrayList<>();
     streams.add(new ContentStreamBase.StringStream(xml));
 
@@ -65,6 +69,7 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
     req.setContentStreams(streams);
 
     xml = h.query(req);
+    req.close();
     NamedList<NamedList<NamedList<Object>>> diff = SolrInfoMBeanHandler.fromXML(xml);
 
     // The stats bean for SolrInfoMBeanHandler
@@ -83,22 +88,28 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
     int now = Integer.parseInt(m.group("now"));
     assertEquals(1, now - was);
 
-    xml = h.query(req(
+    try (SolrQueryRequest req2 = req(
         CommonParams.QT,"/admin/mbeans",
         "stats","true",
         "key","org.apache.solr.handler.admin.CollectionsHandler"
-    ));
-    NamedList<NamedList<NamedList<Object>>> nl = SolrInfoMBeanHandler.fromXML(xml);
-    assertNotNull( nl.get("ADMIN").get("org.apache.solr.handler.admin.CollectionsHandler"));
+    )) {
+      xml = h.query(req2);
+      NamedList<NamedList<NamedList<Object>>> nl = SolrInfoMBeanHandler.fromXML(xml);
+      assertNotNull(nl.get("ADMIN").get("org.apache.solr.handler.admin.CollectionsHandler"));
+    }
   }
 
   @Test
   public void testAddedMBeanDiff() throws Exception {
-    String xml = h.query(req(
+
+    String xml;
+    try (SolrQueryRequest req = req(
         CommonParams.QT,"/admin/mbeans",
         "stats","true",
         CommonParams.WT,"xml"
-    ));
+    )) {
+      xml = h.query(req);
+    }
 
     // Artificially convert a long value to a null, to trigger the ADD case in SolrInfoMBeanHandler.diffObject()
     xml = xml.replaceFirst("<long\\s+(name\\s*=\\s*\"ADMIN./admin/mbeans.totalTime\"\\s*)>[^<]*</long>", "<null $1/>");
@@ -110,6 +121,7 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
         "diff","true");
     req.setContentStreams(Collections.singletonList(new ContentStreamBase.StringStream(xml)));
     xml = h.query(req);
+    req.close();
 
     NamedList<NamedList<NamedList<Object>>> nl = SolrInfoMBeanHandler.fromXML(xml);
     assertNotNull(((NamedList)nl.get("ADMIN").get("/admin/mbeans").get("stats")).get("ADMIN./admin/mbeans.totalTime"));
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/PropertiesRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/PropertiesRequestHandlerTest.java
index 34ab7eb..feefd1b 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/PropertiesRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/PropertiesRequestHandlerTest.java
@@ -22,6 +22,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.util.RedactionUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -61,11 +62,9 @@ public class PropertiesRequestHandlerTest extends SolrTestCaseJ4 {
   }
 
   private NamedList<NamedList<NamedList<Object>>> readProperties() throws Exception {
-    String xml = h.query(req(
-        CommonParams.QT, "/admin/properties",
-        CommonParams.WT, "xml"
-    ));
-
+    SolrQueryRequest req = req(CommonParams.QT, "/admin/properties", CommonParams.WT, "xml");
+    String xml = h.query(req);
+    req.close();
     XMLResponseParser parser = new XMLResponseParser();
     return (NamedList<NamedList<NamedList<Object>>>)
         parser.processResponse(new StringReader(xml)).get("system.properties");
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/ShowFileRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/ShowFileRequestHandlerTest.java
index 82fe992..0f8e34a 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/ShowFileRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/ShowFileRequestHandlerTest.java
@@ -24,6 +24,7 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.After;
 import org.junit.Before;
@@ -71,8 +72,10 @@ public class ShowFileRequestHandlerTest extends SolrJettyTestBase {
     // response.
     SolrCore core = h.getCore();
     SolrQueryResponse rsp = new SolrQueryResponse();
+    SolrQueryRequest req = req("file", "does-not-exist-404.txt");
     core.execute(core.getRequestHandler("/admin/file"),
-            req("file", "does-not-exist-404.txt"), rsp);
+            req, rsp);
+    req.close();
     assertNotNull("no exception in response", rsp.getException());
     assertTrue("wrong type of exception: " + rsp.getException().getClass(),
             rsp.getException() instanceof SolrException);
diff --git a/solr/core/src/test/org/apache/solr/handler/component/DebugComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/DebugComponentTest.java
index 0062fcf..e593897 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/DebugComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/DebugComponentTest.java
@@ -218,6 +218,7 @@ public class DebugComponentTest extends SolrTestCaseJ4 {
       }
       component.prepare(rb);
       ensureRidPresent(rb, null);
+      req.close();
     }
    
     req = req("q", "test query", "distrib", "true", CommonParams.REQUEST_ID, "123");
@@ -226,6 +227,7 @@ public class DebugComponentTest extends SolrTestCaseJ4 {
     rb.setDebug(true);
     component.prepare(rb);
     ensureRidPresent(rb, "123");
+    req.close();
   }
   
   @SuppressWarnings("unchecked")
diff --git a/solr/core/src/test/org/apache/solr/handler/component/ResponseBuilderTest.java b/solr/core/src/test/org/apache/solr/handler/component/ResponseBuilderTest.java
index 28bad7a..af97220 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/ResponseBuilderTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/ResponseBuilderTest.java
@@ -22,11 +22,13 @@ import java.util.ArrayList;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.BeforeClass;
 
 public class ResponseBuilderTest extends SolrTestCaseJ4 {
 
-  SolrQueryRequest req = req("q", "title:test");
+  SolrQueryRequest req;
   SolrQueryResponse rsp = new SolrQueryResponse();
 
   @BeforeClass
@@ -34,6 +36,19 @@ public class ResponseBuilderTest extends SolrTestCaseJ4 {
     initCore("solrconfig.xml", "schema.xml");
   }
 
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    req = req("q", "title:test");
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    super.tearDown();
+    req.close();
+    req = null;
+  }
+
   //This test is being added to verify responseBuilder.isDistributed() exists and is visible.
   public void testIsDistrib(){
     ResponseBuilder responseBuilder = new ResponseBuilder(req, rsp, new ArrayList<>(0));
diff --git a/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentContextFilterQueryTest.java b/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentContextFilterQueryTest.java
index 53aef11..9621a9e 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentContextFilterQueryTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/SuggestComponentContextFilterQueryTest.java
@@ -18,8 +18,6 @@ package org.apache.solr.handler.component;
 
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.spelling.suggest.SuggesterParams;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -83,7 +81,7 @@ public class SuggestComponentContextFilterQueryTest extends SolrTestCaseJ4 {
   @Test
   public void testBuildThrowsIllegalArgumentExceptionWhenContextIsConfiguredButNotImplemented() throws Exception {
     IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> {
-      h.query(req("qt", rh, SuggesterParams.SUGGEST_BUILD, "true",
+        query(req("qt", rh, SuggesterParams.SUGGEST_BUILD, "true",
           SuggesterParams.SUGGEST_DICT, "suggest_context_filtering_not_implemented",
           SuggesterParams.SUGGEST_Q, "examp"));
     });
diff --git a/solr/core/src/test/org/apache/solr/handler/component/TestExpandComponent.java b/solr/core/src/test/org/apache/solr/handler/component/TestExpandComponent.java
index 7f23d68..5d86454 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/TestExpandComponent.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/TestExpandComponent.java
@@ -490,38 +490,38 @@ public class TestExpandComponent extends SolrTestCaseJ4 {
 
     // expand with grouping
     SolrException e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "expand", "true", "expand.field", "id", "group", "true", "group.field", "id"));
+      query(req("q", "*:*", "expand", "true", "expand.field", "id", "group", "true", "group.field", "id"));
     });
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertEquals("Can not use expand with Grouping enabled", e.getMessage());
 
     // no expand field
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true")));
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertEquals("missing expand field", e.getMessage());
 
     // query and filter syntax errors
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true",
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true",
         "expand.field", "term_s", "expand.q", "{!")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertTrue(e.getMessage().contains("Expected identifier at pos 2 str='{!'"));
 
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true",
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true",
         "expand.field", "term_s", "expand.q", "*:*", "expand.fq", "{!")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertTrue(e.getMessage().contains("Expected identifier at pos 2 str='{!'"));
 
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true",
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true",
         "expand.field", "term_s", "expand.q", "*:*", "expand.fq", "{!")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertTrue(e.getMessage().contains("Expected identifier at pos 2 str='{!'"));
 
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true",
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true",
         "expand.field", "term_s", "expand.q", "*:*", "expand.sort", "bleh")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertTrue(e.getMessage().contains("Can't determine a Sort Order (asc or desc) in sort spec 'bleh'"));
 
-    e = expectThrows(SolrException.class,  () -> h.query(req("q", "*:*", "expand", "true",
+    e = expectThrows(SolrException.class,  () -> query(req("q", "*:*", "expand", "true",
         "expand.field", "text_t", "expand.q", "*:*")));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertEquals("Expand not supported for fieldType:'text'", e.getMessage());
diff --git a/solr/core/src/test/org/apache/solr/handler/export/TestExportWriter.java b/solr/core/src/test/org/apache/solr/handler/export/TestExportWriter.java
index c3f81be..0948987 100644
--- a/solr/core/src/test/org/apache/solr/handler/export/TestExportWriter.java
+++ b/solr/core/src/test/org/apache/solr/handler/export/TestExportWriter.java
@@ -34,6 +34,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.index.LogDocMergePolicyFactory;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.SchemaField;
@@ -73,7 +74,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
     assertU(adoc("id","2"));
     assertU(commit());
 
-    String resp = h.query(req("q", "*:*", "qt", "/export", "fl", "id,field2_i_p", "sort", "field2_i_p asc"));
+    String resp = query(req("q", "*:*", "qt", "/export", "fl", "id,field2_i_p", "sort", "field2_i_p asc"));
     assertJsonEquals(resp, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -98,15 +99,12 @@ public class TestExportWriter extends SolrTestCaseJ4 {
     List<String> fieldNames = new ArrayList<>(Arrays.asList("floatdv", "intdv", "stringdv", "longdv", "doubledv",
         "datedv", "booleandv", "field1_s_dv", "field2_i_p", "field3_l_p"));
     for (String sortField : fieldNames) {
-      String resp = h.query(req("q", "*:*", "qt", "/export", "fl", "id," + sortField, "sort", sortField + " desc"));
-      assertJsonEquals(resp, "{\n" +
-          "  \"responseHeader\":{\"status\":0},\n" +
-          "  \"response\":{\n" +
-          "    \"numFound\":1,\n" +
-          "    \"docs\":[{\n" +
-          "        \"id\":\"1\"}]}}");
+      String resp;
+      try (SolrQueryRequest req = req("q", "*:*", "qt", "/export", "fl", "id," + sortField, "sort", sortField + " desc")) {
+        resp = h.query(req);
+      }
+      assertJsonEquals(resp, "{\n" + "  \"responseHeader\":{\"status\":0},\n" + "  \"response\":{\n" + "    \"numFound\":1,\n" + "    \"docs\":[{\n" + "        \"id\":\"1\"}]}}");
     }
-
   }
 
   public static void createIndex() {
@@ -250,7 +248,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
 
     //Test single value DocValue output
     //Expected for asc sort doc3 -> doc2 -> doc1
-    String s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "field1_i_p asc,field2_i_p asc"));
+    String s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "field1_i_p asc,field2_i_p asc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -301,7 +299,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
         "field8_i_p","6"));
     assertU(commit());
 
-    s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "field1_i_p asc,field2_i_p asc,field3_i_p asc,field4_i_p asc,field5_i_p desc,field6_i_p desc,field7_i_p desc,field8_i_p asc"));
+    s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "field1_i_p asc,field2_i_p asc,field3_i_p asc,field4_i_p asc,field5_i_p desc,field6_i_p desc,field7_i_p desc,field8_i_p asc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -342,10 +340,10 @@ public class TestExportWriter extends SolrTestCaseJ4 {
         "      ,{\n" +
         "        \"id\":\"4\"}]}}";
 
-    String s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv asc"));
+    String s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv asc"));
     assertJsonEquals(s, expectedResult);
 
-    s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv desc"));
+    s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv desc"));
     assertJsonEquals(s, expectedResult);
 
   }
@@ -364,7 +362,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
 
     assertU(commit());
 
-    String s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv desc"));
+    String s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "stringdv desc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -391,7 +389,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
         "booleandv","false"));
     assertU(commit());
 
-    String s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "booleandv asc"));
+    String s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "booleandv asc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -401,7 +399,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
         "      ,{\n" +
         "        \"id\":\"1\"}]}}");
 
-    s =  h.query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "booleandv desc"));
+    s =  query(req("q", "*:*", "qt", "/export", "fl", "id", "sort", "booleandv desc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -415,104 +413,104 @@ public class TestExportWriter extends SolrTestCaseJ4 {
   private void testSortingOutput() throws Exception {
 
     //Test single value DocValue output
-    String s =  h.query(req("q", "id:1", "qt", "/export", "fl", "floatdv,intdv,stringdv,longdv,doubledv", "sort", "intdv asc"));
+    String s = query(req("q", "id:1", "qt", "/export", "fl", "floatdv,intdv,stringdv,longdv,doubledv", "sort", "intdv asc"));
 
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"floatdv\":2.1,\"intdv\":1,\"stringdv\":\"hello world\",\"longdv\":323223232323,\"doubledv\":2344.345}]}}");
 
     //Test null value string:
-    s = h.query(req("q", "id:7", "qt", "/export", "fl", "floatdv,intdv,stringdv,longdv,doubledv", "sort", "intdv asc"));
+    s = query(req("q", "id:7", "qt", "/export", "fl", "floatdv,intdv,stringdv,longdv,doubledv", "sort", "intdv asc"));
 
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"floatdv\":2.1,\"intdv\":7,\"longdv\":323223232323,\"doubledv\":2344.345}]}}");
 
     //Test multiValue docValues output
-    s = h.query(req("q", "id:1", "qt", "/export", "fl", "intdv_m,floatdv_m,doubledv_m,longdv_m,stringdv_m", "sort", "intdv asc"));
+    s = query(req("q", "id:1", "qt", "/export", "fl", "intdv_m,floatdv_m,doubledv_m,longdv_m,stringdv_m", "sort", "intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"intdv_m\":[100,250],\"floatdv_m\":[123.321,345.123],\"doubledv_m\":[3444.222,23232.2],\"longdv_m\":[343332,43434343434],\"stringdv_m\":[\"Everton\",\"liverpool\",\"manchester \\\"city\\\"\"]}]}}");
 
     //Test multiValues docValues output with nulls
-    s =  h.query(req("q", "id:7", "qt", "/export", "fl", "intdv_m,floatdv_m,doubledv_m,longdv_m,stringdv_m", "sort", "intdv asc"));
+    s =  query(req("q", "id:7", "qt", "/export", "fl", "intdv_m,floatdv_m,doubledv_m,longdv_m,stringdv_m", "sort", "intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"floatdv_m\":[123.321,345.123],\"doubledv_m\":[3444.222,23232.2],\"longdv_m\":[343332,43434343434]}]}}");
 
     //Test single sort param is working
-    s =  h.query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "intdv desc"));
+    s =  query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":2},{\"intdv\":1}]}}");
 
-    s =  h.query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "intdv asc"));
+    s =  query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":1},{\"intdv\":2}]}}");
 
     // Test sort on String will null value. Null value should sort last on desc and first on asc.
 
-    s =  h.query(req("q", "id:(1 7)", "qt", "/export", "fl", "intdv", "sort", "stringdv desc"));
+    s =  query(req("q", "id:(1 7)", "qt", "/export", "fl", "intdv", "sort", "stringdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":1},{\"intdv\":7}]}}");
 
-    s =  h.query(req("q", "id:(1 7)", "qt", "/export", "fl", "intdv", "sort", "stringdv asc"));
+    s =  query(req("q", "id:(1 7)", "qt", "/export", "fl", "intdv", "sort", "stringdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":7},{\"intdv\":1}]}}");
 
 
     //Test multi-sort params
-    s =  h.query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":2},{\"intdv\":1}]}}");
 
-    s =  h.query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc"));
+    s =  query(req("q", "id:(1 2)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":2, \"docs\":[{\"intdv\":1},{\"intdv\":2}]}}");
 
     //Test three sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,stringdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,stringdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
 
     //Test three sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,stringdv desc,intdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,stringdv desc,intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
 
     //Test four sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,floatdv desc,floatdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,floatdv desc,floatdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
 
     //Test five sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc,floatdv desc,floatdv desc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc,floatdv desc,floatdv desc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
 
     //Test six sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,intdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
 
     //Test seven sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv desc,intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
 
     //Test eight sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,intdv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
 
     //Test nine sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv asc,intdv desc,floatdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv asc,intdv desc,floatdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv desc,intdv asc,floatdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv desc,intdv asc,floatdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
 
     //Test ten sort fields
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv asc,intdv desc,floatdv desc,floatdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "intdv asc,floatdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv asc,intdv desc,floatdv desc,floatdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":1},{\"intdv\":2},{\"intdv\":3}]}}");
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv desc,intdv asc,floatdv desc,floatdv asc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "floatdv asc,intdv desc,floatdv asc,floatdv desc,floatdv asc,floatdv desc,intdv desc,intdv asc,floatdv desc,floatdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":2},{\"intdv\":1}]}}");
 
-    s =  h.query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
+    s =  query(req("q", "id:(1 2 3)", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":1},{\"intdv\":2}]}}");
 
-    s =  h.query(req("q", "intdv:[2 TO 1000]", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
+    s =  query(req("q", "intdv:[2 TO 1000]", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":3, \"docs\":[{\"intdv\":3},{\"intdv\":7},{\"intdv\":2}]}}");
 
-    s =  h.query(req("q", "stringdv:blah", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
+    s =  query(req("q", "stringdv:blah", "qt", "/export", "fl", "intdv", "sort", "doubledv desc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":0, \"docs\":[]}}");
 
-    s =  h.query(req("q", "id:8", "qt", "/export", "fl", "stringdv", "sort", "intdv asc"));
+    s =  query(req("q", "id:8", "qt", "/export", "fl", "stringdv", "sort", "intdv asc"));
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"stringdv\":\"chello \\\"world\\\"\"}]}}");
 
     // Test sortable text fields:
-    s =  h.query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv_m_udvas,sortabledv_udvas", "sort", "sortabledv_udvas asc"));
+    s =  query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv_m_udvas,sortabledv_udvas", "sort", "sortabledv_udvas asc"));
     assertJsonEquals(s, "{\n" +
         "  \"responseHeader\":{\"status\":0},\n" +
         "  \"response\":{\n" +
@@ -529,11 +527,11 @@ public class TestExportWriter extends SolrTestCaseJ4 {
         "          ,\"this is some text two_2\"],\n" +
         "        \"sortabledv_udvas\":\"this is some text_2\"}]}}");
 
-    s =  h.query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv_m", "sort", "sortabledv_udvas asc"));
+    s =  query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv_m", "sort", "sortabledv_udvas asc"));
     assertTrue("Should have 400 status when exporting sortabledv_m, it does not have useDocValuesAsStored='true'", s.contains("\"status\":400}"));
     assertTrue("Should have a cause when exporting sortabledv_m, it does not have useDocValuesAsStored='true'", s.contains("Must have useDocValuesAsStored='true' to be used with export writer"));
 
-    s =  h.query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv", "sort", "sortabledv_udvas asc"));
+    s =  query(req("q", "id:(1 OR 3 OR 8)", "qt", "/export", "fl", "sortabledv", "sort", "sortabledv_udvas asc"));
     assertTrue("Should have 400 status when exporting sortabledv, it does not have useDocValuesAsStored='true'", s.contains("\"status\":400}"));
     assertTrue("Should have a cause when exporting sortabledv, it does not have useDocValuesAsStored='true'", s.contains("Must have useDocValuesAsStored='true' to be used with export writer"));
 
@@ -549,32 +547,39 @@ public class TestExportWriter extends SolrTestCaseJ4 {
 
     //String s =  h.query(req("q", "id:1", "qt", "/export", "fl", "floatdv,intdv,stringdv,longdv,doubledv", "sort", "intdv asc"));
     String s;
-    s = h.query(req("qt", "/export"));
+    s = query(req("qt", "/export"));
     assertTrue("Should have had a sort error", s.contains("No sort criteria"));
-    s = h.query(req("sort", "intdv asc", "qt", "/export"));
+    s = query(req("sort", "intdv asc", "qt", "/export"));
     assertTrue("Should have had fl error", s.contains("export field list (fl) must be specified"));
-    s = h.query(req("sort", "intdv asc", "qt", "/export", "fl", "stringdv"));
+    s = query(req("sort", "intdv asc", "qt", "/export", "fl", "stringdv"));
     // Interesting you don't even need to specify a "q" parameter.
     
   }
 
   private void testDates() throws Exception {
-    String s =  h.query(req("q", "id:1", "qt", "/export", "fl", "datedv", "sort", "datedv asc"));
+    SolrQueryRequest req = req("q", "id:1", "qt", "/export", "fl", "datedv", "sort", "datedv asc");
+    String s =  h.query(req);
+    req.close();
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"datedv\":\"2017-06-16T07:00:00Z\"}]}}");
-    s =  h.query(req("q", "id:1", "qt", "/export", "fl", "datedv_m", "sort", "datedv asc"));
+
+    req = req("q", "id:1", "qt", "/export", "fl", "datedv_m", "sort", "datedv asc");
+    s =  h.query(req);
+    req.close();
     assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"datedv_m\":[\"2017-06-16T01:00:00Z\",\"2017-06-16T02:00:00Z\",\"2017-06-16T03:00:00Z\",\"2017-06-16T04:00:00Z\"]}]}}");
   }
 
   private void testDuplicates() throws Exception {
     // see SOLR-10924
-    String expected = h.getCore().getLatestSchema().getField("int_is_t").getType().isPointField()
-      ? "1,1,1,1" : "1";
-    String s =  h.query(req("q", "id:3", "qt", "/export", "fl", "int_is_t", "sort", "intdv asc"));
-    assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"int_is_t\":["+expected+"]}]}}");
-    expected = h.getCore().getLatestSchema().getField("int_is_p").getType().isPointField()
-      ? "1,1,1,1" : "1";
-    s =  h.query(req("q", "id:8", "qt", "/export", "fl", "int_is_p", "sort", "intdv asc"));
-    assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"int_is_p\":[1,1,1,1]}]}}");
+    try (SolrCore core = h.getCore()) {
+      String expected = core.getLatestSchema().getField("int_is_t").getType().isPointField() ? "1,1,1,1" : "1";
+      String s = query(req("q", "id:3", "qt", "/export", "fl", "int_is_t", "sort", "intdv asc"));
+      assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"int_is_t\":[" + expected + "]}]}}");
+
+      expected = core.getLatestSchema().getField("int_is_p").getType().isPointField() ? "1,1,1,1" : "1";
+
+      s = query(req("q", "id:8", "qt", "/export", "fl", "int_is_p", "sort", "intdv asc"));
+      assertJsonEquals(s, "{\"responseHeader\": {\"status\": 0}, \"response\":{\"numFound\":1, \"docs\":[{\"int_is_p\":[1,1,1,1]}]}}");
+    }
   }
   
   /**
@@ -589,21 +594,23 @@ public class TestExportWriter extends SolrTestCaseJ4 {
     assertU(commit());
     List<String> trieFields = new ArrayList<String>();
     List<String> pointFields = new ArrayList<String>();
-    for (String mv:new String[]{"s", ""}) {
-      for (String indexed:new String[]{"_ni", ""}) {
-        for (String type:new String[]{"i", "l", "f", "d", "dt"}) {
-          String field = "number_" + type + mv + indexed;
-          SchemaField sf = h.getCore().getLatestSchema().getField(field + "_t");
-          assertTrue(sf.hasDocValues());
-          assertTrue(sf.getType().getNumberType() != null);
-          
-          sf = h.getCore().getLatestSchema().getField(field + "_p");
-          assertTrue(sf.hasDocValues());
-          assertTrue(sf.getType().getNumberType() != null);
-          assertTrue(sf.getType().isPointField());
-          
-          trieFields.add(field + "_t");
-          pointFields.add(field + "_p");
+    try (SolrCore core = h.getCore()) {
+      for (String mv : new String[] {"s", ""}) {
+        for (String indexed : new String[] {"_ni", ""}) {
+          for (String type : new String[] {"i", "l", "f", "d", "dt"}) {
+            String field = "number_" + type + mv + indexed;
+            SchemaField sf = core.getLatestSchema().getField(field + "_t");
+            assertTrue(sf.hasDocValues());
+            assertTrue(sf.getType().getNumberType() != null);
+
+            sf = core.getLatestSchema().getField(field + "_p");
+            assertTrue(sf.hasDocValues());
+            assertTrue(sf.getType().getNumberType() != null);
+            assertTrue(sf.getType().isPointField());
+
+            trieFields.add(field + "_t");
+            pointFields.add(field + "_p");
+          }
         }
       }
     }
@@ -747,7 +754,7 @@ public class TestExportWriter extends SolrTestCaseJ4 {
       );
     }
     req = req("q", "*:*", "qt", "/export", "fl", "id,sortabledv_udvas", "sort", "sortabledv_udvas asc", "expr", "unique(input(),over=\"sortabledv_udvas\")");
-    String rsp = h.query(req);
+    String rsp = query(req);
     Map<String, Object> rspMap = mapper.readValue(rsp, HashMap.class);
     List<Map<String, Object>> docs = (List<Map<String, Object>>) Utils.getObjectByPath(rspMap, false, "/response/docs");
     assertNotNull("missing document results: " + rspMap, docs);
@@ -787,12 +794,12 @@ public class TestExportWriter extends SolrTestCaseJ4 {
     String sortStr = String.join(",", fieldWithOrderStrs); // sort : field1 asc, field2 desc
     String fieldsStr = String.join(",", fieldStrs); // fl :  field1, field2
 
-    String resp = h.query(req("q", "*:*", "qt", "/export", "fl", "id," + fieldsStr, "sort", sortStr));
+    String resp = query(req("q", "*:*", "qt", "/export", "fl", "id," + fieldsStr, "sort", sortStr));
     HashMap respMap = mapper.readValue(resp, HashMap.class);
     List docs = (ArrayList) ((HashMap) respMap.get("response")).get("docs");
 
     SolrQueryRequest selectReq = req("q", "*:*", "qt", "/select", "fl", "id," + fieldsStr, "sort", sortStr, "rows", Integer.toString(numDocs), "wt", "json");
-    String response = h.query(selectReq);
+    String response = query(selectReq);
     Map rsp = (Map)Utils.fromJSONString(response);
     List doclist = (List)(((Map)rsp.get("response")).get("docs"));
 
@@ -867,8 +874,8 @@ public class TestExportWriter extends SolrTestCaseJ4 {
     String trieFieldsFl = String.join(",", trieFields);
     String pointFieldsFl = String.join(",", pointFields);
     String sort = pickRandom((String)pickRandom(trieFields.toArray()), (String)pickRandom(pointFields.toArray())).replace("s_", "_") + pickRandom(" asc", " desc");
-    String resultPoints =  h.query(req("q", query, "qt", "/export", "fl", pointFieldsFl, "sort", sort));
-    String resultTries =  h.query(req("q", query, "qt", "/export", "fl", trieFieldsFl, "sort", sort));
+    String resultPoints =  query(req("q", query, "qt", "/export", "fl", pointFieldsFl, "sort", sort));
+    String resultTries =  query(req("q", query, "qt", "/export", "fl", trieFieldsFl, "sort", sort));
     assertJsonEquals(resultPoints.replaceAll("_p", ""), resultTries.replaceAll("_t", ""));
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java b/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
index c38a502..766f79a 100644
--- a/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
+++ b/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
@@ -42,6 +42,7 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequestBase;
 import org.apache.solr.response.SolrQueryResponse;
@@ -184,11 +185,14 @@ public abstract class TaggerTestCase extends SolrTestCaseJ4 {
   /** REMEMBER to close() the result req object. */
   protected SolrQueryRequest reqDoc(String doc, SolrParams moreParams) {
     log.debug("Test doc: {}", doc);
-    SolrParams params = SolrParams.wrapDefaults(moreParams, baseParams);
-    SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(), params) {};
-    Iterable<ContentStream> stream = Collections.singleton((ContentStream)new ContentStreamBase.StringStream(doc));
-    req.setContentStreams(stream);
-    return req;
+    try (SolrCore core = h.getCore()) {
+      SolrParams params = SolrParams.wrapDefaults(moreParams, baseParams);
+      SolrQueryRequestBase req = new SolrQueryRequestBase(core, params) {
+      };
+      Iterable<ContentStream> stream = Collections.singleton((ContentStream) new ContentStreamBase.StringStream(doc));
+      req.setContentStreams(stream);
+      return req;
+    }
   }
 
   /** Asserts the sorted arrays are equals, with a helpful error message when not.*/
diff --git a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
index b6c585e..d3334e0 100644
--- a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
+++ b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
@@ -97,7 +97,7 @@ public class HighlighterTest extends SolrTestCaseJ4 {
     assertU(commit());
 
     IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
-      h.query(req("q", "long", "hl.method", "postings", "df", field, "hl", "true"));
+      query(req("q", "long", "hl.method", "postings", "df", field, "hl", "true"));
     });
     assertTrue("Should warn no offsets", e.getMessage().contains("indexed without offsets"));
     // note: the default schema.xml has no offsets in postings to test the PostingsHighlighter. Leave that for another
diff --git a/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java b/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
index 72686b9..949f7be 100644
--- a/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
+++ b/solr/core/src/test/org/apache/solr/highlight/TestPostingsSolrHighlighter.java
@@ -117,7 +117,7 @@ public class TestPostingsSolrHighlighter extends SolrTestCaseJ4 {
   public void testMisconfiguredField() {
     ignoreException("was indexed without offsets");
     expectThrows(Exception.class, () ->
-        h.query(req("q", "text2:document", "sort", "id asc", "hl", "true", "hl.fl", "text2")));
+        query(req("q", "text2:document", "sort", "id asc", "hl", "true", "hl.fl", "text2")));
     resetExceptionIgnores();
   }
   
diff --git a/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java b/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
index 9d890b1..1609242 100644
--- a/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
+++ b/solr/core/src/test/org/apache/solr/highlight/TestUnifiedSolrHighlighter.java
@@ -72,7 +72,7 @@ public class TestUnifiedSolrHighlighter extends SolrTestCaseJ4 {
 
   public void testImpossibleOffsetSource() {
     IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
-      h.query(req("q", "text2:document", "hl.offsetSource", "postings",
+      query(req("q", "text2:document", "hl.offsetSource", "postings",
           "hl.fl", "text2", "sort", "id asc", "hl", "true"));
     });
     assertTrue("Should warn no offsets", e.getMessage().contains("indexed without offsets"));
diff --git a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
index cb53deb..3fbf998 100644
--- a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
@@ -33,6 +33,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.NodeConfig;
 import org.apache.solr.core.PluginInfo;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrInfoBean;
 import org.apache.solr.core.SolrXmlConfig;
 import org.apache.solr.metrics.reporters.MockMetricReporter;
@@ -88,7 +89,9 @@ public class SolrMetricsIntegrationTest extends SolrTestCaseJ4 {
     h.coreName = DEFAULT_TEST_CORENAME;
     jmxReporter = 1;
     metricManager = cc.getMetricManager();
-    tag = h.getCore().getCoreMetricManager().getTag();
+    try (SolrCore core = h.getCore()) {
+      tag = core.getCoreMetricManager().getTag();
+    }
     // initially there are more reporters, because two of them are added via a matching collection name
     Map<String, SolrMetricReporter> reporters = metricManager.getReporters("solr.core." + DEFAULT_TEST_CORENAME);
     assertEquals(INITIAL_REPORTERS.length + jmxReporter, reporters.size());
@@ -121,45 +124,46 @@ public class SolrMetricsIntegrationTest extends SolrTestCaseJ4 {
     if (null == metricManager) {
       return; // test failed to init, nothing to cleanup
     }
-      
-    SolrCoreMetricManager coreMetricManager = h.getCore().getCoreMetricManager();
-    Map<String, SolrMetricReporter> reporters = metricManager.getReporters(coreMetricManager.getRegistryName());
-
+    try (SolrCore core = h.getCore()) {
+      SolrCoreMetricManager coreMetricManager = core.getCoreMetricManager();
+      Map<String,SolrMetricReporter> reporters = metricManager.getReporters(coreMetricManager.getRegistryName());
+    }
     deleteCore();
   }
 
   @Test
   public void testConfigureReporter() throws Exception {
     Random random = random();
-
-    String metricName = SolrMetricManager.mkName(METRIC_NAME, HANDLER_CATEGORY.toString(), HANDLER_NAME);
-    SolrCoreMetricManager coreMetricManager = h.getCore().getCoreMetricManager();
-    Timer timer = (Timer) metricManager.timer(null, coreMetricManager.getRegistryName(), metricName);
-
-    long initialCount = timer.getCount();
-
-    int iterations = TestUtil.nextInt(random, 0, MAX_ITERATIONS);
-    for (int i = 0; i < iterations; ++i) {
-      h.query(req("*"));
-    }
-
-    long finalCount = timer.getCount();
-    // nocommit - those timers are disabled right now
-    // assertEquals("metric counter incorrect", iterations, finalCount - initialCount);
-    Map<String, SolrMetricReporter> reporters = metricManager.getReporters(coreMetricManager.getRegistryName());
-    assertEquals(RENAMED_REPORTERS.length + jmxReporter, reporters.size());
-
-    // SPECIFIC and MULTIREGISTRY were skipped because they were
-    // specific to collection1
-    for (String reporterName : RENAMED_REPORTERS) {
-      SolrMetricReporter reporter = reporters.get(reporterName + "@" + tag);
-      assertNotNull("Reporter " + reporterName + " was not found.", reporter);
-      assertTrue(reporter instanceof MockMetricReporter);
-
-      MockMetricReporter mockReporter = (MockMetricReporter) reporter;
-      assertTrue("Reporter " + reporterName + " was not initialized: " + mockReporter, mockReporter.didInit);
-      assertTrue("Reporter " + reporterName + " was not validated: " + mockReporter, mockReporter.didValidate);
-      assertFalse("Reporter " + reporterName + " was incorrectly closed: " + mockReporter, mockReporter.didClose);
+    try (SolrCore core = h.getCore()) {
+      String metricName = SolrMetricManager.mkName(METRIC_NAME, HANDLER_CATEGORY.toString(), HANDLER_NAME);
+      SolrCoreMetricManager coreMetricManager = core.getCoreMetricManager();
+      Timer timer = (Timer) metricManager.timer(null, coreMetricManager.getRegistryName(), metricName);
+
+      long initialCount = timer.getCount();
+
+      int iterations = TestUtil.nextInt(random, 0, MAX_ITERATIONS);
+      for (int i = 0; i < iterations; ++i) {
+        query(req("*"));
+      }
+
+      long finalCount = timer.getCount();
+      // nocommit - those timers are disabled right now
+      // assertEquals("metric counter incorrect", iterations, finalCount - initialCount);
+      Map<String,SolrMetricReporter> reporters = metricManager.getReporters(coreMetricManager.getRegistryName());
+      assertEquals(RENAMED_REPORTERS.length + jmxReporter, reporters.size());
+
+      // SPECIFIC and MULTIREGISTRY were skipped because they were
+      // specific to collection1
+      for (String reporterName : RENAMED_REPORTERS) {
+        SolrMetricReporter reporter = reporters.get(reporterName + "@" + tag);
+        assertNotNull("Reporter " + reporterName + " was not found.", reporter);
+        assertTrue(reporter instanceof MockMetricReporter);
+
+        MockMetricReporter mockReporter = (MockMetricReporter) reporter;
+        assertTrue("Reporter " + reporterName + " was not initialized: " + mockReporter, mockReporter.didInit);
+        assertTrue("Reporter " + reporterName + " was not validated: " + mockReporter, mockReporter.didValidate);
+        assertFalse("Reporter " + reporterName + " was incorrectly closed: " + mockReporter, mockReporter.didClose);
+      }
     }
   }
 
diff --git a/solr/core/src/test/org/apache/solr/request/TestFaceting.java b/solr/core/src/test/org/apache/solr/request/TestFaceting.java
index 2d5f33e..12460ef 100644
--- a/solr/core/src/test/org/apache/solr/request/TestFaceting.java
+++ b/solr/core/src/test/org/apache/solr/request/TestFaceting.java
@@ -136,6 +136,7 @@ public class TestFaceting extends SolrTestCaseJ4 {
   }
 
   @Test
+  @Nightly
   public void testTermEnum() throws Exception {
     doTermEnum(0);
     doTermEnum(1);
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 8fd9350..e6c5cfa 100644
--- a/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
+++ b/solr/core/src/test/org/apache/solr/request/TestIntervalFaceting.java
@@ -34,6 +34,7 @@ import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.IntervalFacets.FacetInterval;
 import org.apache.solr.request.IntervalFacets.IntervalCompareResult;
 import org.apache.solr.response.SolrQueryResponse;
@@ -155,8 +156,8 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
   }
 
   private int getNumberOfReaders() {
-    try {
-      return h.getCore().withSearcher(searcher -> searcher.getTopReaderContext().leaves().size());
+    try (SolrCore core = h.getCore()) {
+      return core.withSearcher(searcher -> searcher.getTopReaderContext().leaves().size());
     } catch (IOException e) {
       throw new RuntimeException(e);
     }
@@ -252,9 +253,10 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
 
   @Test
   @Slow
+  @Nightly
   public void testRandom() throws Exception {
     // All field values will be a number between 0 and cardinality
-    int cardinality = TEST_NIGHTLY ? 10000 : 1000;
+    int cardinality = TEST_NIGHTLY ? 10000 : 100;
     // Fields to use for interval faceting
     String[] fields = new String[]{
         "test_s_dv", "test_i_dv", "test_l_dv", "test_f_dv", "test_d_dv", "test_dt_dv",
@@ -262,7 +264,7 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
         "test_l", "test_f", "test_d", "test_dt", "test_ss", "test_is", "test_fs", "test_ls", "test_ds", "test_dts",
         "test_i_p", "test_is_p", "test_l_p", "test_ls_p", "test_f_p", "test_fs_p", "test_d_p", "test_ds_p", "test_dts_p"
         };
-    for (int i = 0; i < atLeast(TEST_NIGHTLY ? 500 : 100); i++) {
+    for (int i = 0; i < atLeast(TEST_NIGHTLY ? 500 : 10); i++) {
       if (random().nextInt(50) == 0) {
         //have some empty docs
         assertU(adoc("id", String.valueOf(i)));
@@ -432,61 +434,63 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
    * The range could also contain "*" as beginning and/or end of the range
    */
   private String[] getRandomRange(int max, String fieldName) {
-    Number[] values = new Number[2];
-    FieldType ft = h.getCore().getLatestSchema().getField(fieldName).getType();
-    if (ft.getNumberType() == null) {
-      assert ft instanceof StrField;
-      values[0] = randomInt(max);
-      values[1] = randomInt(max);
-      Arrays.sort(values, (o1, o2) -> String.valueOf(o1).compareTo(String.valueOf(o2)));
-    } else {
-      switch (ft.getNumberType()) {
-        case DOUBLE:
-          values[0] = raondomDouble(max);
-          values[1] = raondomDouble(max);
-          break;
-        case FLOAT:
-          values[0] = randomFloat(max);
-          values[1] = randomFloat(max);
-          break;
-        case INTEGER:
-          values[0] = randomInt(max);
-          values[1] = randomInt(max);
-          break;
-        case LONG:
-          values[0] = randomLong(max);
-          values[1] = randomLong(max);
-          break;
-        case DATE:
-          values[0] = randomMs(max);
-          values[1] = randomMs(max);
-          break;
-        default:
-          throw new AssertionError("Unexpected number type");
-        
+    try (SolrCore core = h.getCore()) {
+      Number[] values = new Number[2];
+      FieldType ft = core.getLatestSchema().getField(fieldName).getType();
+      if (ft.getNumberType() == null) {
+        assert ft instanceof StrField;
+        values[0] = randomInt(max);
+        values[1] = randomInt(max);
+        Arrays.sort(values, (o1, o2) -> String.valueOf(o1).compareTo(String.valueOf(o2)));
+      } else {
+        switch (ft.getNumberType()) {
+          case DOUBLE:
+            values[0] = raondomDouble(max);
+            values[1] = raondomDouble(max);
+            break;
+          case FLOAT:
+            values[0] = randomFloat(max);
+            values[1] = randomFloat(max);
+            break;
+          case INTEGER:
+            values[0] = randomInt(max);
+            values[1] = randomInt(max);
+            break;
+          case LONG:
+            values[0] = randomLong(max);
+            values[1] = randomLong(max);
+            break;
+          case DATE:
+            values[0] = randomMs(max);
+            values[1] = randomMs(max);
+            break;
+          default:
+            throw new AssertionError("Unexpected number type");
+
+        }
+        Arrays.sort(values);
       }
-      Arrays.sort(values);
-    }
-    String[] stringValues = new String[2];
-    if (rarely()) {
-      stringValues[0] = "*";
-    } else {
-      if (ft.getNumberType() == NumberType.DATE) {
-        stringValues[0] = dateFormat.format(values[0]);
+      String[] stringValues = new String[2];
+      if (rarely()) {
+        stringValues[0] = "*";
       } else {
-        stringValues[0] = String.valueOf(values[0]);
+        if (ft.getNumberType() == NumberType.DATE) {
+          stringValues[0] = dateFormat.format(values[0]);
+        } else {
+          stringValues[0] = String.valueOf(values[0]);
+        }
       }
-    }
-    if (rarely()) {
-      stringValues[1] = "*";
-    } else {
-      if (ft.getNumberType() == NumberType.DATE) {
-        stringValues[1] = dateFormat.format(values[1]);
+      if (rarely()) {
+        stringValues[1] = "*";
       } else {
-        stringValues[1] = String.valueOf(values[1]);
+        if (ft.getNumberType() == NumberType.DATE) {
+          stringValues[1] = dateFormat.format(values[1]);
+        } else {
+          stringValues[1] = String.valueOf(values[1]);
+        }
       }
+      return stringValues;
     }
-    return stringValues;
   }
 
   @Test
@@ -678,54 +682,54 @@ public class TestIntervalFaceting extends SolrTestCaseJ4 {
 
   private void assertStringInterval(String fieldName, String intervalStr,
                                     String expectedStart, String expectedEnd) throws SyntaxError {
-    SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
-    FacetInterval interval = new FacetInterval(f, intervalStr, new ModifiableSolrParams());
+    try (SolrCore core = h.getCore()) {
+      SchemaField f = core.getLatestSchema().getField(fieldName);
+      FacetInterval interval = new FacetInterval(f, intervalStr, new ModifiableSolrParams());
 
-    assertEquals("Expected start " + expectedStart + " but found " + f.getType().toObject(f, interval.start),
-        interval.start, new BytesRef(f.getType().toInternal(expectedStart)));
+      assertEquals("Expected start " + expectedStart + " but found " + f.getType().toObject(f, interval.start), interval.start, new BytesRef(f.getType().toInternal(expectedStart)));
 
-    assertEquals("Expected end " + expectedEnd + " but found " + f.getType().toObject(f, interval.end),
-        interval.end, new BytesRef(f.getType().toInternal(expectedEnd)));
+      assertEquals("Expected end " + expectedEnd + " but found " + f.getType().toObject(f, interval.end), interval.end, new BytesRef(f.getType().toInternal(expectedEnd)));
+    }
   }
 
   private void assertBadInterval(String fieldName, String intervalStr, String errorMsg) {
-    SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
-    SyntaxError e = expectThrows(SyntaxError.class,  () -> new FacetInterval(f, intervalStr, new ModifiableSolrParams()));
-    assertTrue("Unexpected error message for interval String: " + intervalStr + ": " +
-        e.getMessage(), e.getMessage().contains(errorMsg));
+    try (SolrCore core = h.getCore()) {
+      SchemaField f = core.getLatestSchema().getField(fieldName);
+      SyntaxError e = expectThrows(SyntaxError.class, () -> new FacetInterval(f, intervalStr, new ModifiableSolrParams()));
+      assertTrue("Unexpected error message for interval String: " + intervalStr + ": " + e.getMessage(), e.getMessage().contains(errorMsg));
+    }
   }
 
   private void assertInterval(String fieldName, String intervalStr, long[] included, long[] lowerThanStart, long[] graterThanEnd) throws SyntaxError {
-    SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
-    FacetInterval interval = new FacetInterval(f, intervalStr, new ModifiableSolrParams());
-    for (long l : included) {
-      assertEquals("Value " + l + " should be INCLUDED for interval" + interval,
-          IntervalCompareResult.INCLUDED, interval.includes(l));
-    }
-    for (long l : lowerThanStart) {
-      assertEquals("Value " + l + " should be LOWER_THAN_START for inteval " + interval,
-          IntervalCompareResult.LOWER_THAN_START, interval.includes(l));
-    }
-    for (long l : graterThanEnd) {
-      assertEquals("Value " + l + " should be GRATER_THAN_END for inteval " + interval,
-          IntervalCompareResult.GREATER_THAN_END, interval.includes(l));
+    try (SolrCore core = h.getCore()) {
+      SchemaField f = core.getLatestSchema().getField(fieldName);
+      FacetInterval interval = new FacetInterval(f, intervalStr, new ModifiableSolrParams());
+      for (long l : included) {
+        assertEquals("Value " + l + " should be INCLUDED for interval" + interval, IntervalCompareResult.INCLUDED, interval.includes(l));
+      }
+      for (long l : lowerThanStart) {
+        assertEquals("Value " + l + " should be LOWER_THAN_START for inteval " + interval, IntervalCompareResult.LOWER_THAN_START, interval.includes(l));
+      }
+      for (long l : graterThanEnd) {
+        assertEquals("Value " + l + " should be GRATER_THAN_END for inteval " + interval, IntervalCompareResult.GREATER_THAN_END, interval.includes(l));
+      }
     }
-
   }
   
   private void assertIntervalKey(String fieldName, String intervalStr,
       String expectedKey, String...params) throws SyntaxError {
-    assert (params.length&1)==0:"Params must have an even number of elements";
-    SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
-    ModifiableSolrParams solrParams = new ModifiableSolrParams();
-    for (int i = 0; i < params.length - 1;) {
-      solrParams.set(params[i], params[i+1]);
-      i+=2;
+    try (SolrCore core = h.getCore()) {
+      assert (params.length & 1) == 0 : "Params must have an even number of elements";
+      SchemaField f = core.getLatestSchema().getField(fieldName);
+      ModifiableSolrParams solrParams = new ModifiableSolrParams();
+      for (int i = 0; i < params.length - 1; ) {
+        solrParams.set(params[i], params[i + 1]);
+        i += 2;
+      }
+      FacetInterval interval = new FacetInterval(f, intervalStr, solrParams);
+
+      assertEquals("Expected key " + expectedKey + " but found " + interval.getKey(), expectedKey, interval.getKey());
     }
-    FacetInterval interval = new FacetInterval(f, intervalStr, solrParams);
-    
-    assertEquals("Expected key " + expectedKey + " but found " + interval.getKey(), 
-        expectedKey, interval.getKey());
   }
   
   public void testChangeKey() {
diff --git a/solr/core/src/test/org/apache/solr/response/TestGeoJSONResponseWriter.java b/solr/core/src/test/org/apache/solr/response/TestGeoJSONResponseWriter.java
index 82261f9..c2dc0f9 100644
--- a/solr/core/src/test/org/apache/solr/response/TestGeoJSONResponseWriter.java
+++ b/solr/core/src/test/org/apache/solr/response/TestGeoJSONResponseWriter.java
@@ -24,7 +24,6 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.locationtech.spatial4j.context.SpatialContext;
 import org.locationtech.spatial4j.io.SupportedFormats;
@@ -116,7 +115,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
     
     // Make sure we select the field
     try {
-      h.query(req(
+      query(req(
         "q","*:*", 
         "wt","geojson", 
         "fl","*"));
@@ -127,7 +126,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
 
     // non-spatial fields *must* be stored as JSON
     try {
-      h.query(req(
+      query(req(
         "q","id:S.X", 
         "wt","geojson", 
         "fl","*",
@@ -142,7 +141,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
   public void testGeoJSONAtRoot() throws Exception {
     
     // Try reading the whole resposne
-    String json = h.query(req(
+    String json = query(req(
         "q","*:*", 
         "wt","geojson", 
         "rows","2", 
@@ -155,7 +154,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
     assertNotNull(rsp.get("responseHeader"));
     assertNotNull(rsp.get("response"));
     
-    json = h.query(req(
+    json = query(req(
         "q","*:*", 
         "wt","geojson", 
         "rows","2", 
@@ -176,7 +175,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
   public void testGeoJSONOutput() throws Exception {
     
     // Try reading the whole resposne
-    readJSON(h.query(req(
+    readJSON(query(req(
         "q","*:*", 
         "wt","geojson", 
         "fl","*", 
@@ -184,7 +183,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
         "indent","true")));
     
     // Multivalued Valued Point
-    Map<String,Object> json = readJSON(h.query(req(
+    Map<String,Object> json = readJSON(query(req(
         "q","id:H.B", 
         "wt","geojson", 
         "fl","*", 
@@ -208,7 +207,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
     };
     
     for(String[] args : check) {
-      json = readJSON(h.query(req(
+      json = readJSON(query(req(
           "q",args[0], 
           "wt","geojson", 
           "fl","*", 
@@ -265,7 +264,7 @@ public class TestGeoJSONResponseWriter extends SolrTestCaseJ4 {
       
       
       for(String fmt : checkFormats) {
-        String json = h.query(req(
+        String json = query(req(
             "q","id:test", 
             "wt","json", 
             "indent", "true",
diff --git a/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java b/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
index 7995efa..d6b4e88 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
@@ -28,6 +28,7 @@ import org.apache.solr.client.solrj.impl.BinaryResponseParser;
 import org.apache.solr.common.util.ContentStreamBase.ByteArrayStream;
 import org.apache.solr.common.util.ContentStreamBase.StringStream;
 import org.apache.solr.common.util.NamedList;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.AfterClass;
 
@@ -83,12 +84,13 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
 
     stream.setContentType(TestUtil.randomSimpleString(random()));
     rsp.add(RawResponseWriter.CONTENT, stream);
-    
-    for (RawResponseWriter writer : allWriters) {
-      assertEquals(stream.getContentType(), writer.getContentType(req(), rsp));
-      ByteArrayOutputStream out = new ByteArrayOutputStream();
-      writer.write(out, req(), rsp);
-      assertArrayEquals(data, out.toByteArray());
+    try (SolrQueryRequest req = req()) {
+      for (RawResponseWriter writer : allWriters) {
+        assertEquals(stream.getContentType(), writer.getContentType(req, rsp));
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        write(rsp, out, writer);
+        assertArrayEquals(data, out.toByteArray());
+      }
     }
   }
 
@@ -103,19 +105,20 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
 
     stream.setContentType(TestUtil.randomSimpleString(random()));
     rsp.add(RawResponseWriter.CONTENT, stream);
-    
-    for (RawResponseWriter writer : allWriters) {
-      assertEquals(stream.getContentType(), writer.getContentType(req(), rsp));
-
-      // we should have the same string if we use a Writer
-      StringWriter sout = new StringWriter();
-      writer.write(sout, req(), rsp);
-      assertEquals(data, sout.toString());
-
-      // we should have UTF-8 Bytes if we use an OutputStream
-      ByteArrayOutputStream bout = new ByteArrayOutputStream();
-      writer.write(bout, req(), rsp);
-      assertEquals(data, bout.toString(StandardCharsets.UTF_8.toString()));
+    try (SolrQueryRequest req = req()) {
+      for (RawResponseWriter writer : allWriters) {
+        assertEquals(stream.getContentType(), writer.getContentType(req, rsp));
+
+        // we should have the same string if we use a Writer
+        StringWriter sout = new StringWriter();
+        write(rsp, sout, writer);
+        assertEquals(data, sout.toString());
+
+        // we should have UTF-8 Bytes if we use an OutputStream
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        write(rsp, bout, writer);
+        assertEquals(data, bout.toString(StandardCharsets.UTF_8.toString()));
+      }
     }
   }
 
@@ -129,11 +132,12 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
     rsp.add(RawResponseWriter.CONTENT, "test");
     rsp.add("foo", "bar");
 
-    // check Content-Type against each writer 
-    assertEquals("application/xml; charset=UTF-8", writerNoBase.getContentType(req(), rsp));
-    assertEquals("application/xml; charset=UTF-8", writerXmlBase.getContentType(req(), rsp));
-    assertEquals("application/json; charset=UTF-8", writerJsonBase.getContentType(req(), rsp));
-    assertEquals("application/octet-stream",  writerBinBase.getContentType(req(), rsp));
+    // check Content-Type against each writer
+    try (SolrQueryRequest req = req()) {
+      assertEquals("application/xml; charset=UTF-8", writerNoBase.getContentType(req, rsp)); assertEquals("application/xml; charset=UTF-8", writerXmlBase.getContentType(req, rsp));
+      assertEquals("application/json; charset=UTF-8", writerJsonBase.getContentType(req, rsp));
+      assertEquals("application/octet-stream", writerBinBase.getContentType(req, rsp));
+    }
 
     // check response against each writer
 
@@ -145,17 +149,17 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
         "<str name=\"foo\">bar</str>\n" +
         "</response>\n";
     StringWriter xmlSout = new StringWriter();
-    writerXmlBase.write(xmlSout, req(), rsp);
+    write(rsp, xmlSout, writerXmlBase);
     assertEquals(xml, xmlSout.toString());
     ByteArrayOutputStream xmlBout = new ByteArrayOutputStream();
-    writerXmlBase.write(xmlBout, req(), rsp);
+    write(rsp, xmlBout, writerXmlBase);
     assertEquals(xml, xmlBout.toString(StandardCharsets.UTF_8.toString()));
     //
     StringWriter noneSout = new StringWriter();
-    writerNoBase.write(noneSout, req(), rsp);
+    write(rsp, noneSout, writerNoBase);
     assertEquals(xml, noneSout.toString());
     ByteArrayOutputStream noneBout = new ByteArrayOutputStream();
-    writerNoBase.write(noneBout, req(), rsp);
+    write(rsp, noneBout, writerNoBase);
     assertEquals(xml, noneBout.toString(StandardCharsets.UTF_8.toString()));
 
     // json
@@ -163,15 +167,15 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
         "  \"content\":\"test\",\n" +
         "  \"foo\":\"bar\"}\n";
     StringWriter jsonSout = new StringWriter();
-    writerJsonBase.write(jsonSout, req(), rsp);
+    write(rsp, jsonSout, writerJsonBase);
     assertEquals(json, jsonSout.toString());
     ByteArrayOutputStream jsonBout = new ByteArrayOutputStream();
-    writerJsonBase.write(jsonBout, req(), rsp);
+    write(rsp, jsonBout, writerJsonBase);
     assertEquals(json, jsonBout.toString(StandardCharsets.UTF_8.toString()));
 
     // javabin
     ByteArrayOutputStream bytes = new ByteArrayOutputStream();
-    writerBinBase.write(bytes, req(), rsp);
+    write(rsp, bytes, writerBinBase);
     BinaryResponseParser parser = new BinaryResponseParser();
     NamedList<Object> out = parser.processResponse
       (new ByteArrayInputStream(bytes.toByteArray()), /* encoding irrelevant */ null);
@@ -182,6 +186,18 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
 
   }
 
+  private void write(SolrQueryResponse rsp, ByteArrayOutputStream jsonBout, RawResponseWriter writerJsonBase) throws IOException {
+    try (SolrQueryRequest req = req()) {
+      writerJsonBase.write(jsonBout, req, rsp);
+    }
+  }
+
+  private void write(SolrQueryResponse rsp, StringWriter xmlSout, RawResponseWriter writerXmlBase) throws IOException {
+    try (SolrQueryRequest req = req()) {
+      writerXmlBase.write(xmlSout, req, rsp);
+    }
+  }
+
   /**
    * Generates a new {@link RawResponseWriter} wrapping the specified baseWriter name 
    * (which much either be an implicitly defined response writer, or one explicitly 
diff --git a/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java b/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
index ea5619f..228e9ed 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRawTransformer.java
@@ -56,12 +56,12 @@ public class TestRawTransformer extends SolrTestCaseJ4 {
     assertQ(req("q", "*:*"), "//*[@numFound='" + max + "']");
 
     SolrQueryRequest req = req("q", "*:*", "fl", "subject:[json]", "wt", "json");
-    String strResponse = h.query(req);
+    String strResponse = query(req);
     assertTrue("response does not contain right JSON encoding: " + strResponse,
         strResponse.contains("\"subject\":[{poffL:[{offL:[{oGUID:\"7"));
 
     req = req("q", "*:*", "fl", "id,subject", "wt", "json");
-    strResponse = h.query(req);
+    strResponse = query(req);
     assertTrue("response does not contain right JSON encoding: " + strResponse,
         strResponse.contains("subject\":[\""));
   }
diff --git a/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java b/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
index 6fa6bf1..f504f0f 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
@@ -39,7 +39,6 @@ import org.apache.solr.search.SolrReturnFields;
 import org.apache.solr.util.RefCounted;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 import static junit.framework.Assert.fail;
@@ -75,11 +74,12 @@ public class TestRetrieveFieldsOptimizer extends SolrTestCaseJ4 {
     System.setProperty("enable.update.log", "false");
     typesHolder = new FieldTypeHolder();
     initCore("solrconfig-managed-schema.xml", "ignoredSchemaName");
+    try (SolrCore core = h.getCore()) {
+      IndexSchema schema = core.getLatestSchema();
+      setupAllFields();
 
-    IndexSchema schema = h.getCore().getLatestSchema();
-    setupAllFields();
-
-    h.getCore().setLatestSchema(schema);
+      core.setLatestSchema(schema);
+    }
   }
 
   @After
@@ -156,26 +156,27 @@ public class TestRetrieveFieldsOptimizer extends SolrTestCaseJ4 {
     }
     schema = fieldsHolder.addFields(schema);
 
-    h.getCore().setLatestSchema(schema);
+    try (SolrCore core = h.getCore()) {
+      core.setLatestSchema(schema);
 
-    // All that setup work and we're only going to add a very few docs!
-    for (int idx = 0; idx < 10; ++idx) {
-      addDocWithAllFields(idx);
-    }
-    assertU(commit());
-    // Now we need to massage the expected values returned based on the docValues type 'cause it's weird.
-    final RefCounted<SolrIndexSearcher> refCounted = h.getCore().getNewestSearcher(true);
-    try {
-      //static Map<String, Map<String, List<String>>>
-      for (Map<String, List<String>> docFieldsEnt : allFieldValuesInput.values()) {
-        for (Map.Entry<String, List<String>> oneField : docFieldsEnt.entrySet()) {
-          RetrieveField field = fieldsHolder.getTestField(oneField.getKey());
-          field.expectedValsAsStrings(refCounted.get().getSlowAtomicReader().getFieldInfos().fieldInfo(field.name),
-              oneField.getValue());
+      // All that setup work and we're only going to add a very few docs!
+      for (int idx = 0; idx < 10; ++idx) {
+        addDocWithAllFields(idx);
+      }
+      assertU(commit());
+      // Now we need to massage the expected values returned based on the docValues type 'cause it's weird.
+      final RefCounted<SolrIndexSearcher> refCounted = core.getNewestSearcher(true);
+      try {
+        //static Map<String, Map<String, List<String>>>
+        for (Map<String,List<String>> docFieldsEnt : allFieldValuesInput.values()) {
+          for (Map.Entry<String,List<String>> oneField : docFieldsEnt.entrySet()) {
+            RetrieveField field = fieldsHolder.getTestField(oneField.getKey());
+            field.expectedValsAsStrings(refCounted.get().getSlowAtomicReader().getFieldInfos().fieldInfo(field.name), oneField.getValue());
+          }
         }
+      } finally {
+        refCounted.decref();
       }
-    } finally {
-      refCounted.decref();
     }
    }
 
@@ -315,7 +316,7 @@ public class TestRetrieveFieldsOptimizer extends SolrTestCaseJ4 {
     BinaryQueryResponseWriter writer = (BinaryQueryResponseWriter) core.getQueryResponseWriter("javabin");
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     writer.write(baos, req, rsp);
-
+    req.close();
     // This is really the main point!
     assertEquals("We didn't get the values from the expected places! ",
         source, ((SolrReturnFields) rsp.returnFields).getFieldSources());
diff --git a/solr/core/src/test/org/apache/solr/response/transform/TestChildDocTransformer.java b/solr/core/src/test/org/apache/solr/response/transform/TestChildDocTransformer.java
index 4b985cf..cfdfea6 100644
--- a/solr/core/src/test/org/apache/solr/response/transform/TestChildDocTransformer.java
+++ b/solr/core/src/test/org/apache/solr/response/transform/TestChildDocTransformer.java
@@ -113,7 +113,7 @@ public class TestChildDocTransformer extends SolrTestCaseJ4 {
         "fl", "id, subject,[child parentFilter=\"subject:parentDocument\" childFilter=\"title:bar\" limit=2]"), test3);
 
     SolrException e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
+      query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
           "fl", "id, subject,[child parentFilter=\"subject:bleh\" childFilter=\"title:bar\" limit=2]"));
     });
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
@@ -121,7 +121,7 @@ public class TestChildDocTransformer extends SolrTestCaseJ4 {
         containsString("Parent filter 'QueryBitSetProducer(subject:bleh)' doesn't match any parent documents"));
 
     e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
+      query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
           "fl", "id, subject,[child parentFilter=e childFilter=\"title:bar\" limit=2]"));
     });
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
@@ -129,7 +129,7 @@ public class TestChildDocTransformer extends SolrTestCaseJ4 {
         containsString("Parent filter 'QueryBitSetProducer(text:e)' doesn't match any parent documents"));
 
     e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
+      query(req("q", "*:*", "fq", "subject:\"parentDocument\" ",
           "fl", "id, subject,[child parentFilter=\"\"]"));
     });
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
diff --git a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformer.java b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformer.java
index a9e5fa9..039a04d 100644
--- a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformer.java
+++ b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformer.java
@@ -186,7 +186,7 @@ public class TestSubQueryTransformer extends SolrTestCaseJ4 {
   @Test
   public void testRowsStartForSubqueryAndScores() throws Exception {
     
-    String johnDeptsIds = h.query(req(new String[]{"q","{!join from=dept_ss_dv to=dept_id_s}name_s:john", 
+    String johnDeptsIds = query(req(new String[]{"q","{!join from=dept_ss_dv to=dept_id_s}name_s:john",
         "wt","csv",
         "csv.header","false",
         "fl","id",
@@ -244,7 +244,7 @@ public class TestSubQueryTransformer extends SolrTestCaseJ4 {
     for (String dept : new String[] {"Engineering", "Support"}) { //dept_id_s_dv">Engineering
       
       ArrayList<Object> deptWorkers = Collections.list(
-          new StringTokenizer( h.query(req(
+          new StringTokenizer(query(req(
               "q","dept_ss_dv:"+dept ,//dept_id_i_dv
              "wt","csv",
              "csv.header","false",
diff --git a/solr/core/src/test/org/apache/solr/schema/CopyFieldTest.java b/solr/core/src/test/org/apache/solr/schema/CopyFieldTest.java
index 105f9a2..d6923d7 100644
--- a/solr/core/src/test/org/apache/solr/schema/CopyFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/CopyFieldTest.java
@@ -184,7 +184,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     args.put( CommonParams.Q, "text:AAM46" );
     args.put( "indent", "true" );
     core = h.getCore();
-    SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
+    SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args), true );
     assertQ("sku2 copied to text", req
         ,"//*[@numFound='1']"
         ,"//result/doc[1]/str[@name='id'][.='5']"
@@ -194,7 +194,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     args.put( CommonParams.Q, "1_s:10-1839ACX-93" );
     args.put( "indent", "true" );
     core = h.getCore();
-    req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
+    req = new LocalSolrQueryRequest( core, new MapSolrParams( args), true );
     assertQ("sku1 copied to dynamic dest *_s", req
         ,"//*[@numFound='1']"
         ,"//result/doc[1]/str[@name='id'][.='5']"
@@ -205,7 +205,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     args.put( CommonParams.Q, "1_dest_sub_s:10-1839ACX-93" );
     args.put( "indent", "true" );
     core = h.getCore();
-    req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
+    req = new LocalSolrQueryRequest( core, new MapSolrParams( args), true );
     assertQ("sku1 copied to *_dest_sub_s (*_s subset pattern)", req
         ,"//*[@numFound='1']");
 
@@ -213,7 +213,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     args.put( CommonParams.Q, "dest_sub_no_ast_s:AAM46" );
     args.put( "indent", "true" );
     core = h.getCore();
-    req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
+    req = new LocalSolrQueryRequest( core, new MapSolrParams( args), true );
     assertQ("sku2 copied to dest_sub_no_ast_s (*_s subset pattern no asterisk)", req
         ,"//*[@numFound='1']");
   }
@@ -224,7 +224,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     // SOLR-4650: copyField source globs should not have to match an explicit or dynamic field 
     SolrCore core = h.getCore();
     IndexSchema schema = core.getLatestSchema();
-
+    core.close();
     assertNull("'testing123_*' should not be (or match) a dynamic or explicit field", schema.getFieldOrNull("testing123_*"));
 
     assertTrue("schema should contain dynamic field '*_s'", schema.getDynamicPattern("*_s").equals("*_s"));
@@ -236,7 +236,7 @@ public class CopyFieldTest extends SolrTestCaseJ4 {
     args.put( CommonParams.Q, "text:AAM46" );
     args.put( "indent", "true" );
     core = h.getCore();
-    SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args) );
+    SolrQueryRequest req = new LocalSolrQueryRequest( core, new MapSolrParams( args), true );
     assertQ("sku2 copied to text", req
         ,"//*[@numFound='1']"
         ,"//result/doc[1]/str[@name='id'][.='5']"
diff --git a/solr/core/src/test/org/apache/solr/schema/TestSchemaField.java b/solr/core/src/test/org/apache/solr/schema/TestSchemaField.java
index a7cd08e..11912e3 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestSchemaField.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestSchemaField.java
@@ -18,6 +18,7 @@
 package org.apache.solr.schema;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.core.SolrCore;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
@@ -72,13 +73,11 @@ public class TestSchemaField extends SolrTestCaseJ4 {
   }
 
     private void assertFieldFormats(String fieldName, String expectedPostingsFormat, String expectedDocValuesFormat) {
-    SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
-    assertNotNull("Field " + fieldName + " not found  - schema got changed?", f);
-    assertEquals("Field " + f.getName() + " wrong " + FieldProperties.POSTINGS_FORMAT
-            + "  - schema got changed?",
-        expectedPostingsFormat, f.getPostingsFormat());
-    assertEquals("Field " + f.getName() + " wrong " + FieldProperties.DOC_VALUES_FORMAT
-            + "  - schema got changed?",
-        expectedDocValuesFormat, f.getDocValuesFormat());
+    try (SolrCore core = h.getCore()) {
+      SchemaField f = core.getLatestSchema().getField(fieldName);
+      assertNotNull("Field " + fieldName + " not found  - schema got changed?", f);
+      assertEquals("Field " + f.getName() + " wrong " + FieldProperties.POSTINGS_FORMAT + "  - schema got changed?", expectedPostingsFormat, f.getPostingsFormat());
+      assertEquals("Field " + f.getName() + " wrong " + FieldProperties.DOC_VALUES_FORMAT + "  - schema got changed?", expectedDocValuesFormat, f.getDocValuesFormat());
+    }
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/schema/TestSortableTextField.java b/solr/core/src/test/org/apache/solr/schema/TestSortableTextField.java
index abdb21b..9cc1ac8 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestSortableTextField.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestSortableTextField.java
@@ -392,17 +392,17 @@ public class TestSortableTextField extends SolrTestCaseJ4 {
     // unlike most field types, SortableTextField should default to useDocValuesAsStored==false
     // (check a handful that should have the default behavior)
     try (SolrCore core = h.getCore()) {
-    for (String n : Arrays.asList("keyword_stxt", "whitespace_max0_stxt", "whitespace_max6_stxt")) {
-      {
-        FieldType ft = core.getLatestSchema().getFieldTypeByName(n);
-        assertEquals("type " + ft.getTypeName() + " should not default to useDocValuesAsStored", false, ft.useDocValuesAsStored());
-      }
-      {
-        SchemaField sf = core.getLatestSchema().getField(n);
-        assertEquals("field " + sf.getName() + " should not default to useDocValuesAsStored", false, sf.useDocValuesAsStored());
+      for (String n : Arrays.asList("keyword_stxt", "whitespace_max0_stxt", "whitespace_max6_stxt")) {
+        {
+          FieldType ft = core.getLatestSchema().getFieldTypeByName(n);
+          assertEquals("type " + ft.getTypeName() + " should not default to useDocValuesAsStored", false, ft.useDocValuesAsStored());
+        }
+        {
+          SchemaField sf = core.getLatestSchema().getField(n);
+          assertEquals("field " + sf.getName() + " should not default to useDocValuesAsStored", false, sf.useDocValuesAsStored());
+        }
       }
     }
-    }
     
     // but it should be possible to set useDocValuesAsStored=true explicitly on types...
     int num_types_found = 0;
@@ -421,52 +421,49 @@ public class TestSortableTextField extends SolrTestCaseJ4 {
     // ...and it should be possible to set/override useDocValuesAsStored=true on fields...
     int num_fields_found = 0;
     List<String> xpaths = new ArrayList<>(42);
-    for (Map.Entry<String,SchemaField> entry : h.getCore().getLatestSchema().getFields().entrySet()) {
-      if (entry.getKey().endsWith("_usedvs")) {
-        num_fields_found++;
-        final SchemaField sf = entry.getValue();
-        final String name = sf.getName();
-        
-        // some sanity check before we move on with the rest of our testing...
-        assertFalse("schema change? field should not be stored=true: " + name, sf.stored());
-        final boolean usedvs = name.endsWith("_has_usedvs");
-        assertTrue("schema change broke assumptions: field must be '*_has_usedvs' or '*_negates_usedvs': " +
-                   name, usedvs ^ name.endsWith("_negates_usedvs"));
-        final boolean max6 = name.startsWith("max6_");
-        assertTrue("schema change broke assumptions: field must be 'max6_*' or 'max0_*': " +
-                   name, max6 ^ name.startsWith("max0_"));
-        
-        assertEquals("Unexpected useDocValuesAsStored value for field: " + name,
-                     usedvs, sf.useDocValuesAsStored()) ;
-        
-        final String docid = ""+num_fields_found;
-        if (usedvs && max6) {
-          // if useDocValuesAsStored==true and maxCharsForDocValues=N then longer values should fail
-          
-          final String doc = adoc("id", docid, name, "apple pear orange");
-          SolrException ex = expectThrows(SolrException.class, () -> { assertU(doc); });
-          for (String expect : Arrays.asList("field " + name,
-                                             "length=17",
-                                             "useDocValuesAsStored=true",
-                                             "maxCharsForDocValues=6")) {
-            assertTrue("exception must mention " + expect + ": " + ex.getMessage(),
-                       ex.getMessage().contains(expect));
-          }
-        } else {
-          // otherwise (useDocValuesAsStored==false *OR* maxCharsForDocValues=0) any value
-          // should be fine when adding a doc and we should be able to search for it later...
-          final String val = docid + " apple pear orange " + BIG_CONST;
-          assertU(adoc("id", docid, name, val));
-          String doc_xpath = "//result/doc[str[@name='id'][.='"+docid+"']]";
-            
-          if (usedvs) {
-            // ...and if it *does* usedvs, then we should defnitely see our value when searching...
-            doc_xpath = doc_xpath + "[str[@name='"+name+"'][.='"+val+"']]";
+    try (SolrCore core = h.getCore()) {
+      for (Map.Entry<String,SchemaField> entry : core.getLatestSchema().getFields().entrySet()) {
+        if (entry.getKey().endsWith("_usedvs")) {
+          num_fields_found++;
+          final SchemaField sf = entry.getValue();
+          final String name = sf.getName();
+
+          // some sanity check before we move on with the rest of our testing...
+          assertFalse("schema change? field should not be stored=true: " + name, sf.stored());
+          final boolean usedvs = name.endsWith("_has_usedvs");
+          assertTrue("schema change broke assumptions: field must be '*_has_usedvs' or '*_negates_usedvs': " + name, usedvs ^ name.endsWith("_negates_usedvs"));
+          final boolean max6 = name.startsWith("max6_");
+          assertTrue("schema change broke assumptions: field must be 'max6_*' or 'max0_*': " + name, max6 ^ name.startsWith("max0_"));
+
+          assertEquals("Unexpected useDocValuesAsStored value for field: " + name, usedvs, sf.useDocValuesAsStored());
+
+          final String docid = "" + num_fields_found;
+          if (usedvs && max6) {
+            // if useDocValuesAsStored==true and maxCharsForDocValues=N then longer values should fail
+
+            final String doc = adoc("id", docid, name, "apple pear orange");
+            SolrException ex = expectThrows(SolrException.class, () -> {
+              assertU(doc);
+            });
+            for (String expect : Arrays.asList("field " + name, "length=17", "useDocValuesAsStored=true", "maxCharsForDocValues=6")) {
+              assertTrue("exception must mention " + expect + ": " + ex.getMessage(), ex.getMessage().contains(expect));
+            }
           } else {
-            // ...but if not, then we should definitely not see any value for our field...
-            doc_xpath = doc_xpath + "[not(str[@name='"+name+"'])]";
+            // otherwise (useDocValuesAsStored==false *OR* maxCharsForDocValues=0) any value
+            // should be fine when adding a doc and we should be able to search for it later...
+            final String val = docid + " apple pear orange " + BIG_CONST;
+            assertU(adoc("id", docid, name, val));
+            String doc_xpath = "//result/doc[str[@name='id'][.='" + docid + "']]";
+
+            if (usedvs) {
+              // ...and if it *does* usedvs, then we should defnitely see our value when searching...
+              doc_xpath = doc_xpath + "[str[@name='" + name + "'][.='" + val + "']]";
+            } else {
+              // ...but if not, then we should definitely not see any value for our field...
+              doc_xpath = doc_xpath + "[not(str[@name='" + name + "'])]";
+            }
+            xpaths.add(doc_xpath);
           }
-          xpaths.add(doc_xpath);
         }
       }
     }
diff --git a/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java b/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
index 3ec66fc..8711153 100644
--- a/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
+++ b/solr/core/src/test/org/apache/solr/search/QueryParsingTest.java
@@ -100,42 +100,58 @@ public class QueryParsingTest extends SolrTestCaseJ4 {
 
   public void testGetQParser() throws Exception {
     // invalid defType
-    SolrException exception = expectThrows(SolrException.class, () -> h.query(req("q", "ad", "defType", "bleh")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query 'ad'", exception.getMessage());
+    SolrException exception;
+    try (SolrQueryRequest req = req("q", "ad", "defType", "bleh")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query 'ad'", exception.getMessage());
+    }
 
     // invalid qparser override in the local params
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "{!bleh}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "{!bleh}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    }
 
     // invalid qParser with fq params
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "*:*", "fq", "{!some}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'some' for query '{!some}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "fq", "{!some}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'some' for query '{!some}'", exception.getMessage());
+    }
 
     // invalid qparser with function queries
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "*:*", "defType", "edismax", "boost", "{!hmm}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'hmm' for query '{!hmm}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "defType", "edismax", "boost", "{!hmm}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'hmm' for query '{!hmm}'", exception.getMessage());
+    }
 
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "*:*", "defType", "edismax", "boost", "query({!bleh v=ak})")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query '{!bleh v=ak}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "defType", "edismax", "boost", "query({!bleh v=ak})")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query '{!bleh v=ak}'", exception.getMessage());
+    }
 
-    exception = expectThrows(SolrException.class, () ->
-        h.query(req("q", "*:*", "defType", "edismax", "boost", "query($qq)", "qq", "{!bleh v=a}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query '{!bleh v=a}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "defType", "edismax", "boost", "query($qq)", "qq", "{!bleh v=a}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query '{!bleh v=a}'", exception.getMessage());
+    }
 
     // ranking doesn't use defType
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "*:*", "rq", "{!bleh}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "rq", "{!bleh}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    }
 
     // with stats.field
-    exception = expectThrows(SolrException.class, () -> h.query(req("q", "*:*", "stats", "true", "stats.field", "{!bleh}")));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    try (SolrQueryRequest req = req("q", "*:*", "stats", "true", "stats.field", "{!bleh}")) {
+      exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("invalid query parser 'bleh' for query '{!bleh}'", exception.getMessage());
+    }
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/search/SolrIndexSearcherTest.java b/solr/core/src/test/org/apache/solr/search/SolrIndexSearcherTest.java
index d1f557e..1f1a4d5 100644
--- a/solr/core/src/test/org/apache/solr/search/SolrIndexSearcherTest.java
+++ b/solr/core/src/test/org/apache/solr/search/SolrIndexSearcherTest.java
@@ -26,6 +26,7 @@ import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.TotalHits;
 import org.apache.lucene.search.Weight;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.core.SolrCore;
 import org.junit.Before;
 import org.junit.BeforeClass;
 
@@ -109,143 +110,160 @@ public class SolrIndexSearcherTest extends SolrTestCaseJ4 {
   }
   
   public void testLowMinExactCountGeneratesApproximation() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(NUM_DOCS / 2, 10, "field1_s", "foo");
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      return null;
-    });
-    
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field2_s", "1");
-      assertMatchesGreaterThan(NUM_DOCS/2, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(NUM_DOCS / 2, 10, "field1_s", "foo");
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field2_s", "1");
+        assertMatchesGreaterThan(NUM_DOCS / 2, searcher, cmd);
+        return null;
+      });
+    }
   }
 
   public void testHighMinExactCountGeneratesExactCount() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 10, "field1_s", "foo");
-      assertMatchesEqual(NUM_DOCS, searcher, cmd);
-      return null;
-    });
-    
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 10, "field2_s", "1");
-      assertMatchesEqual(NUM_DOCS/2, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 10, "field1_s", "foo");
+        assertMatchesEqual(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 10, "field2_s", "1");
+        assertMatchesEqual(NUM_DOCS / 2, searcher, cmd);
+        return null;
+      });
+    }
   }
 
   
   
   public void testLowMinExactCountWithQueryResultCache() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(NUM_DOCS / 2, 10, "field1_s", "foo");
-      cmd.clearFlags(SolrIndexSearcher.NO_CHECK_QCACHE | SolrIndexSearcher.NO_SET_QCACHE);
-      searcher.search(new QueryResult(), cmd);
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(NUM_DOCS / 2, 10, "field1_s", "foo");
+        cmd.clearFlags(SolrIndexSearcher.NO_CHECK_QCACHE | SolrIndexSearcher.NO_SET_QCACHE);
+        searcher.search(new QueryResult(), cmd);
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
   }
   
   public void testHighMinExactCountWithQueryResultCache() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 2, "field1_s", "foo");
-      cmd.clearFlags(SolrIndexSearcher.NO_CHECK_QCACHE | SolrIndexSearcher.NO_SET_QCACHE);
-      searcher.search(new QueryResult(), cmd);
-      assertMatchesEqual(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(NUM_DOCS, 2, "field1_s", "foo");
+        cmd.clearFlags(SolrIndexSearcher.NO_CHECK_QCACHE | SolrIndexSearcher.NO_SET_QCACHE);
+        searcher.search(new QueryResult(), cmd);
+        assertMatchesEqual(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
   }
   
   public void testMinExactCountMoreRows() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(2, NUM_DOCS, "field1_s", "foo");
-      assertMatchesEqual(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(2, NUM_DOCS, "field1_s", "foo");
+        assertMatchesEqual(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
   }
   
   public void testMinExactCountMatchWithDocSet() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(2, 2, "field1_s", "foo");
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      
-      cmd.setNeedDocSet(true);
-      assertMatchesEqual(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(2, 2, "field1_s", "foo");
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+
+        cmd.setNeedDocSet(true);
+        assertMatchesEqual(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
   }
   
   public void testMinExactCountWithMaxScoreRequested() throws IOException {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(2, 2, "field1_s", "foo");
-      cmd.setFlags(SolrIndexSearcher.GET_SCORES);
-      QueryResult qr = assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      assertNotEquals(Float.NaN, qr.getDocList().maxScore());
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(2, 2, "field1_s", "foo");
+        cmd.setFlags(SolrIndexSearcher.GET_SCORES);
+        QueryResult qr = assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        assertNotEquals(Float.NaN, qr.getDocList().maxScore());
+        return null;
+      });
+    }
   }
   
   public void testMinExactWithFilters() throws Exception {
-    
-    h.getCore().withSearcher(searcher -> {
-      //Sanity Check - No Filter
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      return null;
-    });
-    
-    
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      Query filterQuery = new TermQuery(new Term("field4_t", "19"));
-      cmd.setFilterList(filterQuery);
-      assertNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
-      assertMatchesEqual(1, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        //Sanity Check - No Filter
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        Query filterQuery = new TermQuery(new Term("field4_t", "19"));
+        cmd.setFilterList(filterQuery);
+        assertNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
+        assertMatchesEqual(1, searcher, cmd);
+        return null;
+      });
+    }
   }
   
   public void testMinExactWithPostFilters() throws Exception {
-    h.getCore().withSearcher(searcher -> {
-      //Sanity Check - No Filter
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      return null;
-    });
-    
-    
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      MockPostFilter filterQuery = new MockPostFilter(1, 101);
-      cmd.setFilterList(filterQuery);
-      assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
-      assertMatchesEqual(1, searcher, cmd);
-      return null;
-    });
-    
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      MockPostFilter filterQuery = new MockPostFilter(100, 101);
-      cmd.setFilterList(filterQuery);
-      assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
-      assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        //Sanity Check - No Filter
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        MockPostFilter filterQuery = new MockPostFilter(1, 101);
+        cmd.setFilterList(filterQuery);
+        assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
+        assertMatchesEqual(1, searcher, cmd);
+        return null;
+      });
+
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        MockPostFilter filterQuery = new MockPostFilter(100, 101);
+        cmd.setFilterList(filterQuery);
+        assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
+        assertMatchesGreaterThan(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
     
   }
   
   public void testMinExactWithPostFilterThatChangesScoreMode() throws Exception {
-    h.getCore().withSearcher(searcher -> {
-      QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
-      // Use ScoreMode.COMPLETE for the PostFilter
-      MockPostFilter filterQuery = new MockPostFilter(100, 101, ScoreMode.COMPLETE);
-      cmd.setFilterList(filterQuery);
-      assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
-      assertMatchesEqual(NUM_DOCS, searcher, cmd);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      core.withSearcher(searcher -> {
+        QueryCommand cmd = createBasicQueryCommand(1, 1, "field4_t", "0");
+        // Use ScoreMode.COMPLETE for the PostFilter
+        MockPostFilter filterQuery = new MockPostFilter(100, 101, ScoreMode.COMPLETE);
+        cmd.setFilterList(filterQuery);
+        assertNotNull(searcher.getProcessedFilter(null, cmd.getFilterList()).postFilter);
+        assertMatchesEqual(NUM_DOCS, searcher, cmd);
+        return null;
+      });
+    }
   }
 
   private QueryCommand createBasicQueryCommand(int minExactCount, int length, String field, String q) {
diff --git a/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java b/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
index eb03e64..cc6b421 100644
--- a/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestExtendedDismaxParser.java
@@ -37,6 +37,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.Utils;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.util.SolrPluginUtils;
 import org.junit.BeforeClass;
@@ -713,12 +714,11 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
   public void testUfDynamicField() throws Exception {
     try {
       ignoreException("dynamic field");
-
-      SolrException exception = expectThrows(SolrException.class,
-          () -> h.query(req("uf", "fl=trait*,id", "defType", "edismax")));
-      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-      assertEquals("dynamic field name must start or end with *",
-          exception.getMessage());
+      try (SolrQueryRequest req = req("uf", "fl=trait*,id", "defType", "edismax")) {
+        SolrException exception = expectThrows(SolrException.class, () -> h.query(req));
+        assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+        assertEquals("dynamic field name must start or end with *", exception.getMessage());
+      }
     } finally {
       resetExceptionIgnores();
     }
@@ -730,26 +730,31 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
   public void testCyclicAliasing() throws Exception {
     try {
       ignoreException(".*Field aliases lead to a cycle.*");
+      SolrException e;
+      try (SolrQueryRequest req = req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","who")) {
+        e = expectThrows(SolrException.class, "Simple cyclic alising not detected", () -> h.query(req));
+        assertCyclicDetectionErrorMessage(e);
+      }
 
-      SolrException e = expectThrows(SolrException.class, "Simple cyclic alising not detected",
-          () -> h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","who")));
-      assertCyclicDetectionErrorMessage(e);
-
-      e = expectThrows(SolrException.class, "Cyclic alising not detected",
-          () -> h.query(req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")));
-      assertCyclicDetectionErrorMessage(e);
-
-      e = expectThrows(SolrException.class, "Cyclic aliasing not detected", () -> h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3","f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field6", "f.field3.qf","field6")));
+      try (SolrQueryRequest req = req("defType","edismax", "q","blarg", "qf","who", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")) {
+        e = expectThrows(SolrException.class, "Cyclic alising not detected", () -> h.query(req));
+        assertCyclicDetectionErrorMessage(e);
+      }
+      try (SolrQueryRequest req = req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3","f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field6", "f.field3.qf","field6")) {
+        e = expectThrows(SolrException.class, "Cyclic aliasing not detected", () -> h.query(req));
+      }
       assertFalse("This is not cyclic aliasing", e.getCause().getMessage().contains("Field aliases lead to a cycle"));
       assertTrue("Should throw exception due to invalid field name", e.getCause().getMessage().contains("not a valid field name"));
 
-      e = expectThrows(SolrException.class, "Cyclic alising not detected",
-          () -> h.query(req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3", "f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field4")));
-      assertCyclicDetectionErrorMessage(e);
+      try (SolrQueryRequest req = req("defType","edismax", "q","blarg", "qf","field1", "f.field1.qf","field2 field3", "f.field2.qf","field4 field5", "f.field4.qf","field5", "f.field5.qf","field4")) {
+        e = expectThrows(SolrException.class, "Cyclic alising not detected", () -> h.query(req));
+        assertCyclicDetectionErrorMessage(e);
+      }
 
-      e = expectThrows(SolrException.class, "Cyclic alising not detected",
-          () -> h.query(req("defType","edismax", "q","who:(Zapp Pig)", "qf","text", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")));
-      assertCyclicDetectionErrorMessage(e);
+      try (SolrQueryRequest req = req("defType","edismax", "q","who:(Zapp Pig)", "qf","text", "f.who.qf","name","f.name.qf","myalias", "f.myalias.qf","who")) {
+        e = expectThrows(SolrException.class, "Cyclic alising not detected", () -> h.query(req));
+        assertCyclicDetectionErrorMessage(e);
+      }
     } finally {
       resetExceptionIgnores();
     }
@@ -1818,8 +1823,10 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
     assertJQ(req("qf","text_sw title", "defType","edismax", "q","+(wi fi)", "sow","false")
         , "/response/numFound==1"
     );
-
-    Map all = (Map) Utils.fromJSONString(h.query(req("q", "*:*", "rows", "0", "wt", "json")));
+    Map all;
+    try (SolrQueryRequest req = req("q", "*:*", "rows", "0", "wt", "json")) {
+       all = (Map) Utils.fromJSONString(h.query(req));
+    }
     int totalDocs = Integer.parseInt(((Map)all.get("response")).get("numFound").toString());
     int allDocsExceptOne = totalDocs - 1;
 
@@ -2183,11 +2190,13 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
   /** SOLR-11512 */
   @Test
   public void killInfiniteRecursionParse() throws Exception {
-    SolrException exception = expectThrows(SolrException.class, () -> {
-      h.query(req("defType", "edismax", "q", "*", "qq", "{!edismax v=something}", "bq", "{!edismax v=$qq}"));
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertTrue(exception.getMessage().contains("Infinite Recursion detected parsing query"));
+    try (SolrQueryRequest req = req("defType", "edismax", "q", "*", "qq", "{!edismax v=something}", "bq", "{!edismax v=$qq}")) {
+      SolrException exception = expectThrows(SolrException.class, () -> {
+        h.query(req);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertTrue(exception.getMessage().contains("Infinite Recursion detected parsing query"));
+    }
   }
 
   /** SOLR-5163 */
@@ -2202,16 +2211,18 @@ public class TestExtendedDismaxParser extends SolrTestCaseJ4 {
     params.add("debugQuery", "true");
 
     // test valid field names
-    String response = h.query(req(params));
-    assertTrue(response.contains("+DisjunctionMaxQuery((title:olive | " +
-        "(subject:oliv)^3.0)) +DisjunctionMaxQuery((title:other | (subject:other)^3.0))"));
+    try (SolrQueryRequest req = req(params)) {
+      String response = h.query(req);
+      assertTrue(response.contains("+DisjunctionMaxQuery((title:olive | " + "(subject:oliv)^3.0)) +DisjunctionMaxQuery((title:other | (subject:other)^3.0))"));
+    }
 
     // test invalid field name
     params.set("qf", "subject^3 nosuchfield");
-    SolrException exception = expectThrows(SolrException.class, () -> h.query(req(params)));
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
-    assertEquals("org.apache.solr.search.SyntaxError: Query Field 'nosuchfield' is not a valid field name",
-        exception.getMessage());
+    try (SolrQueryRequest req = req(params)) {
+      SolrException exception = expectThrows(SolrException.class, () -> h.query(req));
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, exception.code());
+      assertEquals("org.apache.solr.search.SyntaxError: Query Field 'nosuchfield' is not a valid field name", exception.getMessage());
+    }
   }
 
 }
diff --git a/solr/core/src/test/org/apache/solr/search/TestHashQParserPlugin.java b/solr/core/src/test/org/apache/solr/search/TestHashQParserPlugin.java
index 37586eb..24ab040 100644
--- a/solr/core/src/test/org/apache/solr/search/TestHashQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestHashQParserPlugin.java
@@ -20,6 +20,8 @@ import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -64,7 +66,10 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("fq", "{!hash worker=0 workers=2 cost="+getCost(random())+"}");
     params.add("partitionKeys", "a_i,a_s,a_i,a_s");
     params.add("wt", "xml");
-    String response = h.query(req(params));
+    String response;
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    }
     h.validateXPath(solrConfig.getResourceLoader(),response, "//*[@numFound='0']");
 
     params = new ModifiableSolrParams();
@@ -103,7 +108,9 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("partitionKeys", "a_s");
     params.add("wt", "xml");
     String response = h.query(req(params));
-    h.validateXPath(h.getCore().getResourceLoader(), response, "//*[@numFound='4']");
+    try (SolrCore core = h.getCore()) {
+      h.validateXPath(core.getResourceLoader(), response, "//*[@numFound='4']");
+    }
 
     //Test with int hash
     params = new ModifiableSolrParams();
@@ -112,7 +119,9 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("partitionKeys", "a_i");
     params.add("wt", "xml");
     response = h.query(req(params));
-    h.validateXPath(h.getCore().getResourceLoader(), response, "//*[@numFound='4']");
+    try (SolrCore core = h.getCore()) {
+      h.validateXPath(core.getResourceLoader(), response, "//*[@numFound='4']");
+    }
   }
 
 
@@ -153,9 +162,11 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set1.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set1.add(s);
+        }
       }
     }
 
@@ -172,9 +183,11 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set2.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set2.add(s);
+        }
       }
     }
 
@@ -186,15 +199,19 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("rows","50");
     params.add("wt", "xml");
     HashSet set3 = new HashSet();
-    response = h.query(req(params));
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    }
 
     it = set.iterator();
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set3.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set3.add(s);
+        }
       }
     }
 
@@ -217,15 +234,19 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("rows","50");
     params.add("wt", "xml");
     set1 = new HashSet();
-    response = h.query(req(params));
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    }
 
     it = set.iterator();
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set1.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set1.add(s);
+        }
       }
     }
 
@@ -236,15 +257,19 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("rows","50");
     params.add("wt", "xml");
     set2 = new HashSet();
-    response = h.query(req(params));
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    };
 
     it = set.iterator();
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set2.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set2.add(s);
+        }
       }
     }
 
@@ -264,15 +289,19 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("rows","50");
     params.add("wt", "xml");
     set1 = new HashSet();
-    response = h.query(req(params));
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    }
 
     it = set.iterator();
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set1.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set1.add(s);
+        }
       }
     }
 
@@ -283,15 +312,19 @@ public class TestHashQParserPlugin extends SolrTestCaseJ4 {
     params.add("rows","50");
     params.add("wt", "xml");
     set2 = new HashSet();
-    response = h.query(req(params));
+    try (SolrQueryRequest req = req(params)) {
+      response = h.query(req);
+    }
 
     it = set.iterator();
 
     while(it.hasNext()) {
       String s = it.next();
-      String results = h.validateXPath(h.getCore().getResourceLoader(), response, "*[count(//str[@name='id'][.='"+s+"'])=1]");
-      if(results == null) {
-        set2.add(s);
+      try (SolrCore core = h.getCore()) {
+        String results = h.validateXPath(core.getResourceLoader(), response, "*[count(//str[@name='id'][.='" + s + "'])=1]");
+        if (results == null) {
+          set2.add(s);
+        }
       }
     }
 
diff --git a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
index 1800ddb..680f22c 100644
--- a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
@@ -22,6 +22,7 @@ import org.apache.lucene.search.*;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -149,7 +150,9 @@ public class TestMaxScoreQueryParser extends SolrTestCaseJ4 {
       while(al.size() >= 2) {
         p.add(al.remove(0), al.remove(0));
       }
-      return new MaxScoreQParser(q, p, new MapSolrParams(Collections.singletonMap("df", "text")), req(q)).parse();
+      try (SolrQueryRequest req = req(q)) {
+        return new MaxScoreQParser(q, p, new MapSolrParams(Collections.singletonMap("df", "text")), req).parse();
+      }
     } catch (SyntaxError syntaxError) {
       fail("Failed with exception "+syntaxError.getMessage());
     }
diff --git a/solr/core/src/test/org/apache/solr/search/TestOverriddenPrefixQueryForCustomFieldType.java b/solr/core/src/test/org/apache/solr/search/TestOverriddenPrefixQueryForCustomFieldType.java
index b26603f7..c80010f 100644
--- a/solr/core/src/test/org/apache/solr/search/TestOverriddenPrefixQueryForCustomFieldType.java
+++ b/solr/core/src/test/org/apache/solr/search/TestOverriddenPrefixQueryForCustomFieldType.java
@@ -22,6 +22,7 @@ import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.response.SolrQueryResponse;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -49,6 +50,14 @@ public class TestOverriddenPrefixQueryForCustomFieldType extends SolrTestCaseJ4
     // if you override setUp or tearDown, you better call
     // the super classes version
     super.setUp();
+  }
+
+  @Override
+  @After
+  public void tearDown() throws Exception {
+    // if you override setUp or tearDown, you better call
+    // the super classes version
+    super.tearDown();
     clearIndex();
     assertU(commit());
     otherCounts=0;
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
index 43d6f39..dba9aaa 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
@@ -33,10 +33,13 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.metrics.MetricsMap;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.util.SpatialUtils;
 import org.apache.solr.util.TestUtils;
+import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -55,14 +58,25 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
     initCore("solrconfig-spatial.xml", "schema-spatial.xml");
   }
 
+  @AfterClass
+  public static void afterTestSolr4Spatial2() throws Exception {
+    deleteCore();
+  }
+
   @Override
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    clearIndex();
     RetrievalCombo.idCounter = 0;
   }
 
+  @Override
+  @After
+  public void tearDown() throws Exception {
+    clearIndex();
+    super.tearDown();
+  }
+
   @Test
   public void testQuadTreeRobustness() {
     assertU(adoc("id", "0", "oslocation", "244502.06 639062.07"));
@@ -160,7 +174,8 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
   public void testLLPDecodeIsStableAndPrecise() throws Exception {
     // test that LatLonPointSpatialField decode of docValue will round-trip (re-index then re-decode) to the same value
     @SuppressWarnings({"resource", "IOResourceOpenedButNotSafelyClosed"})
-    SolrClient client = new EmbeddedSolrServer(h.getCore());// do NOT close it; it will close Solr
+    SolrCore core = h.getCore();
+    SolrClient client = new EmbeddedSolrServer(core);// do NOT close it; it will close Solr
 
     final String fld = "llp_1_dv_dvasst";
     String ptOrig = GeoTestUtil.nextLatitude() + "," + GeoTestUtil.nextLongitude();
@@ -189,6 +204,7 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
     // lose the ability to round-trip -- 40 would become 39.99999997  (ugh).
     assertTrue("deltaCm too high: " + deltaCentimeters, deltaCentimeters < 1.48);
     // Pt(x=105.29894270124083,y=-0.4371673760042398) to  Pt(x=105.2989428,y=-0.4371673) is 1.38568
+    core.close();
   }
 
   @Test
@@ -289,41 +305,49 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
 
     // Search to the edge but not quite touching the indexed envelope of id=0.  It requires geom validation to
     //  eliminate id=0.  id=1 is found and doesn't require validation.  cache=false means no query cache.
-    final SolrQueryRequest sameReq = req(
+    SolrQueryRequest sameReq = req(
         "q", "{!cache=false field f=" + fieldName + "}Intersects(ENVELOPE(-20, -10.0001, 30, 15.0001))",
         "sort", "id asc");
     assertJQ(sameReq, "/response/numFound==1", "/response/docs/[0]/id=='1'");
 
     if (testCache) {
       // The tricky thing is verifying the cache works correctly...
-      MetricsMap cacheMetrics = (MetricsMap) h.getCore().getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.perSegSpatialFieldCache_" + fieldName);
-      assertEquals("1", cacheMetrics.getValue().get("cumulative_inserts").toString());
-      assertEquals("0", cacheMetrics.getValue().get("cumulative_hits").toString());
-
-      // Repeat the query earlier
-      assertJQ(sameReq, "/response/numFound==1", "/response/docs/[0]/id=='1'");
-      assertEquals("1", cacheMetrics.getValue().get("cumulative_hits").toString());
-
-      assertEquals("1 segment",
-          1, getSearcher().getRawReader().leaves().size());
-      // Get key of first leaf reader -- this one contains the match for sure.
-      Object leafKey1 = getFirstLeafReaderKey();
-
-      // add new segment
-      assertU(adoc("id", "3"));
-
-      assertU(commit()); // sometimes merges (to one seg), sometimes won't
-
-      // can still find the same document
-      assertJQ(sameReq, "/response/numFound==1", "/response/docs/[0]/id=='1'");
-
-      // When there are new segments, we accumulate another hit. This tests the cache was not blown away on commit.
-      // (i.e. the cache instance is new but it should've been regenerated from the old one).
-      // Checking equality for the first reader's cache key indicates whether the cache should still be valid.
-      Object leafKey2 = getFirstLeafReaderKey();
-      // get the current instance of metrics - the old one may not represent the current cache instance
-      cacheMetrics = (MetricsMap) h.getCore().getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.perSegSpatialFieldCache_" + fieldName);
-      assertEquals(leafKey1.equals(leafKey2) ? "2" : "1", cacheMetrics.getValue().get("cumulative_hits").toString());
+        SolrCore core = sameReq.getCore();
+        sameReq = req(
+            "q", "{!cache=false field f=" + fieldName + "}Intersects(ENVELOPE(-20, -10.0001, 30, 15.0001))",
+            "sort", "id asc");
+        MetricsMap cacheMetrics = (MetricsMap) core.getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.perSegSpatialFieldCache_" + fieldName);
+        assertEquals("1", cacheMetrics.getValue().get("cumulative_inserts").toString());
+        assertEquals("0", cacheMetrics.getValue().get("cumulative_hits").toString());
+
+        // Repeat the query earlier
+        assertJQ(sameReq, "/response/numFound==1", "/response/docs/[0]/id=='1'");
+        assertEquals("1", cacheMetrics.getValue().get("cumulative_hits").toString());
+
+        assertEquals("1 segment", 1, getSearcher(core).getRawReader().leaves().size());
+        // Get key of first leaf reader -- this one contains the match for sure.
+        Object leafKey1 = getFirstLeafReaderKey(core);
+
+        // add new segment
+        assertU(adoc("id", "3"));
+
+        assertU(commit()); // sometimes merges (to one seg), sometimes won't
+
+        sameReq = req(
+          "q", "{!cache=false field f=" + fieldName + "}Intersects(ENVELOPE(-20, -10.0001, 30, 15.0001))",
+          "sort", "id asc");
+        // can still find the same document
+        assertJQ(sameReq, "/response/numFound==1", "/response/docs/[0]/id=='1'");
+
+        // When there are new segments, we accumulate another hit. This tests the cache was not blown away on commit.
+        // (i.e. the cache instance is new but it should've been regenerated from the old one).
+        // Checking equality for the first reader's cache key indicates whether the cache should still be valid.
+        Object leafKey2 = getFirstLeafReaderKey(core);
+        // get the current instance of metrics - the old one may not represent the current cache instance
+
+        cacheMetrics = (MetricsMap) core.getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.perSegSpatialFieldCache_" + fieldName);
+        assertEquals(leafKey1.equals(leafKey2) ? "2" : "1", cacheMetrics.getValue().get("cumulative_hits").toString());
+
     }
 
     if (testHeatmap) {
@@ -352,14 +376,15 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
     }
   }
 
-  protected SolrIndexSearcher getSearcher() {
+  protected SolrIndexSearcher getSearcher(SolrCore core) {
     // neat trick; needn't deal with the hassle RefCounted
-    return (SolrIndexSearcher) h.getCore().getInfoRegistry().get("searcher");
+
+    return (SolrIndexSearcher) core.getInfoRegistry().get("searcher");
   }
 
 
-  protected Object getFirstLeafReaderKey() {
-    return getSearcher().getRawReader().leaves().get(0).reader().getCoreCacheHelper().getKey();
+  protected Object getFirstLeafReaderKey(SolrCore core) {
+    return getSearcher(core).getRawReader().leaves().get(0).reader().getCoreCacheHelper().getKey();
   }
 
   @Test// SOLR-8541
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
index 09ef399..9c0e43a 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolrQueryParser.java
@@ -43,6 +43,7 @@ import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.Utils;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.metrics.MetricsMap;
 import org.apache.solr.parser.QueryParser;
 import org.apache.solr.query.FilterQuery;
@@ -255,13 +256,16 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
     );
 
     // length of date math caused issues...
+    String expected;
     {
-      SchemaField foo_dt = h.getCore().getLatestSchema().getField("foo_dt");
-      String expected = "foo_dt:2013-09-11T00:00:00Z";
-      if (foo_dt.getType().isPointField()) {
-        expected = "(foo_dt:[1378857600000 TO 1378857600000])";
-        if (foo_dt.hasDocValues() && foo_dt.indexed()) {
-          expected = "IndexOrDocValuesQuery"+expected ;
+      try (SolrCore core = h.getCore()) {
+        SchemaField foo_dt = core.getLatestSchema().getField("foo_dt");
+        expected = "foo_dt:2013-09-11T00:00:00Z";
+        if (foo_dt.getType().isPointField()) {
+          expected = "(foo_dt:[1378857600000 TO 1378857600000])";
+          if (foo_dt.hasDocValues() && foo_dt.indexed()) {
+            expected = "IndexOrDocValuesQuery" + expected;
+          }
         }
       }
       assertJQ(req("q", "foo_dt:\"2013-03-08T00:46:15Z/DAY+000MILLISECONDS+00SECONDS+00MINUTES+00HOURS+0000000000YEARS+6MONTHS+3DAYS\"", "debug", "query")
@@ -447,24 +451,23 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
   @Test
   public void testManyClauses_Solr() throws Exception {
     final String a = "1 a 2 b 3 c 10 d 11 12 "; // 10 terms
-    
+
     // this should exceed our solrconfig.xml level (solr specific) maxBooleanClauses limit
     // even though it's not long enough to trip the Lucene level (global) limit
     final String too_long = "id:(" + a + a + a + a + a + ")";
 
     final String expectedMsg = "Too many clauses";
     ignoreException(expectedMsg);
-    SolrException e = expectThrows(SolrException.class, "expected SolrException",
-                                   () -> assertJQ(req("q", too_long), "/response/numFound==6"));
+    SolrException e;
+    SolrQueryRequest req = req("q", too_long);
+    e = expectThrows(SolrException.class, "expected SolrException", () -> assertJQ(req, "/response/numFound==6"));
+
     assertThat(e.getMessage(), containsString(expectedMsg));
-    
+
     // but should still work as a filter query since TermsQuery can be used...
-    assertJQ(req("q","*:*", "fq", too_long)
-             ,"/response/numFound==6");
-    assertJQ(req("q","*:*", "fq", too_long, "sow", "false")
-             ,"/response/numFound==6");
-    assertJQ(req("q","*:*", "fq", too_long, "sow", "true")
-             ,"/response/numFound==6");
+    assertJQ(req("q", "*:*", "fq", too_long), "/response/numFound==6");
+    assertJQ(req("q", "*:*", "fq", too_long, "sow", "false"), "/response/numFound==6");
+    assertJQ(req("q", "*:*", "fq", too_long, "sow", "true"), "/response/numFound==6");
   }
     
   @Test
@@ -547,15 +550,14 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
     assertU(adoc("id", "777"));
     delI("777");
     assertU(commit());  // arg... commit no longer "commits" unless there has been a change.
+    final MetricsMap filterCacheStats;
+    try (SolrCore core = h.getCore()) {
+      filterCacheStats = (MetricsMap) core.getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.filterCache");
+      assertNotNull(filterCacheStats);
+      final MetricsMap queryCacheStats = (MetricsMap) core.getCoreMetricManager().getRegistry().getMetrics().get("CACHE.searcher.queryResultCache");
 
-
-    final MetricsMap filterCacheStats = (MetricsMap)h.getCore().getCoreMetricManager().getRegistry()
-        .getMetrics().get("CACHE.searcher.filterCache");
-    assertNotNull(filterCacheStats);
-    final MetricsMap queryCacheStats = (MetricsMap)h.getCore().getCoreMetricManager().getRegistry()
-        .getMetrics().get("CACHE.searcher.queryResultCache");
-
-    assertNotNull(queryCacheStats);
+      assertNotNull(queryCacheStats);
+    }
 
 
     long inserts = (Long) filterCacheStats.getValue().get("inserts");
@@ -1064,95 +1066,43 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
     assertJQ(req("df", "syn", "q", "+(wi fi)", "sow", "false")
         , "/response/numFound==1"
     );
+    try (SolrQueryRequest req = req("q", "*:*", "rows", "0", "wt", "json")) {
+      Map all = (Map) Utils.fromJSONString(h.query(req));
+      int totalDocs = Integer.parseInt(((Map) all.get("response")).get("numFound").toString());
+      int allDocsExceptOne = totalDocs - 1;
 
-    Map all = (Map) Utils.fromJSONString(h.query(req("q", "*:*", "rows", "0", "wt", "json")));
-    int totalDocs = Integer.parseInt(((Map)all.get("response")).get("numFound").toString());
-    int allDocsExceptOne = totalDocs - 1;
-
-    assertJQ(req("df", "syn", "q", "-(wi fi)", "sow", "false")
-        , "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
-    );
-    assertJQ(req("df", "syn", "q", "!(wi fi)", "sow", "false")
-        , "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
-    );
-    assertJQ(req("df", "syn", "q", "NOT (wi fi)", "sow", "false")
-        , "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
-    );
-    assertJQ(req("df", "syn", "q", "(wi fi)^2", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "(wi fi)^=2", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "syn:(wi fi)", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "+ATM wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "-ATM wi fi", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "-NotThereAtAll wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "!ATM wi fi", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "!NotThereAtAll wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "NOT ATM wi fi", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "NOT NotThereAtAll wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "AT* wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "AT? wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "\"ATM\" wi fi", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi +ATM", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi -ATM", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi -NotThereAtAll", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi !ATM", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi !NotThereAtAll", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi NOT ATM", "sow", "false")
-        , "/response/numFound==0"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi NOT NotThereAtAll", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi AT*", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi AT?", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "wi fi \"ATM\"", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "\"wi fi\"~2", "sow", "false")
-        , "/response/numFound==1"
-    );
-    assertJQ(req("df", "syn", "q", "syn:\"wi fi\"", "sow", "false")
-        , "/response/numFound==1"
-    );
+      assertJQ(req("df", "syn", "q", "-(wi fi)", "sow", "false"), "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
+      );
+      assertJQ(req("df", "syn", "q", "!(wi fi)", "sow", "false"), "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
+      );
+      assertJQ(req("df", "syn", "q", "NOT (wi fi)", "sow", "false"), "/response/numFound==" + allDocsExceptOne  // one doc contains "wifi" in the syn field
+      );
+      assertJQ(req("df", "syn", "q", "(wi fi)^2", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "(wi fi)^=2", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "syn:(wi fi)", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "+ATM wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "-ATM wi fi", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "-NotThereAtAll wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "!ATM wi fi", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "!NotThereAtAll wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "NOT ATM wi fi", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "NOT NotThereAtAll wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "AT* wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "AT? wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "\"ATM\" wi fi", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi +ATM", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi -ATM", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "wi fi -NotThereAtAll", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi !ATM", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "wi fi !NotThereAtAll", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi NOT ATM", "sow", "false"), "/response/numFound==0");
+      assertJQ(req("df", "syn", "q", "wi fi NOT NotThereAtAll", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi AT*", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi AT?", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "wi fi \"ATM\"", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "\"wi fi\"~2", "sow", "false"), "/response/numFound==1");
+      assertJQ(req("df", "syn", "q", "syn:\"wi fi\"", "sow", "false"), "/response/numFound==1");
+    }
   }
 
   @Test
@@ -1208,19 +1158,25 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
 
 
   public void testSynonymQueryStyle() throws Exception {
+    Query q;
+    try (SolrQueryRequest req = req(params("df", "t_pick_best_foo"))) {
+      q = QParser.getParser("tabby", req).getQuery();
+      assertEquals("(t_pick_best_foo:tabbi | t_pick_best_foo:cat | t_pick_best_foo:felin | t_pick_best_foo:anim)", q.toString());
+    }
 
-    Query q = QParser.getParser("tabby", req(params("df", "t_pick_best_foo"))).getQuery();
-    assertEquals("(t_pick_best_foo:tabbi | t_pick_best_foo:cat | t_pick_best_foo:felin | t_pick_best_foo:anim)", q.toString());
-
-    q = QParser.getParser("tabby", req(params("df", "t_as_distinct_foo"))).getQuery();
-    assertEquals("t_as_distinct_foo:tabbi t_as_distinct_foo:cat t_as_distinct_foo:felin t_as_distinct_foo:anim", q.toString());
-
+    try (SolrQueryRequest req = req(params("df", "t_as_distinct_foo"))) {
+      q = QParser.getParser("tabby", req).getQuery();
+      assertEquals("t_as_distinct_foo:tabbi t_as_distinct_foo:cat t_as_distinct_foo:felin t_as_distinct_foo:anim", q.toString());
+    }
     /*confirm autoGeneratePhraseQueries always builds OR queries*/
-    q = QParser.getParser("jeans",  req(params("df", "t_as_distinct_foo", "sow", "false"))).getQuery();
-    assertEquals("(t_as_distinct_foo:\"denim pant\" t_as_distinct_foo:jean)", q.toString());
-
-    q = QParser.getParser("jeans",  req(params("df", "t_pick_best_foo", "sow", "false"))).getQuery();
-    assertEquals("(t_pick_best_foo:\"denim pant\" | t_pick_best_foo:jean)", q.toString());
+    try (SolrQueryRequest req = req(params("df", "t_as_distinct_foo", "sow", "false"))) {
+      q = QParser.getParser("jeans", req).getQuery();
+      assertEquals("(t_as_distinct_foo:\"denim pant\" t_as_distinct_foo:jean)", q.toString());
+    }
+    try (SolrQueryRequest req = req(params("df", "t_pick_best_foo", "sow", "false"))) {
+      q = QParser.getParser("jeans", req).getQuery();
+      assertEquals("(t_pick_best_foo:\"denim pant\" | t_pick_best_foo:jean)", q.toString());
+    }
   }
 
   @AwaitsFix(bugUrl = "nocommit - review difference")
@@ -1472,7 +1428,8 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
       qParser.setIsFilter(true);
       qParser.getQuery();
     }
-
+    req.close();
+    req = req();
     for (String suffix:fieldSuffix) {
       qParser = QParser.getParser("foo_" + suffix + ":(1 2 3 4 5 6 7 8 9 10 20 19 18 17 16 15 14 13 12 NOT_A_NUMBER)", req);
       qParser.setIsFilter(true); // this may change in the future
@@ -1481,12 +1438,12 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
       assertTrue("Unexpected exception: " + e.getMessage(), e.getMessage().contains("Invalid Number: NOT_A_NUMBER"));
     }
 
-
+    req.close();
   }
 
   @Test
   public void testFieldExistsQueries() throws SyntaxError {
-    SolrQueryRequest req = req();
+
     String[] fieldSuffix = new String[] {
         "ti", "tf", "td", "tl", "tdt",
         "pi", "pf", "pd", "pl", "pdt",
@@ -1504,32 +1461,38 @@ public class TestSolrQueryParser extends SolrTestCaseJ4 {
 
     for (String existenceQuery : existenceQueries) {
       for (String suffix : fieldSuffix) {
-        IndexSchema indexSchema = h.getCore().getLatestSchema();
-        String field = "foo_" + suffix;
-        String query = field + ":" + existenceQuery;
-        QParser qParser = QParser.getParser(query, req);
-        Query createdQuery = qParser.getQuery();
-        SchemaField schemaField = indexSchema.getField(field);
-
-        // Test float & double realNumber queries differently
-        if ("[* TO *]".equals(existenceQuery) && (schemaField.getType().getNumberType() == NumberType.DOUBLE || schemaField.getType().getNumberType() == NumberType.FLOAT)) {
-          assertFalse("For float and double fields \"" + query + "\" is not an existence query, so the query returned should not be a DocValuesFieldExistsQuery.", createdQuery instanceof DocValuesFieldExistsQuery);
-          assertFalse("For float and double fields \"" + query + "\" is not an existence query, so the query returned should not be a NormsFieldExistsQuery.", createdQuery instanceof NormsFieldExistsQuery);
-          assertFalse("For float and double fields \"" + query + "\" is not an existence query, so NaN should not be matched via a ConstantScoreQuery.", createdQuery instanceof ConstantScoreQuery);
-          assertFalse("For float and double fields\"" + query + "\" is not an existence query, so NaN should not be matched via a BooleanQuery (NaN and [* TO *]).", createdQuery instanceof BooleanQuery);
-        } else {
-          if (schemaField.hasDocValues()) {
-            assertTrue("Field has docValues, so existence query \"" + query + "\" should return DocValuesFieldExistsQuery", createdQuery instanceof DocValuesFieldExistsQuery);
-          } else if (!schemaField.omitNorms() && !schemaField.getType().isPointField()) { //TODO: Remove !isPointField() for SOLR-14199
-            assertTrue("Field has norms and no docValues, so existence query \"" + query + "\" should return NormsFieldExistsQuery", createdQuery instanceof NormsFieldExistsQuery);
-          } else if (schemaField.getType().getNumberType() == NumberType.DOUBLE || schemaField.getType().getNumberType() == NumberType.FLOAT) {
-            assertTrue("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\".", createdQuery instanceof ConstantScoreQuery);
-            assertTrue("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\".", ((ConstantScoreQuery)createdQuery).getQuery() instanceof BooleanQuery);
-            assertEquals("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\". This boolean query must be an OR.", 1, ((BooleanQuery)((ConstantScoreQuery)createdQuery).getQuery()).getMinimumNumberShouldMatch());
-            assertEquals("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\". This boolean query must have 2 clauses.", 2, ((BooleanQuery)((ConstantScoreQuery)createdQuery).getQuery()).clauses().size());
+        try (SolrCore core = h.getCore()) {
+          IndexSchema indexSchema = core.getLatestSchema();
+          String field = "foo_" + suffix;
+          String query = field + ":" + existenceQuery;
+          SolrQueryRequest req = req();
+          QParser qParser = QParser.getParser(query, req);
+          req.close();
+          Query createdQuery = qParser.getQuery();
+          SchemaField schemaField = indexSchema.getField(field);
+
+          // Test float & double realNumber queries differently
+          if ("[* TO *]".equals(existenceQuery) && (schemaField.getType().getNumberType() == NumberType.DOUBLE || schemaField.getType().getNumberType() == NumberType.FLOAT)) {
+            assertFalse("For float and double fields \"" + query + "\" is not an existence query, so the query returned should not be a DocValuesFieldExistsQuery.", createdQuery instanceof DocValuesFieldExistsQuery);
+            assertFalse("For float and double fields \"" + query + "\" is not an existence query, so the query returned should not be a NormsFieldExistsQuery.", createdQuery instanceof NormsFieldExistsQuery);
+            assertFalse("For float and double fields \"" + query + "\" is not an existence query, so NaN should not be matched via a ConstantScoreQuery.", createdQuery instanceof ConstantScoreQuery);
+            assertFalse("For float and double fields\"" + query + "\" is not an existence query, so NaN should not be matched via a BooleanQuery (NaN and [* TO *]).", createdQuery instanceof BooleanQuery);
           } else {
-            assertFalse("Field doesn't have docValues, so existence query \"" + query + "\" should not return DocValuesFieldExistsQuery", createdQuery instanceof DocValuesFieldExistsQuery);
-            assertFalse("Field doesn't have norms, so existence query \"" + query + "\" should not return NormsFieldExistsQuery", createdQuery instanceof NormsFieldExistsQuery);
+            if (schemaField.hasDocValues()) {
+              assertTrue("Field has docValues, so existence query \"" + query + "\" should return DocValuesFieldExistsQuery", createdQuery instanceof DocValuesFieldExistsQuery);
+            } else if (!schemaField.omitNorms() && !schemaField.getType().isPointField()) { //TODO: Remove !isPointField() for SOLR-14199
+              assertTrue("Field has norms and no docValues, so existence query \"" + query + "\" should return NormsFieldExistsQuery", createdQuery instanceof NormsFieldExistsQuery);
+            } else if (schemaField.getType().getNumberType() == NumberType.DOUBLE || schemaField.getType().getNumberType() == NumberType.FLOAT) {
+              assertTrue("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\".", createdQuery instanceof ConstantScoreQuery);
+              assertTrue("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\".", ((ConstantScoreQuery) createdQuery).getQuery() instanceof BooleanQuery);
+              assertEquals("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\". This boolean query must be an OR.", 1,
+                  ((BooleanQuery) ((ConstantScoreQuery) createdQuery).getQuery()).getMinimumNumberShouldMatch());
+              assertEquals("PointField with NaN values must include \"exists or NaN\" if the field doesn't have norms or docValues: \"" + query + "\". This boolean query must have 2 clauses.", 2,
+                  ((BooleanQuery) ((ConstantScoreQuery) createdQuery).getQuery()).clauses().size());
+            } else {
+              assertFalse("Field doesn't have docValues, so existence query \"" + query + "\" should not return DocValuesFieldExistsQuery", createdQuery instanceof DocValuesFieldExistsQuery);
+              assertFalse("Field doesn't have norms, so existence query \"" + query + "\" should not return NormsFieldExistsQuery", createdQuery instanceof NormsFieldExistsQuery);
+            }
           }
         }
       }
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressReorder.java b/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
index ea6323b..3923987 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
@@ -26,6 +26,7 @@ import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.util.TestHarness;
@@ -307,14 +308,19 @@ public class TestStressReorder extends TestRTGBase {
               if (VERBOSE) {
                 verbose("querying id", id);
               }
-              SolrQueryRequest sreq;
-              if (realTime) {
-                sreq = req("wt","json", "qt","/get", "ids",Integer.toString(id));
-              } else {
-                sreq = req("wt","json", "q","id:"+Integer.toString(id), "omitHeader","true");
-              }
+              String response = null;
+              SolrQueryRequest sreq = null;
+              try {
+                if (realTime) {
+                  sreq = req("wt", "json", "qt", "/get", "ids", Integer.toString(id));
+                } else {
+                  sreq = req("wt", "json", "q", "id:" + Integer.toString(id), "omitHeader", "true");
+                }
 
-              String response = h.query(sreq);
+                response = h.query(sreq);
+              } finally {
+                IOUtils.closeQuietly(sreq);
+              }
               Map rsp = (Map) Utils.fromJSONString(response);
               List doclist = (List)(((Map)rsp.get("response")).get("docs"));
               if (doclist.size() == 0) {
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressUserVersions.java b/solr/core/src/test/org/apache/solr/search/TestStressUserVersions.java
index ab86cdc..e63e7cf 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressUserVersions.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressUserVersions.java
@@ -28,6 +28,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrQueryRequest;
@@ -268,14 +269,19 @@ public class TestStressUserVersions extends TestRTGBase {
               if (VERBOSE) {
                 verbose("querying id", id);
               }
-              SolrQueryRequest sreq;
-              if (realTime) {
-                sreq = req("wt","json", "qt","/get", "ids",Integer.toString(id));
-              } else {
-                sreq = req("wt","json", "q","id:"+Integer.toString(id), "omitHeader","true");
-              }
+              SolrQueryRequest sreq = null;
+              String response;
+              try {
+                if (realTime) {
+                  sreq = req("wt", "json", "qt", "/get", "ids", Integer.toString(id));
+                } else {
+                  sreq = req("wt", "json", "q", "id:" + Integer.toString(id), "omitHeader", "true");
+                }
 
-              String response = h.query(sreq);
+                response = h.query(sreq);
+              } finally {
+                IOUtils.closeQuietly(sreq);
+              }
               Map rsp = (Map) Utils.fromJSONString(response);
               List doclist = (List)(((Map)rsp.get("response")).get("docs"));
               if (doclist.size() == 0) {
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressVersions.java b/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
index d7996d4..6d18c8e 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
@@ -25,6 +25,7 @@ import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.util.TestHarness;
@@ -240,14 +241,19 @@ public class TestStressVersions extends TestRTGBase {
               if (VERBOSE) {
                 verbose("querying id", id);
               }
-              SolrQueryRequest sreq;
-              if (realTime) {
-                sreq = req("wt","json", "qt","/get", "ids",Integer.toString(id));
-              } else {
-                sreq = req("wt","json", "q","id:"+Integer.toString(id), "omitHeader","true");
-              }
+              String response = null;
+              SolrQueryRequest sreq = null;
+              try {
+                if (realTime) {
+                  sreq = req("wt", "json", "qt", "/get", "ids", Integer.toString(id));
+                } else {
+                  sreq = req("wt", "json", "q", "id:" + Integer.toString(id), "omitHeader", "true");
+                }
 
-              String response = h.query(sreq);
+                response = h.query(sreq);
+              } finally {
+                IOUtils.closeQuietly(sreq);
+              }
               Map rsp = (Map) Utils.fromJSONString(response);
               List doclist = (List)(((Map)rsp.get("response")).get("docs"));
               if (doclist.size() == 0) {
diff --git a/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java b/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java
index 7056064..3ec33ba 100644
--- a/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java
+++ b/solr/core/src/test/org/apache/solr/search/TestValueSourceCache.java
@@ -19,6 +19,7 @@ package org.apache.solr.search;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.QueryUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -29,7 +30,9 @@ public class TestValueSourceCache extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
     initCore("solrconfig.xml", "schema.xml");
-    _func = QParser.getParser(null, FunctionQParserPlugin.NAME, lrf.makeRequest());
+    try (SolrQueryRequest req = lrf.makeRequest()) {
+      _func = QParser.getParser(null, FunctionQParserPlugin.NAME, req);
+    }
   }
 
   static QParser _func;
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetErrors.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetErrors.java
index d79908e..a694a90 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetErrors.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetErrors.java
@@ -21,6 +21,7 @@ import org.apache.solr.JSONTestUtil;
 import org.apache.solr.SolrTestCaseHS;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -153,104 +154,94 @@ public class TestJsonFacetErrors extends SolrTestCaseHS {
     indexSimple(client);
 
     SolrParams params = params("q", "*:*", "rows", "0");
-
+    SolrException ex;
     // invalid format for ranges
-    SolrException ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i,start:-10,end:10,gap:2," +
-            "ranges:[{key:\"0-200\", to:200}]}}"))
-    );
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
-    assertEquals("Cannot set gap/start/end and ranges params together", ex.getMessage());
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i,start:-10,end:10,gap:2," +
+        "ranges:[{key:\"0-200\", to:200}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:bleh}}"))
-    );
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
+      assertEquals("Cannot set gap/start/end and ranges params together", ex.getMessage());
+    }
+
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," +
+        "ranges:bleh}}")){
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Expected List for ranges but got String"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[bleh]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," +
+        "ranges:[bleh]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Expected Map for range but got String"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{from:0, to:200, inclusive_to:bleh}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{from:0, to:200, inclusive_to:bleh}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Expected boolean type for param 'inclusive_to' but got String"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{from:0, to:200, inclusive_from:bleh}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{from:0, to:200, inclusive_from:bleh}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Expected boolean type for param 'inclusive_from' but got String"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{from:bleh, to:200}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{from:bleh, to:200}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("Can't parse value bleh for field: num_i", ex.getMessage());
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{from:0, to:bleh}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{from:0, to:bleh}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("Can't parse value bleh for field: num_i", ex.getMessage());
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{from:200, to:0}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{from:200, to:0}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("'from' is higher than 'to' in range for key: [200,0)", ex.getMessage());
 
     // with old format
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("empty facet range"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"bl\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"bl\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Invalid start character b in facet range bl"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"(bl\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"(bl\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertTrue(ex.getMessage().contains("Invalid end character l in facet range (bl"));
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"(bleh,12)\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"(bleh,12)\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("Can't parse value bleh for field: num_i", ex.getMessage());
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"(12,bleh)\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"(12,bleh)\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("Can't parse value bleh for field: num_i", ex.getMessage());
 
-    ex = expectThrows(SolrException.class,
-        () -> h.query(req(params, "json.facet", "{price:{type :range, field : num_i," +
-            "ranges:[{range:\"(200,12)\"}]}}"))
-    );
+    try (SolrQueryRequest req = req(params, "json.facet", "{price:{type :range, field : num_i," + "ranges:[{range:\"(200,12)\"}]}}")) {
+      ex = expectThrows(SolrException.class, () -> h.query(req));
+    }
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, ex.code());
     assertEquals("'start' is higher than 'end' in range for key: (200,12)", ex.getMessage());
   }
@@ -367,33 +358,38 @@ public class TestJsonFacetErrors extends SolrTestCaseHS {
   public void testAggErrors() {
     ignoreException("aggregation");
 
-    SolrException e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "json.facet", "{bleh:'div(2,4)'}"));
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
-    assertThat(e.getMessage(),
-        containsString("Expected multi-doc aggregation from 'div' but got per-doc function in input ('div(2,4)"));
-
-    e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "json.facet", "{b:'agg(div(2,4))'}"));
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
-    assertThat(e.getMessage(),
-        containsString("Expected multi-doc aggregation from 'div' but got per-doc function in input ('agg(div(2,4))"));
-
-    e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "json.facet", "{b:'agg(bleh(2,4))'}"));
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
-    assertThat(e.getMessage(),
-        containsString("Unknown aggregation 'bleh' in input ('agg(bleh(2,4))"));
-
-    e = expectThrows(SolrException.class, () -> {
-      h.query(req("q", "*:*", "json.facet", "{b:'bleh(2,4)'}"));
-    });
-    assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
-    assertThat(e.getMessage(),
-        containsString("Unknown aggregation 'bleh' in input ('bleh(2,4)"));
+    SolrException e;
+    try (SolrQueryRequest req = req("q", "*:*", "json.facet", "{bleh:'div(2,4)'}")) {
+      e = expectThrows(SolrException.class, () -> {
+        h.query(req);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
+      assertThat(e.getMessage(), containsString("Expected multi-doc aggregation from 'div' but got per-doc function in input ('div(2,4)"));
+    }
+
+    try (SolrQueryRequest req = req("q", "*:*", "json.facet", "{b:'agg(div(2,4))'}")) {
+      e = expectThrows(SolrException.class, () -> {
+        h.query(req);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
+      assertThat(e.getMessage(), containsString("Expected multi-doc aggregation from 'div' but got per-doc function in input ('agg(div(2,4))"));
+    }
+
+    try (SolrQueryRequest req = req("q", "*:*", "json.facet", "{b:'agg(bleh(2,4))'}")) {
+      e = expectThrows(SolrException.class, () -> {
+        h.query(req);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
+      assertThat(e.getMessage(), containsString("Unknown aggregation 'bleh' in input ('agg(bleh(2,4))"));
+    }
+
+    try (SolrQueryRequest req = req("q", "*:*", "json.facet", "{b:'bleh(2,4)'}")) {
+      e = expectThrows(SolrException.class, () -> {
+        h.query(req);
+      });
+      assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
+      assertThat(e.getMessage(), containsString("Unknown aggregation 'bleh' in input ('bleh(2,4)"));
+    }
 
     resetExceptionIgnores();
   }
diff --git a/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java b/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
index 889c383..50dfedc 100644
--- a/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
+++ b/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
@@ -30,6 +30,8 @@ import org.apache.lucene.search.similarities.TFIDFSimilarity;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -49,13 +51,15 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
   static long start = System.nanoTime();
   
   void makeExternalFile(String field, String contents) {
-    String dir = h.getCore().getDataDir();
-    String filename = dir + "/external_" + field + "." + (start++);
-
-    try (Writer out = new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8)) {
-      out.write(contents);
-    } catch (Exception e) {
-      throw new RuntimeException(e);
+    try (SolrCore core = h.getCore()) {
+      String dir = core.getDataDir();
+      String filename = dir + "/external_" + field + "." + (start++);
+
+      try (Writer out = new OutputStreamWriter(new FileOutputStream(filename), StandardCharsets.UTF_8)) {
+        out.write(contents);
+      } catch (Exception e) {
+        throw new RuntimeException(e);
+      }
     }
   }
 
@@ -230,7 +234,9 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
     assertTrue(orig == FileFloatSource.onlyForTesting);
 
     makeExternalFile(field, "0=1");
-    assertU(h.query("/reloadCache",lrf.makeRequest("","")));
+    try (SolrQueryRequest req = lrf.makeRequest("","")) {
+      assertU(h.query("/reloadCache", req));
+    }
     singleTest(field, "sqrt(\0)");
     assertTrue(orig != FileFloatSource.onlyForTesting);
 
@@ -266,7 +272,9 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
       makeExternalFile(field, sb.toString());
 
       // make it visible
-      assertU(h.query("/reloadCache",lrf.makeRequest("","")));
+      try (SolrQueryRequest req = lrf.makeRequest("","")) {
+        assertU(h.query("/reloadCache", req));
+      }
 
       // test it
       float[] answers = new float[ids.length*2];
@@ -481,11 +489,12 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
 
     TFIDFSimilarity similarity = null;
     {
-      Similarity sim = h.getCore().getLatestSchema().getFieldType("a_tfidf").getSimilarity();
-      assertNotNull("Test needs *_tfidf to use a TFIDFSimilarity ... who broke the config?", sim);
-      assertTrue("Test needs *_tfidf to use a TFIDFSimilarity ... who broke the config: " + sim.getClass(),
-                 sim instanceof TFIDFSimilarity);
-      similarity = (TFIDFSimilarity) sim;
+      try (SolrCore core = h.getCore()) {
+        Similarity sim = core.getLatestSchema().getFieldType("a_tfidf").getSimilarity();
+        assertNotNull("Test needs *_tfidf to use a TFIDFSimilarity ... who broke the config?", sim);
+        assertTrue("Test needs *_tfidf to use a TFIDFSimilarity ... who broke the config: " + sim.getClass(), sim instanceof TFIDFSimilarity);
+        similarity = (TFIDFSimilarity) sim;
+      }
     }
      
     assertU(adoc("id","1", "a_tdt","2009-08-31T12:10:10.123Z", "b_tdt","2009-08-31T12:10:10.124Z"));
diff --git a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
index bc2aa19..5aeedfa 100644
--- a/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
+++ b/solr/core/src/test/org/apache/solr/servlet/SolrRequestParserTest.java
@@ -66,7 +66,9 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
   public static void beforeClass() throws Exception {
     assumeWorkingMockito();
     initCore("solrconfig.xml", "schema.xml");
-    parser = new SolrRequestParsers( h.getCore().getSolrConfig() );
+    try (SolrCore core = h.getCore()) {
+      parser = new SolrRequestParsers(core.getSolrConfig());
+    }
   }
   
   static SolrRequestParsers parser;
@@ -82,47 +84,48 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
     String body1 = "AMANAPLANPANAMA";
     String body2 = "qwertasdfgzxcvb";
     String body3 = "1234567890";
-    
-    SolrCore core = h.getCore();
-    
-    Map<String,String[]> args = new HashMap<>();
-    args.put( CommonParams.STREAM_BODY, new String[] {body1} );
-    
-    // Make sure it got a single stream in and out ok
-    List<ContentStream> streams = new ArrayList<>();
-    SolrQueryRequest req = parser.buildRequestFrom( core, new MultiMapSolrParams( args ), streams );
-    assertEquals( 1, streams.size() );
-    assertEquals( body1, IOUtils.toString( streams.get(0).getReader() ) );
-    req.close();
-
-    // Now add three and make sure they come out ok
-    streams = new ArrayList<>();
-    args.put( CommonParams.STREAM_BODY, new String[] {body1,body2,body3} );
-    req = parser.buildRequestFrom( core, new MultiMapSolrParams( args ), streams );
-    assertEquals( 3, streams.size() );
-    ArrayList<String> input  = new ArrayList<>();
-    ArrayList<String> output = new ArrayList<>();
-    input.add( body1 );
-    input.add( body2 );
-    input.add( body3 );
-    output.add( IOUtils.toString( streams.get(0).getReader() ) );
-    output.add( IOUtils.toString( streams.get(1).getReader() ) );
-    output.add( IOUtils.toString( streams.get(2).getReader() ) );
-    // sort them so the output is consistent
-    Collections.sort( input );
-    Collections.sort( output );
-    assertEquals( input.toString(), output.toString() );
-    req.close();
-
-    // set the contentType and make sure tat gets set
-    String ctype = "text/xxx";
-    streams = new ArrayList<>();
-    args.put( CommonParams.STREAM_CONTENTTYPE, new String[] {ctype} );
-    req = parser.buildRequestFrom( core, new MultiMapSolrParams( args ), streams );
-    for( ContentStream s : streams ) {
-      assertEquals( ctype, s.getContentType() );
+
+    try (SolrCore core = h.getCore()) {
+
+      Map<String,String[]> args = new HashMap<>();
+      args.put(CommonParams.STREAM_BODY, new String[] {body1});
+
+      // Make sure it got a single stream in and out ok
+      List<ContentStream> streams = new ArrayList<>();
+      SolrQueryRequest req = parser.buildRequestFrom(core, new MultiMapSolrParams(args), streams);
+      assertEquals(1, streams.size());
+      assertEquals(body1, IOUtils.toString(streams.get(0).getReader()));
+      req.close();
+
+      // Now add three and make sure they come out ok
+      streams = new ArrayList<>();
+      args.put(CommonParams.STREAM_BODY, new String[] {body1, body2, body3});
+      req = parser.buildRequestFrom(core, new MultiMapSolrParams(args), streams);
+      assertEquals(3, streams.size());
+      ArrayList<String> input = new ArrayList<>();
+      ArrayList<String> output = new ArrayList<>();
+      input.add(body1);
+      input.add(body2);
+      input.add(body3);
+      output.add(IOUtils.toString(streams.get(0).getReader()));
+      output.add(IOUtils.toString(streams.get(1).getReader()));
+      output.add(IOUtils.toString(streams.get(2).getReader()));
+      // sort them so the output is consistent
+      Collections.sort(input);
+      Collections.sort(output);
+      assertEquals(input.toString(), output.toString());
+      req.close();
+
+      // set the contentType and make sure tat gets set
+      String ctype = "text/xxx";
+      streams = new ArrayList<>();
+      args.put(CommonParams.STREAM_CONTENTTYPE, new String[] {ctype});
+      req = parser.buildRequestFrom(core, new MultiMapSolrParams(args), streams);
+      for (ContentStream s : streams) {
+        assertEquals(ctype, s.getContentType());
+      }
+      req.close();
     }
-    req.close();
   }
   
   @Test
@@ -133,17 +136,18 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
     
     byte[] bytes = IOUtils.toByteArray(url);
 
-    SolrCore core = h.getCore();
-    
-    Map<String,String[]> args = new HashMap<>();
-    args.put( CommonParams.STREAM_URL, new String[] { url.toExternalForm() } );
-    
-    // Make sure it got a single stream in and out ok
-    List<ContentStream> streams = new ArrayList<>();
-    try (SolrQueryRequest req = parser.buildRequestFrom( core, new MultiMapSolrParams( args ), streams )) {
-      assertEquals( 1, streams.size() );
-      try (InputStream in = streams.get(0).getStream()) {
-        assertArrayEquals( bytes, IOUtils.toByteArray( in ) );
+    try (SolrCore core = h.getCore()) {
+
+      Map<String,String[]> args = new HashMap<>();
+      args.put(CommonParams.STREAM_URL, new String[] {url.toExternalForm()});
+
+      // Make sure it got a single stream in and out ok
+      List<ContentStream> streams = new ArrayList<>();
+      try (SolrQueryRequest req = parser.buildRequestFrom(core, new MultiMapSolrParams(args), streams)) {
+        assertEquals(1, streams.size());
+        try (InputStream in = streams.get(0).getStream()) {
+          assertArrayEquals(bytes, IOUtils.toByteArray(in));
+        }
       }
     }
   }
@@ -155,17 +159,18 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
     
     byte[] bytes = FileUtils.readFileToByteArray(file);
 
-    SolrCore core = h.getCore();
-    
-    Map<String,String[]> args = new HashMap<>();
-    args.put( CommonParams.STREAM_FILE, new String[] { file.getAbsolutePath() } );
-    
-    // Make sure it got a single stream in and out ok
-    List<ContentStream> streams = new ArrayList<>();
-    try (SolrQueryRequest req = parser.buildRequestFrom( core, new MultiMapSolrParams( args ), streams )) {
-      assertEquals( 1, streams.size() );
-      try (InputStream in = streams.get(0).getStream()) {
-        assertArrayEquals( bytes, IOUtils.toByteArray( in ) );
+    try (SolrCore core = h.getCore()) {
+
+      Map<String,String[]> args = new HashMap<>();
+      args.put(CommonParams.STREAM_FILE, new String[] {file.getAbsolutePath()});
+
+      // Make sure it got a single stream in and out ok
+      List<ContentStream> streams = new ArrayList<>();
+      try (SolrQueryRequest req = parser.buildRequestFrom(core, new MultiMapSolrParams(args), streams)) {
+        assertEquals(1, streams.size());
+        try (InputStream in = streams.get(0).getStream()) {
+          assertArrayEquals(bytes, IOUtils.toByteArray(in));
+        }
       }
     }
   }
@@ -396,29 +401,30 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
       v.add(entry.getValue());
       when(request.getHeaders(entry.getKey())).thenReturn(v.elements());
     }
-
-    SolrRequestParsers parsers = new SolrRequestParsers(h.getCore().getSolrConfig());
-    assertFalse(parsers.isAddRequestHeadersToContext());
-    SolrQueryRequest solrReq = parsers.parse(h.getCore(), "/select", request);
-    assertFalse(solrReq.getContext().containsKey("httpRequest"));
-    
-    parsers.setAddRequestHeadersToContext(true);
-    solrReq = parsers.parse(h.getCore(), "/select", request);
-    assertEquals(request, solrReq.getContext().get("httpRequest"));
-    assertEquals("10.0.0.1", ((HttpServletRequest)solrReq.getContext().get("httpRequest")).getHeaders("X-Forwarded-For").nextElement());
-    
+    try (SolrCore core = h.getCore()) {
+      SolrRequestParsers parsers = new SolrRequestParsers(core.getSolrConfig());
+      assertFalse(parsers.isAddRequestHeadersToContext());
+      SolrQueryRequest solrReq = parsers.parse(core, "/select", request);
+      assertFalse(solrReq.getContext().containsKey("httpRequest"));
+
+      parsers.setAddRequestHeadersToContext(true);
+      solrReq = parsers.parse(core, "/select", request);
+      assertEquals(request, solrReq.getContext().get("httpRequest"));
+      assertEquals("10.0.0.1", ((HttpServletRequest) solrReq.getContext().get("httpRequest")).getHeaders("X-Forwarded-For").nextElement());
+    }
   }
 
   public void testPostMissingContentType() throws Exception {
     HttpServletRequest request = getMock();
     when(request.getMethod()).thenReturn("POST");
-
-    SolrRequestParsers parsers = new SolrRequestParsers(h.getCore().getSolrConfig());
-    try {
-      parsers.parse(h.getCore(), "/select", request);
-    } catch (SolrException e) {
-      log.error("should not throw SolrException", e);
-      fail("should not throw SolrException");
+    try (SolrCore core = h.getCore()) {
+      SolrRequestParsers parsers = new SolrRequestParsers(core.getSolrConfig());
+      try {
+        parsers.parse(core, "/select", request);
+      } catch (SolrException e) {
+        log.error("should not throw SolrException", e);
+        fail("should not throw SolrException");
+      }
     }
   }
 
@@ -455,29 +461,30 @@ public class SolrRequestParserTest extends SolrTestCaseJ4 {
     // we dont pass a content-length to let the security mechanism limit it:
     when(request.getQueryString()).thenReturn("foo=1&bar=2");
     when(request.getInputStream()).thenReturn(new ByteServletInputStream(body.getBytes(StandardCharsets.US_ASCII)));
-
-    SolrRequestParsers parsers = new SolrRequestParsers(h.getCore().getSolrConfig());
-    SolrQueryRequest req = parsers.parse(h.getCore(), "/select", request);
-    int num=0;
-    if (expectedContentType != null) {
-      for (ContentStream cs : req.getContentStreams()) {
-        num++;
-        assertTrue(cs.getContentType().startsWith(expectedContentType));
-        String returnedBody = IOUtils.toString(cs.getReader());
-        assertEquals(body, returnedBody);
+    try (SolrCore core = h.getCore()) {
+      SolrRequestParsers parsers = new SolrRequestParsers(core.getSolrConfig());
+      SolrQueryRequest req = parsers.parse(core, "/select", request);
+      int num = 0;
+      if (expectedContentType != null) {
+        for (ContentStream cs : req.getContentStreams()) {
+          num++;
+          assertTrue(cs.getContentType().startsWith(expectedContentType));
+          String returnedBody = IOUtils.toString(cs.getReader());
+          assertEquals(body, returnedBody);
+        }
+        assertEquals(1, num);
       }
-      assertEquals(1, num);
-    }
 
-    assertEquals("1", req.getParams().get("foo"));
-    assertEquals("2", req.getParams().get("bar"));
+      assertEquals("1", req.getParams().get("foo"));
+      assertEquals("2", req.getParams().get("bar"));
 
-    if (expectedKey != null) {
-      assertEquals(expectedValue, req.getParams().get(expectedKey));
-    }
+      if (expectedKey != null) {
+        assertEquals(expectedValue, req.getParams().get(expectedKey));
+      }
 
-    req.close();
-    verify(request).getInputStream();
+      req.close();
+      verify(request).getInputStream();
+    }
   }
 
 
diff --git a/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java b/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
index e7afcff..ae99c4a 100644
--- a/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
@@ -84,23 +84,23 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
 
   @Test
   public void testComparator() throws Exception {
-    SpellCheckComponent component = (SpellCheckComponent) h.getCore().getSearchComponent("spellcheck");
-    assertNotNull(component);
-    AbstractLuceneSpellChecker spellChecker;
-    Comparator<SuggestWord> comp;
-    spellChecker = (AbstractLuceneSpellChecker) component.getSpellChecker("freq");
-    assertNotNull(spellChecker);
-    comp = spellChecker.getSpellChecker().getComparator();
-    assertNotNull(comp);
-    assertTrue(comp instanceof SuggestWordFrequencyComparator);
-
-    spellChecker = (AbstractLuceneSpellChecker) component.getSpellChecker("fqcn");
-    assertNotNull(spellChecker);
-    comp = spellChecker.getSpellChecker().getComparator();
-    assertNotNull(comp);
-    assertTrue(comp instanceof SampleComparator);
-
-
+    try (SolrCore core = h.getCore()) {
+      SpellCheckComponent component = (SpellCheckComponent) core.getSearchComponent("spellcheck");
+      assertNotNull(component);
+      AbstractLuceneSpellChecker spellChecker;
+      Comparator<SuggestWord> comp;
+      spellChecker = (AbstractLuceneSpellChecker) component.getSpellChecker("freq");
+      assertNotNull(spellChecker);
+      comp = spellChecker.getSpellChecker().getComparator();
+      assertNotNull(comp);
+      assertTrue(comp instanceof SuggestWordFrequencyComparator);
+
+      spellChecker = (AbstractLuceneSpellChecker) component.getSpellChecker("fqcn");
+      assertNotNull(spellChecker);
+      comp = spellChecker.getSpellChecker().getComparator();
+      assertNotNull(comp);
+      assertTrue(comp instanceof SampleComparator);
+    }
   }
 
   @Test
@@ -115,66 +115,66 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
     spellchecker.add(AbstractLuceneSpellChecker.INDEX_DIR, indexDir.getAbsolutePath());
     spellchecker.add(AbstractLuceneSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
-    SolrCore core = h.getCore();
-
-    String dictName = checker.init(spellchecker, core);
-    assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
-            dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    h.getCore().withSearcher(searcher -> {
-      checker.build(core, searcher);
-
-      IndexReader reader = searcher.getIndexReader();
-      Collection<Token> tokens = queryConverter.convert("documemt");
-      SpellingOptions spellOpts = new SpellingOptions(tokens, reader);
-      SpellingResult result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      //should be lowercased, b/c we are using a lowercasing analyzer
-      Map<String, Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("documemt is null and it shouldn't be", suggestions != null);
-      assertTrue("documemt Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
-      Map.Entry<String, Integer> entry = suggestions.entrySet().iterator().next();
-      assertTrue(entry.getKey() + " is not equal to " + "document", entry.getKey().equals("document") == true);
-      assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
-
-      //test something not in the spell checker
-      spellOpts.tokens = queryConverter.convert("super");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions size should be 0", suggestions.size()==0);
-
-      //test something that is spelled correctly
-      spellOpts.tokens = queryConverter.convert("document");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions is null and it shouldn't be", suggestions == null);
-
-      //Has multiple possibilities, but the exact exists, so that should be returned
-      spellOpts.tokens = queryConverter.convert("red");
-      spellOpts.count = 2;
-      result = checker.getSuggestions(spellOpts);
-      assertNotNull(result);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions is not null and it should be", suggestions == null);
-
-      //Try out something which should have multiple suggestions
-      spellOpts.tokens = queryConverter.convert("bug");
-      result = checker.getSuggestions(spellOpts);
-      assertNotNull(result);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertNotNull(suggestions);
-      assertTrue("suggestions Size: " + suggestions.size() + " is not: " + 2, suggestions.size() == 2);
-
-      entry = suggestions.entrySet().iterator().next();
-      assertTrue(entry.getKey() + " is equal to " + "bug and it shouldn't be", entry.getKey().equals("bug") == false);
-      assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
-
-      entry = suggestions.entrySet().iterator().next();
-      assertTrue(entry.getKey() + " is equal to " + "bug and it shouldn't be", entry.getKey().equals("bug") == false);
-      assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+
+      String dictName = checker.init(spellchecker, core);
+      assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME, dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
+      core.withSearcher(searcher -> {
+        checker.build(core, searcher);
+
+        IndexReader reader = searcher.getIndexReader();
+        Collection<Token> tokens = queryConverter.convert("documemt");
+        SpellingOptions spellOpts = new SpellingOptions(tokens, reader);
+        SpellingResult result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        //should be lowercased, b/c we are using a lowercasing analyzer
+        Map<String,Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("documemt is null and it shouldn't be", suggestions != null);
+        assertTrue("documemt Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
+        Map.Entry<String,Integer> entry = suggestions.entrySet().iterator().next();
+        assertTrue(entry.getKey() + " is not equal to " + "document", entry.getKey().equals("document") == true);
+        assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
+
+        //test something not in the spell checker
+        spellOpts.tokens = queryConverter.convert("super");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions size should be 0", suggestions.size() == 0);
+
+        //test something that is spelled correctly
+        spellOpts.tokens = queryConverter.convert("document");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions is null and it shouldn't be", suggestions == null);
+
+        //Has multiple possibilities, but the exact exists, so that should be returned
+        spellOpts.tokens = queryConverter.convert("red");
+        spellOpts.count = 2;
+        result = checker.getSuggestions(spellOpts);
+        assertNotNull(result);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions is not null and it should be", suggestions == null);
+
+        //Try out something which should have multiple suggestions
+        spellOpts.tokens = queryConverter.convert("bug");
+        result = checker.getSuggestions(spellOpts);
+        assertNotNull(result);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertNotNull(suggestions);
+        assertTrue("suggestions Size: " + suggestions.size() + " is not: " + 2, suggestions.size() == 2);
+
+        entry = suggestions.entrySet().iterator().next();
+        assertTrue(entry.getKey() + " is equal to " + "bug and it shouldn't be", entry.getKey().equals("bug") == false);
+        assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
+
+        entry = suggestions.entrySet().iterator().next();
+        assertTrue(entry.getKey() + " is equal to " + "bug and it shouldn't be", entry.getKey().equals("bug") == false);
+        assertTrue(entry.getValue() + " does not equal: " + SpellingResult.NO_FREQUENCY_INFO, entry.getValue() == SpellingResult.NO_FREQUENCY_INFO);
+        return null;
+      });
+    }
   }
 
   @Test
@@ -188,40 +188,40 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
     spellchecker.add(AbstractLuceneSpellChecker.INDEX_DIR, indexDir.getAbsolutePath());
     spellchecker.add(AbstractLuceneSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
-    SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core);
-    assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
-            dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    h.getCore().withSearcher(searcher -> {
-      checker.build(core, searcher);
-
-      IndexReader reader = searcher.getIndexReader();
-      Collection<Token> tokens = queryConverter.convert("documemt");
-      SpellingOptions spellOpts = new SpellingOptions(tokens, reader, 1, SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX, true, 0.5f, null);
-      SpellingResult result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      //should be lowercased, b/c we are using a lowercasing analyzer
-      Map<String, Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("documemt is null and it shouldn't be", suggestions != null);
-      assertTrue("documemt Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
-      Map.Entry<String, Integer> entry = suggestions.entrySet().iterator().next();
-      assertTrue(entry.getKey() + " is not equal to " + "document", entry.getKey().equals("document") == true);
-      assertTrue(entry.getValue() + " does not equal: " + 2, entry.getValue() == 2);
-
-      //test something not in the spell checker
-      spellOpts.tokens = queryConverter.convert("super");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions size should be 0", suggestions.size()==0);
-
-      spellOpts.tokens = queryConverter.convert("document");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions is not null and it should be", suggestions == null);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      String dictName = checker.init(spellchecker, core);
+      assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME, dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
+      core.withSearcher(searcher -> {
+        checker.build(core, searcher);
+
+        IndexReader reader = searcher.getIndexReader();
+        Collection<Token> tokens = queryConverter.convert("documemt");
+        SpellingOptions spellOpts = new SpellingOptions(tokens, reader, 1, SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX, true, 0.5f, null);
+        SpellingResult result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        //should be lowercased, b/c we are using a lowercasing analyzer
+        Map<String,Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("documemt is null and it shouldn't be", suggestions != null);
+        assertTrue("documemt Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
+        Map.Entry<String,Integer> entry = suggestions.entrySet().iterator().next();
+        assertTrue(entry.getKey() + " is not equal to " + "document", entry.getKey().equals("document") == true);
+        assertTrue(entry.getValue() + " does not equal: " + 2, entry.getValue() == 2);
+
+        //test something not in the spell checker
+        spellOpts.tokens = queryConverter.convert("super");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions size should be 0", suggestions.size() == 0);
+
+        spellOpts.tokens = queryConverter.convert("document");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions is not null and it should be", suggestions == null);
+        return null;
+      });
+    }
   }
 
   private static class TestSpellChecker extends IndexBasedSpellChecker{
@@ -242,20 +242,19 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
     spellchecker.add(AbstractLuceneSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
     spellchecker.add(AbstractLuceneSpellChecker.STRING_DISTANCE, JaroWinklerDistance.class.getName());
-    SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core);
-    assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
-            dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    h.getCore().withSearcher(searcher -> {
-      checker.build(core, searcher);
-      SpellChecker sc = checker.getSpellChecker();
-      assertTrue("sc is null and it shouldn't be", sc != null);
-      StringDistance sd = sc.getStringDistance();
-      assertTrue("sd is null and it shouldn't be", sd != null);
-      assertTrue("sd is not an instance of " + JaroWinklerDistance.class.getName(), sd instanceof JaroWinklerDistance);
-      return null;
-    });
-
+    try (SolrCore core = h.getCore()) {
+      String dictName = checker.init(spellchecker, core);
+      assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME, dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
+      core.withSearcher(searcher -> {
+        checker.build(core, searcher);
+        SpellChecker sc = checker.getSpellChecker();
+        assertTrue("sc is null and it shouldn't be", sc != null);
+        StringDistance sd = sc.getStringDistance();
+        assertTrue("sd is null and it shouldn't be", sd != null);
+        assertTrue("sd is not an instance of " + JaroWinklerDistance.class.getName(), sd instanceof JaroWinklerDistance);
+        return null;
+      });
+    }
   }
 
   @Test
@@ -296,40 +295,40 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
     spellchecker.add(AbstractLuceneSpellChecker.LOCATION, altIndexDir.getAbsolutePath());
     spellchecker.add(AbstractLuceneSpellChecker.FIELD, "title");
     spellchecker.add(AbstractLuceneSpellChecker.SPELLCHECKER_ARG_NAME, spellchecker);
-    SolrCore core = h.getCore();
-    String dictName = checker.init(spellchecker, core);
-    assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME,
-            dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
-    h.getCore().withSearcher(searcher -> {
-      checker.build(core, searcher);
-
-      IndexReader reader = searcher.getIndexReader();
-      Collection<Token> tokens = queryConverter.convert("flesh");
-      SpellingOptions spellOpts = new SpellingOptions(tokens, reader, 1, SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX, true, 0.5f, null);
-      SpellingResult result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      //should be lowercased, b/c we are using a lowercasing analyzer
-      Map<String, Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("flesh is null and it shouldn't be", suggestions != null);
-      assertTrue("flesh Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
-      Map.Entry<String, Integer> entry = suggestions.entrySet().iterator().next();
-      assertTrue(entry.getKey() + " is not equal to " + "flash", entry.getKey().equals("flash") == true);
-      assertTrue(entry.getValue() + " does not equal: " + 1, entry.getValue() == 1);
-
-      //test something not in the spell checker
-      spellOpts.tokens = queryConverter.convert("super");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions size should be 0", suggestions.size()==0);
-
-      spellOpts.tokens = queryConverter.convert("Caroline");
-      result = checker.getSuggestions(spellOpts);
-      assertTrue("result is null and it shouldn't be", result != null);
-      suggestions = result.get(spellOpts.tokens.iterator().next());
-      assertTrue("suggestions is not null and it should be", suggestions == null);
-      return null;
-    });
+    try (SolrCore core = h.getCore()) {
+      String dictName = checker.init(spellchecker, core);
+      assertTrue(dictName + " is not equal to " + SolrSpellChecker.DEFAULT_DICTIONARY_NAME, dictName.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME) == true);
+      core.withSearcher(searcher -> {
+        checker.build(core, searcher);
+
+        IndexReader reader = searcher.getIndexReader();
+        Collection<Token> tokens = queryConverter.convert("flesh");
+        SpellingOptions spellOpts = new SpellingOptions(tokens, reader, 1, SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX, true, 0.5f, null);
+        SpellingResult result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        //should be lowercased, b/c we are using a lowercasing analyzer
+        Map<String,Integer> suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("flesh is null and it shouldn't be", suggestions != null);
+        assertTrue("flesh Size: " + suggestions.size() + " is not: " + 1, suggestions.size() == 1);
+        Map.Entry<String,Integer> entry = suggestions.entrySet().iterator().next();
+        assertTrue(entry.getKey() + " is not equal to " + "flash", entry.getKey().equals("flash") == true);
+        assertTrue(entry.getValue() + " does not equal: " + 1, entry.getValue() == 1);
+
+        //test something not in the spell checker
+        spellOpts.tokens = queryConverter.convert("super");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions size should be 0", suggestions.size() == 0);
+
+        spellOpts.tokens = queryConverter.convert("Caroline");
+        result = checker.getSuggestions(spellOpts);
+        assertTrue("result is null and it shouldn't be", result != null);
+        suggestions = result.get(spellOpts.tokens.iterator().next());
+        assertTrue("suggestions is not null and it should be", suggestions == null);
+        return null;
+      });
+    }
   }
 }
 
diff --git a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
index 1daea96..d0a8b54 100644
--- a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
@@ -60,6 +60,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.JavaBinCodec;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.loader.XMLLoader;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
@@ -131,7 +132,9 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
 
   private SolrIndexSearcher getSearcher() {
     if (_searcher == null) {
-      searcherRef = h.getCore().getSearcher();
+      try (SolrCore core = h.getCore()) {
+        searcherRef = core.getSearcher();
+      }
       _searcher = searcherRef.get();
     }
     return _searcher;
diff --git a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
index 63d0938..3845791 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
@@ -32,6 +32,7 @@ import org.apache.solr.common.MapSerializable;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.SolrConfig;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.core.TestMergePolicyConfig;
 import org.apache.solr.index.SortingMergePolicy;
@@ -67,11 +68,15 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
       SolrConfig solrConfig = new SolrConfig(loader, "bad-mpf-solrconfig.xml");
       SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
-      h.getCore().setLatestSchema(indexSchema);
+      try (SolrCore core = h.getCore()) {
+        core.setLatestSchema(indexSchema);
+      }
 
       // this should fail as mergePolicy doesn't have any public constructor
-      SolrException ex = expectThrows(SolrException.class, () -> solrIndexConfig.toIndexWriterConfig(h.getCore()));
-      assertTrue(ex.getMessage().contains("Error instantiating class: 'org.apache.solr.index.DummyMergePolicyFactory'"));
+      try (SolrCore core = h.getCore()) {
+        SolrException ex = expectThrows(SolrException.class, () -> solrIndexConfig.toIndexWriterConfig(core));
+        assertTrue(ex.getMessage().contains("Error instantiating class: 'org.apache.solr.index.DummyMergePolicyFactory'"));
+      }
     }
   }
 
@@ -82,22 +87,23 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
       SolrConfig solrConfig = new SolrConfig(loader, solrConfigFileName);
       SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
-
-      h.getCore().setLatestSchema(indexSchema);
-      IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(h.getCore());
-
-      assertNotNull("null mp", iwc.getMergePolicy());
-      assertTrue("mp is not TieredMergePolicy", iwc.getMergePolicy() instanceof TieredMergePolicy);
-      TieredMergePolicy mp = (TieredMergePolicy) iwc.getMergePolicy();
-      assertEquals("mp.maxMergeAtOnceExplicit", 19, mp.getMaxMergeAtOnceExplicit());
-      assertEquals("mp.segmentsPerTier", 9, (int) mp.getSegmentsPerTier());
-
-      assertNotNull("null ms", iwc.getMergeScheduler());
-      assertTrue("ms is not CMS", iwc.getMergeScheduler() instanceof ConcurrentMergeScheduler);
-      ConcurrentMergeScheduler ms = (ConcurrentMergeScheduler) iwc.getMergeScheduler();
-      assertEquals("ms.maxMergeCount", 987, ms.getMaxMergeCount());
-      assertEquals("ms.maxThreadCount", 42, ms.getMaxThreadCount());
-      assertEquals("ms.isAutoIOThrottle", true, ms.getAutoIOThrottle());
+      try (SolrCore core = h.getCore()) {
+        core.setLatestSchema(indexSchema);
+        IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(core);
+
+        assertNotNull("null mp", iwc.getMergePolicy());
+        assertTrue("mp is not TieredMergePolicy", iwc.getMergePolicy() instanceof TieredMergePolicy);
+        TieredMergePolicy mp = (TieredMergePolicy) iwc.getMergePolicy();
+        assertEquals("mp.maxMergeAtOnceExplicit", 19, mp.getMaxMergeAtOnceExplicit());
+        assertEquals("mp.segmentsPerTier", 9, (int) mp.getSegmentsPerTier());
+
+        assertNotNull("null ms", iwc.getMergeScheduler());
+        assertTrue("ms is not CMS", iwc.getMergeScheduler() instanceof ConcurrentMergeScheduler);
+        ConcurrentMergeScheduler ms = (ConcurrentMergeScheduler) iwc.getMergeScheduler();
+        assertEquals("ms.maxMergeCount", 987, ms.getMaxMergeCount());
+        assertEquals("ms.maxThreadCount", 42, ms.getMaxThreadCount());
+        assertEquals("ms.isAutoIOThrottle", true, ms.getAutoIOThrottle());
+      }
     }
 
   }
@@ -109,19 +115,20 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
       SolrConfig solrConfig = new SolrConfig(loader, solrConfigFileName);
       SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
-
-      h.getCore().setLatestSchema(indexSchema);
-      IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(h.getCore());
-
-      assertNotNull("null mp", iwc.getMergePolicy());
-      assertTrue("mp is not TieredMergePolicy", iwc.getMergePolicy() instanceof TieredMergePolicy);
-
-      assertNotNull("null ms", iwc.getMergeScheduler());
-      assertTrue("ms is not CMS", iwc.getMergeScheduler() instanceof ConcurrentMergeScheduler);
-      ConcurrentMergeScheduler ms = (ConcurrentMergeScheduler) iwc.getMergeScheduler();
-      assertEquals("ms.maxMergeCount", 987, ms.getMaxMergeCount());
-      assertEquals("ms.maxThreadCount", 42, ms.getMaxThreadCount());
-      assertEquals("ms.isAutoIOThrottle", false, ms.getAutoIOThrottle());
+      try (SolrCore core = h.getCore()) {
+        core.setLatestSchema(indexSchema);
+        IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(core);
+
+        assertNotNull("null mp", iwc.getMergePolicy());
+        assertTrue("mp is not TieredMergePolicy", iwc.getMergePolicy() instanceof TieredMergePolicy);
+
+        assertNotNull("null ms", iwc.getMergeScheduler());
+        assertTrue("ms is not CMS", iwc.getMergeScheduler() instanceof ConcurrentMergeScheduler);
+        ConcurrentMergeScheduler ms = (ConcurrentMergeScheduler) iwc.getMergeScheduler();
+        assertEquals("ms.maxMergeCount", 987, ms.getMaxMergeCount());
+        assertEquals("ms.maxThreadCount", 42, ms.getMaxThreadCount());
+        assertEquals("ms.isAutoIOThrottle", false, ms.getAutoIOThrottle());
+      }
     }
 
   }
@@ -135,17 +142,18 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
       SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
       assertNotNull(solrIndexConfig);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
-
-      h.getCore().setLatestSchema(indexSchema);
-      IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(h.getCore());
-
-      final MergePolicy mergePolicy = iwc.getMergePolicy();
-      assertNotNull("null mergePolicy", mergePolicy);
-      assertTrue("mergePolicy (" + mergePolicy + ") is not a SortingMergePolicy", mergePolicy instanceof SortingMergePolicy);
-      final SortingMergePolicy sortingMergePolicy = (SortingMergePolicy) mergePolicy;
-      final Sort expected = new Sort(new SortField(expectedFieldName, expectedFieldType, expectedFieldSortDescending));
-      final Sort actual = sortingMergePolicy.getSort();
-      assertEquals("SortingMergePolicy.getSort", expected, actual);
+      try (SolrCore core = h.getCore()) {
+        core.setLatestSchema(indexSchema);
+        IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(core);
+
+        final MergePolicy mergePolicy = iwc.getMergePolicy();
+        assertNotNull("null mergePolicy", mergePolicy);
+        assertTrue("mergePolicy (" + mergePolicy + ") is not a SortingMergePolicy", mergePolicy instanceof SortingMergePolicy);
+        final SortingMergePolicy sortingMergePolicy = (SortingMergePolicy) mergePolicy;
+        final Sort expected = new Sort(new SortField(expectedFieldName, expectedFieldType, expectedFieldSortDescending));
+        final Sort actual = sortingMergePolicy.getSort();
+        assertEquals("SortingMergePolicy.getSort", expected, actual);
+      }
     }
   }
 
@@ -157,9 +165,11 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
       assertNotNull(solrIndexConfig.mergedSegmentWarmerInfo);
       assertEquals(SimpleMergedSegmentWarmer.class.getName(), solrIndexConfig.mergedSegmentWarmerInfo.className);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
-      h.getCore().setLatestSchema(indexSchema);
-      IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(h.getCore());
-      assertEquals(SimpleMergedSegmentWarmer.class, iwc.getMergedSegmentWarmer().getClass());
+      try (SolrCore core = h.getCore()) {
+        core.setLatestSchema(indexSchema);
+        IndexWriterConfig iwc = solrIndexConfig.toIndexWriterConfig(core);
+        assertEquals(SimpleMergedSegmentWarmer.class, iwc.getMergedSegmentWarmer().getClass());
+      }
     }
   }
 
diff --git a/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java b/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
index e125f7e..23e60d7 100644
--- a/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
+++ b/solr/core/src/test/org/apache/solr/update/TestNestedUpdateProcessor.java
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.update.processor.NestedUpdateProcessorFactory;
 import org.apache.solr.update.processor.UpdateRequestProcessor;
@@ -157,10 +158,12 @@ public class TestNestedUpdateProcessor extends SolrTestCaseJ4 {
   public void testDeeplyNestedURPSanity() throws Exception {
     SolrInputDocument docHierarchy = sdoc("id", "1", "children", sdocs(sdoc("id", "2", "name_s", "Yaz"),
         sdoc("id", "3", "name_s", "Jazz", "grandChild", sdoc("id", "4", "name_s", "Gaz"))), "lonelyChild", sdoc("id", "5", "name_s", "Loner"));
-    UpdateRequestProcessor nestedUpdate = new NestedUpdateProcessorFactory().getInstance(req(), null, null);
-    AddUpdateCommand cmd = new AddUpdateCommand(req());
+    SolrQueryRequest req = req();
+    UpdateRequestProcessor nestedUpdate = new NestedUpdateProcessorFactory().getInstance(req, null, null);
+    AddUpdateCommand cmd = new AddUpdateCommand(req);
     cmd.solrDoc = docHierarchy;
     nestedUpdate.processAdd(cmd);
+    req.close();
     cmd.clear();
 
     List children = (List) docHierarchy.get("children").getValues();
@@ -184,11 +187,13 @@ public class TestNestedUpdateProcessor extends SolrTestCaseJ4 {
     final String rootId = "1";
     final String childKey = "grandChild";
     final String expectedId = rootId + "/children#1/" + childKey + NUM_SEP_CHAR + SINGLE_VAL_CHAR;
+    SolrQueryRequest req = req();
     SolrInputDocument noIdChildren = sdoc("id", rootId, "children", sdocs(sdoc("name_s", "Yaz"), sdoc("name_s", "Jazz", childKey, sdoc("name_s", "Gaz"))));
-    UpdateRequestProcessor nestedUpdate = new NestedUpdateProcessorFactory().getInstance(req(), null, null);
-    AddUpdateCommand cmd = new AddUpdateCommand(req());
+    UpdateRequestProcessor nestedUpdate = new NestedUpdateProcessorFactory().getInstance(req, null, null);
+    AddUpdateCommand cmd = new AddUpdateCommand(req);
     cmd.solrDoc = noIdChildren;
     nestedUpdate.processAdd(cmd);
+    req.close();
     cmd.clear();
     List children = (List) noIdChildren.get("children").getValues();
     SolrInputDocument idLessChild = (SolrInputDocument)((SolrInputDocument) children.get(1)).get(childKey).getValue();
diff --git a/solr/core/src/test/org/apache/solr/update/TestUpdate.java b/solr/core/src/test/org/apache/solr/update/TestUpdate.java
index 2418169..4c6fc41 100644
--- a/solr/core/src/test/org/apache/solr/update/TestUpdate.java
+++ b/solr/core/src/test/org/apache/solr/update/TestUpdate.java
@@ -22,6 +22,7 @@ import java.util.concurrent.Callable;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -224,18 +225,19 @@ public class TestUpdate extends SolrTestCaseJ4 {
     SolrInputDocument doc = new SolrInputDocument();
     doc.addField("id", "444");
     doc.addField("text", new Object());//Object shouldn't be serialized later...
-
-    AddUpdateCommand cmd = new AddUpdateCommand(req());
-    cmd.solrDoc = doc;
-    try {
-      h.getCore().getUpdateHandler().addDoc(cmd); // should throw
-    } catch (SolrException e) {
-      if (e.getMessage().contains("serialize")) {
-        return;//passed test
+    try (SolrQueryRequest req = req()){
+      AddUpdateCommand cmd = new AddUpdateCommand(req);
+      cmd.solrDoc = doc;
+      try {
+        h.getCore().getUpdateHandler().addDoc(cmd); // should throw
+      } catch (SolrException e) {
+        if (e.getMessage().contains("serialize")) {
+          return;//passed test
+        }
+        throw e;
       }
-      throw e;
+      fail();
     }
-    fail();
   }
 
 }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
index a531216..ca3d666 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/AtomicUpdateProcessorFactoryTest.java
@@ -27,6 +27,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -52,10 +53,10 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
         .add("processor", "Atomic")
         .add("atomic.cat", "delete")
         .add("commit", "true");
-    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params)) {
+    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params, true)) {
       AddUpdateCommand cmd = new AddUpdateCommand(req);
       AtomicUpdateProcessorFactory factory = new AtomicUpdateProcessorFactory();
-      factory.inform(h.getCore());
+      factory.inform(req.getCore());
       UpdateRequestProcessor proc = factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
               null);
       try {
@@ -74,12 +75,12 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
         .add("processor", "atomic")
         .add("atomic.cat", "add")
         .add("commit", "true");
-    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params)) {
+    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params, true)) {
       AddUpdateCommand cmd = new AddUpdateCommand(req);
       cmd.solrDoc = new SolrInputDocument();
       cmd.solrDoc.addField("title", 1);
       AtomicUpdateProcessorFactory factory = new AtomicUpdateProcessorFactory();
-      factory.inform(h.getCore());
+      factory.inform(req.getCore());
       UpdateRequestProcessor proc = factory.getInstance(cmd.getReq(), new SolrQueryResponse(),
           null);
       proc.processAdd(cmd);
@@ -99,7 +100,7 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
         .add("atomic.name_s", "set")
         .add("atomic.multiDefault", "set")
         .add("commit", "true");
-    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params)) {
+    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params, true)) {
       AddUpdateCommand cmd = new AddUpdateCommand(req);
 
       cmd.solrDoc = new SolrInputDocument();
@@ -110,7 +111,7 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       cmd.solrDoc.addField("name_s", "Virat");
       cmd.solrDoc.addField("multiDefault", "Delhi");
 
-      UpdateRequestProcessor proc = h.getCore()
+      UpdateRequestProcessor proc = req.getCore()
               .getUpdateProcessorChain(params)
               .createProcessor(cmd.getReq(), new SolrQueryResponse());
       proc.processAdd(cmd);
@@ -151,7 +152,7 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
         .add("atomic.name_s", "remove")
         .add("atomic.multiDefault", "removeregex")
         .add("commit", "true");
-    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params)) {
+    try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params, true)) {
       AddUpdateCommand cmd = new AddUpdateCommand(req);
 
       cmd.solrDoc = new SolrInputDocument();
@@ -161,7 +162,7 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
       cmd.solrDoc.addField("count_i", 20);
       cmd.solrDoc.addField("name_s", "Virat");
       cmd.solrDoc.addField("multiDefault", ".elh.");
-      UpdateRequestProcessor proc = h.getCore()
+      UpdateRequestProcessor proc = req.getCore()
               .getUpdateProcessorChain(params)
               .createProcessor(cmd.getReq(), new SolrQueryResponse());
       proc.processAdd(cmd);
@@ -223,7 +224,9 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     int finalCount = 0; //int_i
 
     AtomicUpdateProcessorFactory factory = new AtomicUpdateProcessorFactory();
-    factory.inform(h.getCore());
+    try (SolrCore core = h.getCore()) {
+      factory.inform(core);
+    }
 
     for (int i = 0; i < 10; i++) {
       int index = random().nextInt(5);
@@ -235,7 +238,7 @@ public class AtomicUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
               .add("atomic.cat", "add")
               .add("atomic.int_i", "inc")
               .add("commit","true");
-          try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params)) {
+          try (SolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), params, true)) {
             AddUpdateCommand cmd = new AddUpdateCommand(req);
             cmd.solrDoc = new SolrInputDocument();
             cmd.solrDoc.addField("id", 10); //hardcoded id=10
diff --git a/solr/core/src/test/org/apache/solr/update/processor/FieldMutatingUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/FieldMutatingUpdateProcessorTest.java
index 1f48d71..b2025c5 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/FieldMutatingUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/FieldMutatingUpdateProcessorTest.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
+import org.apache.solr.core.SolrCore;
 import org.apache.solr.schema.IndexSchema;
 import org.junit.BeforeClass;
 
@@ -600,8 +601,10 @@ public class FieldMutatingUpdateProcessorTest extends UpdateProcessorTestBase {
   }
 
   public void testIgnore() throws Exception {
-
-    IndexSchema schema = h.getCore().getLatestSchema();
+    IndexSchema schema;
+    try (SolrCore core = h.getCore()) {
+       schema = core.getLatestSchema();
+    }
     assertNull("test expects 'foo_giberish' to not be a valid field, looks like schema was changed out from under us",
                schema.getFieldTypeNoEx("foo_giberish"));
     assertNull("test expects 'bar_giberish' to not be a valid field, looks like schema was changed out from under us",
diff --git a/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java b/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
index 8693c38..1f08fe9 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
@@ -31,9 +31,9 @@ import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.component.RealTimeGetComponent;
+import org.apache.solr.request.SolrQueryRequest;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
@@ -63,13 +63,15 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
     dummyBlock.removeField(VERSION);
 
     SolrInputDocument preMergeDoc = new SolrInputDocument(dummyBlock);
-    AtomicUpdateDocumentMerger docMerger = new AtomicUpdateDocumentMerger(req());
-    docMerger.merge(addedDoc, dummyBlock);
-    assertEquals("merged document should have the same id", preMergeDoc.getFieldValue("id"), dummyBlock.getFieldValue("id"));
-    assertDocContainsSubset(preMergeDoc, dummyBlock);
-    assertDocContainsSubset(addedDoc, dummyBlock);
-    assertDocContainsSubset(newChildDoc, (SolrInputDocument) ((List) dummyBlock.getFieldValues("child")).get(1));
-    assertEquals(dummyBlock.getFieldValue("id"), dummyBlock.getFieldValue("id"));
+    try (SolrQueryRequest req = req()) {
+      AtomicUpdateDocumentMerger docMerger = new AtomicUpdateDocumentMerger(req);
+      docMerger.merge(addedDoc, dummyBlock);
+      assertEquals("merged document should have the same id", preMergeDoc.getFieldValue("id"), dummyBlock.getFieldValue("id"));
+      assertDocContainsSubset(preMergeDoc, dummyBlock);
+      assertDocContainsSubset(addedDoc, dummyBlock);
+      assertDocContainsSubset(newChildDoc, (SolrInputDocument) ((List) dummyBlock.getFieldValues("child")).get(1));
+      assertEquals(dummyBlock.getFieldValue("id"), dummyBlock.getFieldValue("id"));
+    }
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
index 06af046..70794f4 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
@@ -86,6 +86,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     SolrCore core = h.getCore();
     UpdateRequestProcessorChain chained = core.getUpdateProcessingChain(this.chain);
     SignatureUpdateProcessorFactory factory = ((SignatureUpdateProcessorFactory) chained.getProcessors().get(0));
+    core.close();
     factory.setEnabled(true);
     assertNotNull(chained);
 
@@ -106,6 +107,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     UpdateRequestProcessorChain chained = core.getUpdateProcessingChain(
         "dedupe");
     SignatureUpdateProcessorFactory factory = ((SignatureUpdateProcessorFactory) chained.getProcessors().get(0));
+    core.close();
     factory.setEnabled(true);
     assertNotNull(chained);
 
@@ -148,9 +150,11 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
 
   @Test
   public void testMultiThreaded() throws Exception {
-    UpdateRequestProcessorChain chained = h.getCore().getUpdateProcessingChain(
+    SolrCore core = h.getCore();
+    UpdateRequestProcessorChain chained = core.getUpdateProcessingChain(
         "dedupe");
     SignatureUpdateProcessorFactory factory = ((SignatureUpdateProcessorFactory) chained.getProcessors().get(0));
+    core.close();
     factory.setEnabled(true);
     Thread[] threads = null;
     Thread[] threads2 = null;
@@ -216,7 +220,6 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     for (int i = 0; i < threads2.length; i++) {
       threads2[i].join();
     }
-    SolrCore core = h.getCore();
 
     assertU(commit());
 
@@ -229,8 +232,6 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
    */
   @Test
   public void testNonIndexedSignatureField() throws Exception {
-    SolrCore core = h.getCore();
-
     checkNumDocs(0);    
 
     chain = "stored_sig";
@@ -255,6 +256,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     } catch (Exception e) {
       exception_ok = true;
     }
+    core.close();
     assertTrue("Should have gotten an exception from inform(SolrCore)", 
                exception_ok);
   }
@@ -268,7 +270,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
         .getUpdateProcessingChain(chain);
     SignatureUpdateProcessorFactory factory = ((SignatureUpdateProcessorFactory) chained.getProcessors().get(0));
     factory.setEnabled(true);
-    
+    core.close();
     Map<String,String[]> params = new HashMap<>();
     MultiMapSolrParams mmparams = new MultiMapSolrParams(params);
     params.put(UpdateParams.UPDATE_CHAIN, new String[] {chain});
@@ -324,7 +326,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
     }
         
 
-    LocalSolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), mmparams);
+    LocalSolrQueryRequest req = new LocalSolrQueryRequest(h.getCore(), mmparams, true);
     try {
       req.setContentStreams(Collections.singletonList(ContentStreamBase.create(new BinaryRequestWriter(), ureq)));
       UpdateRequestHandler h = new UpdateRequestHandler();
diff --git a/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
index e0ff260..5c0f3b9 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/SkipExistingDocumentsProcessorFactoryTest.java
@@ -35,6 +35,8 @@ import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.processor.SkipExistingDocumentsProcessorFactory.SkipExistingDocumentsUpdateProcessor;
+import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -42,11 +44,17 @@ import org.mockito.Mockito;
 public class SkipExistingDocumentsProcessorFactoryTest {
 
   private BytesRef docId = new BytesRef();
-  private SolrQueryRequest defaultRequest = new LocalSolrQueryRequest(null, new NamedList());
+  private static SolrQueryRequest defaultRequest;
   
   @BeforeClass
   public static void beforeClass() {
-    SolrTestCaseJ4.assumeWorkingMockito();
+    defaultRequest = new LocalSolrQueryRequest(null, new NamedList());
+  }
+
+  @AfterClass
+  public static void afterClass() {
+    defaultRequest.close();
+    defaultRequest = null;
   }
 
   // Tests for logic in the factory
@@ -189,6 +197,7 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
     next.close();
     processor.close();
+    req.close();
   }
 
   @Test
@@ -207,6 +216,7 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     assertFalse("Expected skipUpdateIfMissing to be false", processor.isSkipUpdateIfMissing());
     next.close();
     processor.close();
+    req.close();
   }
 
   @Test
@@ -226,6 +236,7 @@ public class SkipExistingDocumentsProcessorFactoryTest {
     assertTrue("Expected skipUpdateIfMissing to be true", processor.isSkipUpdateIfMissing());
     next.close();
     processor.close();
+    req.close();
   }
 
 
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java
index 1657c01..d5d9a71 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TolerantUpdateProcessorTest.java
@@ -337,16 +337,18 @@ public class TolerantUpdateProcessorTest extends UpdateProcessorTestBase {
 
   
   public String update(String chain, String xml) {
-    DirectSolrConnection connection = new DirectSolrConnection(h.getCore());
-    SolrRequestHandler handler = h.getCore().getRequestHandler("/update");
-    ModifiableSolrParams params = new ModifiableSolrParams();
-    params.add("update.chain", chain);
-    try {
-      return connection.request(handler, params, xml);
-    } catch (SolrException e) {
-      throw (SolrException)e;
-    } catch (Exception e) {
-      throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
+    try (SolrCore core = h.getCore()) {
+      DirectSolrConnection connection = new DirectSolrConnection(core);
+      SolrRequestHandler handler = core.getRequestHandler("/update");
+      ModifiableSolrParams params = new ModifiableSolrParams();
+      params.add("update.chain", chain);
+      try {
+        return connection.request(handler, params, xml);
+      } catch (SolrException e) {
+        throw (SolrException) e;
+      } catch (Exception e) {
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, e);
+      }
     }
   }
   
@@ -393,7 +395,7 @@ public class TolerantUpdateProcessorTest extends UpdateProcessorTestBase {
       requestParams = new ModifiableSolrParams();
     }
     
-    SolrQueryRequest req = new LocalSolrQueryRequest(core, requestParams);
+    SolrQueryRequest req = new LocalSolrQueryRequest(core, requestParams, true);
     UpdateRequestProcessor processor = null;
     try {
       processor = pc.createProcessor(req, rsp);
diff --git a/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
index 5e5f82d..e51df01 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/UpdateRequestProcessorFactoryTest.java
@@ -24,6 +24,7 @@ import java.util.List;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.core.SolrCore;
+import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.junit.BeforeClass;
 import org.slf4j.Logger;
@@ -55,7 +56,7 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
     UpdateRequestProcessorChain chain = core.getUpdateProcessorChain(params);
     List<UpdateRequestProcessorFactory> l = chain.getProcessors();
     assertTrue(l.get(0) instanceof TemplateUpdateProcessorFactory);
-
+    core.close();
 
   }
   
@@ -89,6 +90,8 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
     
     // Make sure the NamedListArgs got through ok
     assertEquals( "{name={n8=88, n9=99}}", link.args.toString() );
+
+    core.close();
   }
 
   public void testUpdateDistribChainSkipping() throws Exception {
@@ -119,8 +122,10 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
                    chain.getProcessors().size());
 
       // test a basic (non distrib) chain
-      proc = chain.createProcessor(req(), new SolrQueryResponse());
+      SolrQueryRequest req = req();
+      proc = chain.createProcessor(req, new SolrQueryResponse());
       procs = procToList(proc);
+      req.close();
 
       int expectedProcLen = EXPECTED_CHAIN_LENGTH;
       if ("distrib-chain-noop".equals(name)) { // NoOpDistributingUpdateProcessorFactory produces no processor
@@ -148,9 +153,11 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
                    && procs.get(1) instanceof LogUpdateProcessorFactory.LogUpdateProcessor));
       proc.close();
       // fetch the distributed version of this chain
-      proc = chain.createProcessor(req(DISTRIB_UPDATE_PARAM, "NONE"), // just some non-blank value
+      req = req(DISTRIB_UPDATE_PARAM, "NONE");
+      proc = chain.createProcessor(req, // just some non-blank value
                                    new SolrQueryResponse());
       procs = procToList(proc);
+      req.close();
       assertNotNull(name + " (distrib) chain produced null proc", proc);
       assertFalse(name + " (distrib) procs is empty", procs.isEmpty());
 
@@ -181,7 +188,7 @@ public class UpdateRequestProcessorFactoryTest extends SolrTestCaseJ4 {
           expectedProcLen, procs.size());
       proc.close();
     }
-
+    core.close();
   }
 
   /**
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
index 514fa82..db1c38b 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/Http2SolrClient.java
@@ -1045,6 +1045,7 @@ public class Http2SolrClient extends SolrClient {
       } catch (IllegalStateException e) {
         log.error("Unexpected, perhaps came after close; ?", e);
       } catch (InterruptedException e) {
+        ParWork.propagateInterrupt(e);
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
       } catch (TimeoutException e) {
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Timeout", e);
@@ -1075,6 +1076,7 @@ public class Http2SolrClient extends SolrClient {
           available.acquire();
         }
       } catch (InterruptedException e) {
+        ParWork.propagateInterrupt(e);
         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
       }
       phaser.register();
diff --git a/solr/solrj/src/java/org/apache/solr/common/ParWork.java b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
index 718fed8..174927d 100644
--- a/solr/solrj/src/java/org/apache/solr/common/ParWork.java
+++ b/solr/solrj/src/java/org/apache/solr/common/ParWork.java
@@ -58,6 +58,7 @@ import org.slf4j.LoggerFactory;
  */
 public class ParWork implements Closeable {
   public static final int PROC_COUNT = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
+  public static final String ROOT_EXEC_NAME = "Root";
   private static final String WORK_WAS_INTERRUPTED = "Work was interrupted!";
 
   private static final String RAN_INTO_AN_ERROR_WHILE_DOING_WORK =
@@ -77,7 +78,7 @@ public class ParWork implements Closeable {
     if (EXEC == null) {
       synchronized (ParWork.class) {
         if (EXEC == null) {
-          EXEC = (ParWorkExecutor) getParExecutorService("Root",
+          EXEC = (ParWorkExecutor) getParExecutorService(ROOT_EXEC_NAME,
               Integer.getInteger("solr.rootSharedThreadPoolCoreSize", 32), Integer.MAX_VALUE, 1000,
               new SynchronousQueue());
           ((ParWorkExecutor)EXEC).enableCloseLock();
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
index f5eb82e..0a80357 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
@@ -26,11 +26,13 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.embedded.JettySolrRunner;
+import org.apache.solr.client.solrj.io.Lang;
 import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.ComparatorOrder;
@@ -38,6 +40,8 @@ import org.apache.solr.client.solrj.io.comp.FieldComparator;
 import org.apache.solr.client.solrj.io.comp.MultipleFieldComparator;
 import org.apache.solr.client.solrj.io.eq.FieldEqualitor;
 import org.apache.solr.client.solrj.io.ops.GroupOperation;
+import org.apache.solr.client.solrj.io.stream.expr.DefaultStreamFactory;
+import org.apache.solr.client.solrj.io.stream.expr.Expressible;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.client.solrj.io.stream.metrics.Bucket;
 import org.apache.solr.client.solrj.io.stream.metrics.CountMetric;
@@ -94,6 +98,7 @@ private static boolean useAlias;
 
 @BeforeClass
 public static void configureCluster() throws Exception {
+
   numShards = random().nextInt(2) + 2;  //1 - 3
   numWorkers = numShards > 2 ? random().nextInt(numShards - 1) + 1 : numShards;
   configureCluster(numShards)
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
index 40c4cb0..e6b3bd3 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
@@ -29,7 +29,6 @@ import java.util.TreeMap;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.apache.solr.client.solrj.impl.BaseHttpSolrClient;
 import org.apache.solr.client.solrj.request.schema.AnalyzerDefinition;
 import org.apache.solr.client.solrj.request.schema.FieldTypeDefinition;
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index fb64618..7c34893 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -29,9 +29,6 @@ import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.QuickPatchThreadsFilter;
 import org.apache.solr.client.solrj.impl.Http2SolrClient;
 import org.apache.solr.client.solrj.impl.HttpClientUtil;
-import org.apache.solr.client.solrj.io.Lang;
-import org.apache.solr.client.solrj.io.stream.expr.DefaultStreamFactory;
-import org.apache.solr.client.solrj.io.stream.expr.Expressible;
 import org.apache.solr.common.AlreadyClosedException;
 import org.apache.solr.common.ParWork;
 import org.apache.solr.common.ParWorkExecutor;
@@ -44,6 +41,7 @@ import org.apache.solr.common.util.CloseTracker;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.SolrQueuedThreadPool;
 import org.apache.solr.common.util.SysStats;
+import org.apache.solr.core.SolrResourceLoader;
 import org.apache.solr.security.PublicKeyHandler;
 import org.apache.solr.servlet.SolrDispatchFilter;
 import org.apache.solr.util.CryptoKeys;
@@ -87,7 +85,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
 
 /**
  * All Solr test cases should derive from this class eventually. This is originally a result of async logging, see:
@@ -423,13 +420,6 @@ public class SolrTestCase extends LuceneTestCase {
                SolrDispatchFilter.SOLR_DEFAULT_CONFDIR_ATTRIBUTE, ExternalPaths.DEFAULT_CONFIGSET);
     }
 
-    // preinit static
-    Lang.register(new DefaultStreamFactory(){
-      public void setFunctionNames(Map<String,Supplier<Class<? extends Expressible>>> functionNames) {
-
-      }
-    });
-
     log.info("@BeforeClass end ------------------------------------------------------");
     log.info("*******************************************************************");
   }
@@ -507,7 +497,7 @@ public class SolrTestCase extends LuceneTestCase {
 
       if (testExecutor != null) {
         testExecutor.disableCloseLock();
-        testExecutor.shutdownNow();
+        testExecutor.shutdown();
       }
 
 
@@ -543,6 +533,7 @@ public class SolrTestCase extends LuceneTestCase {
       ParWork.shutdownParWorkExecutor();
 
     } finally {
+      SolrResourceLoader.refreshConf();
       ObjectReleaseTracker.clear();
       TestInjection.reset();
     }
@@ -692,7 +683,7 @@ public class SolrTestCase extends LuceneTestCase {
     if (thread.getName().contains("ForkJoinPool.") || thread.getName().contains("Log4j2-")) {
       return false;
     }
-    if (thread.getName().contains("RootExec")) {
+    if (thread.getName().contains(ParWork.ROOT_EXEC_NAME + "-")) {
       log.warn("interrupt on " + thread.getName());
       thread.interrupt();
       return true;
@@ -887,7 +878,8 @@ public class SolrTestCase extends LuceneTestCase {
       if (testExecutor != null) {
         return testExecutor;
       }
-      testExecutor = (ParWorkExecutor) ParWork.getParExecutorService("testExecutor", 3, 100, 3000, new BlockingArrayQueue(30, 16));
+      testExecutor = (ParWorkExecutor) ParWork.getParExecutorService("testExecutor", 10, 30, 1000, new BlockingArrayQueue(30, 16));
+      testExecutor.prestartAllCoreThreads();
       ((ParWorkExecutor) testExecutor).enableCloseLock();
       return testExecutor;
     }
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index 282b05d..0322eec 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -95,6 +95,7 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
+import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.common.util.XML;
 import org.apache.solr.core.CoreContainer;
@@ -1014,18 +1015,19 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     Map<String, String[]> params = new HashMap<>();
     MultiMapSolrParams mmparams = new MultiMapSolrParams(params);
     params.put(UpdateParams.UPDATE_CHAIN, new String[]{updateRequestProcessorChain});
-    SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(),
-        (SolrParams) mmparams) {
-    };
-
-    UpdateRequestHandler handler = new UpdateRequestHandler();
-    handler.init(null);
-    ArrayList<ContentStream> streams = new ArrayList<>(2);
-    streams.add(new ContentStreamBase.StringStream(doc));
-    req.setContentStreams(streams);
-    handler.handleRequestBody(req, new SolrQueryResponse());
-    req.close();
-    handler.close();
+    try (SolrCore core = h.getCore()) {
+      SolrQueryRequestBase req = new SolrQueryRequestBase(core, (SolrParams) mmparams) {
+      };
+
+      UpdateRequestHandler handler = new UpdateRequestHandler();
+      handler.init(null);
+      ArrayList<ContentStream> streams = new ArrayList<>(2);
+      streams.add(new ContentStreamBase.StringStream(doc));
+      req.setContentStreams(streams);
+      handler.handleRequestBody(req, new SolrQueryResponse());
+      req.close();
+      handler.close();
+    }
   }
 
   /**
@@ -1127,7 +1129,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
     for (int i=0; i<moreParams.length; i+=2) {
       mp.add(moreParams[i], moreParams[i+1]);
     }
-    return new LocalSolrQueryRequest(h.getCore(), mp);
+    return new LocalSolrQueryRequest(h.getCore(), mp, true);
   }
 
   /** Necessary to make method signatures un-ambiguous */
@@ -1683,7 +1685,7 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
 
     // merging segments no longer selects just adjacent segments hence ids (doc.order) can be shuffled.
     // we need to look at the index to determine the order.
-    String responseStr = h.query(req("q","*:*", "fl","id", "sort","_docid_ asc", "rows",Integer.toString(model.size()*2), "wt","json", "indent","true"));
+    String responseStr = query(req("q","*:*", "fl","id", "sort","_docid_ asc", "rows",Integer.toString(model.size()*2), "wt","json", "indent","true"));
     Object response = ObjectBuilder.fromJSON(responseStr);
 
     response = ((Map)response).get("response");
@@ -2511,7 +2513,27 @@ public abstract class SolrTestCaseJ4 extends SolrTestCase {
   }
 
   protected void waitForWarming() throws InterruptedException {
-    waitForWarming(h.getCore());
+    try (SolrCore core = h.getCore()) {
+      waitForWarming(core);
+    }
+  }
+
+  protected String query(SolrQueryRequest req) throws Exception {
+    try {
+      String resp = h.query(req);
+      return resp;
+    } finally {
+      IOUtils.closeQuietly(req);
+    }
+  }
+
+  protected String query(String handler, SolrQueryRequest req) throws Exception {
+    try {
+      String resp = h.query(handler, req);
+      return resp;
+    } finally {
+      IOUtils.closeQuietly(req);
+    }
   }
 
   public static void assertNonBlockingRandomGeneratorAvailable() throws InterruptedException {
diff --git a/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java b/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
index 827c07f..5f14a13 100644
--- a/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/update/processor/UpdateProcessorTestBase.java
@@ -63,7 +63,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
 
     SolrQueryResponse rsp = new SolrQueryResponse();
 
-    SolrQueryRequest req = new LocalSolrQueryRequest(core, requestParams);
+    SolrQueryRequest req = new LocalSolrQueryRequest(core, requestParams, true);
     try {
       SolrRequestInfo.setRequestInfo(new SolrRequestInfo(req, rsp));
       AddUpdateCommand cmd = new AddUpdateCommand(req);
@@ -95,7 +95,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
 
     SolrQueryResponse rsp = new SolrQueryResponse();
 
-    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams());
+    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams(), true);
 
     CommitUpdateCommand cmd = new CommitUpdateCommand(req,false);
     UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
@@ -114,7 +114,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
 
     SolrQueryResponse rsp = new SolrQueryResponse();
 
-    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams());
+    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams(), true);
 
     DeleteUpdateCommand cmd = new DeleteUpdateCommand(req);
     cmd.setId(id);
@@ -133,7 +133,7 @@ public class UpdateProcessorTestBase extends SolrTestCaseJ4 {
     assertNotNull("No Chain named: " + chain, pc);
 
     SolrQueryResponse rsp = new SolrQueryResponse();
-    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams());
+    SolrQueryRequest req = new LocalSolrQueryRequest(core, new ModifiableSolrParams(), true);
 
     UpdateRequestProcessor processor = pc.createProcessor(req, rsp);
     try {
diff --git a/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java b/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
index 228842c..dc7f0c5 100644
--- a/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
+++ b/solr/test-framework/src/test/org/apache/solr/cloud/MiniSolrCloudClusterTest.java
@@ -24,6 +24,7 @@ import org.apache.solr.client.solrj.embedded.JettySolrRunner;
 import org.junit.Test;
 
 @LuceneTestCase.SuppressSysoutChecks(bugUrl = "Solr logs to JUL")
+@LuceneTestCase.Nightly
 public class MiniSolrCloudClusterTest extends SolrTestCaseJ4 {
 
   @Test