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

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


The following commit(s) were added to refs/heads/main by this push:
     new 7b613b06c TIKA-4545 - rm TikaConfigs and streamline 
PipesConfig/AsyncConfig (#2421)
7b613b06c is described below

commit 7b613b06c10f91a193f612e4c59f2d31165bab58
Author: Tim Allison <[email protected]>
AuthorDate: Thu Dec 4 12:01:37 2025 -0500

    TIKA-4545 - rm TikaConfigs and streamline PipesConfig/AsyncConfig (#2421)
---
 .../test/resources/configs/config-template.json    |   2 +-
 .../src/test/resources/kafka/plugins-template.json |   2 +-
 .../pipes/opensearch/tests/OpenSearchTest.java     |   6 +-
 .../resources/opensearch/plugins-template.json     |   2 +-
 .../opensearch/tika-config-opensearch.json         |   2 +-
 .../src/test/resources/s3/plugins-template.json    |   2 +-
 .../src/test/resources/solr/plugins-template.json  |   2 +-
 .../src/test/resources/tika-config-solr-urls.json  |   2 +-
 .../java/org/apache/tika/TikaLoaderHelper.java     |   3 +-
 .../src/test/resources/configs/tika-4533.json      |   2 +-
 .../configs/tika-config-digests-pdf-only.json      |   2 +-
 .../tika-config-digests-skip-container.json        |   2 +-
 .../resources/configs/tika-config-digests.json     |   2 +-
 ...a-config-doubling-custom-handler-decorator.json |   2 +-
 .../resources/configs/tika-config-no-names.json    |   5 +-
 ...a-config-upcasing-custom-handler-decorator.json |   2 +-
 .../resources/configs/tika-config-with-names.json  |   5 +-
 .../org/apache/tika/async/cli/PluginsWriter.java   |  14 +-
 .../org/apache/tika/async/cli/TikaAsyncCLI.java    |  12 +-
 .../tika/async/cli/TikaConfigAsyncWriterTest.java  |  10 +-
 .../test/resources/configs/config-template.json    |   2 +-
 .../org/apache/tika/pipes/core/PipesConfig.java    | 105 ++++++++++++++
 .../org/apache/tika/pipes/core/PipesServer.java    |  13 +-
 .../apache/tika/pipes/core/async/AsyncConfig.java  | 104 --------------
 .../apache/tika/pipes/core/async/AsyncEmitter.java |   5 +-
 .../tika/pipes/core/async/AsyncProcessor.java      |  19 +--
 .../tika/pipes/core/emitter/EmitterManager.java    |   7 +-
 .../tika/pipes/core/fetcher/FetcherManager.java    |   7 +-
 .../core/pipesiterator/PipesIteratorManager.java   |   7 +-
 .../tika/pipes/core/reporter/ReporterManager.java  |   7 +-
 tika-pipes/tika-pipes-integration-tests/pom.xml    |   2 +-
 .../apache/tika/pipes/core/PassbackFilterTest.java |   6 +-
 .../apache/tika/pipes/core/PipesClientTest.java    |   6 +-
 .../apache/tika/pipes/core/PipesServerTest.java    |  20 +--
 .../apache/tika/pipes/core/PluginManagerTest.java  |   8 +-
 .../test/resources/configs/tika-config-basic.json  |   4 +-
 .../resources/configs/tika-config-passback.json    |   4 +-
 .../resources/configs/tika-config-truncate.json    |   4 +-
 .../tika/pipes/fetcher/http/HttpFetcherTest.java   |   6 +-
 .../java/org/apache/tika/plugins/TikaConfigs.java  | 160 ---------------------
 .../org/apache/tika/plugins/TikaPluginManager.java |  38 ++---
 .../org/apache/tika/plugins/TikaConfigsTest.java   | 147 -------------------
 .../apache/tika/config/loader/ConfigLoader.java    |  79 +++++-----
 .../apache/tika/config/loader/TikaJsonConfig.java  |  84 ++++++++++-
 .../org/apache/tika/config/loader/TikaLoader.java  |  21 +--
 .../test/resources/configs/test-config-loader.json |  48 ++++---
 .../resources/configs/test-interface-no-type.json  |   8 +-
 .../test/resources/configs/test-invalid-class.json |   4 +-
 .../resources/configs/test-partial-config.json     |  22 +--
 .../resources/configs/test-unexpected-field.json   |  12 +-
 .../test/resources/configs/test-wrong-type.json    |   4 +-
 .../apache/tika/server/client/TikaClientCLI.java   |   8 +-
 .../apache/tika/server/core/TikaServerConfig.java  |   2 +-
 .../apache/tika/server/core/TikaServerProcess.java |   8 +-
 .../tika/server/core/resource/AsyncResource.java   |   8 +-
 .../tika/server/core/resource/PipesResource.java   |   6 +-
 .../org/apache/tika/server/core/CXFTestBase.java   |   2 +-
 .../org/apache/tika/server/core/TikaPipesTest.java |   8 +-
 .../tika/server/core/TikaResourceFetcherTest.java  |   9 +-
 .../resources/configs/cxf-test-base-template.json  |   4 +-
 .../apache/tika/server/standard/FetcherTest.java   |   8 +-
 .../apache/tika/server/standard/TikaPipesTest.java |   8 +-
 .../resources/configs/cxf-test-base-template.json  |   4 +-
 .../configs/tika-config-for-server-tests.json      |   2 +-
 .../tika-config-langdetect-opennlp-filter.json     |   2 +-
 .../tika-config-langdetect-optimaize-filter.json   |   2 +-
 66 files changed, 447 insertions(+), 678 deletions(-)

diff --git a/tika-app/src/test/resources/configs/config-template.json 
b/tika-app/src/test/resources/configs/config-template.json
index 7a256e301..4039a1628 100644
--- a/tika-app/src/test/resources/configs/config-template.json
+++ b/tika-app/src/test/resources/configs/config-template.json
@@ -37,7 +37,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "emitWithinMillis": 10000,
     "emitMaxEstimatedBytes": 100000,
     "queueSize": 10000,
diff --git 
a/tika-integration-tests/tika-pipes-kafka-integration-tests/src/test/resources/kafka/plugins-template.json
 
b/tika-integration-tests/tika-pipes-kafka-integration-tests/src/test/resources/kafka/plugins-template.json
index be46240aa..79a47981c 100644
--- 
a/tika-integration-tests/tika-pipes-kafka-integration-tests/src/test/resources/kafka/plugins-template.json
+++ 
b/tika-integration-tests/tika-pipes-kafka-integration-tests/src/test/resources/kafka/plugins-template.json
@@ -93,7 +93,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 10,
diff --git 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/java/org/apache/tika/pipes/opensearch/tests/OpenSearchTest.java
 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/java/org/apache/tika/pipes/opensearch/tests/OpenSearchTest.java
index 421ef15b3..80c6b6933 100644
--- 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/java/org/apache/tika/pipes/opensearch/tests/OpenSearchTest.java
+++ 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/java/org/apache/tika/pipes/opensearch/tests/OpenSearchTest.java
@@ -48,6 +48,7 @@ import org.testcontainers.utility.DockerImageName;
 
 import org.apache.tika.cli.TikaCLI;
 import org.apache.tika.client.HttpClientFactory;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
@@ -57,7 +58,6 @@ import org.apache.tika.pipes.core.emitter.EmitterManager;
 import org.apache.tika.pipes.emitter.opensearch.HttpClientConfig;
 import org.apache.tika.pipes.emitter.opensearch.JsonResponse;
 import org.apache.tika.pipes.emitter.opensearch.OpenSearchEmitterConfig;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 @Testcontainers(disabledWithoutDocker = true)
@@ -364,9 +364,9 @@ public class OpenSearchTest {
                         OpenSearchEmitterConfig.UpdateStrategy.UPSERT, 
HandlerConfig.PARSE_MODE.RMETA,
                         endpoint, testDocDirectory);
 
-        TikaConfigs tikaConfigs = TikaConfigs.load(pluginsConfigFile);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pluginsConfigFile);
         Emitter emitter = EmitterManager
-                .load(TikaPluginManager.load(tikaConfigs), 
tikaConfigs).getEmitter();
+                .load(TikaPluginManager.load(tikaJsonConfig), 
tikaJsonConfig).getEmitter();
         Metadata metadata = new Metadata();
         metadata.set("mime", "mimeA");
         metadata.set("title", "titleA");
diff --git 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/plugins-template.json
 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/plugins-template.json
index 3073ceee3..c301f3226 100644
--- 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/plugins-template.json
+++ 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/plugins-template.json
@@ -59,7 +59,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 60000,
diff --git 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/tika-config-opensearch.json
 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/tika-config-opensearch.json
index d46bfe2fe..d304e3c9b 100644
--- 
a/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/tika-config-opensearch.json
+++ 
b/tika-integration-tests/tika-pipes-opensearch-integration-tests/src/test/resources/opensearch/tika-config-opensearch.json
@@ -100,7 +100,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 60000,
diff --git 
a/tika-integration-tests/tika-pipes-s3-integration-tests/src/test/resources/s3/plugins-template.json
 
b/tika-integration-tests/tika-pipes-s3-integration-tests/src/test/resources/s3/plugins-template.json
index 01d01a2bd..52f9c7ab1 100644
--- 
a/tika-integration-tests/tika-pipes-s3-integration-tests/src/test/resources/s3/plugins-template.json
+++ 
b/tika-integration-tests/tika-pipes-s3-integration-tests/src/test/resources/s3/plugins-template.json
@@ -55,7 +55,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 10,
diff --git 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/solr/plugins-template.json
 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/solr/plugins-template.json
index 37595e57b..1588f4f7a 100644
--- 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/solr/plugins-template.json
+++ 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/solr/plugins-template.json
@@ -90,7 +90,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 10,
diff --git 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/tika-config-solr-urls.json
 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/tika-config-solr-urls.json
index b8bfe5f5d..baee81c2b 100644
--- 
a/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/tika-config-solr-urls.json
+++ 
b/tika-integration-tests/tika-pipes-solr-integration-tests/src/test/resources/tika-config-solr-urls.json
@@ -40,7 +40,7 @@
       }
     }
   ],
-  "async": {
+  "pipes": {
     "maxForEmitBatchBytes": 10000,
     "emitMaxEstimatedBytes": 100000,
     "emitWithinMillis": 10,
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/TikaLoaderHelper.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/TikaLoaderHelper.java
index fd4d41e2e..d8e16eeed 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/TikaLoaderHelper.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/java/org/apache/tika/TikaLoaderHelper.java
@@ -16,6 +16,7 @@
  */
 package org.apache.tika;
 
+import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Paths;
 
@@ -29,7 +30,7 @@ public class TikaLoaderHelper {
             return TikaLoader.load(Paths.get(TikaLoaderHelper.class
                     .getResource("/configs/" + config)
                     .toURI()));
-        } catch (URISyntaxException | TikaConfigException e) {
+        } catch (URISyntaxException | TikaConfigException | IOException e) {
             throw new RuntimeException(e);
         }
     }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-4533.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-4533.json
index 6fed19e4d..bab3af07e 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-4533.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-4533.json
@@ -1,5 +1,5 @@
 {
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "maximumCompressionRatio": 100,
     "maximumDepth": 100,
     "maximumPackageEntryDepth": 100,
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-pdf-only.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-pdf-only.json
index 8c8192eaa..9f31bfbc9 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-pdf-only.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-pdf-only.json
@@ -8,7 +8,7 @@
       }
     }
   ],
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-skip-container.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-skip-container.json
index b06f96841..5fa5e7897 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-skip-container.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests-skip-container.json
@@ -1,5 +1,5 @@
 {
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests.json
index b98e959d6..bf12e17d7 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-digests.json
@@ -1,5 +1,5 @@
 {
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-doubling-custom-handler-decorator.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-doubling-custom-handler-decorator.json
index a3945c03d..dcd44b7f3 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-doubling-custom-handler-decorator.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-doubling-custom-handler-decorator.json
@@ -1,5 +1,5 @@
 {
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000,
     "outputThreshold": 1000,
     "contentHandlerDecoratorFactory": {
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
index 2f0ac2a2f..5938163df 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-no-names.json
@@ -3,9 +3,8 @@
     "spoolToDisk": 123450,
     "outputThreshold": 678900,
     "embeddedDocumentExtractorFactory": {
-      "runpack-extractor-factory": {
-        "writeFileNameToContent": false
-      }
+      "@class": "org.apache.tika.extractor.RUnpackExtractorFactory",
+      "writeFileNameToContent": false
     }
   }
 }
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
index 2d088ccdc..d573606b9 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-upcasing-custom-handler-decorator.json
@@ -1,5 +1,5 @@
 {
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000,
     "outputThreshold": 1000,
     "maximumCompressionRatio": 0.8,
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
index 0659adb85..ea1519ec0 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-package/src/test/resources/configs/tika-config-with-names.json
@@ -3,9 +3,8 @@
     "spoolToDisk": 123450,
     "outputThreshold": 678900,
     "embeddedDocumentExtractorFactory": {
-      "runpack-extractor-factory": {
-        "writeFileNameToContent": true
-      }
+      "@class": "org.apache.tika.extractor.RUnpackExtractorFactory",
+      "writeFileNameToContent": true
     }
   }
 }
diff --git 
a/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/PluginsWriter.java
 
b/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/PluginsWriter.java
index f3236a05b..5c863c491 100644
--- 
a/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/PluginsWriter.java
+++ 
b/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/PluginsWriter.java
@@ -28,7 +28,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
 import org.apache.tika.config.loader.PolymorphicObjectMapperFactory;
-import org.apache.tika.pipes.core.async.AsyncConfig;
+import org.apache.tika.pipes.core.PipesConfig;
 import org.apache.tika.utils.StringUtils;
 
 public class PluginsWriter {
@@ -61,20 +61,20 @@ public class PluginsWriter {
                 pluginString = plugins.toAbsolutePath().toString();
             }
             json = json.replace("PLUGIN_ROOTS", pluginString).replace("\\", 
"/");
-            AsyncConfig asyncConfig = new AsyncConfig();
+            PipesConfig pipesConfig = new PipesConfig();
 
-            asyncConfig.setNumClients(simpleAsyncConfig.getNumClients() == 
null ? 2 : simpleAsyncConfig.getNumClients());
-            asyncConfig.setTikaConfig(output.toAbsolutePath().toString());
+            pipesConfig.setNumClients(simpleAsyncConfig.getNumClients() == 
null ? 2 : simpleAsyncConfig.getNumClients());
+            pipesConfig.setTikaConfig(output.toAbsolutePath().toString());
 
             if (simpleAsyncConfig.getXmx() != null) {
-                asyncConfig.setForkedJvmArgs(new 
ArrayList<>(List.of(simpleAsyncConfig.getXmx())));
+                pipesConfig.setForkedJvmArgs(new 
ArrayList<>(List.of(simpleAsyncConfig.getXmx())));
             }
             if (simpleAsyncConfig.getTimeoutMs() != null) {
-                asyncConfig.setTimeoutMillis(simpleAsyncConfig.getTimeoutMs());
+                pipesConfig.setTimeoutMillis(simpleAsyncConfig.getTimeoutMs());
             }
             ObjectMapper objectMapper = 
PolymorphicObjectMapperFactory.getMapper();
             ObjectNode root = (ObjectNode) 
objectMapper.readTree(json.getBytes(StandardCharsets.UTF_8));
-            root.set("async", objectMapper.valueToTree(asyncConfig));
+            root.set("pipes", objectMapper.valueToTree(pipesConfig));
 
             Files.writeString(output, root.toString());
         } catch (Exception e) {
diff --git 
a/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/TikaAsyncCLI.java
 
b/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/TikaAsyncCLI.java
index 656e67aed..3a9c5cec3 100644
--- 
a/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/TikaAsyncCLI.java
+++ 
b/tika-pipes/tika-async-cli/src/main/java/org/apache/tika/async/cli/TikaAsyncCLI.java
@@ -33,6 +33,7 @@ import org.apache.commons.cli.ParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.pipes.api.FetchEmitTuple;
@@ -44,7 +45,6 @@ import org.apache.tika.pipes.core.async.AsyncProcessor;
 import org.apache.tika.pipes.core.extractor.EmbeddedDocumentBytesConfig;
 import org.apache.tika.pipes.core.pipesiterator.PipesIteratorManager;
 import org.apache.tika.plugins.ExtensionConfig;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.utils.StringUtils;
@@ -84,8 +84,8 @@ public class TikaAsyncCLI {
         if (args.length == 1) {
             if (args[0].endsWith(".json")) {
                 LOG.warn("processing args");
-                TikaConfigs tikaConfigs = TikaConfigs.load(Paths.get(args[0]));
-                Optional<PipesIterator> pipesIteratorOpt = 
PipesIteratorManager.load(TikaPluginManager.load(tikaConfigs), tikaConfigs);
+                TikaJsonConfig tikaJsonConfig = 
TikaJsonConfig.load(Paths.get(args[0]));
+                Optional<PipesIterator> pipesIteratorOpt = 
PipesIteratorManager.load(TikaPluginManager.load(tikaJsonConfig), 
tikaJsonConfig);
                 if (pipesIteratorOpt.isEmpty()) {
                     throw new IllegalArgumentException("Must specify a pipes 
iterator if supplying a .json file");
                 }
@@ -121,10 +121,10 @@ public class TikaAsyncCLI {
 
 
     private static PipesIterator buildPipesIterator(Path pluginsConfig, 
SimpleAsyncConfig simpleAsyncConfig) throws TikaConfigException, IOException {
-        TikaConfigs tikaConfigs = TikaConfigs.load(pluginsConfig);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pluginsConfig);
         String inputDirString = simpleAsyncConfig.getInputDir();
         if (StringUtils.isBlank(inputDirString)) {
-            Optional<PipesIterator> pipesIteratorOpt =  
PipesIteratorManager.load(TikaPluginManager.load(tikaConfigs), tikaConfigs);
+            Optional<PipesIterator> pipesIteratorOpt =  
PipesIteratorManager.load(TikaPluginManager.load(tikaJsonConfig), 
tikaJsonConfig);
             if (pipesIteratorOpt.isEmpty()) {
                 throw new TikaConfigException("something went wrong loading: 
pipesIterator from the tika configs");
             }
@@ -134,7 +134,7 @@ public class TikaAsyncCLI {
         if (Files.isRegularFile(p)) {
             return new SingleFilePipesIterator(p.getFileName().toString());
         }
-        Optional<PipesIterator> pipesIteratorOpt = 
PipesIteratorManager.load(TikaPluginManager.load(tikaConfigs), tikaConfigs);
+        Optional<PipesIterator> pipesIteratorOpt = 
PipesIteratorManager.load(TikaPluginManager.load(tikaJsonConfig), 
tikaJsonConfig);
         if (pipesIteratorOpt.isEmpty()) {
             throw new TikaConfigException("something went wrong loading: 
pipesIterator from the tika configs");
         }
diff --git 
a/tika-pipes/tika-async-cli/src/test/java/org/apache/tika/async/cli/TikaConfigAsyncWriterTest.java
 
b/tika-pipes/tika-async-cli/src/test/java/org/apache/tika/async/cli/TikaConfigAsyncWriterTest.java
index 5e009f1f8..225bf031e 100644
--- 
a/tika-pipes/tika-async-cli/src/test/java/org/apache/tika/async/cli/TikaConfigAsyncWriterTest.java
+++ 
b/tika-pipes/tika-async-cli/src/test/java/org/apache/tika/async/cli/TikaConfigAsyncWriterTest.java
@@ -25,8 +25,8 @@ import java.nio.file.Paths;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
-import org.apache.tika.pipes.core.async.AsyncConfig;
-import org.apache.tika.plugins.TikaConfigs;
+import org.apache.tika.config.loader.TikaJsonConfig;
+import org.apache.tika.pipes.core.PipesConfig;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 
 public class TikaConfigAsyncWriterTest {
@@ -44,9 +44,9 @@ public class TikaConfigAsyncWriterTest {
 
         Path tmp = Files.createTempFile(dir, "plugins-",".json");
         pluginsWriter.write(tmp);
-        TikaConfigs configs = TikaConfigs.load(tmp);
-        AsyncConfig asyncConfig = AsyncConfig.load(configs);
-        assertEquals("-Xmx1g", asyncConfig.getForkedJvmArgs().get(0));
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tmp);
+        PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
+        assertEquals("-Xmx1g", pipesConfig.getForkedJvmArgs().get(0));
     }
 
 }
diff --git 
a/tika-pipes/tika-async-cli/src/test/resources/configs/config-template.json 
b/tika-pipes/tika-async-cli/src/test/resources/configs/config-template.json
index 9e0ff05ef..082939278 100644
--- a/tika-pipes/tika-async-cli/src/test/resources/configs/config-template.json
+++ b/tika-pipes/tika-async-cli/src/test/resources/configs/config-template.json
@@ -21,7 +21,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "emitWithinMillis": 10000,
     "emitMaxEstimatedBytes": 100000,
     "queueSize": 10000,
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
index 4f2093530..2acfc486a 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesConfig.java
@@ -16,12 +16,16 @@
  */
 package org.apache.tika.pipes.core;
 
+import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
+import org.apache.tika.exception.TikaConfigException;
+
 public class PipesConfig {
 
     /**
@@ -60,12 +64,48 @@ public class PipesConfig {
     public static final int DEFAULT_STALE_FETCHER_DELAY_SECONDS = 60;
     private int staleFetcherDelaySeconds = DEFAULT_STALE_FETCHER_DELAY_SECONDS;
 
+    // Async-specific fields (used by AsyncProcessor, ignored by PipesServer)
+    public static final long DEFAULT_EMIT_WITHIN_MILLIS = 10000;
+    public static final long DEFAULT_EMIT_MAX_ESTIMATED_BYTES = 100000;
+    public static final int DEFAULT_QUEUE_SIZE = 10000;
+    public static final int DEFAULT_NUM_EMITTERS = 1;
+
+    private long emitWithinMillis = DEFAULT_EMIT_WITHIN_MILLIS;
+    private long emitMaxEstimatedBytes = DEFAULT_EMIT_MAX_ESTIMATED_BYTES;
+    private int queueSize = DEFAULT_QUEUE_SIZE;
+    private int numEmitters = DEFAULT_NUM_EMITTERS;
+    private boolean emitIntermediateResults = false;
+
     private ArrayList<String> forkedJvmArgs = new ArrayList<>();
     private String javaPath = "java";
 
 
     private String tikaConfig;
 
+    /**
+     * Loads PipesConfig from the "pipes" section of the JSON configuration.
+     * <p>
+     * This configuration is used by both PipesServer (forking process) and
+     * AsyncProcessor (async processing). Some fields are specific to each:
+     * <ul>
+     *   <li>PipesServer uses: numClients, timeoutMillis, 
maxForEmitBatchBytes, etc.</li>
+     *   <li>AsyncProcessor uses: emitWithinMillis, queueSize, numEmitters, 
etc.</li>
+     * </ul>
+     * Unused fields in each context are simply ignored.
+     *
+     * @param tikaJsonConfig the JSON configuration to load from
+     * @return the loaded PipesConfig, or a new default instance if not found 
in config
+     * @throws IOException if deserialization fails
+     * @throws TikaConfigException if configuration is invalid
+     */
+    public static PipesConfig load(TikaJsonConfig tikaJsonConfig) throws 
IOException, TikaConfigException {
+        PipesConfig config = tikaJsonConfig.deserialize("pipes", 
PipesConfig.class);
+        if (config == null) {
+            return new PipesConfig();
+        }
+        return config;
+    }
+
     public long getTimeoutMillis() {
         return timeoutMillis;
     }
@@ -201,4 +241,69 @@ public class PipesConfig {
     public void setMaxWaitForClientMillis(long maxWaitForClientMillis) {
         this.maxWaitForClientMillis = maxWaitForClientMillis;
     }
+
+    // Async-specific getters/setters (used by AsyncProcessor, ignored by 
PipesServer)
+
+    public long getEmitWithinMillis() {
+        return emitWithinMillis;
+    }
+
+    /**
+     * If nothing has been emitted in this amount of time
+     * and the {@link #getEmitMaxEstimatedBytes()} has not been reached yet,
+     * emit what's in the emit queue.
+     *
+     * @param emitWithinMillis time in milliseconds
+     */
+    public void setEmitWithinMillis(long emitWithinMillis) {
+        this.emitWithinMillis = emitWithinMillis;
+    }
+
+    /**
+     * When the emit queue hits this estimated size (sum of
+     * estimated extract sizes), emit the batch.
+     *
+     * @return the maximum estimated bytes before emitting
+     */
+    public long getEmitMaxEstimatedBytes() {
+        return emitMaxEstimatedBytes;
+    }
+
+    public void setEmitMaxEstimatedBytes(long emitMaxEstimatedBytes) {
+        this.emitMaxEstimatedBytes = emitMaxEstimatedBytes;
+    }
+
+    /**
+     * FetchEmitTuple queue size
+     *
+     * @return the queue size
+     */
+    public int getQueueSize() {
+        return queueSize;
+    }
+
+    public void setQueueSize(int queueSize) {
+        this.queueSize = queueSize;
+    }
+
+    /**
+     * Number of emitters
+     *
+     * @return the number of emitters
+     */
+    public int getNumEmitters() {
+        return numEmitters;
+    }
+
+    public void setNumEmitters(int numEmitters) {
+        this.numEmitters = numEmitters;
+    }
+
+    public boolean isEmitIntermediateResults() {
+        return emitIntermediateResults;
+    }
+
+    public void setEmitIntermediateResults(boolean emitIntermediateResults) {
+        this.emitIntermediateResults = emitIntermediateResults;
+    }
 }
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesServer.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesServer.java
index 2d6379ee3..bdc31cc43 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesServer.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/PipesServer.java
@@ -43,6 +43,7 @@ import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
 import org.apache.tika.config.TikaTaskTimeout;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.config.loader.TikaLoader;
 import org.apache.tika.detect.Detector;
 import org.apache.tika.exception.EncryptedDocumentException;
@@ -79,7 +80,6 @@ import 
org.apache.tika.pipes.core.extractor.BasicEmbeddedDocumentBytesHandler;
 import org.apache.tika.pipes.core.extractor.EmbeddedDocumentBytesConfig;
 import 
org.apache.tika.pipes.core.extractor.EmittingEmbeddedDocumentBytesHandler;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.sax.ContentHandlerFactory;
@@ -162,7 +162,7 @@ public class PipesServer implements Runnable {
     public PipesServer(Path tikaConfigPath,
                        InputStream in, PrintStream out,
                        long maxForEmitBatchBytes, long 
serverParseTimeoutMillis,
-                       long serverWaitTimeoutMillis) throws 
TikaConfigException {
+                       long serverWaitTimeoutMillis) throws 
TikaConfigException, IOException {
         this.tikaLoader = TikaLoader.load(tikaConfigPath);
         this.defaultMetadataFilter = tikaLoader.loadMetadataFilters();
         this.input = new DataInputStream(in);
@@ -834,16 +834,15 @@ public class PipesServer implements Runnable {
 
     protected void initializeResources() throws TikaException, IOException, 
SAXException {
 
-        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaLoader.getConfig());
+        TikaJsonConfig tikaJsonConfig = tikaLoader.getConfig();
+        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaJsonConfig);
 
-        //TODO -- fix this -- get rid of TikaConfigs
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaLoader.getConfig());
         //TODO allowed named configurations in tika config
-        this.fetcherManager = FetcherManager.load(tikaPluginManager, 
tikaConfigs);
+        this.fetcherManager = FetcherManager.load(tikaPluginManager, 
tikaJsonConfig);
         //skip initialization of the emitters if emitting
         //from the pipesserver is turned off.
         if (maxForEmitBatchBytes > -1) {
-            this.emitterManager = EmitterManager.load(tikaPluginManager, 
tikaConfigs);
+            this.emitterManager = EmitterManager.load(tikaPluginManager, 
tikaJsonConfig);
         } else {
             LOG.debug("'maxForEmitBatchBytes' < 0. Not initializing emitters 
in PipesServer");
             this.emitterManager = null;
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncConfig.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncConfig.java
deleted file mode 100644
index a48a2d0db..000000000
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncConfig.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.pipes.core.async;
-
-import java.io.IOException;
-
-import org.apache.tika.exception.TikaConfigException;
-import org.apache.tika.pipes.core.PipesConfig;
-import org.apache.tika.plugins.TikaConfigs;
-
-public class AsyncConfig extends PipesConfig {
-
-    private long emitWithinMillis = 10000;
-    private long emitMaxEstimatedBytes = 100000;
-
-    private int queueSize = 10000;
-    private int numEmitters = 1;
-
-    private boolean emitIntermediateResults = false;
-
-    public static AsyncConfig load(TikaConfigs tikaConfigs) throws 
IOException, TikaConfigException {
-        AsyncConfig a = tikaConfigs.deserialize(AsyncConfig.class, "async");
-        if (a == null) {
-            return new AsyncConfig();
-        }
-        return a;
-    }
-
-    public long getEmitWithinMillis() {
-        return emitWithinMillis;
-    }
-
-    /**
-     * If nothing has been emitted in this amount of time
-     * and the {@link #getEmitMaxEstimatedBytes()} has not been reached yet,
-     * emit what's in the emit queue.
-     *
-     * @param emitWithinMillis
-     */
-    public void setEmitWithinMillis(long emitWithinMillis) {
-        this.emitWithinMillis = emitWithinMillis;
-    }
-
-    /**
-     * When the emit queue hits this estimated size (sum of
-     * estimated extract sizes), emit the batch.
-     * @return
-     */
-    public long getEmitMaxEstimatedBytes() {
-        return emitMaxEstimatedBytes;
-    }
-
-    public void setEmitMaxEstimatedBytes(long emitMaxEstimatedBytes) {
-        this.emitMaxEstimatedBytes = emitMaxEstimatedBytes;
-    }
-
-
-    public void setNumEmitters(int numEmitters) {
-        this.numEmitters = numEmitters;
-    }
-
-    /**
-     * FetchEmitTuple queue size
-     * @return
-     */
-    public int getQueueSize() {
-        return queueSize;
-    }
-
-    public void setQueueSize(int queueSize) {
-        this.queueSize = queueSize;
-    }
-
-    /**
-     * Number of emitters
-     *
-     * @return
-     */
-    public int getNumEmitters() {
-        return numEmitters;
-    }
-
-    public void setEmitIntermediateResults(boolean emitIntermediateResults) {
-        this.emitIntermediateResults = emitIntermediateResults;
-    }
-
-    public boolean isEmitIntermediateResults() {
-        return emitIntermediateResults;
-    }
-}
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncEmitter.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncEmitter.java
index ccffd03de..ea084aa65 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncEmitter.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncEmitter.java
@@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
 
 import org.apache.tika.pipes.api.emitter.EmitData;
 import org.apache.tika.pipes.api.emitter.Emitter;
+import org.apache.tika.pipes.core.PipesConfig;
 import org.apache.tika.pipes.core.emitter.EmitterManager;
 import org.apache.tika.utils.ExceptionUtils;
 
@@ -46,13 +47,13 @@ public class AsyncEmitter implements Callable<Integer> {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(AsyncEmitter.class);
 
-    private final AsyncConfig asyncConfig;
+    private final PipesConfig asyncConfig;
     private final EmitterManager emitterManager;
     private final ArrayBlockingQueue<EmitDataPair> emitDataQueue;
 
     Instant lastEmitted = Instant.now();
 
-    public AsyncEmitter(AsyncConfig asyncConfig, 
ArrayBlockingQueue<EmitDataPair> emitData,
+    public AsyncEmitter(PipesConfig asyncConfig, 
ArrayBlockingQueue<EmitDataPair> emitData,
                         EmitterManager emitterManager) {
         this.asyncConfig = asyncConfig;
         this.emitDataQueue = emitData;
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncProcessor.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncProcessor.java
index 3b7ac66c8..a83387a42 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncProcessor.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/async/AsyncProcessor.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.config.loader.TikaLoader;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.filter.MetadataFilter;
@@ -43,11 +44,11 @@ import 
org.apache.tika.pipes.api.pipesiterator.TotalCountResult;
 import org.apache.tika.pipes.api.pipesiterator.TotalCounter;
 import org.apache.tika.pipes.api.reporter.PipesReporter;
 import org.apache.tika.pipes.core.PipesClient;
+import org.apache.tika.pipes.core.PipesConfig;
 import org.apache.tika.pipes.core.PipesException;
 import org.apache.tika.pipes.core.PipesResults;
 import org.apache.tika.pipes.core.emitter.EmitterManager;
 import org.apache.tika.pipes.core.reporter.ReporterManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 /**
@@ -66,7 +67,7 @@ public class AsyncProcessor implements Closeable {
     private final ArrayBlockingQueue<EmitDataPair> emitDatumTuples;
     private final ExecutorCompletionService<Integer> executorCompletionService;
     private final ExecutorService executorService;
-    private final AsyncConfig asyncConfig;
+    private final PipesConfig asyncConfig;
     private final PipesReporter pipesReporter;
     private final AtomicLong totalProcessed = new AtomicLong(0);
     private static long MAX_OFFER_WAIT_MS = 120000;
@@ -80,11 +81,11 @@ public class AsyncProcessor implements Closeable {
     }
 
     public AsyncProcessor(Path tikaConfigPath, PipesIterator pipesIterator) 
throws TikaException, IOException {
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaConfigPath);
-        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tikaConfigPath);
+        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaJsonConfig);
         MetadataFilter metadataFilter = 
TikaLoader.load(tikaConfigPath).loadMetadataFilters();
-        this.asyncConfig = AsyncConfig.load(tikaConfigs);
-        this.pipesReporter = ReporterManager.load(tikaPluginManager, 
tikaConfigs);
+        this.asyncConfig = PipesConfig.load(tikaJsonConfig);
+        this.pipesReporter = ReporterManager.load(tikaPluginManager, 
tikaJsonConfig);
         LOG.debug("loaded reporter {}", pipesReporter.getClass());
         this.fetchEmitTuples = new 
ArrayBlockingQueue<>(asyncConfig.getQueueSize());
         this.emitDatumTuples = new ArrayBlockingQueue<>(100);
@@ -121,7 +122,7 @@ public class AsyncProcessor implements Closeable {
                         new FetchEmitWorker(asyncConfig, fetchEmitTuples, 
emitDatumTuples));
             }
 
-            EmitterManager emitterManager = 
EmitterManager.load(tikaPluginManager, tikaConfigs);
+            EmitterManager emitterManager = 
EmitterManager.load(tikaPluginManager, tikaJsonConfig);
             for (int i = 0; i < asyncConfig.getNumEmitters(); i++) {
                 executorCompletionService.submit(
                         new AsyncEmitter(asyncConfig, emitDatumTuples, 
emitterManager));
@@ -270,11 +271,11 @@ public class AsyncProcessor implements Closeable {
 
     private class FetchEmitWorker implements Callable<Integer> {
 
-        private final AsyncConfig asyncConfig;
+        private final PipesConfig asyncConfig;
         private final ArrayBlockingQueue<FetchEmitTuple> fetchEmitTuples;
         private final ArrayBlockingQueue<EmitDataPair> emitDataTupleQueue;
 
-        private FetchEmitWorker(AsyncConfig asyncConfig,
+        private FetchEmitWorker(PipesConfig asyncConfig,
                                 ArrayBlockingQueue<FetchEmitTuple> 
fetchEmitTuples,
                                 ArrayBlockingQueue<EmitDataPair> 
emitDataTupleQueue) {
             this.asyncConfig = asyncConfig;
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/emitter/EmitterManager.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/emitter/EmitterManager.java
index a99cde81c..ee5ac55a4 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/emitter/EmitterManager.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/emitter/EmitterManager.java
@@ -26,11 +26,11 @@ import org.pf4j.PluginManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.pipes.api.emitter.Emitter;
 import org.apache.tika.pipes.api.emitter.EmitterFactory;
 import org.apache.tika.plugins.PluginComponentLoader;
-import org.apache.tika.plugins.TikaConfigs;
 
 /**
  * Utility class that will apply the appropriate emitter
@@ -45,9 +45,8 @@ public class EmitterManager {
 
     private final Map<String, Emitter> emitterMap = new ConcurrentHashMap<>();
 
-    public static EmitterManager load(PluginManager pluginManager, TikaConfigs 
tikaConfigs) throws IOException, TikaConfigException {
-        JsonNode fetchersNode = tikaConfigs.getTikaJsonConfig()
-                                           .getRootNode().get(CONFIG_KEY);
+    public static EmitterManager load(PluginManager pluginManager, 
TikaJsonConfig tikaJsonConfig) throws IOException, TikaConfigException {
+        JsonNode fetchersNode = tikaJsonConfig.getRootNode().get(CONFIG_KEY);
         Map<String, Emitter> fetchers =
                 PluginComponentLoader.loadInstances(pluginManager, 
EmitterFactory.class, fetchersNode);
         return new EmitterManager(fetchers);
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/fetcher/FetcherManager.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/fetcher/FetcherManager.java
index a0c926d40..e30a833fa 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/fetcher/FetcherManager.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/fetcher/FetcherManager.java
@@ -26,12 +26,12 @@ import org.pf4j.PluginManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.pipes.api.fetcher.Fetcher;
 import org.apache.tika.pipes.api.fetcher.FetcherFactory;
 import org.apache.tika.plugins.PluginComponentLoader;
-import org.apache.tika.plugins.TikaConfigs;
 
 /**
  * Utility class to hold multiple fetchers.
@@ -44,9 +44,8 @@ public class FetcherManager {
     private static final Logger LOG = 
LoggerFactory.getLogger(FetcherManager.class);
 
 
-    public static FetcherManager load(PluginManager pluginManager, TikaConfigs 
tikaConfigs) throws TikaConfigException, IOException {
-        JsonNode fetchersNode = tikaConfigs.getTikaJsonConfig()
-                                           .getRootNode().get(CONFIG_KEY);
+    public static FetcherManager load(PluginManager pluginManager, 
TikaJsonConfig tikaJsonConfig) throws TikaConfigException, IOException {
+        JsonNode fetchersNode = tikaJsonConfig.getRootNode().get(CONFIG_KEY);
         Map<String, Fetcher> fetchers =
                 PluginComponentLoader.loadInstances(pluginManager, 
FetcherFactory.class, fetchersNode);
         return new FetcherManager(fetchers);
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/pipesiterator/PipesIteratorManager.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/pipesiterator/PipesIteratorManager.java
index b80f24baf..f374dec44 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/pipesiterator/PipesIteratorManager.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/pipesiterator/PipesIteratorManager.java
@@ -22,11 +22,11 @@ import java.util.Optional;
 import com.fasterxml.jackson.databind.JsonNode;
 import org.pf4j.PluginManager;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.pipes.api.pipesiterator.PipesIterator;
 import org.apache.tika.pipes.api.pipesiterator.PipesIteratorFactory;
 import org.apache.tika.plugins.PluginComponentLoader;
-import org.apache.tika.plugins.TikaConfigs;
 
 /**
  * Utility class to hold a single pipes iterator
@@ -37,10 +37,9 @@ public class PipesIteratorManager {
 
     public static final String CONFIG_KEY = "pipes-iterator";
 
-    public static Optional<PipesIterator> load(PluginManager pluginManager, 
TikaConfigs tikaConfigs) throws IOException, TikaConfigException {
+    public static Optional<PipesIterator> load(PluginManager pluginManager, 
TikaJsonConfig tikaJsonConfig) throws IOException, TikaConfigException {
 
-        JsonNode node = tikaConfigs.getTikaJsonConfig()
-                                   .getRootNode().get(CONFIG_KEY);
+        JsonNode node = tikaJsonConfig.getRootNode().get(CONFIG_KEY);
 
         return PluginComponentLoader.loadSingleton(pluginManager, 
PipesIteratorFactory.class, node);
     }
diff --git 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/reporter/ReporterManager.java
 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/reporter/ReporterManager.java
index a539103c5..56a8dcc74 100644
--- 
a/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/reporter/ReporterManager.java
+++ 
b/tika-pipes/tika-pipes-core/src/main/java/org/apache/tika/pipes/core/reporter/ReporterManager.java
@@ -22,11 +22,11 @@ import java.util.List;
 import com.fasterxml.jackson.databind.JsonNode;
 import org.pf4j.PluginManager;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.pipes.api.reporter.PipesReporter;
 import org.apache.tika.pipes.api.reporter.PipesReporterFactory;
 import org.apache.tika.plugins.PluginComponentLoader;
-import org.apache.tika.plugins.TikaConfigs;
 
 /**
  * Utility class to hold multiple fetchers.
@@ -37,10 +37,9 @@ public class ReporterManager {
 
     public static final String CONFIG_KEY = "pipes-reporters";
 
-    public static PipesReporter load(PluginManager pluginManager, TikaConfigs 
tikaConfigs) throws IOException, TikaConfigException {
+    public static PipesReporter load(PluginManager pluginManager, 
TikaJsonConfig tikaJsonConfig) throws IOException, TikaConfigException {
 
-        JsonNode node = tikaConfigs.getTikaJsonConfig()
-                                   .getRootNode().get(CONFIG_KEY);
+        JsonNode node = tikaJsonConfig.getRootNode().get(CONFIG_KEY);
 
         List<PipesReporter> reporters =  
PluginComponentLoader.loadUnnamedInstances(pluginManager, 
PipesReporterFactory.class, node);
         if (reporters.isEmpty()) {
diff --git a/tika-pipes/tika-pipes-integration-tests/pom.xml 
b/tika-pipes/tika-pipes-integration-tests/pom.xml
index 0dfe1b6a9..48c495641 100644
--- a/tika-pipes/tika-pipes-integration-tests/pom.xml
+++ b/tika-pipes/tika-pipes-integration-tests/pom.xml
@@ -28,7 +28,7 @@
 
   <artifactId>tika-pipes-integration-tests</artifactId>
 
-  <name>Apache Tika pipes core tests</name>
+  <name>Apache Tika pipes core integration tests</name>
   <url>https://tika.apache.org/</url>
 
   <dependencies>
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PassbackFilterTest.java
 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PassbackFilterTest.java
index 0aed6b79c..0bf8fa545 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PassbackFilterTest.java
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PassbackFilterTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
-import org.apache.tika.config.loader.TikaLoader;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -39,7 +39,6 @@ import org.apache.tika.pipes.api.FetchEmitTuple;
 import org.apache.tika.pipes.api.PipesResult;
 import org.apache.tika.pipes.api.emitter.EmitKey;
 import org.apache.tika.pipes.api.fetcher.FetchKey;
-import org.apache.tika.pipes.core.async.AsyncConfig;
 import org.apache.tika.serialization.JsonMetadataList;
 import org.apache.tika.utils.StringUtils;
 
@@ -53,7 +52,8 @@ public class PassbackFilterTest {
 
     public void init(Path tmpDir) throws Exception {
         Path pipesConfigPath = 
PluginsTestHelper.getFileSystemFetcherConfig("tika-config-passback.json", 
tmpDir);
-        PipesConfig pipesConfig = 
TikaLoader.load(pipesConfigPath).configs().load("async", AsyncConfig.class);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pipesConfigPath);
+        PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
         PluginsTestHelper.copyTestFilesToTmpInput(tmpDir, testPdfFile);
 
         pipesClient = new PipesClient(pipesConfig);
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
index de14368d1..5fae57e51 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesClientTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
 import org.apache.tika.config.TikaTaskTimeout;
-import org.apache.tika.config.loader.TikaLoader;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.filter.AttachmentCountingListFilter;
@@ -38,7 +38,6 @@ import org.apache.tika.pipes.api.FetchEmitTuple;
 import org.apache.tika.pipes.api.PipesResult;
 import org.apache.tika.pipes.api.emitter.EmitKey;
 import org.apache.tika.pipes.api.fetcher.FetchKey;
-import org.apache.tika.pipes.core.async.AsyncConfig;
 
 public class PipesClientTest {
     String fetcherName = "fsf";
@@ -49,7 +48,8 @@ public class PipesClientTest {
         Path pipesConfigPath = 
PluginsTestHelper.getFileSystemFetcherConfig(tmp, tmp.resolve("input"), 
tmp.resolve("output"));
         PluginsTestHelper.copyTestFilesToTmpInput(tmp, testFileName);
 
-        PipesConfig pipesConfig = 
TikaLoader.load(pipesConfigPath).configs().load("async", AsyncConfig.class);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pipesConfigPath);
+        PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
         return new PipesClient(pipesConfig);
     }
 
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesServerTest.java
 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesServerTest.java
index 3c2d45fbb..eca8ed017 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesServerTest.java
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PipesServerTest.java
@@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
 import org.apache.tika.TikaTest;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.pipes.api.FetchEmitTuple;
@@ -40,7 +41,6 @@ import 
org.apache.tika.pipes.api.pipesiterator.PipesIteratorBaseConfig;
 import org.apache.tika.pipes.core.extractor.BasicEmbeddedDocumentBytesHandler;
 import org.apache.tika.pipes.core.extractor.EmbeddedDocumentBytesConfig;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 public class PipesServerTest extends TikaTest {
@@ -69,9 +69,9 @@ public class PipesServerTest extends TikaTest {
         FetchEmitTuple fetchEmitTuple = new FetchEmitTuple("id",
                 new FetchKey("fsf", testDoc),
                 new EmitKey("", ""));
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaConfig);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaConfigs).getFetcher();
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tikaConfig);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaJsonConfig).getFetcher();
         PipesServer.MetadataListAndEmbeddedBytes
                 parseData = pipesServer.parseFromTuple(fetchEmitTuple, 
fetcher);
         
assertEquals("5f3b924303e960ce35d7f705e91d3018dd110a9c3cef0546a91fe013d6dad6fd",
@@ -102,9 +102,9 @@ public class PipesServerTest extends TikaTest {
         FetchEmitTuple fetchEmitTuple = new FetchEmitTuple("id",
                 new FetchKey("fs", testDoc),
                 new EmitKey("", ""), new Metadata(), parseContext);
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaConfig);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaConfigs).getFetcher();
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tikaConfig);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaJsonConfig).getFetcher();
         PipesServer.MetadataListAndEmbeddedBytes
                 parseData = pipesServer.parseFromTuple(fetchEmitTuple, 
fetcher);
         assertEquals(2, parseData.metadataList.size());
@@ -150,9 +150,9 @@ public class PipesServerTest extends TikaTest {
                 new FetchKey("fs", testDoc),
                 new EmitKey("", ""), new Metadata(), parseContext);
 
-        TikaConfigs tikaConfigs = TikaConfigs.load(pipesConfig);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaConfigs).getFetcher();
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pipesConfig);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        Fetcher fetcher = FetcherManager.load(pluginManager, 
tikaJsonConfig).getFetcher();
         PipesServer.MetadataListAndEmbeddedBytes
                 parseData = pipesServer.parseFromTuple(fetchEmitTuple, 
fetcher);
         assertEquals(2, parseData.metadataList.size());
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PluginManagerTest.java
 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PluginManagerTest.java
index 24625064c..738c3c476 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PluginManagerTest.java
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/java/org/apache/tika/pipes/core/PluginManagerTest.java
@@ -23,9 +23,9 @@ import java.nio.file.Path;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.pipes.api.fetcher.Fetcher;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 public class PluginManagerTest {
@@ -33,9 +33,9 @@ public class PluginManagerTest {
     @Test
     public void testBasic(@TempDir Path tmpDir) throws Exception {
         Path config = PluginsTestHelper.getFileSystemFetcherConfig(tmpDir);
-        TikaConfigs tikaConfigs = TikaConfigs.load(config);
-        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaConfigs);
-        FetcherManager fetcherManager = FetcherManager.load(tikaPluginManager, 
tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(config);
+        TikaPluginManager tikaPluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        FetcherManager fetcherManager = FetcherManager.load(tikaPluginManager, 
tikaJsonConfig);
         assertEquals(1, fetcherManager.getSupported().size());
         Fetcher f = fetcherManager.getFetcher();
         assertEquals("fsf", f.getExtensionConfig().id());
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-basic.json
 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-basic.json
index 026045898..57e9dc813 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-basic.json
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-basic.json
@@ -38,7 +38,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "tikaConfig": "TIKA_CONFIG",
     "numClients": 4,
     "timeoutMillis": 5000,
@@ -46,7 +46,7 @@
     "forkedJvmArgs": ["-Xmx512m"],
     "maxForEmitBatchBytes": 1000000
   },
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-passback.json
 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-passback.json
index 406fe1783..c92cf24d7 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-passback.json
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-passback.json
@@ -38,7 +38,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "tikaConfig": "TIKA_CONFIG",
     "numClients": 4,
     "timeoutMillis": 5000,
@@ -46,7 +46,7 @@
     "forkedJvmArgs": ["-Xmx512m"],
     "maxForEmitBatchBytes": 0
   },
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
index 8e9212387..811e8da1b 100644
--- 
a/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
+++ 
b/tika-pipes/tika-pipes-integration-tests/src/test/resources/configs/tika-config-truncate.json
@@ -38,7 +38,7 @@
       }
     }
   },
-  "async": {
+  "pipes": {
     "tikaConfig": "TIKA_CONFIG",
     "numClients": 4,
     "timeoutMillis": 5000,
@@ -46,7 +46,7 @@
     "forkedJvmArgs": ["-Xmx512m"],
     "maxForEmitBatchBytes": 1000000
   },
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-pipes/tika-pipes-plugins/tika-pipes-http/src/test/java/org/apache/tika/pipes/fetcher/http/HttpFetcherTest.java
 
b/tika-pipes/tika-pipes-plugins/tika-pipes-http/src/test/java/org/apache/tika/pipes/fetcher/http/HttpFetcherTest.java
index e501eed1a..267dae1d0 100644
--- 
a/tika-pipes/tika-pipes-plugins/tika-pipes-http/src/test/java/org/apache/tika/pipes/fetcher/http/HttpFetcherTest.java
+++ 
b/tika-pipes/tika-pipes-plugins/tika-pipes-http/src/test/java/org/apache/tika/pipes/fetcher/http/HttpFetcherTest.java
@@ -61,6 +61,7 @@ import org.mockito.Mockito;
 import org.apache.tika.TikaTest;
 import org.apache.tika.client.HttpClientFactory;
 import org.apache.tika.config.ConfigContainer;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.TemporaryResources;
 import org.apache.tika.metadata.Metadata;
@@ -72,7 +73,6 @@ import 
org.apache.tika.pipes.fetcher.http.config.HttpFetcherConfig;
 import org.apache.tika.pipes.fetcher.http.config.HttpHeaders;
 import org.apache.tika.pipes.fetcher.http.jwt.JwtGenerator;
 import org.apache.tika.plugins.ExtensionConfig;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 class HttpFetcherTest extends TikaTest {
@@ -281,8 +281,8 @@ class HttpFetcherTest extends TikaTest {
 
     FetcherManager getFetcherManager(String path) throws Exception {
         Path configPath = 
Paths.get(HttpFetcherTest.class.getResource("/configs/" + path).toURI());
-        TikaConfigs tikaConfigs = TikaConfigs.load(configPath);
-        return FetcherManager.load(TikaPluginManager.load(tikaConfigs), 
tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(configPath);
+        return FetcherManager.load(TikaPluginManager.load(tikaJsonConfig), 
tikaJsonConfig);
     }
 
     private void mockClientResponse(final HttpResponse response) throws 
Exception {
diff --git 
a/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaConfigs.java 
b/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaConfigs.java
deleted file mode 100644
index d2a780b64..000000000
--- a/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaConfigs.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.plugins;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Iterator;
-import java.util.Set;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-import org.apache.tika.config.loader.TikaJsonConfig;
-import org.apache.tika.exception.TikaConfigException;
-
-/**
- * Loads and validates Tika pipes/plugin configuration from JSON.
- * <p>
- * This class validates pipes-specific configuration keys and delegates to
- * {@link TikaJsonConfig} for parsing. Core Tika keys (parsers, detectors, 
etc.)
- * are ignored by this validator - they are handled by TikaLoader.
- */
-public class TikaConfigs {
-
-    /**
-     * Pipes-specific configuration keys.
-     */
-    private static final Set<String> PIPES_KEYS = Set.of(
-            "fetchers",
-            "emitters",
-            "pipes-iterator",
-            "pipes-reporters",
-            "async",
-            "plugin-roots"
-    );
-
-    /**
-     * Core Tika configuration keys (handled by TikaLoader, not validated 
here).
-     */
-    private static final Set<String> CORE_TIKA_KEYS = Set.of(
-            "parsers",
-            "detectors",
-            "encoding-detectors",
-            "encodingDetectors",
-            "metadata-filters",
-            "metadataFilters",
-            "renderers",
-            "translators",
-            "auto-detect-parser-config",
-            "autoDetectParserConfig",
-            "server"
-    );
-
-    private final TikaJsonConfig tikaJsonConfig;
-
-    /**
-     * Loads pipes configuration from a pre-parsed TikaJsonConfig.
-     * This is the preferred method when sharing configuration across
-     * core Tika and pipes components.
-     *
-     * @param tikaJsonConfig the pre-parsed JSON configuration
-     * @return the pipes configuration
-     * @throws TikaConfigException if validation fails
-     */
-    public static TikaConfigs load(TikaJsonConfig tikaJsonConfig) throws 
TikaConfigException {
-        TikaConfigs configs = new TikaConfigs(tikaJsonConfig);
-        configs.validatePipesKeys();
-        return configs;
-    }
-
-    /**
-     * Loads pipes configuration from a file.
-     * For backwards compatibility - prefer {@link #load(TikaJsonConfig)} when 
possible.
-     *
-     * @param path the path to the JSON configuration file
-     * @return the pipes configuration
-     * @throws IOException if reading fails
-     * @throws TikaConfigException if validation fails
-     */
-    public static TikaConfigs load(Path path) throws IOException, 
TikaConfigException {
-        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(path);
-        return load(tikaJsonConfig);
-    }
-
-    private TikaConfigs(TikaJsonConfig tikaJsonConfig) {
-        this.tikaJsonConfig = tikaJsonConfig;
-    }
-
-    /**
-     * Gets the underlying TikaJsonConfig.
-     *
-     * @return the TikaJsonConfig
-     */
-    public TikaJsonConfig getTikaJsonConfig() {
-        return tikaJsonConfig;
-    }
-
-    /**
-     * Deserializes a configuration value for the given key.
-     *
-     * @param clazz the target class
-     * @param key the configuration key
-     * @param <T> the type to deserialize to
-     * @return the deserialized value
-     * @throws IOException if deserialization fails
-     */
-    public <T> T deserialize(Class<T> clazz, String key) throws IOException {
-        return tikaJsonConfig.deserialize(key, clazz);
-    }
-
-    /**
-     * Validates that pipes-specific keys are correct.
-     * This catches typos like "pipes-reporter" instead of "pipes-reporters".
-     * <p>
-     * Core Tika keys (parsers, detectors, etc.) are ignored - they are
-     * validated by TikaLoader.
-     * <p>
-     * Keys prefixed with "x-" are allowed for custom extensions.
-     *
-     * @throws TikaConfigException if unknown pipes keys are found
-     */
-    private void validatePipesKeys() throws TikaConfigException {
-        JsonNode root = tikaJsonConfig.getRootNode();
-        Iterator<String> fieldNames = root.fieldNames();
-        while (fieldNames.hasNext()) {
-            String key = fieldNames.next();
-
-            // Ignore core Tika keys - TikaLoader validates those
-            if (CORE_TIKA_KEYS.contains(key)) {
-                continue;
-            }
-
-            // Ignore custom extension keys
-            if (key.startsWith("x-")) {
-                continue;
-            }
-
-            // Must be a known pipes key
-            if (!PIPES_KEYS.contains(key)) {
-                throw new TikaConfigException("Unknown pipes config key: '" + 
key +
-                        "'. Valid pipes keys: " + PIPES_KEYS +
-                        " (or use 'x-' prefix for custom keys). " +
-                        "Core Tika keys like 'parsers', 'detectors' should be 
configured separately.");
-            }
-        }
-    }
-}
diff --git 
a/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaPluginManager.java
 
b/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaPluginManager.java
index ad560558b..e030b8a67 100644
--- 
a/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaPluginManager.java
+++ 
b/tika-plugins-core/src/main/java/org/apache/tika/plugins/TikaPluginManager.java
@@ -65,13 +65,22 @@ public class TikaPluginManager extends DefaultPluginManager 
{
      */
     public static TikaPluginManager load(TikaJsonConfig tikaJsonConfig)
             throws TikaConfigException, IOException {
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaJsonConfig);
-        return load(tikaConfigs);
+
+        JsonNode root = tikaJsonConfig.getRootNode();
+        JsonNode pluginRoots = root.get("plugin-roots");
+        if (pluginRoots == null) {
+            throw new TikaConfigException("plugin-roots must be specified");
+        }
+        List<Path> roots = OBJECT_MAPPER.convertValue(pluginRoots,
+                new TypeReference<List<Path>>() {});
+        if (roots.isEmpty()) {
+            throw new TikaConfigException("plugin-roots must not be empty");
+        }
+        return new TikaPluginManager(roots);
     }
 
     /**
      * Loads plugin manager from a configuration file.
-     * For backwards compatibility - prefer {@link #load(TikaJsonConfig)} when 
possible.
      *
      * @param configPath the path to the JSON configuration file
      * @return the plugin manager
@@ -83,29 +92,6 @@ public class TikaPluginManager extends DefaultPluginManager {
         return load(tikaJsonConfig);
     }
 
-    /**
-     * Loads plugin manager from a TikaConfigs instance.
-     *
-     * @param tikaConfigs the pipes configuration
-     * @return the plugin manager
-     * @throws TikaConfigException if configuration is invalid
-     * @throws IOException if plugin initialization fails
-     */
-    public static TikaPluginManager load(TikaConfigs tikaConfigs)
-            throws TikaConfigException, IOException {
-        JsonNode root = tikaConfigs.getTikaJsonConfig().getRootNode();
-        JsonNode pluginRoots = root.get("plugin-roots");
-        if (pluginRoots == null) {
-            throw new TikaConfigException("plugin-roots must be specified");
-        }
-        List<Path> roots = OBJECT_MAPPER.convertValue(pluginRoots,
-                new TypeReference<List<Path>>() {});
-        if (roots.isEmpty()) {
-            throw new TikaConfigException("plugin-roots must not be empty");
-        }
-        return new TikaPluginManager(roots);
-    }
-
     public TikaPluginManager(List<Path> pluginRoots) throws IOException {
         super(pluginRoots);
         init();
diff --git 
a/tika-plugins-core/src/test/java/org/apache/tika/plugins/TikaConfigsTest.java 
b/tika-plugins-core/src/test/java/org/apache/tika/plugins/TikaConfigsTest.java
deleted file mode 100644
index 207765d26..000000000
--- 
a/tika-plugins-core/src/test/java/org/apache/tika/plugins/TikaConfigsTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tika.plugins;
-
-import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.nio.charset.StandardCharsets;
-
-import org.junit.jupiter.api.Test;
-
-import org.apache.tika.config.loader.TikaJsonConfig;
-import org.apache.tika.exception.TikaConfigException;
-
-public class TikaConfigsTest {
-
-    @Test
-    public void testValidKnownKeysPass() {
-        String json = """
-                {
-                    "fetchers": {},
-                    "emitters": {},
-                    "pipes-iterator": {},
-                    "pipes-reporters": {},
-                    "async": {},
-                    "plugin-roots": "target/plugins"
-                }
-                """;
-
-        assertDoesNotThrow(() -> loadFromString(json));
-    }
-
-    @Test
-    public void testUnknownKeyThrows() {
-        String json = """
-                {
-                    "fetchers": {},
-                    "pipes-reporter": {}
-                }
-                """;
-
-        TikaConfigException ex = assertThrows(TikaConfigException.class,
-                () -> loadFromString(json));
-
-        assertTrue(ex.getMessage().contains("pipes-reporter"));
-        assertTrue(ex.getMessage().contains("Unknown pipes config key"));
-    }
-
-    @Test
-    public void testTypoInKeyThrows() {
-        String json = """
-                {
-                    "fethcers": {}
-                }
-                """;
-
-        TikaConfigException ex = assertThrows(TikaConfigException.class,
-                () -> loadFromString(json));
-
-        assertTrue(ex.getMessage().contains("fethcers"));
-    }
-
-    @Test
-    public void testExtensionKeyWithXPrefixAllowed() {
-        String json = """
-                {
-                    "fetchers": {},
-                    "x-custom-extension": {
-                        "setting": "value"
-                    },
-                    "x-another-custom": {}
-                }
-                """;
-
-        assertDoesNotThrow(() -> loadFromString(json));
-    }
-
-    @Test
-    public void testEmptyConfigPasses() {
-        String json = "{}";
-
-        assertDoesNotThrow(() -> loadFromString(json));
-    }
-
-    @Test
-    public void testSingleValidKeyPasses() {
-        String json = """
-                {
-                    "plugin-roots": ["path1", "path2"]
-                }
-                """;
-
-        assertDoesNotThrow(() -> loadFromString(json));
-    }
-
-    @Test
-    public void testErrorMessageIncludesValidKeys() {
-        String json = """
-                {
-                    "bad-key": {}
-                }
-                """;
-
-        TikaConfigException ex = assertThrows(TikaConfigException.class,
-                () -> loadFromString(json));
-
-        assertTrue(ex.getMessage().contains("fetchers"));
-        assertTrue(ex.getMessage().contains("emitters"));
-        assertTrue(ex.getMessage().contains("x-"));
-    }
-
-    @Test
-    public void testGetRootReturnsJsonNode() throws Exception {
-        String json = """
-                {
-                    "fetchers": {
-                        "file-system-fetcher": {}
-                    }
-                }
-                """;
-
-        TikaConfigs configs = loadFromString(json);
-        assertNotNull(configs.getTikaJsonConfig().getRootNode());
-        
assertNotNull(configs.getTikaJsonConfig().getRootNode().get("fetchers"));
-    }
-
-    private TikaConfigs loadFromString(String json) throws Exception {
-        return TikaConfigs.load(TikaJsonConfig.load(new 
ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8))));
-    }
-}
diff --git 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/ConfigLoader.java
 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/ConfigLoader.java
index 1f7c16b64..c9045c9d7 100644
--- 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/ConfigLoader.java
+++ 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/ConfigLoader.java
@@ -25,11 +25,14 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.tika.exception.TikaConfigException;
 
 /**
- * Loader for simple configuration objects from JSON.
+ * Loader for custom configuration objects from the "other-configs" section.
  * <p>
- * This class handles straightforward POJOs that can be deserialized directly 
from JSON.
- * For complex components like Parsers, Detectors, etc., use the specific 
methods on
- * {@link TikaLoader} instead (e.g., {@code loadParsers()}, {@code 
loadDetectors()}).
+ * This class handles custom POJOs and test configurations that are not part of
+ * Tika's official configuration schema. All configurations loaded via 
ConfigLoader
+ * must be placed under the "other-configs" top-level node in the JSON.
+ * <p>
+ * For official Tika components and configurations (parsers, detectors, async, 
server, etc.),
+ * use the specific methods on {@link TikaLoader} or load directly from {@link 
TikaJsonConfig}.
  *
  * <p>Usage:
  * <pre>
@@ -40,40 +43,26 @@ import org.apache.tika.exception.TikaConfigException;
  *
  * // Load by class name (auto-converts to kebab-case)
  * HandlerConfig config = loader.configs().load(HandlerConfig.class);
- *
- * // Load server configuration (tika-server-core module)
- * TikaServerConfig serverConfig = loader.configs().load("server", 
TikaServerConfig.class);
- *
- * // Load async configuration (tika-pipes-core module)
- * AsyncConfig asyncConfig = loader.configs().load("async", AsyncConfig.class);
- *
- * // Load pipes configuration (tika-pipes-core module)
- * PipesConfig pipesConfig = loader.configs().load("pipes", PipesConfig.class);
  * </pre>
  *
- * <p>JSON configuration examples:
+ * <p>JSON configuration example:
  * <pre>
  * {
- *   "server": {
- *     "port": 9998,
- *     "host": "localhost",
- *     "taskTimeoutMillis": 300000,
- *     "enableUnsecureFeatures": false,
- *     "endpoints": ["all"]
- *   },
- *   "async": {
- *     "emitWithinMillis": 10000,
- *     "emitMaxEstimatedBytes": 100000,
- *     "queueSize": 10000,
- *     "numEmitters": 1,
- *     "numClients": 4,
- *     "timeoutMillis": 60000
- *   },
- *   "pipes": {
- *     "numClients": 4,
- *     "timeoutMillis": 60000,
- *     "maxFilesProcessedPerProcess": 10000,
- *     "forkedJvmArgs": ["-Xmx2g", "-XX:+UseG1GC"]
+ *   // Official Tika configs at root level (NOT loaded via configs())
+ *   "parsers": [...],
+ *   "detectors": [...],
+ *   "pipes": {...},
+ *   "server": {...},
+ *
+ *   // Custom configs MUST be in "other-configs" (loaded via configs())
+ *   "other-configs": {
+ *     "handler-config": {
+ *       "timeout": 5000,
+ *       "retries": 3
+ *     },
+ *     "my-custom-config": {
+ *       "enabled": true
+ *     }
  *   }
  * }
  * </pre>
@@ -152,7 +141,7 @@ public class ConfigLoader {
         validateKey(key);
         validateClass(clazz);
 
-        JsonNode node = config.getRootNode().get(key);
+        JsonNode node = getNode(key);
         if (node == null || node.isNull()) {
             return null;
         }
@@ -246,7 +235,7 @@ public class ConfigLoader {
         validateKey(key);
         validateClass(clazz);
 
-        JsonNode node = config.getRootNode().get(key);
+        JsonNode node = getNode(key);
         if (node == null || node.isNull()) {
             return defaultValue;
         }
@@ -286,10 +275,26 @@ public class ConfigLoader {
      * @return true if the key exists and is not null
      */
     public boolean hasKey(String key) {
-        JsonNode node = config.getRootNode().get(key);
+        JsonNode node = getNode(key);
         return node != null && !node.isNull();
     }
 
+    /**
+     * Gets a node by key from the "other-configs".
+     *
+     * @param key The JSON key to look for
+     * @return the node, or null if not found
+     */
+    private JsonNode getNode(String key) {
+
+        JsonNode otherConfigs = config.getRootNode().get("other-configs");
+        if (otherConfigs != null && otherConfigs.isObject()) {
+            return otherConfigs.get(key);
+        }
+
+        return null;
+    }
+
     /**
      * Derives a kebab-case key from a class name.
      * <p>
diff --git 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaJsonConfig.java
 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaJsonConfig.java
index c8b59206d..1a7cff5d4 100644
--- 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaJsonConfig.java
+++ 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaJsonConfig.java
@@ -22,9 +22,11 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -76,13 +78,17 @@ import org.apache.tika.exception.TikaConfigException;
  *     { "zip-container-detector": { "maxDepth": 10 } }
  *   ],
  *
- *   // Pipes components (validated by TikaConfigs)
+ *   // Pipes components (validated by validateKeys())
  *   "plugin-roots": ["/path/to/plugins"],
  *   "fetchers": [...],
  *   "emitters": [...],
  *
- *   // Custom extensions (prefix with x-)
- *   "x-my-custom-config": { ... }
+ *   // Custom configurations (for testing or extensions)
+ *   "other-configs": {
+ *     "test-config": { ... },
+ *     "my-custom-config": { ... },
+ *     "anything": { ... }
+ *   }
  * }
  * </pre>
  *
@@ -92,6 +98,34 @@ import org.apache.tika.exception.TikaConfigException;
  */
 public class TikaJsonConfig {
 
+    /**
+     * Known top-level configuration keys across core Tika and pipes/plugins.
+     * Only kebab-case names are allowed.
+     */
+    private static final Set<String> KNOWN_KEYS = Set.of(
+            // Globals
+            "maxJsonStringFieldLength",
+            "service-loader",
+            "xml-reader-utils",
+            // Core Tika component keys
+            "parsers",
+            "detectors",
+            "encoding-detectors",
+            "metadata-filters",
+            "renderers",
+            "translator",
+            "auto-detect-parser",
+            "server",
+
+            // Pipes/plugin keys
+            "fetchers",
+            "emitters",
+            "pipes-iterator",
+            "pipes-reporters",
+            "pipes",
+            "plugin-roots"
+    );
+
     private static final ObjectMapper OBJECT_MAPPER =
             PolymorphicObjectMapperFactory.getMapper();
 
@@ -130,7 +164,9 @@ public class TikaJsonConfig {
     public static TikaJsonConfig load(InputStream inputStream) throws 
TikaConfigException {
         try {
             JsonNode rootNode = OBJECT_MAPPER.readTree(inputStream);
-            return new TikaJsonConfig(rootNode);
+            TikaJsonConfig tikaJsonConfig = new TikaJsonConfig(rootNode);
+            tikaJsonConfig.validateKeys();
+            return tikaJsonConfig;
         } catch (IOException e) {
             throw new TikaConfigException("Failed to parse JSON 
configuration", e);
         }
@@ -302,6 +338,46 @@ public class TikaJsonConfig {
         return rootNode.has(key) && !rootNode.get(key).isNull();
     }
 
+    /**
+     * Validates that all top-level configuration keys are known or custom 
extensions.
+     * <p>
+     * This catches typos like "parser" instead of "parsers" or 
"pipes-reporter"
+     * instead of "pipes-reporters".
+     * <p>
+     * The "other-configs" node is allowed for custom configurations.
+     *
+     * @throws TikaConfigException if unknown keys are found
+     */
+    private void validateKeys() throws TikaConfigException {
+        if (rootNode == null || !rootNode.isObject()) {
+            return;
+        }
+
+        Iterator<String> fieldNames = rootNode.fieldNames();
+        List<String> unknownKeys = new ArrayList<>();
+
+        while (fieldNames.hasNext()) {
+            String key = fieldNames.next();
+
+            // Ignore custom configs node
+            if (key.equals("other-configs")) {
+                continue;
+            }
+
+            // Must be a known key
+            if (!KNOWN_KEYS.contains(key)) {
+                unknownKeys.add(key);
+            }
+        }
+
+        if (!unknownKeys.isEmpty()) {
+            throw new TikaConfigException(
+                    "Unknown configuration key(s): " + unknownKeys + ". " +
+                    "Valid keys: " + KNOWN_KEYS + " " +
+                    "(or use 'other-configs' node for custom keys)");
+        }
+    }
+
     @Override
     public String toString() {
         return "TikaJsonConfig{" + "rootNode=" + rootNode + '}';
diff --git 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
index 67b57cc69..e3a4c63a6 100644
--- 
a/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
+++ 
b/tika-serialization/src/main/java/org/apache/tika/config/loader/TikaLoader.java
@@ -103,7 +103,7 @@ public class TikaLoader {
      *
      * @throws TikaConfigException if loading global settings fails
      */
-    private void init() throws TikaConfigException {
+    private void init() throws TikaConfigException, IOException {
         loadGlobalSettings();
     }
 
@@ -115,7 +115,7 @@ public class TikaLoader {
      * @return the Tika loader
      * @throws TikaConfigException if loading or parsing fails
      */
-    public static TikaLoader load(Path configPath) throws TikaConfigException {
+    public static TikaLoader load(Path configPath) throws TikaConfigException, 
IOException {
         return load(configPath, 
Thread.currentThread().getContextClassLoader());
     }
 
@@ -129,7 +129,7 @@ public class TikaLoader {
      * @throws TikaConfigException if loading or parsing fails
      */
     public static TikaLoader load(Path configPath, ClassLoader classLoader)
-            throws TikaConfigException {
+            throws TikaConfigException, IOException {
         TikaJsonConfig config = TikaJsonConfig.load(configPath);
         TikaLoader loader = new TikaLoader(config, classLoader);
         loader.init();
@@ -162,7 +162,7 @@ public class TikaLoader {
         TikaLoader loader = new TikaLoader(config, classLoader);
         try {
             loader.init();
-        } catch (TikaConfigException e) {
+        } catch (IOException | TikaConfigException e) {
             // Default config should never throw, but wrap in RuntimeException 
if it does
             throw new RuntimeException("Failed to initialize default 
TikaLoader", e);
         }
@@ -314,7 +314,8 @@ public class TikaLoader {
      */
     public synchronized Parser loadAutoDetectParser() throws 
TikaConfigException, IOException {
         if (autoDetectParser == null) {
-            AutoDetectParserConfig adpConfig = 
configs().load(AutoDetectParserConfig.class);
+            // Load directly from root-level config (not via configs() which 
only looks in "other-configs")
+            AutoDetectParserConfig adpConfig = 
config.deserialize("auto-detect-parser", AutoDetectParserConfig.class);
             if (adpConfig == null) {
                 adpConfig = new AutoDetectParserConfig();
             }
@@ -410,7 +411,7 @@ public class TikaLoader {
      * @return the global settings, or an empty object if no settings are 
configured
      * @throws TikaConfigException if loading fails
      */
-    public synchronized GlobalSettings loadGlobalSettings() throws 
TikaConfigException {
+    public synchronized GlobalSettings loadGlobalSettings() throws 
IOException, TikaConfigException {
         if (globalSettings == null) {
             globalSettings = new GlobalSettings();
 
@@ -420,16 +421,16 @@ public class TikaLoader {
                         
config.getRootNode().get("maxJsonStringFieldLength").asInt());
             }
 
-            // Load service-loader config
+            // Load service-loader config (official Tika config at root level)
             GlobalSettings.ServiceLoaderConfig serviceLoaderConfig =
-                    configs().load("service-loader", 
GlobalSettings.ServiceLoaderConfig.class);
+                    config.deserialize("service-loader", 
GlobalSettings.ServiceLoaderConfig.class);
             if (serviceLoaderConfig != null) {
                 globalSettings.setServiceLoader(serviceLoaderConfig);
             }
 
-            // Load xml-reader-utils config
+            // Load xml-reader-utils config (official Tika config at root 
level)
             GlobalSettings.XmlReaderUtilsConfig xmlReaderUtilsConfig =
-                    configs().load("xml-reader-utils", 
GlobalSettings.XmlReaderUtilsConfig.class);
+                    config.deserialize("xml-reader-utils", 
GlobalSettings.XmlReaderUtilsConfig.class);
             if (xmlReaderUtilsConfig != null) {
                 globalSettings.setXmlReaderUtils(xmlReaderUtilsConfig);
             }
diff --git 
a/tika-serialization/src/test/resources/configs/test-config-loader.json 
b/tika-serialization/src/test/resources/configs/test-config-loader.json
index 8f6e89a8c..cb6264c91 100644
--- a/tika-serialization/src/test/resources/configs/test-config-loader.json
+++ b/tika-serialization/src/test/resources/configs/test-config-loader.json
@@ -1,32 +1,34 @@
 {
-  "handler-config": {
-    "timeout": 5000,
-    "retries": 3,
-    "enabled": true
-  },
+  "parsers": [
+    {"pdf-parser": {}}
+  ],
 
-  "simple-handler": 
"org.apache.tika.config.loader.ConfigLoaderTest$SimpleHandlerImpl",
+  "other-configs": {
+    "handler-config": {
+      "timeout": 5000,
+      "retries": 3,
+      "enabled": true
+    },
 
-  "configured-handler": {
-    "@class": 
"org.apache.tika.config.loader.ConfigLoaderTest$ConfiguredHandlerImpl",
-    "maxSize": 100000,
-    "prefix": "test-"
-  },
+    "simple-handler": 
"org.apache.tika.config.loader.ConfigLoaderTest$SimpleHandlerImpl",
 
-  "tika-task-timeout": {
-    "millis": 30000
-  },
+    "configured-handler": {
+      "@class": 
"org.apache.tika.config.loader.ConfigLoaderTest$ConfiguredHandlerImpl",
+      "maxSize": 100000,
+      "prefix": "test-"
+    },
 
-  "parsers": [
-    {"pdf-parser": {}}
-  ],
+    "tika-task-timeout": {
+      "millis": 30000
+    },
 
-  "my-feature-settings": {
-    "featureName": "test-feature",
-    "priority": 10
-  },
+    "my-feature-settings": {
+      "featureName": "test-feature",
+      "priority": 10
+    },
 
-  "abstract-handler": {
-    "someProperty": "value"
+    "abstract-handler": {
+      "someProperty": "value"
+    }
   }
 }
diff --git 
a/tika-serialization/src/test/resources/configs/test-interface-no-type.json 
b/tika-serialization/src/test/resources/configs/test-interface-no-type.json
index 15a3d35b2..da2e606bb 100644
--- a/tika-serialization/src/test/resources/configs/test-interface-no-type.json
+++ b/tika-serialization/src/test/resources/configs/test-interface-no-type.json
@@ -1,6 +1,8 @@
 {
-  "handler-no-type": {
-    "maxSize": 50000,
-    "prefix": "no-type-"
+  "other-configs": {
+    "handler-no-type": {
+      "maxSize": 50000,
+      "prefix": "no-type-"
+    }
   }
 }
diff --git 
a/tika-serialization/src/test/resources/configs/test-invalid-class.json 
b/tika-serialization/src/test/resources/configs/test-invalid-class.json
index f0bf4bf4e..c927b6e1c 100644
--- a/tika-serialization/src/test/resources/configs/test-invalid-class.json
+++ b/tika-serialization/src/test/resources/configs/test-invalid-class.json
@@ -1,3 +1,5 @@
 {
-  "handler": "com.example.NonExistentClass"
+  "other-configs": {
+    "handler": "com.example.NonExistentClass"
+  }
 }
diff --git 
a/tika-serialization/src/test/resources/configs/test-partial-config.json 
b/tika-serialization/src/test/resources/configs/test-partial-config.json
index fb010c3e8..866f2594b 100644
--- a/tika-serialization/src/test/resources/configs/test-partial-config.json
+++ b/tika-serialization/src/test/resources/configs/test-partial-config.json
@@ -1,15 +1,17 @@
 {
-  "handler-config": {
-    "enabled": true
-  },
+  "other-configs": {
+    "handler-config": {
+      "enabled": true
+    },
 
-  "handler-config-full": {
-    "timeout": 10000,
-    "retries": 5,
-    "enabled": false
-  },
+    "handler-config-full": {
+      "timeout": 10000,
+      "retries": 5,
+      "enabled": false
+    },
 
-  "tika-task-timeout": {
-    "millis": 30000
+    "tika-task-timeout": {
+      "millis": 30000
+    }
   }
 }
diff --git 
a/tika-serialization/src/test/resources/configs/test-unexpected-field.json 
b/tika-serialization/src/test/resources/configs/test-unexpected-field.json
index ada7f9bdf..d250d5fa1 100644
--- a/tika-serialization/src/test/resources/configs/test-unexpected-field.json
+++ b/tika-serialization/src/test/resources/configs/test-unexpected-field.json
@@ -1,8 +1,10 @@
 {
-  "handler-config": {
-    "timeout": 5000,
-    "retries": 3,
-    "enabled": true,
-    "unexpectedField": "this should cause an error"
+  "other-configs": {
+    "handler-config": {
+      "timeout": 5000,
+      "retries": 3,
+      "enabled": true,
+      "unexpectedField": "this should cause an error"
+    }
   }
 }
diff --git a/tika-serialization/src/test/resources/configs/test-wrong-type.json 
b/tika-serialization/src/test/resources/configs/test-wrong-type.json
index b25e9f644..ece5fe3ae 100644
--- a/tika-serialization/src/test/resources/configs/test-wrong-type.json
+++ b/tika-serialization/src/test/resources/configs/test-wrong-type.json
@@ -1,3 +1,5 @@
 {
-  "handler": "java.lang.String"
+  "other-configs": {
+    "handler": "java.lang.String"
+  }
 }
diff --git 
a/tika-server/tika-server-client/src/main/java/org/apache/tika/server/client/TikaClientCLI.java
 
b/tika-server/tika-server-client/src/main/java/org/apache/tika/server/client/TikaClientCLI.java
index af63caec9..0da685418 100644
--- 
a/tika-server/tika-server-client/src/main/java/org/apache/tika/server/client/TikaClientCLI.java
+++ 
b/tika-server/tika-server-client/src/main/java/org/apache/tika/server/client/TikaClientCLI.java
@@ -34,12 +34,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.pipes.api.FetchEmitTuple;
 import org.apache.tika.pipes.api.pipesiterator.PipesIterator;
 import org.apache.tika.pipes.core.pipesiterator.CallablePipesIterator;
 import org.apache.tika.pipes.core.pipesiterator.PipesIteratorManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 public class TikaClientCLI {
@@ -61,9 +61,9 @@ public class TikaClientCLI {
 
         ExecutorCompletionService<Long> completionService = new 
ExecutorCompletionService<>(executorService);
 
-        TikaConfigs tikaConfigs = TikaConfigs.load(pluginsConfigPath);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        final PipesIterator pipesIterator = 
PipesIteratorManager.load(pluginManager, tikaConfigs)
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(pluginsConfigPath);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        final PipesIterator pipesIterator = 
PipesIteratorManager.load(pluginManager, tikaJsonConfig)
                 .orElseThrow(() -> new TikaException("No pipes iterator 
configured"));
 
         final ArrayBlockingQueue<FetchEmitTuple> queue = new 
ArrayBlockingQueue<>(QUEUE_SIZE);
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
index 2bb62d595..29cd8f4c4 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerConfig.java
@@ -150,7 +150,7 @@ private long forkedProcessShutdownMillis = 
DEFAULT_FORKED_PROCESS_SHUTDOWN_MILLI
     }
 
     static TikaServerConfig load(Path tikaConfigPath, CommandLine commandLine, 
Set<String> settings) throws IOException, TikaException {
-        TikaServerConfig tikaServerConfig = 
TikaLoader.load(tikaConfigPath).configs().load("server", 
TikaServerConfig.class);
+        TikaServerConfig tikaServerConfig = 
TikaLoader.load(tikaConfigPath).getConfig().deserialize("server", 
TikaServerConfig.class);
         if (tikaServerConfig == null) {
             throw new TikaConfigException("Couldn't find 'server' element");
         }
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
index 21eae3369..09de5b18a 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerProcess.java
@@ -55,11 +55,11 @@ import org.xml.sax.SAXException;
 
 import org.apache.tika.Tika;
 import org.apache.tika.config.ServiceLoader;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.config.loader.TikaLoader;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.pipes.core.emitter.EmitterManager;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.server.core.resource.AsyncResource;
 import org.apache.tika.server.core.resource.DetectorResource;
@@ -176,9 +176,9 @@ public class TikaServerProcess {
         FetcherManager fetcherManager = null;
         InputStreamFactory inputStreamFactory = null;
         if (tikaServerConfig.isEnableUnsecureFeatures()) {
-            TikaConfigs tikaConfigs = 
TikaConfigs.load(tikaServerConfig.getConfigPath());
-            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaConfigs);
-            fetcherManager = FetcherManager.load(pluginManager, tikaConfigs);
+            TikaJsonConfig tikaJsonConfig = 
TikaJsonConfig.load(tikaServerConfig.getConfigPath());
+            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+            fetcherManager = FetcherManager.load(pluginManager, 
tikaJsonConfig);
             inputStreamFactory = new FetcherStreamFactory(fetcherManager);
         } else {
             inputStreamFactory = new DefaultInputStreamFactory();
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/AsyncResource.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/AsyncResource.java
index 96a1fcaa8..952e3b376 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/AsyncResource.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/AsyncResource.java
@@ -37,6 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.SAXException;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -49,7 +50,6 @@ import org.apache.tika.pipes.core.emitter.EmitDataImpl;
 import org.apache.tika.pipes.core.emitter.EmitterManager;
 import org.apache.tika.pipes.core.extractor.EmbeddedDocumentBytesConfig;
 import org.apache.tika.pipes.core.serialization.JsonFetchEmitTupleList;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 
 @Path("/async")
@@ -63,9 +63,9 @@ public class AsyncResource {
 
     public AsyncResource(java.nio.file.Path tikaConfigPath) throws 
TikaException, IOException, SAXException {
         this.asyncProcessor = new AsyncProcessor(tikaConfigPath);
-        TikaConfigs tikaConfigs = TikaConfigs.load(tikaConfigPath);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        this.emitterManager = EmitterManager.load(pluginManager, tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tikaConfigPath);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        this.emitterManager = EmitterManager.load(pluginManager, 
tikaJsonConfig);
     }
 
     public ArrayBlockingQueue<FetchEmitTuple> getFetchEmitQueue(int queueSize) 
{
diff --git 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
index 139189fee..69426d17f 100644
--- 
a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
+++ 
b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/PipesResource.java
@@ -33,7 +33,7 @@ import jakarta.ws.rs.core.UriInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.tika.config.loader.TikaLoader;
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -42,7 +42,6 @@ import org.apache.tika.pipes.api.PipesResult;
 import org.apache.tika.pipes.core.PipesConfig;
 import org.apache.tika.pipes.core.PipesException;
 import org.apache.tika.pipes.core.PipesParser;
-import org.apache.tika.pipes.core.async.AsyncConfig;
 import org.apache.tika.pipes.core.serialization.JsonFetchEmitTuple;
 
 @Path("/pipes")
@@ -54,7 +53,8 @@ public class PipesResource {
     private final PipesParser pipesParser;
 
     public PipesResource(java.nio.file.Path tikaConfig) throws 
TikaConfigException, IOException {
-        PipesConfig pipesConfig = 
TikaLoader.load(tikaConfig).configs().load("async", AsyncConfig.class);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tikaConfig);
+        PipesConfig pipesConfig = PipesConfig.load(tikaJsonConfig);
         //this has to be zero. everything must be emitted through the 
PipesServer
         long maxEmit = pipesConfig.getMaxForEmitBatchBytes();
         if (maxEmit != 0) {
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
index b70b465e4..0ecace00c 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
@@ -69,7 +69,7 @@ public abstract class CXFTestBase {
 
     public final static String BASIC_CONFIG = """
             {
-              "auto-detect-parser-config": {
+              "auto-detect-parser": {
                 "spoolToDisk": 1000000,
                 "outputThreshold": 1000000,
                 "digesterFactory": {
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
index 41423d739..74eec7574 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaPipesTest.java
@@ -48,6 +48,7 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -58,7 +59,6 @@ import org.apache.tika.pipes.api.emitter.EmitKey;
 import org.apache.tika.pipes.api.fetcher.FetchKey;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
 import org.apache.tika.pipes.core.serialization.JsonFetchEmitTuple;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.serialization.JsonMetadataList;
@@ -106,9 +106,9 @@ public class TikaPipesTest extends CXFTestBase {
 
         CXFTestBase.createPluginsConfig(TIKA_CONFIG_PATH, inputDir, 
TMP_OUTPUT_DIR, null, 10000L);
 
-        TikaConfigs tikaConfigs = TikaConfigs.load(TIKA_CONFIG_PATH);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        FETCHER_MANAGER = FetcherManager.load(pluginManager, tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(TIKA_CONFIG_PATH);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        FETCHER_MANAGER = FetcherManager.load(pluginManager, tikaJsonConfig);
     }
 
     @AfterAll
diff --git 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceFetcherTest.java
 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceFetcherTest.java
index 84f2b6198..f76d14bb2 100644
--- 
a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceFetcherTest.java
+++ 
b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceFetcherTest.java
@@ -35,10 +35,10 @@ import 
org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.server.core.resource.TikaResource;
 import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
@@ -93,10 +93,9 @@ public class TikaResourceFetcherTest extends CXFTestBase {
     @Override
     protected InputStreamFactory getInputStreamFactory(InputStream is) {
         try (TikaInputStream tis = TikaInputStream.get(is)) {
-            TikaConfigs tikaConfigs = TikaConfigs.load(tis.getPath());
-            
System.out.println(tikaConfigs.getTikaJsonConfig().getRootNode().toPrettyString());
-            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaConfigs);
-            FetcherManager fetcherManager = FetcherManager.load(pluginManager, 
tikaConfigs);
+            TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tis.getPath());
+            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+            FetcherManager fetcherManager = FetcherManager.load(pluginManager, 
tikaJsonConfig);
             return new FetcherStreamFactory(fetcherManager);
         } catch (IOException | TikaConfigException e) {
             throw new RuntimeException(e);
diff --git 
a/tika-server/tika-server-core/src/test/resources/configs/cxf-test-base-template.json
 
b/tika-server/tika-server-core/src/test/resources/configs/cxf-test-base-template.json
index 740d5d26b..0182e2bd0 100644
--- 
a/tika-server/tika-server-core/src/test/resources/configs/cxf-test-base-template.json
+++ 
b/tika-server/tika-server-core/src/test/resources/configs/cxf-test-base-template.json
@@ -33,7 +33,7 @@
       "pipes"
     ]
   },
-  "async": {
+  "pipes": {
     "tikaConfig": "TIKA_CONFIG",
     "numClients": 2,
     "timeoutMillis": TIMEOUT_MILLIS,
@@ -43,7 +43,7 @@
     ],
     "maxForEmitBatchBytes": 1000000
   },
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/FetcherTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/FetcherTest.java
index 9c8d349e0..d9a5ce8c0 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/FetcherTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/FetcherTest.java
@@ -33,11 +33,11 @@ import 
org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.serialization.JsonMetadataList;
 import org.apache.tika.server.core.CXFTestBase;
@@ -76,9 +76,9 @@ public class FetcherTest extends CXFTestBase {
     @Override
     protected InputStreamFactory getInputStreamFactory(InputStream 
tikaConfigInputStream) {
         try (TikaInputStream tis = TikaInputStream.get(tikaConfigInputStream)) 
{
-            TikaConfigs tikaConfigs = TikaConfigs.load(tis.getPath());
-            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaConfigs);
-            FetcherManager fetcherManager = FetcherManager.load(pluginManager, 
tikaConfigs);
+            TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(tis.getPath());
+            TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+            FetcherManager fetcherManager = FetcherManager.load(pluginManager, 
tikaJsonConfig);
             return new FetcherStreamFactory(fetcherManager);
         } catch (Exception e) {
             throw new RuntimeException(e);
diff --git 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
index 6cd36d6ca..41db6ba73 100644
--- 
a/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
+++ 
b/tika-server/tika-server-standard/src/test/java/org/apache/tika/server/standard/TikaPipesTest.java
@@ -50,6 +50,7 @@ import org.junit.jupiter.api.io.TempDir;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.tika.config.loader.TikaJsonConfig;
 import org.apache.tika.exception.TikaConfigException;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
@@ -62,7 +63,6 @@ import org.apache.tika.pipes.api.fetcher.FetchKey;
 import org.apache.tika.pipes.core.extractor.EmbeddedDocumentBytesConfig;
 import org.apache.tika.pipes.core.fetcher.FetcherManager;
 import org.apache.tika.pipes.core.serialization.JsonFetchEmitTuple;
-import org.apache.tika.plugins.TikaConfigs;
 import org.apache.tika.plugins.TikaPluginManager;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.serialization.JsonMetadataList;
@@ -111,9 +111,9 @@ public class TikaPipesTest extends CXFTestBase {
         TIKA_CONFIG_PATH = Files.createTempFile(TMP_WORKING_DIR, 
"tika-pipes-config-", ".json");
         CXFTestBase.createPluginsConfig(TIKA_CONFIG_PATH, inputDir, 
OUTPUT_JSON_DIR, OUTPUT_BYTES_DIR, 10000L);
 
-        TikaConfigs tikaConfigs = TikaConfigs.load(TIKA_CONFIG_PATH);
-        TikaPluginManager pluginManager = TikaPluginManager.load(tikaConfigs);
-        FETCHER_MANAGER = FetcherManager.load(pluginManager, tikaConfigs);
+        TikaJsonConfig tikaJsonConfig = TikaJsonConfig.load(TIKA_CONFIG_PATH);
+        TikaPluginManager pluginManager = 
TikaPluginManager.load(tikaJsonConfig);
+        FETCHER_MANAGER = FetcherManager.load(pluginManager, tikaJsonConfig);
 
     }
 
diff --git 
a/tika-server/tika-server-standard/src/test/resources/configs/cxf-test-base-template.json
 
b/tika-server/tika-server-standard/src/test/resources/configs/cxf-test-base-template.json
index 740d5d26b..0182e2bd0 100644
--- 
a/tika-server/tika-server-standard/src/test/resources/configs/cxf-test-base-template.json
+++ 
b/tika-server/tika-server-standard/src/test/resources/configs/cxf-test-base-template.json
@@ -33,7 +33,7 @@
       "pipes"
     ]
   },
-  "async": {
+  "pipes": {
     "tikaConfig": "TIKA_CONFIG",
     "numClients": 2,
     "timeoutMillis": TIMEOUT_MILLIS,
@@ -43,7 +43,7 @@
     ],
     "maxForEmitBatchBytes": 1000000
   },
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-for-server-tests.json
 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-for-server-tests.json
index e14b2dab7..0e2f181c3 100644
--- 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-for-server-tests.json
+++ 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-for-server-tests.json
@@ -9,7 +9,7 @@
       }
     }
   ],
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-opennlp-filter.json
 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-opennlp-filter.json
index 93c8ae2fa..f760b8d87 100644
--- 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-opennlp-filter.json
+++ 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-opennlp-filter.json
@@ -14,7 +14,7 @@
       "open-nlp-metadata-filter": {}
     }
   ],
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {
diff --git 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-optimaize-filter.json
 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-optimaize-filter.json
index 38e69c5c3..f4ffda22a 100644
--- 
a/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-optimaize-filter.json
+++ 
b/tika-server/tika-server-standard/src/test/resources/configs/tika-config-langdetect-optimaize-filter.json
@@ -14,7 +14,7 @@
       "optimaize-metadata-filter": {}
     }
   ],
-  "auto-detect-parser-config": {
+  "auto-detect-parser": {
     "spoolToDisk": 1000000,
     "outputThreshold": 1000000,
     "digesterFactory": {

Reply via email to