You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2020/12/11 20:34:45 UTC

[tika] 01/01: TIKA-3180 WIP -- DO NOT COMMIT -- initial pass at modularizing tika-server. Still need to add back in XMPWriter and Unpacker's ability to handle embedded file types that require POI as a dependency.

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

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

commit 04946a62b2510e0c3a64836d833491e1813a1092
Author: tallison <ta...@apache.org>
AuthorDate: Fri Dec 11 15:34:22 2020 -0500

    TIKA-3180 WIP -- DO NOT COMMIT -- initial pass at modularizing tika-server.  Still need to add back in XMPWriter and Unpacker's ability to handle embedded file types that require POI as a dependency.
---
 .../src/main/java/org/apache/tika/cli/TikaCLI.java |   2 +-
 .../src/main/java/org/apache/tika/gui/TikaGUI.java |   2 +-
 tika-parsers/pom.xml                               |   4 -
 .../tika-parsers-classic-modules/pom.xml           |   1 +
 .../tika-parser-html-commons/pom.xml               |  43 +++
 .../sax/boilerpipe}/BoilerpipeContentHandler.java  |   2 +-
 .../tika-parser-html-module/pom.xml                |  11 +-
 .../apache/tika/parser/html/HtmlParserTest.java    |   3 +-
 .../tika-parsers-classic-package/pom.xml           |   5 +
 tika-server/pom.xml                                | 361 +--------------------
 tika-server/src/test/resources/mock/fake_oom.xml   |  24 --
 .../src/test/resources/mock/heavy_hang_100.xml     |  25 --
 .../src/test/resources/mock/heavy_hang_30000.xml   |  25 --
 .../src/test/resources/mock/null_pointer.xml       |  25 --
 tika-server/src/test/resources/mock/real_oom.xml   |  24 --
 .../src/test/resources/mock/system_exit.xml        |  25 --
 .../test/resources/mock/testStaticStdOutErr.xml    |  75 -----
 .../src/test/resources/mock/testStdOutErr.xml      |  75 -----
 .../src/test/resources/mock/thread_interrupt.xml   |  25 --
 tika-server/{ => tika-server-classic}/assembly.xml |   2 +-
 .../{ => tika-server-classic}/bin/init.d/tika      |   0
 .../bin/install_tika_service.sh                    |   0
 tika-server/{ => tika-server-classic}/bin/tika     |   0
 .../{ => tika-server-classic}/bin/tika.in.sh       |   0
 tika-server/tika-server-classic/pom.xml            | 228 +++++++++++++
 tika-server/tika-server-classic/src/TODO           |   8 +
 .../server/classic/config/PDFServerConfig.java     |  36 ++
 .../classic/config/TesseractServerConfig.java      |  36 ++
 .../classic}/writer/XMPMessageBodyWriter.java      |   2 +-
 .../org.apache.tika.server.core.ParseContextConfig |  16 +
 .../tika/server/classic}/DetectorResourceTest.java |  28 +-
 .../tika/server/classic}/MetadataResourceTest.java |  17 +-
 .../classic}/RecursiveMetadataFilterTest.java      |  19 +-
 .../classic}/RecursiveMetadataResourceTest.java    |  12 +-
 .../tika/server/classic}/TikaDetectorsTest.java    |   5 +-
 .../tika/server/classic}/TikaMimeTypesTest.java    |  81 +----
 .../tika/server/classic}/TikaParsersTest.java      |   6 +-
 .../tika/server/classic}/TikaResourceTest.java     | 126 +++----
 .../tika/server/classic}/UnpackerResourceTest.java |  58 ++--
 .../test/resources/config}/TIKA-3137-include.xml   |   0
 .../src/test/resources/log4j.properties            |   2 +-
 .../src/test/resources/test-documents}/2exe.docx   | Bin
 .../src/test/resources/test-documents}/2pic.doc    | Bin
 .../src/test/resources/test-documents}/2pic.docx   | Bin
 .../test-documents}/CDEC_WEATHER_2010_03_02        |   0
 .../test/resources/test-documents}/Doc1_ole.doc    | Bin
 .../src/test/resources/test-documents}/foo.csv     |   0
 .../test/resources/test-documents}/password.xls    | Bin
 .../src/test/resources/test-documents}/pic.xls     | Bin
 .../src/test/resources/test-documents}/pic.xlsx    | Bin
 .../src/test/resources/test-documents}/test.doc    | Bin
 .../test/resources/test-documents}/testHTML.html   |   0
 .../src/test/resources/test-documents}/testOCR.pdf | Bin
 .../test-documents}/testPDFTwoTextBoxes.pdf        | Bin
 .../test-documents}/testPassword4Spaces.pdf        | Bin
 .../testRTF_npeFromWMFInTikaServer.rtf             |   0
 .../test-documents}/testUnicodePassword.pdf        | Bin
 .../test-documents}/test_recursive_embedded.docx   | Bin
 tika-server/{ => tika-server-core}/pom.xml         |  85 ++---
 .../server/core/CompositeParseContextConfig.java}  |  28 +-
 .../server/core}/DefaultInputStreamFactory.java    |   2 +-
 .../org/apache/tika/server/core}/HTMLHelper.java   |   2 +-
 .../tika/server/core}/InputStreamFactory.java      |   2 +-
 .../org/apache/tika/server/core}/MetadataList.java |   2 +-
 .../tika/server/core/ParseContextConfig.java}      |  24 +-
 .../org/apache/tika/server/core}/ServerStatus.java |   2 +-
 .../tika/server/core}/ServerStatusWatcher.java     |   2 +-
 .../apache/tika/server/core}/ServerTimeouts.java   |   2 +-
 .../org/apache/tika/server/core}/TaskStatus.java   |   4 +-
 .../tika/server/core}/TikaLoggingFilter.java       |   2 +-
 .../apache/tika/server/core}/TikaServerCli.java    |  45 ++-
 .../server/core}/TikaServerParseException.java     |   2 +-
 .../core}/TikaServerParseExceptionMapper.java      |   7 +-
 .../tika/server/core}/TikaServerWatchDog.java      |   4 +-
 .../server/core}/URLEnabledInputStreamFactory.java |   2 +-
 .../server/core/config/DocumentSelectorConfig.java |  32 ++
 .../server/core/config/PasswordProviderConfig.java |  45 +++
 .../server/core}/resource/DetectorResource.java    |   4 +-
 .../server/core}/resource/LanguageResource.java    |   2 +-
 .../server/core}/resource/MetadataResource.java    |  20 +-
 .../core}/resource/RecursiveMetadataResource.java  |  13 +-
 .../tika/server/core}/resource/TikaDetectors.java  |   4 +-
 .../tika/server/core}/resource/TikaMimeTypes.java  |   4 +-
 .../tika/server/core}/resource/TikaParsers.java    |   4 +-
 .../tika/server/core}/resource/TikaResource.java   | 108 ++----
 .../server/core}/resource/TikaServerStatus.java    |   4 +-
 .../tika/server/core}/resource/TikaVersion.java    |   2 +-
 .../tika/server/core}/resource/TikaWelcome.java    |   6 +-
 .../server/core}/resource/TranslateResource.java   |   6 +-
 .../server/core}/resource/UnpackerResource.java    |  31 +-
 .../server/core}/writer/CSVMessageBodyWriter.java  |   2 +-
 .../server/core}/writer/JSONMessageBodyWriter.java |   2 +-
 .../tika/server/core}/writer/JSONObjWriter.java    |   4 +-
 .../writer/MetadataListMessageBodyWriter.java      |   4 +-
 .../apache/tika/server/core}/writer/TarWriter.java |   2 +-
 .../server/core}/writer/TextMessageBodyWriter.java |   2 +-
 .../apache/tika/server/core}/writer/ZipWriter.java |   2 +-
 .../org.apache.tika.server.core.ParseContextConfig |  16 +
 .../src/main/resources/log4j.properties            |   0
 .../src/main/resources/tikaserver-template.html    |   0
 .../main/resources/tikaserver-version.properties   |   0
 .../org/apache/tika/server/core}/CXFTestBase.java  |  15 +-
 .../tika/server/core}/LanguageResourceTest.java    |  13 +-
 .../tika/server/core}/NullWebClientLogger.java     |   3 +-
 .../apache/tika/server/core}/ServerStatusTest.java |   4 +-
 .../tika/server/core}/StackTraceOffTest.java       |  39 ++-
 .../apache/tika/server/core}/StackTraceTest.java   |  38 ++-
 .../tika/server/core}/TikaMimeTypesTest.java       |  38 +--
 .../apache/tika/server/core/TikaResourceTest.java  | 111 +++++++
 .../server/core}/TikaServerIntegrationTest.java    |  35 +-
 .../tika/server/core}/TikaServerStatusTest.java    |  12 +-
 .../apache/tika/server/core}/TikaVersionTest.java  |   5 +-
 .../apache/tika/server/core}/TikaWelcomeTest.java  |  13 +-
 .../tika/server/core}/TranslateResourceTest.java   |  11 +-
 .../config}/tika-config-for-server-tests.xml       |   0
 .../src/test/resources/log4j.properties            |   2 +-
 .../src/test/resources/logging/log4j_child.xml     |   4 +-
 .../src/test/resources/test-documents}/english.txt |   0
 .../src/test/resources/test-documents}/french.txt  |   0
 .../resources/test-documents}/testDigilite.fdf     |   0
 120 files changed, 1012 insertions(+), 1306 deletions(-)

diff --git a/tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java b/tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java
index 7666dc9..e2557e4 100644
--- a/tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java
+++ b/tika-app/src/main/java/org/apache/tika/cli/TikaCLI.java
@@ -98,7 +98,6 @@ import org.apache.tika.parser.ParserDecorator;
 import org.apache.tika.parser.PasswordProvider;
 import org.apache.tika.parser.RecursiveParserWrapper;
 import org.apache.tika.parser.digestutils.CommonsDigester;
-import org.apache.tika.parser.html.BoilerpipeContentHandler;
 import org.apache.tika.parser.pdf.PDFParserConfig;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.sax.BodyContentHandler;
@@ -106,6 +105,7 @@ import org.apache.tika.sax.ContentHandlerFactory;
 import org.apache.tika.sax.ExpandedTitleContentHandler;
 import org.apache.tika.sax.RecursiveParserWrapperHandler;
 import org.apache.tika.sax.WriteOutContentHandler;
+import org.apache.tika.sax.boilerpipe.BoilerpipeContentHandler;
 import org.apache.tika.xmp.XMPMetadata;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java b/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java
index a6dd019..50b3c22 100644
--- a/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java
+++ b/tika-app/src/main/java/org/apache/tika/gui/TikaGUI.java
@@ -77,7 +77,7 @@ import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.RecursiveParserWrapper;
 import org.apache.tika.parser.digestutils.CommonsDigester;
-import org.apache.tika.parser.html.BoilerpipeContentHandler;
+import org.apache.tika.sax.boilerpipe.BoilerpipeContentHandler;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.ContentHandlerDecorator;
diff --git a/tika-parsers/pom.xml b/tika-parsers/pom.xml
index 0db4e7a..03bf5f4 100644
--- a/tika-parsers/pom.xml
+++ b/tika-parsers/pom.xml
@@ -35,10 +35,6 @@
     <modules>
         <!-- basic parsers - avoid network dependent parsers, native code -->
         <module>tika-parsers-classic</module>
-        <!-- allow network dependent parsers and native code  -->
-        <module>tika-parsers-extended</module>
-        <!-- potentially massive dependencies (e.g. dl4j)    -->
-        <module>tika-parsers-advanced</module>
     </modules>
 
 </project>
\ No newline at end of file
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/pom.xml b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/pom.xml
index 52d67b1..ab76ef2 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/pom.xml
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/pom.xml
@@ -58,6 +58,7 @@
         </dependency>
     </dependencies>
     <modules>
+        <module>tika-parser-html-commons</module>
         <module>tika-parser-jdbc-commons</module>
         <module>tika-parser-digest-commons</module>
         <module>tika-parser-mail-commons</module>
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/pom.xml b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/pom.xml
new file mode 100644
index 0000000..dd34b6a
--- /dev/null
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/pom.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tika-parsers-classic-modules</artifactId>
+        <groupId>org.apache.tika</groupId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>tika-parser-html-commons</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>de.l3s.boilerpipe</groupId>
+            <artifactId>boilerpipe</artifactId>
+            <version>${boilerpipe.version}</version>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifestEntries>
+                            <Automatic-Module-Name>org.apache.tika.sax.boilerpipe</Automatic-Module-Name>
+                        </manifestEntries>
+                    </archive>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>test-jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/BoilerpipeContentHandler.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/src/main/java/org/apache/tika/sax/boilerpipe/BoilerpipeContentHandler.java
similarity index 99%
rename from tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/BoilerpipeContentHandler.java
rename to tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/src/main/java/org/apache/tika/sax/boilerpipe/BoilerpipeContentHandler.java
index 19a29b9..b8cca63 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/main/java/org/apache/tika/parser/html/BoilerpipeContentHandler.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-commons/src/main/java/org/apache/tika/sax/boilerpipe/BoilerpipeContentHandler.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.parser.html;
+package org.apache.tika.sax.boilerpipe;
 
 import java.io.Writer;
 import java.util.ArrayList;
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/pom.xml b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/pom.xml
index fa647a3..807ef6e 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/pom.xml
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/pom.xml
@@ -32,15 +32,16 @@
 
     <dependencies>
         <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parser-html-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.ccil.cowan.tagsoup</groupId>
             <artifactId>tagsoup</artifactId>
             <version>${tagsoup.version}</version>
         </dependency>
-        <dependency>
-            <groupId>de.l3s.boilerpipe</groupId>
-            <artifactId>boilerpipe</artifactId>
-            <version>${boilerpipe.version}</version>
-        </dependency>
+
         <dependency>
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/test/java/org/apache/tika/parser/html/HtmlParserTest.java b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/test/java/org/apache/tika/parser/html/HtmlParserTest.java
index ba13d00..4a7e61f 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/test/java/org/apache/tika/parser/html/HtmlParserTest.java
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-modules/tika-parser-html-module/src/test/java/org/apache/tika/parser/html/HtmlParserTest.java
@@ -39,7 +39,6 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -64,6 +63,7 @@ import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Geographic;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
+
 import org.apache.tika.parser.AutoDetectParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
@@ -73,6 +73,7 @@ import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.LinkContentHandler;
 import org.apache.tika.sax.RecursiveParserWrapperHandler;
 import org.apache.tika.sax.TeeContentHandler;
+import org.apache.tika.sax.boilerpipe.BoilerpipeContentHandler;
 import org.ccil.cowan.tagsoup.HTMLSchema;
 import org.ccil.cowan.tagsoup.Schema;
 import org.junit.Ignore;
diff --git a/tika-parsers/tika-parsers-classic/tika-parsers-classic-package/pom.xml b/tika-parsers/tika-parsers-classic/tika-parsers-classic-package/pom.xml
index 19f94a4..06b1e83 100644
--- a/tika-parsers/tika-parsers-classic/tika-parsers-classic-package/pom.xml
+++ b/tika-parsers/tika-parsers-classic/tika-parsers-classic-package/pom.xml
@@ -139,6 +139,11 @@
             <artifactId>tika-parser-xml-module</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parser-xmp-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
 
         <!-- externally maintained parsers -->
         <dependency>
diff --git a/tika-server/pom.xml b/tika-server/pom.xml
index 8aeb14a..dc9b8f9 100644
--- a/tika-server/pom.xml
+++ b/tika-server/pom.xml
@@ -17,6 +17,11 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
+    <packaging>pom</packaging>
+    <modules>
+        <module>tika-server-core</module>
+        <module>tika-server-classic</module>
+    </modules>
 
     <parent>
         <groupId>org.apache.tika</groupId>
@@ -29,363 +34,7 @@
     <name>Apache Tika server</name>
     <url>http://tika.apache.org/</url>
 
-    <properties>
-    </properties>
 
-    <pluginRepositories>
-        <pluginRepository>
-            <id>miredot</id>
-            <name>MireDot Releases</name>
-            <url>http://nexus.qmino.com/content/repositories/miredot</url>
-        </pluginRepository>
-    </pluginRepositories>
-
-    <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-parsers-classic-package</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-translate</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-langdetect-optimaize</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-serialization</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-xmp</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>net.sf.opencsv</groupId>
-            <artifactId>opencsv</artifactId>
-            <version>${opencsv.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
-            <version>${cxf.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.annotation</groupId>
-                    <artifactId>javax.annotation-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.glassfish.jaxb</groupId>
-                    <artifactId>jaxb-runtime</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>jakarta.xml.bind</groupId>
-                    <artifactId>jakarta.xml.bind-api</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-rs-service-description</artifactId>
-            <version>${cxf.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-transports-http-jetty</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-rs-security-cors</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>${commons.cli.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
-            <version>${commons.lang3.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.cxf</groupId>
-            <artifactId>cxf-rt-rs-client</artifactId>
-            <version>${cxf.version}</version>
-        </dependency>
-
-        <!-- logging -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-log4j12</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jul-to-slf4j</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-core</artifactId>
-            <version>${project.version}</version>
-            <type>test-jar</type>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <configuration>
-                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
-                    <argLine>-da -XX:+HeapDumpOnOutOfMemoryError -Xmx512m</argLine>
-                    <systemPropertyVariables>
-                        <java.util.logging.config.file>
-                            ${basedir}/src/main/resources/commons-logging.properties
-                        </java.util.logging.config.file>
-                    </systemPropertyVariables>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>${maven.shade.version}</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <createDependencyReducedPom>
-                                false
-                            </createDependencyReducedPom>
-                            <artifactSet>
-                                <excludes>
-                                    <exclude>org.apache.tika:tika-parsers:jar:</exclude>
-                                </excludes>
-                            </artifactSet>
-                            <filters>
-                                <filter>
-                                    <artifact>*:*</artifact>
-                                    <excludes>
-                                        <exclude>META-INF/*.SF</exclude>
-                                        <exclude>META-INF/*.DSA</exclude>
-                                        <exclude>META-INF/*.RSA</exclude>
-                                        <exclude>META-INF/*.txt</exclude>
-                                        <exclude>META-INF/ASL2.0</exclude>
-                                        <exclude>META-INF/DEPENDENCIES</exclude>
-                                        <exclude>META-INF/LICENSE</exclude>
-                                        <exclude>META-INF/NOTICE</exclude>
-                                        <exclude>META-INF/README</exclude>
-                                        <exclude>LICENSE.txt</exclude>
-                                        <exclude>NOTICE.txt</exclude>
-                                        <exclude>CHANGES</exclude>
-                                        <exclude>README</exclude>
-                                        <exclude>builddef.lst</exclude>
-                                        <!-- clutter not needed in jar -->
-                                        <exclude>resources/grib1/nasa/README*.pdf</exclude>
-                                        <exclude>resources/grib1/**/readme*.txt</exclude>
-                                        <exclude>resources/grib2/**/readme*.txt</exclude>
-                                        <!-- TIKA-763: Workaround to avoid including LGPL classes -->
-                                        <exclude>ucar/nc2/iosp/fysat/Fysat*.class</exclude>
-                                        <exclude>ucar/nc2/dataset/transform/VOceanSG1*class</exclude>
-                                        <exclude>ucar/unidata/geoloc/vertical/OceanSG*.class</exclude>
-                                    </excludes>
-                                </filter>
-                            </filters>
-                            <transformers>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>org.apache.tika.server.TikaServerCli</mainClass>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
-                                    <resource>META-INF/LICENSE</resource>
-                                    <file>target/classes/META-INF/LICENSE</file>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
-                                    <resource>META-INF/NOTICE</resource>
-                                    <file>target/classes/META-INF/NOTICE</file>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
-                                    <resource>META-INF/DEPENDENCIES</resource>
-                                    <file>target/classes/META-INF/DEPENDENCIES</file>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.handlers</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/spring.schemas</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/cxf/cxf.extension</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/extensions.xml</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/cxf/extensions.xml</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>META-INF/cxf/bus-extensions.txt</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/cxf/bus-extensions.xml</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/wsdl.plugin.xml</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/tools.service.validator.xml</resource>
-                                </transformer>
-                                <transformer
-                                        implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
-                                    <resource>META-INF/cxf/java2wsbeans.xml</resource>
-                                </transformer>
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestEntries>
-                            <Automatic-Module-Name>org.apache.tika.server</Automatic-Module-Name>
-                        </manifestEntries>
-                    </archive>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test-jar</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>${rat.version}</version>
-                <configuration>
-                    <excludes>
-                        <exclude>src/main/resources/tikaserver-version.properties</exclude>
-                        <exclude>src/test/resources/*</exclude>
-                        <exclude>README.md</exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <configuration>
-                    <descriptors>
-                        <descriptor>assembly.xml</descriptor>
-                    </descriptors>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
-                        <phase>package</phase> <!-- bind to the packaging phase -->
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-    <profiles>
-        <profile>
-            <id>server</id>
-            <build>
-                <defaultGoal>test</defaultGoal>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>exec-maven-plugin</artifactId>
-                        <version>1.6.0</version>
-                        <executions>
-                            <execution>
-                                <phase>test</phase>
-                                <goals>
-                                    <goal>java</goal>
-                                </goals>
-                                <configuration>
-                                    <mainClass>org.apache.tika.server.TikaServerCli</mainClass>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>com.qmino</groupId>
-                        <artifactId>miredot-plugin</artifactId>
-                        <version>2.2</version>
-                        <executions>
-                            <execution>
-                                <goals>
-                                    <goal>restdoc</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                        <configuration>
-                            <organizationId>c579ca2e-c194-4a14-a7f0-f39ef4ec3c2d</organizationId>
-                            <restModel>
-                                <restFramework>
-                                    <name>jax-rs</name>
-                                </restFramework>
-                            </restModel>
-                            <output>
-                                <html/>
-                            </output>
-                            <!-- Free Miredot license key, valid until Jan 31st(?), 2025
-                            https://issues.apache.org/jira/browse/TIKA-2253
-                             https://issues.apache.org/jira/browse/TIKA-3038-->
-                            <licence>
-                                cHJvamVjdHxvcmcuYXBhY2hlLnRpa2EudGlrYS1zZXJ2ZXJ8MjAyNS0wMy0wMXxmYWxzZXwtMSNNQ3dDRkdtemsraHJDdjNodXlhN0d1KzlQM1Y0bUNxMEFoUnRHc25DQ1VyMjhLQ2swU0R5RGp1WkVpcXVlZz09
-                            </licence>
-                            <!-- insert other configuration here (optional) -->
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
 
     <organization>
         <name>The Apache Software Foundation</name>
diff --git a/tika-server/src/test/resources/mock/fake_oom.xml b/tika-server/src/test/resources/mock/fake_oom.xml
deleted file mode 100644
index 42aa9a7..0000000
--- a/tika-server/src/test/resources/mock/fake_oom.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <throw class="java.lang.OutOfMemoryError">oom message</throw>
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/heavy_hang_100.xml b/tika-server/src/test/resources/mock/heavy_hang_100.xml
deleted file mode 100644
index b1413bc..0000000
--- a/tika-server/src/test/resources/mock/heavy_hang_100.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <write element="p">some content</write>
-    <hang millis="100" heavy="true" pulse_millis="50" />
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/heavy_hang_30000.xml b/tika-server/src/test/resources/mock/heavy_hang_30000.xml
deleted file mode 100644
index f1f5b67..0000000
--- a/tika-server/src/test/resources/mock/heavy_hang_30000.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <write element="p">some content</write>
-    <hang millis="30000" heavy="true" pulse_millis="100" />
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/null_pointer.xml b/tika-server/src/test/resources/mock/null_pointer.xml
deleted file mode 100644
index 80043c0..0000000
--- a/tika-server/src/test/resources/mock/null_pointer.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <write element="p">some content</write>
-    <throw class="java.lang.NullPointerException">null pointer message</throw>
-</mock>
diff --git a/tika-server/src/test/resources/mock/real_oom.xml b/tika-server/src/test/resources/mock/real_oom.xml
deleted file mode 100644
index 168751a..0000000
--- a/tika-server/src/test/resources/mock/real_oom.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <oom/>
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/system_exit.xml b/tika-server/src/test/resources/mock/system_exit.xml
deleted file mode 100644
index 75d1d3b..0000000
--- a/tika-server/src/test/resources/mock/system_exit.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <write element="p">some content</write>
-    <system_exit />
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/testStaticStdOutErr.xml b/tika-server/src/test/resources/mock/testStaticStdOutErr.xml
deleted file mode 100644
index f08229e..0000000
--- a/tika-server/src/test/resources/mock/testStaticStdOutErr.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
-  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.
--->
-
-<mock>
-
-
-    <!-- action can be "add" or "set" -->
-    <metadata action="add" name="dc:creator">Nikolai Lobachevsky</metadata>
-    <!-- element is the name of the sax event to write, p=paragraph
-        if the element is not specified, the default is <p> -->
-    <hang millis="100" heavy="false"  />
-    <write element="p">hello world! </write>
-    <!-- write something to System.out -->
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out static="true" random="200000"/>
-    <hang millis="10" heavy="false"  />
-    <print_out static="true" random="200000"/>
-    <hang millis="10" heavy="false"  />
-    <print_out static="true" random="200000"/>
-    <hang millis="10" heavy="false"  />
-    <print_err static="true" random="200000"/>
-    <hang millis="10" heavy="false"  />
-    <print_err static="true" random="200000"/>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="80" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="70" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="60" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="30" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="30" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="50" heavy="false"  />
-    <!-- write something to System.err -->
-    <print_err>writing to System.err</print_err>
-
-    <write element="p">Even after the calls to Sys.out/err...hello world! the quick brown fox jumped over the lazy dog</write>
-
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/testStdOutErr.xml b/tika-server/src/test/resources/mock/testStdOutErr.xml
deleted file mode 100644
index ce0682f..0000000
--- a/tika-server/src/test/resources/mock/testStdOutErr.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-
-<!--
-  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.
--->
-
-<mock>
-
-
-    <!-- action can be "add" or "set" -->
-    <metadata action="add" name="dc:creator">Nikolai Lobachevsky</metadata>
-    <!-- element is the name of the sax event to write, p=paragraph
-        if the element is not specified, the default is <p> -->
-    <hang millis="100" heavy="false"  />
-    <write element="p">hello world! </write>
-    <!-- write something to System.out -->
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="100" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="100" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="100" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="80" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="70" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="60" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="1" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="20" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="30" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="10" heavy="false"  />
-    <print_out>writing to System.out</print_out>
-    <hang millis="50" heavy="false"  />
-    <!-- write something to System.err -->
-    <print_err>writing to System.err</print_err>
-
-    <write element="p">Even after the calls to Sys.out/err...hello world! the quick brown fox jumped over the lazy dog</write>
-
-</mock>
\ No newline at end of file
diff --git a/tika-server/src/test/resources/mock/thread_interrupt.xml b/tika-server/src/test/resources/mock/thread_interrupt.xml
deleted file mode 100644
index 3e54512..0000000
--- a/tika-server/src/test/resources/mock/thread_interrupt.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  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.
--->
-
-<mock>
-    <metadata action="add" name="author">Nikolai Lobachevsky</metadata>
-    <write element="p">some content</write>
-    <thread_interrupt />
-</mock>
\ No newline at end of file
diff --git a/tika-server/assembly.xml b/tika-server/tika-server-classic/assembly.xml
similarity index 94%
rename from tika-server/assembly.xml
rename to tika-server/tika-server-classic/assembly.xml
index 216ee71..b346df4 100644
--- a/tika-server/assembly.xml
+++ b/tika-server/tika-server-classic/assembly.xml
@@ -38,7 +38,7 @@
   </fileSets>
   <files>
     <file>
-      <source>${project.build.directory}/tika-server-${project.version}.jar</source>
+      <source>${project.build.directory}/tika-server-classic-${project.version}.jar</source>
       <outputDirectory/>
       <destName>tika-server.jar</destName>
     </file>
diff --git a/tika-server/bin/init.d/tika b/tika-server/tika-server-classic/bin/init.d/tika
similarity index 100%
rename from tika-server/bin/init.d/tika
rename to tika-server/tika-server-classic/bin/init.d/tika
diff --git a/tika-server/bin/install_tika_service.sh b/tika-server/tika-server-classic/bin/install_tika_service.sh
similarity index 100%
rename from tika-server/bin/install_tika_service.sh
rename to tika-server/tika-server-classic/bin/install_tika_service.sh
diff --git a/tika-server/bin/tika b/tika-server/tika-server-classic/bin/tika
similarity index 100%
rename from tika-server/bin/tika
rename to tika-server/tika-server-classic/bin/tika
diff --git a/tika-server/bin/tika.in.sh b/tika-server/tika-server-classic/bin/tika.in.sh
similarity index 100%
rename from tika-server/bin/tika.in.sh
rename to tika-server/tika-server-classic/bin/tika.in.sh
diff --git a/tika-server/tika-server-classic/pom.xml b/tika-server/tika-server-classic/pom.xml
new file mode 100644
index 0000000..622ad12
--- /dev/null
+++ b/tika-server/tika-server-classic/pom.xml
@@ -0,0 +1,228 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>tika-server</artifactId>
+        <groupId>org.apache.tika</groupId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>tika-server-classic</artifactId>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-server-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parsers-classic-package</artifactId>
+            <version>${project.version}</version>
+            <!-- this is brought in by tika-server-core. Don't duplicate -->
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.tika</groupId>
+                    <artifactId>tika-parser-digest-commons</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.tika</groupId>
+                    <artifactId>tika-parser-zip-commons</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-xmp</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- test jars -->
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-server-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-core</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+    <plugins>
+        <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+                <redirectTestOutputToFile>true</redirectTestOutputToFile>
+                <argLine>-da -XX:+HeapDumpOnOutOfMemoryError -Xmx512m</argLine>
+                <systemPropertyVariables>
+                    <java.util.logging.config.file>
+                        ${basedir}/src/main/resources/commons-logging.properties
+                    </java.util.logging.config.file>
+                </systemPropertyVariables>
+            </configuration>
+        </plugin>
+        <plugin>
+            <artifactId>maven-shade-plugin</artifactId>
+            <version>${maven.shade.version}</version>
+            <executions>
+                <execution>
+                    <phase>package</phase>
+                    <goals>
+                        <goal>shade</goal>
+                    </goals>
+                    <configuration>
+                        <createDependencyReducedPom>
+                            false
+                        </createDependencyReducedPom>
+                        <artifactSet>
+                            <excludes>
+                                <exclude>org.apache.tika:tika-parsers-classic:jar:</exclude>
+                            </excludes>
+                        </artifactSet>
+                        <filters>
+                            <filter>
+                                <artifact>*:*</artifact>
+                                <excludes>
+                                    <exclude>META-INF/*.SF</exclude>
+                                    <exclude>META-INF/*.DSA</exclude>
+                                    <exclude>META-INF/*.RSA</exclude>
+                                    <exclude>META-INF/*.txt</exclude>
+                                    <exclude>META-INF/ASL2.0</exclude>
+                                    <exclude>META-INF/DEPENDENCIES</exclude>
+                                    <exclude>META-INF/LICENSE</exclude>
+                                    <exclude>META-INF/NOTICE</exclude>
+                                    <exclude>META-INF/README</exclude>
+                                    <exclude>LICENSE.txt</exclude>
+                                    <exclude>NOTICE.txt</exclude>
+                                    <exclude>CHANGES</exclude>
+                                    <exclude>README</exclude>
+                                    <exclude>builddef.lst</exclude>
+                                </excludes>
+                            </filter>
+                        </filters>
+                        <transformers>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+                                <mainClass>org.apache.tika.server.core.TikaServerCli</mainClass>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
+                                <resource>META-INF/LICENSE</resource>
+                                <file>target/classes/META-INF/LICENSE</file>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
+                                <resource>META-INF/NOTICE</resource>
+                                <file>target/classes/META-INF/NOTICE</file>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
+                                <resource>META-INF/DEPENDENCIES</resource>
+                                <file>target/classes/META-INF/DEPENDENCIES</file>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                <resource>META-INF/spring.handlers</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                <resource>META-INF/spring.schemas</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                <resource>META-INF/cxf/cxf.extension</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/extensions.xml</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/cxf/extensions.xml</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                <resource>META-INF/cxf/bus-extensions.txt</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/cxf/bus-extensions.xml</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/wsdl.plugin.xml</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/tools.service.validator.xml</resource>
+                            </transformer>
+                            <transformer
+                                    implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
+                                <resource>META-INF/cxf/java2wsbeans.xml</resource>
+                            </transformer>
+                        </transformers>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-jar-plugin</artifactId>
+            <configuration>
+                <archive>
+                    <manifestEntries>
+                        <Automatic-Module-Name>org.apache.tika.server.classic</Automatic-Module-Name>
+                    </manifestEntries>
+                </archive>
+            </configuration>
+            <executions>
+                <execution>
+                    <goals>
+                        <goal>test-jar</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+        <plugin>
+            <groupId>org.apache.rat</groupId>
+            <artifactId>apache-rat-plugin</artifactId>
+            <version>${rat.version}</version>
+            <configuration>
+                <excludes>
+                    <exclude>src/main/resources/tikaserver-version.properties</exclude>
+                    <exclude>src/test/resources/*</exclude>
+                    <exclude>README.md</exclude>
+                </excludes>
+            </configuration>
+        </plugin>
+        <plugin>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <configuration>
+                <descriptors>
+                    <descriptor>assembly.xml</descriptor>
+                </descriptors>
+            </configuration>
+            <executions>
+                <execution>
+                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
+                    <phase>package</phase> <!-- bind to the packaging phase -->
+                    <goals>
+                        <goal>single</goal>
+                    </goals>
+                </execution>
+            </executions>
+        </plugin>
+    </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/tika-server/tika-server-classic/src/TODO b/tika-server/tika-server-classic/src/TODO
new file mode 100644
index 0000000..6c605de
--- /dev/null
+++ b/tika-server/tika-server-classic/src/TODO
@@ -0,0 +1,8 @@
+this is needed by poi-ooxml
+    static {
+        ExtractorFactory.setAllThreadsPreferEventExtractors(true);
+    }
+
+figure out what to do with the xmp writer
+
+figure out what to do with the unpacker
diff --git a/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/PDFServerConfig.java b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/PDFServerConfig.java
new file mode 100644
index 0000000..aac750d
--- /dev/null
+++ b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/PDFServerConfig.java
@@ -0,0 +1,36 @@
+package org.apache.tika.server.classic.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.pdf.PDFParserConfig;
+import org.apache.tika.server.core.ParseContextConfig;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import static org.apache.tika.server.core.resource.TikaResource.processHeaderConfig;
+
+public class PDFServerConfig implements ParseContextConfig {
+
+    public static final String X_TIKA_PDF_HEADER_PREFIX = "X-Tika-PDF";
+
+    @Override
+    public void configure(MultivaluedMap<String, String> httpHeaders,
+                          Metadata metadata, ParseContext parseContext) {
+        //lazily initialize configs
+        //if a header is submitted, any params set in --tika-config tika-config.xml
+        //upon server startup will be ignored.
+        PDFParserConfig pdfParserConfig = null;
+        for (String key : httpHeaders.keySet()) {
+            if (StringUtils.startsWith(key, X_TIKA_PDF_HEADER_PREFIX)) {
+                pdfParserConfig = (pdfParserConfig == null) ? new PDFParserConfig() : pdfParserConfig;
+                processHeaderConfig(httpHeaders, pdfParserConfig, key, X_TIKA_PDF_HEADER_PREFIX);
+            }
+        }
+        if (pdfParserConfig != null) {
+            parseContext.set(PDFParserConfig.class, pdfParserConfig);
+        }
+    }
+}
diff --git a/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/TesseractServerConfig.java b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/TesseractServerConfig.java
new file mode 100644
index 0000000..db04a8c
--- /dev/null
+++ b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/config/TesseractServerConfig.java
@@ -0,0 +1,36 @@
+package org.apache.tika.server.classic.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.ocr.TesseractOCRConfig;
+import org.apache.tika.server.core.ParseContextConfig;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import static org.apache.tika.server.core.resource.TikaResource.processHeaderConfig;
+
+public class TesseractServerConfig implements ParseContextConfig {
+
+    public static final String X_TIKA_OCR_HEADER_PREFIX = "X-Tika-OCR";
+    @Override
+    public void configure(MultivaluedMap<String, String> httpHeaders,
+                          Metadata metadata, ParseContext parseContext) {
+        //lazily initialize configs
+        //if a header is submitted, any params set in --tika-config tika-config.xml
+        //upon server startup will be ignored.
+        TesseractOCRConfig ocrConfig = null;
+        DocumentSelector documentSelector = null;
+        for (String key : httpHeaders.keySet()) {
+            if (StringUtils.startsWith(key, X_TIKA_OCR_HEADER_PREFIX)) {
+                ocrConfig = (ocrConfig == null) ? new TesseractOCRConfig() : ocrConfig;
+                processHeaderConfig(httpHeaders, ocrConfig, key, X_TIKA_OCR_HEADER_PREFIX);
+            }
+        }
+        if (ocrConfig != null) {
+            parseContext.set(TesseractOCRConfig.class, ocrConfig);
+        }
+    }
+}
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/XMPMessageBodyWriter.java b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/writer/XMPMessageBodyWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/XMPMessageBodyWriter.java
rename to tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/writer/XMPMessageBodyWriter.java
index 8e58793..a98829b 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/XMPMessageBodyWriter.java
+++ b/tika-server/tika-server-classic/src/main/java/org/apache/tika/server/classic/writer/XMPMessageBodyWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.classic.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/tika-server-classic/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig b/tika-server/tika-server-classic/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig
new file mode 100644
index 0000000..2e04320
--- /dev/null
+++ b/tika-server/tika-server-classic/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig
@@ -0,0 +1,16 @@
+#  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.
+org.apache.tika.server.classic.config.PDFServerConfig
+org.apache.tika.server.classic.config.TesseractServerConfig
\ No newline at end of file
diff --git a/tika-server/src/test/java/org/apache/tika/server/DetectorResourceTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/DetectorResourceTest.java
similarity index 87%
rename from tika-server/src/test/java/org/apache/tika/server/DetectorResourceTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/DetectorResourceTest.java
index a5ed5b3..d773959 100644
--- a/tika-server/src/test/java/org/apache/tika/server/DetectorResourceTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/DetectorResourceTest.java
@@ -15,31 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TikaServerParseExceptionMapper;
+import org.apache.tika.server.core.resource.DetectorResource;
+import org.apache.tika.server.core.writer.TarWriter;
+import org.apache.tika.server.core.writer.ZipWriter;
+import org.junit.Test;
 
 import javax.ws.rs.core.Response;
-
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.DetectorResource;
-import org.apache.tika.server.writer.TarWriter;
-import org.apache.tika.server.writer.ZipWriter;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class DetectorResourceTest extends CXFTestBase {
 
     private static final String DETECT_PATH = "/detect";
     private static final String DETECT_STREAM_PATH = DETECT_PATH + "/stream";
-    private static final String FOO_CSV = "foo.csv";
-    private static final String CDEC_CSV_NO_EXT = "CDEC_WEATHER_2010_03_02";
+    private static final String FOO_CSV = "test-documents/foo.csv";
+    private static final String CDEC_CSV_NO_EXT = "test-documents/CDEC_WEATHER_2010_03_02";
 
     @Override
     protected void setUpResources(JAXRSServerFactoryBean sf) {
diff --git a/tika-server/src/test/java/org/apache/tika/server/MetadataResourceTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/MetadataResourceTest.java
similarity index 94%
rename from tika-server/src/test/java/org/apache/tika/server/MetadataResourceTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/MetadataResourceTest.java
index 01acbaf..31056a0 100644
--- a/tika-server/src/test/java/org/apache/tika/server/MetadataResourceTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/MetadataResourceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertEquals;
@@ -40,12 +40,14 @@ import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.serialization.JsonMetadata;
-import org.apache.tika.server.resource.MetadataResource;
-import org.apache.tika.server.writer.CSVMessageBodyWriter;
-import org.apache.tika.server.writer.JSONMessageBodyWriter;
-import org.apache.tika.server.writer.TextMessageBodyWriter;
-import org.apache.tika.server.writer.XMPMessageBodyWriter;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.MetadataResource;
+import org.apache.tika.server.core.writer.CSVMessageBodyWriter;
+import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
+import org.apache.tika.server.core.writer.TextMessageBodyWriter;
+import org.apache.tika.server.classic.writer.XMPMessageBodyWriter;
 import org.junit.Assert;
+import org.junit.Ignore;
 import org.junit.Test;
 
 public class MetadataResourceTest extends CXFTestBase {
@@ -161,6 +163,7 @@ public class MetadataResourceTest extends CXFTestBase {
     }
 
     @Test
+    @Ignore("TODO -- add back in xmp writer")
     public void testXMP() throws Exception {
         Response response = WebClient
                 .create(endPoint + META_PATH)
@@ -192,6 +195,7 @@ public class MetadataResourceTest extends CXFTestBase {
     }
 
     @Test
+    @Ignore("TODO: add back in xmp handler")
     public void testGetField_Author_TEXT_Partial_Found() throws Exception {
 
         InputStream stream = ClassLoader.getSystemResourceAsStream(TikaResourceTest.TEST_DOC);
@@ -220,6 +224,7 @@ public class MetadataResourceTest extends CXFTestBase {
     }
 
     @Test
+    @Ignore("TODO: until we can reintegrate xmpwriter")
     public void testGetField_Author_XMP_Partial_Found() throws Exception {
 
         InputStream stream = ClassLoader.getSystemResourceAsStream(TikaResourceTest.TEST_DOC);
diff --git a/tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataFilterTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataFilterTest.java
similarity index 82%
rename from tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataFilterTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataFilterTest.java
index 9799f8b..11fcc77 100644
--- a/tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataFilterTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataFilterTest.java
@@ -15,21 +15,17 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
-import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.OfficeOpenXMLExtended;
-import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.serialization.JsonMetadataList;
-import org.apache.tika.sax.AbstractRecursiveParserWrapperHandler;
-import org.apache.tika.sax.RecursiveParserWrapperHandler;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.RecursiveMetadataResource;
+import org.apache.tika.server.core.writer.MetadataListMessageBodyWriter;
 import org.junit.Test;
 
 import javax.ws.rs.core.Response;
@@ -42,10 +38,7 @@ import java.util.List;
 import java.util.Set;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.tika.TikaTest.assertNotContained;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -53,11 +46,11 @@ public class RecursiveMetadataFilterTest extends CXFTestBase {
 
     private static final String META_PATH = "/rmeta";
 
-    private static final String TEST_RECURSIVE_DOC = "test_recursive_embedded.docx";
+    private static final String TEST_RECURSIVE_DOC = "test-documents/test_recursive_embedded.docx";
 
     @Override
     protected InputStream getTikaConfigInputStream() {
-        return getClass().getResourceAsStream("TIKA-3137-include.xml");
+        return getClass().getResourceAsStream("/config/TIKA-3137-include.xml");
     }
 
     @Override
diff --git a/tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataResourceTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataResourceTest.java
similarity index 97%
rename from tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataResourceTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataResourceTest.java
index 38dcb05..3a32f13 100644
--- a/tika-server/src/test/java/org/apache/tika/server/RecursiveMetadataResourceTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/RecursiveMetadataResourceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.tika.TikaTest.assertNotContained;
@@ -37,14 +37,16 @@ import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.OfficeOpenXMLExtended;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.metadata.serialization.JsonMetadataList;
 import org.apache.tika.sax.AbstractRecursiveParserWrapperHandler;
 import org.apache.tika.sax.RecursiveParserWrapperHandler;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.RecursiveMetadataResource;
+import org.apache.tika.server.core.writer.MetadataListMessageBodyWriter;
 import org.junit.Test;
 
 public class RecursiveMetadataResourceTest extends CXFTestBase {
@@ -57,7 +59,7 @@ public class RecursiveMetadataResourceTest extends CXFTestBase {
     private static final String UNPARSEABLE_PATH = "/somethingOrOther";
     private static final String SLASH = "/";
 
-    private static final String TEST_RECURSIVE_DOC = "test_recursive_embedded.docx";
+    private static final String TEST_RECURSIVE_DOC = "test-documents/test_recursive_embedded.docx";
 
     @Override
     protected void setUpResources(JAXRSServerFactoryBean sf) {
@@ -380,7 +382,7 @@ public class RecursiveMetadataResourceTest extends CXFTestBase {
         assertEquals("true", metadataList.get(6).get(AbstractRecursiveParserWrapperHandler.WRITE_LIMIT_REACHED));
         assertContains("When in the Course of human events it becomes necessary for one people",
                 metadataList.get(6).get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
-        assertNotContained("to dissolve",
+        TikaTest.assertNotContained("to dissolve",
                 metadataList.get(6).get(AbstractRecursiveParserWrapperHandler.TIKA_CONTENT));
 
     }
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaDetectorsTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaDetectorsTest.java
similarity index 97%
rename from tika-server/src/test/java/org/apache/tika/server/TikaDetectorsTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaDetectorsTest.java
index 93e049a..8d78ba5 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaDetectorsTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaDetectorsTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -35,7 +35,8 @@ import org.apache.tika.detect.microsoft.POIFSContainerDetector;
 import org.apache.tika.detect.zip.DefaultZipContainerDetector;
 import org.apache.tika.mime.MimeTypes;
 
-import org.apache.tika.server.resource.TikaDetectors;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.TikaDetectors;
 import org.gagravarr.tika.OggDetector;
 import org.junit.Test;
 
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaMimeTypesTest.java
similarity index 54%
copy from tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java
copy to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaMimeTypesTest.java
index 6b2be33..a93d8ce 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaMimeTypesTest.java
@@ -1,45 +1,28 @@
-/*
- * 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.server;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import javax.ws.rs.core.Response;
-
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
+package org.apache.tika.server.classic;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.TikaMimeTypes;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.TikaMimeTypes;
 import org.junit.Test;
 
-public class TikaMimeTypesTest extends CXFTestBase {
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
+public class TikaMimeTypesTest extends CXFTestBase {
     private static final Gson GSON = new GsonBuilder().create();
 
     private static final String MIMETYPES_PATH = "/mime-types";
 
+
     @Override
     protected void setUpResources(JAXRSServerFactoryBean sf) {
         sf.setResourceClasses(TikaMimeTypes.class);
@@ -54,45 +37,6 @@ public class TikaMimeTypesTest extends CXFTestBase {
     }
 
     @Test
-    public void testGetPlainText() throws Exception {
-        Response response = WebClient
-                .create(endPoint + MIMETYPES_PATH)
-                .type("text/plain")
-                .accept("text/plain")
-                .get();
-
-        String text = getStringFromInputStream((InputStream) response.getEntity());
-        assertContains("text/plain", text);
-        assertContains("application/xml", text);
-        assertContains("video/x-ogm", text);
-
-        assertContains("supertype: video/ogg", text);
-
-        assertContains("alias:     image/x-ms-bmp", text);
-    }
-
-    @Test
-    public void testGetHTML() throws Exception {
-        Response response = WebClient
-                .create(endPoint + MIMETYPES_PATH)
-                .type("text/html")
-                .accept("text/html")
-                .get();
-
-        String text = getStringFromInputStream((InputStream) response.getEntity());
-        assertContains("text/plain", text);
-        assertContains("application/xml", text);
-        assertContains("video/x-ogm", text);
-
-        assertContains("<h2>text/plain", text);
-        assertContains("name=\"text/plain", text);
-
-        assertContains("Super Type: <a href=\"#video/ogg\">video/ogg", text);
-
-        assertContains("Alias: image/x-ms-bmp", text);
-    }
-
-    @Test
     @SuppressWarnings("unchecked")
     public void testGetJSON() throws Exception {
         Response response = WebClient
@@ -126,4 +70,5 @@ public class TikaMimeTypesTest extends CXFTestBase {
         assertEquals("video/ogg", ogm.get("supertype"));
         assertEquals("org.gagravarr.tika.OggParser", ogm.get("parser"));
     }
+
 }
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaParsersTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaParsersTest.java
similarity index 98%
rename from tika-server/src/test/java/org/apache/tika/server/TikaParsersTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaParsersTest.java
index cd3b083..d1d093e 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaParsersTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaParsersTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -32,9 +32,9 @@ import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.parser.microsoft.ooxml.OOXMLParser;
-import org.apache.tika.parser.pdf.PDFParser;
 import org.apache.tika.parser.pkg.PackageParser;
-import org.apache.tika.server.resource.TikaParsers;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.TikaParsers;
 import org.gagravarr.tika.OpusParser;
 import org.junit.Test;
 
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaResourceTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaResourceTest.java
similarity index 84%
rename from tika-server/src/test/java/org/apache/tika/server/TikaResourceTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaResourceTest.java
index 81e3ed5..84b57f5 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaResourceTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/TikaResourceTest.java
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
-import org.apache.commons.io.IOUtils;
 import org.apache.cxf.attachment.AttachmentUtil;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
@@ -27,20 +26,22 @@ import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.parser.ocr.TesseractOCRConfig;
 import org.apache.tika.parser.ocr.TesseractOCRParser;
-import org.apache.tika.server.resource.TikaResource;
+import org.apache.tika.server.classic.config.PDFServerConfig;
+import org.apache.tika.server.classic.config.TesseractServerConfig;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.TikaServerParseExceptionMapper;
+import org.apache.tika.server.core.config.DocumentSelectorConfig;
+import org.apache.tika.server.core.config.PasswordProviderConfig;
+import org.apache.tika.server.core.resource.TikaResource;
 import org.junit.Ignore;
 import org.junit.Test;
 
 import javax.ws.rs.ProcessingException;
-import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 import static org.apache.cxf.helpers.HttpHeaderHelper.CONTENT_ENCODING;
 import static org.junit.Assert.assertEquals;
@@ -48,9 +49,9 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class TikaResourceTest extends CXFTestBase {
-    public static final String TEST_DOC = "test.doc";
-    public static final String TEST_PASSWORD_PROTECTED = "password.xls";
-    private static final String TEST_RECURSIVE_DOC = "test_recursive_embedded.docx";
+    public static final String TEST_DOC = "test-documents/test.doc";
+    public static final String TEST_PASSWORD_PROTECTED = "test-documents/password.xls";
+    private static final String TEST_RECURSIVE_DOC = "test-documents/test_recursive_embedded.docx";
     private static final String TEST_OOM = "mock/fake_oom.xml";
 
     private static final String STREAM_CLOSED_FAULT = "java.io.IOException: Stream Closed";
@@ -140,7 +141,7 @@ public class TikaResourceTest extends CXFTestBase {
         //boilerpipe
         Response response = WebClient.create(endPoint + TIKA_PATH + "/main")
                 .accept("text/plain")
-                .put(ClassLoader.getSystemResourceAsStream("testHTML.html"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testHTML.html"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertTrue(responseMsg.contains("Title : Test Indexation Html"));
@@ -151,7 +152,7 @@ public class TikaResourceTest extends CXFTestBase {
     public void testTextMainMultipart() throws Exception {
         //boilerpipe
         Attachment attachmentPart =
-                new Attachment("myhtml", "text/html", ClassLoader.getSystemResourceAsStream("testHTML.html"));
+                new Attachment("myhtml", "text/html", ClassLoader.getSystemResourceAsStream("test-documents/testHTML.html"));
 
 
         Response response = WebClient.create(endPoint + TIKA_PATH+"/form/main")
@@ -164,22 +165,14 @@ public class TikaResourceTest extends CXFTestBase {
         assertFalse(responseMsg.contains("Indexation du fichier"));
     }
 
-    @Test
-    public void testApplicationWadl() throws Exception {
-        Response response = WebClient
-                .create(endPoint + TIKA_PATH + "?_wadl")
-                .accept("text/plain").get();
-        String resp = getStringFromInputStream((InputStream) response
-                .getEntity());
-        assertTrue(resp.startsWith("<application"));
-    }
+
 
     @Test
     public void testPasswordXLS() throws Exception {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/vnd.ms-excel")
                 .accept("text/plain")
-                .put(ClassLoader.getSystemResourceAsStream("password.xls"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/password.xls"));
 
         assertEquals(UNPROCESSEABLE, response.getStatus());
     }
@@ -204,7 +197,7 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/vnd.ms-excel")
                 .accept("text/html")
-                .put(ClassLoader.getSystemResourceAsStream("password.xls"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/password.xls"));
 
         assertEquals(UNPROCESSEABLE, response.getStatus());
     }
@@ -225,7 +218,7 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/vnd.ms-excel")
                 .accept("text/xml")
-                .put(ClassLoader.getSystemResourceAsStream("password.xls"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/password.xls"));
 
         assertEquals(UNPROCESSEABLE, response.getStatus());
     }
@@ -281,7 +274,7 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/rtf")
                 .accept("text/plain")
-                .put(ClassLoader.getSystemResourceAsStream("testRTF_npeFromWMFInTikaServer.rtf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testRTF_npeFromWMFInTikaServer.rtf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertTrue(responseMsg.contains("Example text"));
@@ -296,11 +289,11 @@ public class TikaResourceTest extends CXFTestBase {
 
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "ocr_only")
-                .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX+"Language", "eng+fra")
-                .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX+"MinFileSizeToOcr", "10")
-                .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX+"MaxFileSizeToOcr", "1000000000")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "ocr_only")
+                .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX+"Language", "eng+fra")
+                .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX+"MinFileSizeToOcr", "10")
+                .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX+"MaxFileSizeToOcr", "1000000000")
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertContains("Happy New Year 2003!", responseMsg);
@@ -316,8 +309,8 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "no_ocr")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "no_ocr")
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertTrue(responseMsg.trim().equals(""));
@@ -325,8 +318,8 @@ public class TikaResourceTest extends CXFTestBase {
         response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "ocr_only")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"OcrStrategy", "ocr_only")
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertContains("Happy New Year 2003!", responseMsg);
@@ -335,8 +328,8 @@ public class TikaResourceTest extends CXFTestBase {
         response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX + "OcrStrategy", "non-sense-value")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX + "OcrStrategy", "non-sense-value")
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         assertEquals(400, response.getStatus());
     }
 
@@ -347,7 +340,7 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .put(ClassLoader.getSystemResourceAsStream("testPDFTwoTextBoxes.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testPDFTwoTextBoxes.pdf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         responseMsg = responseMsg.replaceAll("[\r\n ]+", " ").trim();
@@ -357,8 +350,8 @@ public class TikaResourceTest extends CXFTestBase {
         response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"sortByPosition", "false")
-                .put(ClassLoader.getSystemResourceAsStream("testPDFTwoTextBoxes.pdf"));
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"sortByPosition", "false")
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testPDFTwoTextBoxes.pdf"));
         responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         responseMsg = responseMsg.replaceAll("[\r\n ]+", " ").trim();
@@ -368,7 +361,7 @@ public class TikaResourceTest extends CXFTestBase {
         response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .put(ClassLoader.getSystemResourceAsStream("testPDFTwoTextBoxes.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testPDFTwoTextBoxes.pdf"));
         responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         responseMsg = responseMsg.replaceAll("[\r\n ]+", " ").trim();
@@ -384,7 +377,7 @@ public class TikaResourceTest extends CXFTestBase {
         Attachment attachmentPart = new Attachment(
                 "my-docx-file",
                 "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
-                ClassLoader.getSystemResourceAsStream("2pic.docx")
+                ClassLoader.getSystemResourceAsStream("test-documents/2pic.docx")
         );
 
         Response response = WebClient.create(endPoint + TIKA_PATH + "/form")
@@ -407,10 +400,10 @@ public class TikaResourceTest extends CXFTestBase {
             response = WebClient.create(endPoint + TIKA_PATH)
                     .type("application/pdf")
                     .accept("text/plain")
-                    .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX +
+                    .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX +
                                     "tesseractPath",
                             "C://tmp//hello.bat\u0000")
-                    .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                    .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
             assertEquals(400, response.getStatus());
         } catch (ProcessingException e) {
             //can't tell why this intermittently happens. :(
@@ -420,10 +413,10 @@ public class TikaResourceTest extends CXFTestBase {
         response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX +
+                .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX +
                                 "tesseractPath",
                         "bogus path")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         assertEquals(200, response.getStatus());
     }
 
@@ -432,10 +425,10 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_OCR_HEADER_PREFIX +
+                .header(TesseractServerConfig.X_TIKA_OCR_HEADER_PREFIX +
                                 "trustedPageSeparator",
                         "\u0020")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         assertEquals(400, response.getStatus());
 
     }
@@ -445,38 +438,15 @@ public class TikaResourceTest extends CXFTestBase {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .type("application/pdf")
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX +
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX +
                                 "averageCharTolerance",
                         "2.0")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         assertEquals(200, response.getStatus());
 
     }
 
-    @Test
-    public void testOOMInLegacyMode() throws Exception {
-
-        Response response = null;
-        try {
-            response = WebClient
-                    .create(endPoint + TIKA_PATH)
-                    .accept("text/plain")
-                    .put(ClassLoader
-                            .getSystemResourceAsStream(TEST_OOM));
-        } catch (Exception e) {
-            //oom may or may not cause an exception depending
-            //on the timing
-        }
-
-        response = WebClient
-                .create(endPoint + TIKA_PATH)
-                .accept("text/plain")
-                .put(ClassLoader
-                        .getSystemResourceAsStream(TEST_RECURSIVE_DOC));
-        String responseMsg = getStringFromInputStream((InputStream) response.getEntity());
 
-        assertContains("plundered our seas", responseMsg);
-    }
 
     @Test
     public void testUnicodePasswordProtectedSpaces() throws Exception {
@@ -485,8 +455,8 @@ public class TikaResourceTest extends CXFTestBase {
         final String encoded = new Base64().encodeAsString(password.getBytes(StandardCharsets.UTF_8));
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .accept("text/plain")
-                .header(TikaResource.PASSWORD_BASE64_UTF8, encoded)
-                .put(ClassLoader.getSystemResourceAsStream("testPassword4Spaces.pdf"));
+                .header(PasswordProviderConfig.PASSWORD_BASE64_UTF8, encoded)
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testPassword4Spaces.pdf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertContains("Just some text.", responseMsg);
@@ -499,8 +469,8 @@ public class TikaResourceTest extends CXFTestBase {
         final String encoded = new Base64().encodeAsString(password.getBytes(StandardCharsets.UTF_8));
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .accept("text/plain")
-                .header(TikaResource.PASSWORD_BASE64_UTF8, encoded)
-                .put(ClassLoader.getSystemResourceAsStream("testUnicodePassword.pdf"));
+                .header(PasswordProviderConfig.PASSWORD_BASE64_UTF8, encoded)
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testUnicodePassword.pdf"));
         String responseMsg = getStringFromInputStream((InputStream) response
                 .getEntity());
         assertContains("Just some text.", responseMsg);
@@ -511,14 +481,14 @@ public class TikaResourceTest extends CXFTestBase {
     public void testSkipEmbedded() throws Exception {
         Response response = WebClient.create(endPoint + TIKA_PATH)
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_SKIP_EMBEDDED_HEADER, "false")
+                .header(DocumentSelectorConfig.X_TIKA_SKIP_EMBEDDED_HEADER, "false")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_RECURSIVE_DOC));
         String responseMsg = getStringFromInputStream((InputStream) response.getEntity());
         assertContains("embed4.txt", responseMsg);
 
         response = WebClient.create(endPoint + TIKA_PATH)
                 .accept("text/plain")
-                .header(TikaResource.X_TIKA_SKIP_EMBEDDED_HEADER, "true")
+                .header(DocumentSelectorConfig.X_TIKA_SKIP_EMBEDDED_HEADER, "true")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_RECURSIVE_DOC));
         responseMsg = getStringFromInputStream((InputStream) response.getEntity());
         assertNotFound("embed4.txt", responseMsg);
diff --git a/tika-server/src/test/java/org/apache/tika/server/UnpackerResourceTest.java b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/UnpackerResourceTest.java
similarity index 80%
rename from tika-server/src/test/java/org/apache/tika/server/UnpackerResourceTest.java
rename to tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/UnpackerResourceTest.java
index 039d28f..4c5fae9 100644
--- a/tika-server/src/test/java/org/apache/tika/server/UnpackerResourceTest.java
+++ b/tika-server/tika-server-classic/src/test/java/org/apache/tika/server/classic/UnpackerResourceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.classic;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -35,10 +35,12 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.parser.ocr.TesseractOCRConfig;
 import org.apache.tika.parser.ocr.TesseractOCRParser;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.writer.TarWriter;
-import org.apache.tika.server.resource.UnpackerResource;
-import org.apache.tika.server.writer.ZipWriter;
+import org.apache.tika.server.classic.config.PDFServerConfig;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.TikaServerParseExceptionMapper;
+import org.apache.tika.server.core.writer.TarWriter;
+import org.apache.tika.server.core.resource.UnpackerResource;
+import org.apache.tika.server.core.writer.ZipWriter;
 import org.junit.Assume;
 import org.junit.Test;
 
@@ -47,7 +49,7 @@ public class UnpackerResourceTest extends CXFTestBase {
     private static final String UNPACKER_PATH = BASE_PATH + "";
     private static final String ALL_PATH = BASE_PATH + "/all";
 
-    private static final String TEST_DOC_WAV = "Doc1_ole.doc";
+    private static final String TEST_DOC_WAV = "test-documents/Doc1_ole.doc";
     private static final String WAV1_MD5 = "bdd0a78a54968e362445364f95d8dc96";
     private static final String WAV1_NAME = "_1310388059/MSj00974840000[1].wav";
     private static final String WAV2_MD5 = "3bbd42fb1ac0e46a95350285f16d9596";
@@ -57,7 +59,7 @@ public class UnpackerResourceTest extends CXFTestBase {
     private static final String JPG_MD5 = XSL_IMAGE1_MD5;
     private static final String JPG2_NAME = "image2.jpg";
     private static final String JPG2_MD5 = "b27a41d12c646d7fc4f3826cf8183c68";
-    private static final String TEST_DOCX_IMAGE = "2pic.docx";
+    private static final String TEST_DOCX_IMAGE = "test-documents/2pic.docx";
     private static final String DOCX_IMAGE1_MD5 = "5516590467b069fa59397432677bad4d";
     private static final String DOCX_IMAGE2_MD5 = "a5dd81567427070ce0a2ff3e3ef13a4c";
     private static final String DOCX_IMAGE1_NAME = "image1.jpeg";
@@ -89,7 +91,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testDocWAV() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .type(APPLICATION_MSWORD).accept("application/zip")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOC_WAV));
 
@@ -101,7 +103,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testDocWAVText() throws Exception {
-        Response response = WebClient.create(endPoint + ALL_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + ALL_PATH)
                 .type(APPLICATION_MSWORD).accept("application/zip")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOC_WAV));
 
@@ -113,7 +115,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testDocPicture() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .type(APPLICATION_MSWORD).accept("application/zip")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOC_WAV));
 
@@ -124,9 +126,9 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testDocPictureNoOle() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .type(APPLICATION_MSWORD).accept("application/zip")
-                .put(ClassLoader.getSystemResourceAsStream("2pic.doc"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/2pic.doc"));
 
         Map<String, String> data = readZipArchive((InputStream) response.getEntity());
         assertEquals(JPG2_MD5, data.get(JPG2_NAME));
@@ -134,7 +136,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testImageDOCX() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .accept("application/zip").put(
                         ClassLoader.getSystemResourceAsStream(TEST_DOCX_IMAGE));
 
@@ -145,7 +147,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void test204() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .type("xxx/xxx")
                 .accept("*/*")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOC_WAV));
@@ -155,8 +157,8 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testExeDOCX() throws Exception {
-        String TEST_DOCX_EXE = "2exe.docx";
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        String TEST_DOCX_EXE = "test-documents/2exe.docx";
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .accept("application/zip")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOCX_EXE));
 
@@ -168,9 +170,9 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testImageXSL() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .accept("application/zip")
-                .put(ClassLoader.getSystemResourceAsStream("pic.xls"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/pic.xls"));
 
         Map<String, String> data = readZipArchive((InputStream) response.getEntity());
         assertEquals(XSL_IMAGE1_MD5, data.get("0.jpg"));
@@ -179,7 +181,7 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testTarDocPicture() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
                 .type(APPLICATION_MSWORD).accept("application/x-tar")
                 .put(ClassLoader.getSystemResourceAsStream(TEST_DOC_WAV));
 
@@ -190,10 +192,10 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testText() throws Exception {
-        Response response = WebClient.create(endPoint + ALL_PATH)
+        Response response = WebClient.create(CXFTestBase.endPoint + ALL_PATH)
                 .header(CONTENT_TYPE, APPLICATION_XML)
                 .accept("application/zip")
-                .put(ClassLoader.getSystemResourceAsStream("test.doc"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/test.doc"));
 
         String responseMsg = readArchiveText((InputStream) response.getEntity());
         assertNotNull(responseMsg);
@@ -202,10 +204,10 @@ public class UnpackerResourceTest extends CXFTestBase {
 
     @Test
     public void testPDFImages() throws Exception {
-        Response response = WebClient.create(endPoint + UNPACKER_PATH)
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"ExtractInlineImages", "true")
+        Response response = WebClient.create(CXFTestBase.endPoint + UNPACKER_PATH)
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"ExtractInlineImages", "true")
                 .accept("application/zip")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         Map<String, String> results = readZipArchive((InputStream)response.getEntity());
         assertTrue(results.containsKey("image0.png"));
         String md5 = results.get("image0.png");
@@ -220,11 +222,11 @@ public class UnpackerResourceTest extends CXFTestBase {
     public void testPDFRenderOCR() throws Exception {
         Assume.assumeTrue( new TesseractOCRParser().hasTesseract(new TesseractOCRConfig()));
 
-        Response response = WebClient.create(endPoint + ALL_PATH)
-                .header(TikaResource.X_TIKA_PDF_HEADER_PREFIX+"ocrStrategy", "ocr_only")
+        Response response = WebClient.create(CXFTestBase.endPoint + ALL_PATH)
+                .header(PDFServerConfig.X_TIKA_PDF_HEADER_PREFIX+"ocrStrategy", "ocr_only")
                 .accept("application/zip")
-                .put(ClassLoader.getSystemResourceAsStream("testOCR.pdf"));
+                .put(ClassLoader.getSystemResourceAsStream("test-documents/testOCR.pdf"));
         String txt = readArchiveText((InputStream)response.getEntity());
-        assertContains("Happy New Year", txt);
+        CXFTestBase.assertContains("Happy New Year", txt);
     }
 }
diff --git a/tika-server/src/test/resources/org/apache/tika/server/TIKA-3137-include.xml b/tika-server/tika-server-classic/src/test/resources/config/TIKA-3137-include.xml
similarity index 100%
rename from tika-server/src/test/resources/org/apache/tika/server/TIKA-3137-include.xml
rename to tika-server/tika-server-classic/src/test/resources/config/TIKA-3137-include.xml
diff --git a/tika-server/src/test/resources/log4j.properties b/tika-server/tika-server-classic/src/test/resources/log4j.properties
similarity index 97%
copy from tika-server/src/test/resources/log4j.properties
copy to tika-server/tika-server-classic/src/test/resources/log4j.properties
index 6aa860a..c3676a2 100644
--- a/tika-server/src/test/resources/log4j.properties
+++ b/tika-server/tika-server-classic/src/test/resources/log4j.properties
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 #info,debug, error,fatal ...
-log4j.rootLogger=info,stderr
+log4j.rootLogger=warn,stderr
 
 #console
 log4j.appender.stderr=org.apache.log4j.ConsoleAppender
diff --git a/tika-server/src/test/resources/2exe.docx b/tika-server/tika-server-classic/src/test/resources/test-documents/2exe.docx
similarity index 100%
rename from tika-server/src/test/resources/2exe.docx
rename to tika-server/tika-server-classic/src/test/resources/test-documents/2exe.docx
diff --git a/tika-server/src/test/resources/2pic.doc b/tika-server/tika-server-classic/src/test/resources/test-documents/2pic.doc
similarity index 100%
rename from tika-server/src/test/resources/2pic.doc
rename to tika-server/tika-server-classic/src/test/resources/test-documents/2pic.doc
diff --git a/tika-server/src/test/resources/2pic.docx b/tika-server/tika-server-classic/src/test/resources/test-documents/2pic.docx
similarity index 100%
rename from tika-server/src/test/resources/2pic.docx
rename to tika-server/tika-server-classic/src/test/resources/test-documents/2pic.docx
diff --git a/tika-server/src/test/resources/CDEC_WEATHER_2010_03_02 b/tika-server/tika-server-classic/src/test/resources/test-documents/CDEC_WEATHER_2010_03_02
similarity index 100%
rename from tika-server/src/test/resources/CDEC_WEATHER_2010_03_02
rename to tika-server/tika-server-classic/src/test/resources/test-documents/CDEC_WEATHER_2010_03_02
diff --git a/tika-server/src/test/resources/Doc1_ole.doc b/tika-server/tika-server-classic/src/test/resources/test-documents/Doc1_ole.doc
similarity index 100%
rename from tika-server/src/test/resources/Doc1_ole.doc
rename to tika-server/tika-server-classic/src/test/resources/test-documents/Doc1_ole.doc
diff --git a/tika-server/src/test/resources/foo.csv b/tika-server/tika-server-classic/src/test/resources/test-documents/foo.csv
similarity index 100%
rename from tika-server/src/test/resources/foo.csv
rename to tika-server/tika-server-classic/src/test/resources/test-documents/foo.csv
diff --git a/tika-server/src/test/resources/password.xls b/tika-server/tika-server-classic/src/test/resources/test-documents/password.xls
similarity index 100%
rename from tika-server/src/test/resources/password.xls
rename to tika-server/tika-server-classic/src/test/resources/test-documents/password.xls
diff --git a/tika-server/src/test/resources/pic.xls b/tika-server/tika-server-classic/src/test/resources/test-documents/pic.xls
similarity index 100%
rename from tika-server/src/test/resources/pic.xls
rename to tika-server/tika-server-classic/src/test/resources/test-documents/pic.xls
diff --git a/tika-server/src/test/resources/pic.xlsx b/tika-server/tika-server-classic/src/test/resources/test-documents/pic.xlsx
similarity index 100%
rename from tika-server/src/test/resources/pic.xlsx
rename to tika-server/tika-server-classic/src/test/resources/test-documents/pic.xlsx
diff --git a/tika-server/src/test/resources/test.doc b/tika-server/tika-server-classic/src/test/resources/test-documents/test.doc
similarity index 100%
rename from tika-server/src/test/resources/test.doc
rename to tika-server/tika-server-classic/src/test/resources/test-documents/test.doc
diff --git a/tika-server/src/test/resources/testHTML.html b/tika-server/tika-server-classic/src/test/resources/test-documents/testHTML.html
similarity index 100%
rename from tika-server/src/test/resources/testHTML.html
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testHTML.html
diff --git a/tika-server/src/test/resources/testOCR.pdf b/tika-server/tika-server-classic/src/test/resources/test-documents/testOCR.pdf
similarity index 100%
rename from tika-server/src/test/resources/testOCR.pdf
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testOCR.pdf
diff --git a/tika-server/src/test/resources/testPDFTwoTextBoxes.pdf b/tika-server/tika-server-classic/src/test/resources/test-documents/testPDFTwoTextBoxes.pdf
similarity index 100%
rename from tika-server/src/test/resources/testPDFTwoTextBoxes.pdf
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testPDFTwoTextBoxes.pdf
diff --git a/tika-server/src/test/resources/testPassword4Spaces.pdf b/tika-server/tika-server-classic/src/test/resources/test-documents/testPassword4Spaces.pdf
similarity index 100%
rename from tika-server/src/test/resources/testPassword4Spaces.pdf
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testPassword4Spaces.pdf
diff --git a/tika-server/src/test/resources/testRTF_npeFromWMFInTikaServer.rtf b/tika-server/tika-server-classic/src/test/resources/test-documents/testRTF_npeFromWMFInTikaServer.rtf
similarity index 100%
rename from tika-server/src/test/resources/testRTF_npeFromWMFInTikaServer.rtf
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testRTF_npeFromWMFInTikaServer.rtf
diff --git a/tika-server/src/test/resources/testUnicodePassword.pdf b/tika-server/tika-server-classic/src/test/resources/test-documents/testUnicodePassword.pdf
similarity index 100%
rename from tika-server/src/test/resources/testUnicodePassword.pdf
rename to tika-server/tika-server-classic/src/test/resources/test-documents/testUnicodePassword.pdf
diff --git a/tika-server/src/test/resources/test_recursive_embedded.docx b/tika-server/tika-server-classic/src/test/resources/test-documents/test_recursive_embedded.docx
similarity index 100%
rename from tika-server/src/test/resources/test_recursive_embedded.docx
rename to tika-server/tika-server-classic/src/test/resources/test-documents/test_recursive_embedded.docx
diff --git a/tika-server/pom.xml b/tika-server/tika-server-core/pom.xml
similarity index 85%
copy from tika-server/pom.xml
copy to tika-server/tika-server-core/pom.xml
index 8aeb14a..954550d 100644
--- a/tika-server/pom.xml
+++ b/tika-server/tika-server-core/pom.xml
@@ -1,36 +1,16 @@
-<!--
-  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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
+        <artifactId>tika-server</artifactId>
         <groupId>org.apache.tika</groupId>
-        <artifactId>tika-parent</artifactId>
         <version>2.0.0-SNAPSHOT</version>
-        <relativePath>../tika-parent/pom.xml</relativePath>
     </parent>
 
-    <artifactId>tika-server</artifactId>
-    <name>Apache Tika server</name>
-    <url>http://tika.apache.org/</url>
+    <modelVersion>4.0.0</modelVersion>
 
-    <properties>
-    </properties>
+    <artifactId>tika-server-core</artifactId>
 
     <pluginRepositories>
         <pluginRepository>
@@ -41,11 +21,7 @@
     </pluginRepositories>
 
     <dependencies>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>tika-parsers-classic-package</artifactId>
-            <version>${project.version}</version>
-        </dependency>
+
         <dependency>
             <groupId>${project.groupId}</groupId>
             <artifactId>tika-translate</artifactId>
@@ -64,7 +40,17 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
-            <artifactId>tika-xmp</artifactId>
+            <artifactId>tika-parser-html-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parser-digest-commons</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>tika-parser-zip-commons</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
@@ -180,11 +166,6 @@
                             <createDependencyReducedPom>
                                 false
                             </createDependencyReducedPom>
-                            <artifactSet>
-                                <excludes>
-                                    <exclude>org.apache.tika:tika-parsers:jar:</exclude>
-                                </excludes>
-                            </artifactSet>
                             <filters>
                                 <filter>
                                     <artifact>*:*</artifact>
@@ -203,21 +184,13 @@
                                         <exclude>CHANGES</exclude>
                                         <exclude>README</exclude>
                                         <exclude>builddef.lst</exclude>
-                                        <!-- clutter not needed in jar -->
-                                        <exclude>resources/grib1/nasa/README*.pdf</exclude>
-                                        <exclude>resources/grib1/**/readme*.txt</exclude>
-                                        <exclude>resources/grib2/**/readme*.txt</exclude>
-                                        <!-- TIKA-763: Workaround to avoid including LGPL classes -->
-                                        <exclude>ucar/nc2/iosp/fysat/Fysat*.class</exclude>
-                                        <exclude>ucar/nc2/dataset/transform/VOceanSG1*class</exclude>
-                                        <exclude>ucar/unidata/geoloc/vertical/OceanSG*.class</exclude>
                                     </excludes>
                                 </filter>
                             </filters>
                             <transformers>
                                 <transformer
                                         implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <mainClass>org.apache.tika.server.TikaServerCli</mainClass>
+                                    <mainClass>org.apache.tika.server.core.TikaServerCli</mainClass>
                                 </transformer>
                                 <transformer
                                         implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
@@ -287,7 +260,7 @@
                 <configuration>
                     <archive>
                         <manifestEntries>
-                            <Automatic-Module-Name>org.apache.tika.server</Automatic-Module-Name>
+                            <Automatic-Module-Name>org.apache.tika.server.core</Automatic-Module-Name>
                         </manifestEntries>
                     </archive>
                 </configuration>
@@ -347,7 +320,7 @@
                                     <goal>java</goal>
                                 </goals>
                                 <configuration>
-                                    <mainClass>org.apache.tika.server.TikaServerCli</mainClass>
+                                    <mainClass>org.apache.tika.server.core.TikaServerCli</mainClass>
                                 </configuration>
                             </execution>
                         </executions>
@@ -387,16 +360,4 @@
         </profile>
     </profiles>
 
-    <organization>
-        <name>The Apache Software Foundation</name>
-        <url>http://www.apache.org</url>
-    </organization>
-    <issueManagement>
-        <system>JIRA</system>
-        <url>https://issues.apache.org/jira/browse/TIKA</url>
-    </issueManagement>
-    <ciManagement>
-        <system>Jenkins</system>
-        <url>https://builds.apache.org/job/Tika-trunk/</url>
-    </ciManagement>
-</project>
+</project>
\ No newline at end of file
diff --git a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/CompositeParseContextConfig.java
similarity index 53%
copy from tika-server/src/main/java/org/apache/tika/server/MetadataList.java
copy to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/CompositeParseContextConfig.java
index 599e20f..0bc0e46 100644
--- a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/CompositeParseContextConfig.java
@@ -1,5 +1,3 @@
-package org.apache.tika.server;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -16,22 +14,30 @@ package org.apache.tika.server;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.tika.server.core;
 
+import org.apache.tika.config.ServiceLoader;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
 
+import javax.ws.rs.core.MultivaluedMap;
 import java.util.List;
 
-/**
- * wrapper class to make isWriteable in MetadataListMBW simpler
- */
-public class MetadataList {
-    private final List<Metadata> metadata;
+public class CompositeParseContextConfig implements ParseContextConfig {
+
+
+    final List<ParseContextConfig> configs;
 
-    public MetadataList(List<Metadata> metadata) {
-        this.metadata = metadata;
+    public CompositeParseContextConfig() {
+        configs = new ServiceLoader(CompositeParseContextConfig.class.getClassLoader())
+                .loadServiceProviders(ParseContextConfig.class);
     }
 
-    public List<Metadata> getMetadata() {
-        return metadata;
+    @Override
+    public void configure(MultivaluedMap<String, String> httpHeaders,
+                          Metadata metadata, ParseContext context) {
+        for (ParseContextConfig config : configs) {
+            config.configure(httpHeaders, metadata, context);
+        }
     }
 }
diff --git a/tika-server/src/main/java/org/apache/tika/server/DefaultInputStreamFactory.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/DefaultInputStreamFactory.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/DefaultInputStreamFactory.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/DefaultInputStreamFactory.java
index f1d6aa6..c09b139 100644
--- a/tika-server/src/main/java/org/apache/tika/server/DefaultInputStreamFactory.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/DefaultInputStreamFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.apache.tika.metadata.Metadata;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/HTMLHelper.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/HTMLHelper.java
index a7e8907..f4af353 100644
--- a/tika-server/src/main/java/org/apache/tika/server/HTMLHelper.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/HTMLHelper.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.apache.commons.io.IOUtils;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/InputStreamFactory.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/InputStreamFactory.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/InputStreamFactory.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/InputStreamFactory.java
index 3bd4170..4d293c6 100644
--- a/tika-server/src/main/java/org/apache/tika/server/InputStreamFactory.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/InputStreamFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.apache.tika.metadata.Metadata;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/MetadataList.java
similarity index 96%
copy from tika-server/src/main/java/org/apache/tika/server/MetadataList.java
copy to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/MetadataList.java
index 599e20f..1a2ce91 100644
--- a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/MetadataList.java
@@ -1,4 +1,4 @@
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ParseContextConfig.java
similarity index 64%
rename from tika-server/src/main/java/org/apache/tika/server/MetadataList.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ParseContextConfig.java
index 599e20f..de6191b 100644
--- a/tika-server/src/main/java/org/apache/tika/server/MetadataList.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ParseContextConfig.java
@@ -1,5 +1,3 @@
-package org.apache.tika.server;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -16,22 +14,22 @@ package org.apache.tika.server;
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.tika.server.core;
 
+import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
 
-import java.util.List;
+import javax.ws.rs.core.MultivaluedMap;
 
 /**
- * wrapper class to make isWriteable in MetadataListMBW simpler
+ * Implementations must be thread-safe!
+ *
+ * This class translates http headers into objects/configurations set
+ * via the ParseConfig
  */
-public class MetadataList {
-    private final List<Metadata> metadata;
-
-    public MetadataList(List<Metadata> metadata) {
-        this.metadata = metadata;
-    }
+public interface ParseContextConfig {
 
-    public List<Metadata> getMetadata() {
-        return metadata;
-    }
+    void configure(MultivaluedMap<String, String> headers,
+                   Metadata metadata, ParseContext context);
 }
diff --git a/tika-server/src/main/java/org/apache/tika/server/ServerStatus.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
similarity index 99%
rename from tika-server/src/main/java/org/apache/tika/server/ServerStatus.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
index bc9ad0a..7ad830f 100644
--- a/tika-server/src/main/java/org/apache/tika/server/ServerStatus.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatus.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/tika-server/src/main/java/org/apache/tika/server/ServerStatusWatcher.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatusWatcher.java
similarity index 99%
rename from tika-server/src/main/java/org/apache/tika/server/ServerStatusWatcher.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatusWatcher.java
index b56ffc6..cec3024 100644
--- a/tika-server/src/main/java/org/apache/tika/server/ServerStatusWatcher.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerStatusWatcher.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/tika-server/src/main/java/org/apache/tika/server/ServerTimeouts.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerTimeouts.java
similarity index 99%
rename from tika-server/src/main/java/org/apache/tika/server/ServerTimeouts.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerTimeouts.java
index 17959bf..94bf704 100644
--- a/tika-server/src/main/java/org/apache/tika/server/ServerTimeouts.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/ServerTimeouts.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 public class ServerTimeouts {
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/TaskStatus.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TaskStatus.java
similarity index 90%
rename from tika-server/src/main/java/org/apache/tika/server/TaskStatus.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TaskStatus.java
index 1637d7d..07d1373 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TaskStatus.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TaskStatus.java
@@ -14,12 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import java.time.Instant;
 import java.util.Optional;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicInteger;
 
 public class TaskStatus {
     final ServerStatus.TASK task;
diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaLoggingFilter.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaLoggingFilter.java
index 266818e..3532eda 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaLoggingFilter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaLoggingFilter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerCli.java
similarity index 93%
rename from tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerCli.java
index 7995ae7..d0b27df 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerCli.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerCli.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -46,27 +46,26 @@ import org.apache.tika.config.TikaConfig;
 import org.apache.tika.parser.DigestingParser;
 import org.apache.tika.parser.digestutils.BouncyCastleDigester;
 import org.apache.tika.parser.digestutils.CommonsDigester;
-import org.apache.tika.server.resource.DetectorResource;
-import org.apache.tika.server.resource.LanguageResource;
-import org.apache.tika.server.resource.MetadataResource;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.resource.TikaDetectors;
-import org.apache.tika.server.resource.TikaMimeTypes;
-import org.apache.tika.server.resource.TikaParsers;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.resource.TikaServerStatus;
-import org.apache.tika.server.resource.TikaVersion;
-import org.apache.tika.server.resource.TikaWelcome;
-import org.apache.tika.server.resource.TranslateResource;
-import org.apache.tika.server.resource.UnpackerResource;
-import org.apache.tika.server.writer.CSVMessageBodyWriter;
-import org.apache.tika.server.writer.JSONMessageBodyWriter;
-import org.apache.tika.server.writer.JSONObjWriter;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
-import org.apache.tika.server.writer.TarWriter;
-import org.apache.tika.server.writer.TextMessageBodyWriter;
-import org.apache.tika.server.writer.XMPMessageBodyWriter;
-import org.apache.tika.server.writer.ZipWriter;
+import org.apache.tika.server.core.resource.DetectorResource;
+import org.apache.tika.server.core.resource.LanguageResource;
+import org.apache.tika.server.core.resource.MetadataResource;
+import org.apache.tika.server.core.resource.RecursiveMetadataResource;
+import org.apache.tika.server.core.resource.TikaDetectors;
+import org.apache.tika.server.core.resource.TikaMimeTypes;
+import org.apache.tika.server.core.resource.TikaParsers;
+import org.apache.tika.server.core.resource.TikaResource;
+import org.apache.tika.server.core.resource.TikaServerStatus;
+import org.apache.tika.server.core.resource.TikaVersion;
+import org.apache.tika.server.core.resource.TikaWelcome;
+import org.apache.tika.server.core.resource.TranslateResource;
+import org.apache.tika.server.core.resource.UnpackerResource;
+import org.apache.tika.server.core.writer.CSVMessageBodyWriter;
+import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
+import org.apache.tika.server.core.writer.JSONObjWriter;
+import org.apache.tika.server.core.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.writer.TarWriter;
+import org.apache.tika.server.core.writer.TextMessageBodyWriter;
+import org.apache.tika.server.core.writer.ZipWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -327,7 +326,7 @@ public class TikaServerCli {
             providers.add(new CSVMessageBodyWriter());
             providers.add(new MetadataListMessageBodyWriter());
             providers.add(new JSONMessageBodyWriter());
-            providers.add(new XMPMessageBodyWriter());
+            //providers.add(new XMPMessageBodyWriter());
             providers.add(new TextMessageBodyWriter());
             providers.add(new TikaServerParseExceptionMapper(returnStackTrace));
             if (line.hasOption("status")) {
diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerParseException.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseException.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/TikaServerParseException.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseException.java
index f6d8f7c..898a623 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerParseException.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseException.java
@@ -1,4 +1,4 @@
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerParseExceptionMapper.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
similarity index 95%
rename from tika-server/src/main/java/org/apache/tika/server/TikaServerParseExceptionMapper.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
index 21c28b6..4401d2e 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerParseExceptionMapper.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerParseExceptionMapper.java
@@ -1,4 +1,4 @@
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -27,9 +27,10 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.io.Writer;
 
-import org.apache.poi.hwpf.OldWordFileFormatException;
+
 import org.apache.tika.exception.EncryptedDocumentException;
 import org.apache.tika.exception.TikaException;
+import org.apache.tika.exception.UnsupportedFormatException;
 
 @Provider
 public class TikaServerParseExceptionMapper implements ExceptionMapper<TikaServerParseException> {
@@ -60,7 +61,7 @@ public class TikaServerParseExceptionMapper implements ExceptionMapper<TikaServe
                 return buildResponse(cause, 422);
             } else if (cause instanceof IllegalStateException) {
                 return buildResponse(cause, 422);
-            } else if (cause instanceof OldWordFileFormatException) {
+            } else if (cause instanceof UnsupportedFormatException) {
                 return buildResponse(cause, 422);
             } else if (cause instanceof WebApplicationException) {
                 return ((WebApplicationException) e.getCause()).getResponse();
diff --git a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
similarity index 99%
rename from tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
index 605b262..28973a7 100644
--- a/tika-server/src/main/java/org/apache/tika/server/TikaServerWatchDog.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/TikaServerWatchDog.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.apache.tika.utils.ProcessUtils;
 import org.slf4j.Logger;
@@ -402,7 +402,7 @@ public class TikaServerWatchDog {
                 jvmArgs.add(cp);
             }
             argList.addAll(jvmArgs);
-            argList.add("org.apache.tika.server.TikaServerCli");
+            argList.add("org.apache.tika.server.core.TikaServerCli");
             argList.addAll(childArgs);
             argList.add("-child");
             argList.add("--numRestarts");
diff --git a/tika-server/src/main/java/org/apache/tika/server/URLEnabledInputStreamFactory.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/URLEnabledInputStreamFactory.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/URLEnabledInputStreamFactory.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/URLEnabledInputStreamFactory.java
index 775f27a..bdb71c6 100644
--- a/tika-server/src/main/java/org/apache/tika/server/URLEnabledInputStreamFactory.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/URLEnabledInputStreamFactory.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import javax.ws.rs.core.HttpHeaders;
 import java.io.IOException;
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/DocumentSelectorConfig.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/DocumentSelectorConfig.java
new file mode 100644
index 0000000..574a313
--- /dev/null
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/DocumentSelectorConfig.java
@@ -0,0 +1,32 @@
+package org.apache.tika.server.core.config;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.extractor.DocumentSelector;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.server.core.ParseContextConfig;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+public class DocumentSelectorConfig implements ParseContextConfig {
+
+    public static final String X_TIKA_SKIP_EMBEDDED_HEADER = "X-Tika-Skip-Embedded";
+
+    @Override
+    public void configure(MultivaluedMap<String, String> httpHeaders,
+                          Metadata mtadata, ParseContext context) {
+        DocumentSelector documentSelector = null;
+        for (String key : httpHeaders.keySet()) {
+            if (StringUtils.endsWithIgnoreCase(key, X_TIKA_SKIP_EMBEDDED_HEADER)) {
+                String skipEmbedded = httpHeaders.getFirst(key);
+                if (Boolean.parseBoolean(skipEmbedded)) {
+                    documentSelector = metadata -> false;
+                }
+            }
+        }
+        if (documentSelector != null) {
+            context.set(DocumentSelector.class, documentSelector);
+        }
+    }
+}
diff --git a/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/PasswordProviderConfig.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/PasswordProviderConfig.java
new file mode 100644
index 0000000..d2bbcfc
--- /dev/null
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/config/PasswordProviderConfig.java
@@ -0,0 +1,45 @@
+package org.apache.tika.server.core.config;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.PasswordProvider;
+import org.apache.tika.server.core.ParseContextConfig;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class PasswordProviderConfig implements ParseContextConfig {
+    private static final Base64 BASE_64 = new Base64();
+
+    public static final String PASSWORD = "Password";
+    public static final String PASSWORD_BASE64_UTF8 = "Password_Base64_UTF-8";
+
+    @Override
+    public void configure(MultivaluedMap<String, String> httpHeaders,
+                          Metadata metadata, ParseContext context) {
+        String tmpPassword = httpHeaders.getFirst(PASSWORD_BASE64_UTF8);
+        if (tmpPassword != null) {
+            tmpPassword = decodeBase64UTF8(tmpPassword);
+        } else {
+            tmpPassword = httpHeaders.getFirst(PASSWORD);
+        }
+        if (tmpPassword != null) {
+            final String password = tmpPassword;
+            context.set(PasswordProvider.class, new PasswordProvider() {
+                @Override
+                public String getPassword(Metadata metadata) {
+                    return password;
+                }
+            });
+        }
+    }
+
+    private static String decodeBase64UTF8(String s) {
+        byte[] bytes = BASE_64.decode(s);
+        return new String(bytes, UTF_8);
+    }
+
+}
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/DetectorResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java
similarity index 96%
rename from tika-server/src/main/java/org/apache/tika/server/resource/DetectorResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java
index 6d3ce89..8714e2f 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/DetectorResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/DetectorResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.PUT;
@@ -31,7 +31,7 @@ import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
-import org.apache.tika.server.ServerStatus;
+import org.apache.tika.server.core.ServerStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/LanguageResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/LanguageResource.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/resource/LanguageResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/LanguageResource.java
index 537b1e6..89383f7 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/LanguageResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/LanguageResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/MetadataResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java
similarity index 89%
rename from tika-server/src/main/java/org/apache/tika/server/resource/MetadataResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java
index 95199a3..7587bf7 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/MetadataResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/MetadataResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
@@ -32,6 +32,7 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
+import org.apache.tika.extractor.DocumentSelector;
 import org.apache.tika.language.detect.LanguageHandler;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
@@ -39,6 +40,9 @@ import org.apache.tika.parser.Parser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.tika.server.core.resource.TikaResource.fillMetadata;
+import static org.apache.tika.server.core.resource.TikaResource.fillParseContext;
+
 
 @Path("/meta")
 public class MetadataResource {
@@ -46,7 +50,7 @@ public class MetadataResource {
 
     @POST
     @Consumes("multipart/form-data")
-    @Produces({"text/csv", "application/json", "application/rdf+xml"})
+    @Produces({"text/csv", "application/json"})
     @Path("form")
     public Response getMetadataFromMultipart(Attachment att, @Context UriInfo info) throws Exception {
         return Response.ok(
@@ -55,7 +59,7 @@ public class MetadataResource {
     }
 
     @PUT
-    @Produces({"text/csv", "application/json", "application/rdf+xml"})
+    @Produces({"text/csv", "application/json"})
     public Response getMetadata(InputStream is, @Context HttpHeaders httpHeaders, @Context UriInfo info) throws Exception {
         Metadata metadata = new Metadata();
         return Response.ok(
@@ -86,7 +90,7 @@ public class MetadataResource {
      */
     @PUT
     @Path("{field}")
-    @Produces({"text/csv", "application/json", "application/rdf+xml", "text/plain"})
+    @Produces({"text/csv", "application/json", "text/plain"})
     public Response getMetadataField(InputStream is, @Context HttpHeaders httpHeaders,
                                      @Context UriInfo info, @PathParam("field") String field) throws Exception {
 
@@ -123,9 +127,11 @@ public class MetadataResource {
                                    MultivaluedMap<String, String> httpHeaders, UriInfo info) throws IOException {
         final ParseContext context = new ParseContext();
         Parser parser = TikaResource.createParser();
-        TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
-        //no need to pass parser for embedded document parsing
-        TikaResource.fillParseContext(context, httpHeaders, null);
+        fillMetadata(parser, metadata, httpHeaders);
+        fillParseContext(httpHeaders, metadata, context);
+        //no need to parse embedded docs
+        context.set(DocumentSelector.class, metadata1 -> false);
+
         TikaResource.logRequest(LOG, info, metadata);
         TikaResource.parse(parser, LOG, info.getPath(), is,
                 new LanguageHandler() {
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/RecursiveMetadataResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java
similarity index 94%
rename from tika-server/src/main/java/org/apache/tika/server/resource/RecursiveMetadataResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java
index 71e7180..e0bc1ca 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/RecursiveMetadataResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/RecursiveMetadataResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
@@ -31,17 +31,19 @@ import javax.ws.rs.core.UriInfo;
 import java.io.InputStream;
 
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
-import org.apache.tika.language.detect.LanguageHandler;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.RecursiveParserWrapper;
 import org.apache.tika.sax.BasicContentHandlerFactory;
 import org.apache.tika.sax.RecursiveParserWrapperHandler;
-import org.apache.tika.server.MetadataList;
+import org.apache.tika.server.core.MetadataList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.tika.server.core.resource.TikaResource.fillMetadata;
+import static org.apache.tika.server.core.resource.TikaResource.fillParseContext;
+
 @Path("/rmeta")
 public class RecursiveMetadataResource {
 
@@ -134,9 +136,8 @@ public class RecursiveMetadataResource {
 		RecursiveParserWrapper wrapper = new RecursiveParserWrapper(parser);
 
 
-		TikaResource.fillMetadata(parser, metadata, context, httpHeaders);
-		// no need to add parser to parse recursively
-		TikaResource.fillParseContext(context, httpHeaders, null);
+        fillMetadata(parser, metadata, httpHeaders);
+        fillParseContext(httpHeaders, metadata, context);
 		TikaResource.logRequest(LOG, info, metadata);
 
         int writeLimit = -1;
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaDetectors.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java
similarity index 97%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaDetectors.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java
index e0cd6ba..ce163d5 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaDetectors.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaDetectors.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -28,7 +28,7 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.apache.tika.detect.CompositeDetector;
 import org.apache.tika.detect.Detector;
-import org.apache.tika.server.HTMLHelper;
+import org.apache.tika.server.core.HTMLHelper;
 
 /**
  * <p>Provides details of all the {@link Detector}s registered with
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaMimeTypes.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaMimeTypes.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
index bc8c8ca..be1d84b 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaMimeTypes.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaMimeTypes.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -32,7 +32,7 @@ import org.apache.tika.mime.MediaType;
 import org.apache.tika.mime.MediaTypeRegistry;
 import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.Parser;
-import org.apache.tika.server.HTMLHelper;
+import org.apache.tika.server.core.HTMLHelper;
 
 /**
  * <p>Provides details of all the mimetypes known to Apache Tika,
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaParsers.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaParsers.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java
index 1c5dfae..f1c4abb 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaParsers.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaParsers.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -35,7 +35,7 @@ import org.apache.tika.parser.CompositeParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserDecorator;
-import org.apache.tika.server.HTMLHelper;
+import org.apache.tika.server.core.HTMLHelper;
 
 /**
  * <p>Provides details of all the {@link Parser}s registered with
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
similarity index 83%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
index f48a89d..627a12a 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaResource.java
@@ -15,18 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.attachment.ContentDisposition;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
-import org.apache.poi.ooxml.extractor.ExtractorFactory;
 import org.apache.tika.Tika;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.detect.Detector;
 import org.apache.tika.exception.EncryptedDocumentException;
-import org.apache.tika.extractor.DocumentSelector;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MediaType;
@@ -35,16 +33,15 @@ import org.apache.tika.parser.DigestingParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
 import org.apache.tika.parser.ParserDecorator;
-import org.apache.tika.parser.PasswordProvider;
-import org.apache.tika.parser.html.BoilerpipeContentHandler;
-import org.apache.tika.parser.ocr.TesseractOCRConfig;
-import org.apache.tika.parser.pdf.PDFParserConfig;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.ExpandedTitleContentHandler;
 import org.apache.tika.sax.RichTextContentHandler;
-import org.apache.tika.server.InputStreamFactory;
-import org.apache.tika.server.ServerStatus;
-import org.apache.tika.server.TikaServerParseException;
+import org.apache.tika.sax.boilerpipe.BoilerpipeContentHandler;
+import org.apache.tika.server.core.CompositeParseContextConfig;
+import org.apache.tika.server.core.InputStreamFactory;
+import org.apache.tika.server.core.ParseContextConfig;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TikaServerParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.ContentHandler;
@@ -87,19 +84,18 @@ public class TikaResource {
     private static Pattern ALLOWABLE_HEADER_CHARS = Pattern.compile("(?i)^[-/_+\\.A-Z0-9 ]+$");
 
     public static final String GREETING = "This is Tika Server (" + new Tika().toString() + "). Please PUT\n";
-    public static final String X_TIKA_OCR_HEADER_PREFIX = "X-Tika-OCR";
-    public static final String X_TIKA_PDF_HEADER_PREFIX = "X-Tika-PDF";
-    public static final String X_TIKA_SKIP_EMBEDDED_HEADER = "X-Tika-Skip-Embedded";
-    public static final String PASSWORD = "Password";
-    public static final String PASSWORD_BASE64_UTF8 = "Password_Base64_UTF-8";
+
 
     private static final Logger LOG = LoggerFactory.getLogger(TikaResource.class);
-    private static final Base64 BASE_64 = new Base64();
 
     private static TikaConfig tikaConfig;
     private static DigestingParser.Digester digester = null;
     private static InputStreamFactory inputStreamFactory = null;
     private static ServerStatus SERVER_STATUS = null;
+
+    private static ParseContextConfig PARSE_CONTEXT_CONFIG = new CompositeParseContextConfig();
+
+
     public static void init(TikaConfig config, DigestingParser.Digester digestr,
                             InputStreamFactory iSF, ServerStatus serverStatus) {
         tikaConfig = config;
@@ -108,9 +104,7 @@ public class TikaResource {
         SERVER_STATUS = serverStatus;
     }
 
-    static {
-        ExtractorFactory.setAllThreadsPreferEventExtractors(true);
-    }
+
 
     @SuppressWarnings("serial")
     public static Parser createParser() {
@@ -145,40 +139,10 @@ public class TikaResource {
         return httpHeaders.getFirst("File-Name");
     }
 
-    public static void fillParseContext(ParseContext parseContext, MultivaluedMap<String, String> httpHeaders,
-                                        Parser embeddedParser) {
-        //lazily initialize configs
-        //if a header is submitted, any params set in --tika-config tika-config.xml
-        //upon server startup will be ignored.
-        TesseractOCRConfig ocrConfig = null;
-        PDFParserConfig pdfParserConfig = null;
-        DocumentSelector documentSelector = null;
-        for (String key : httpHeaders.keySet()) {
-            if (StringUtils.startsWith(key, X_TIKA_OCR_HEADER_PREFIX)) {
-                ocrConfig = (ocrConfig == null) ? new TesseractOCRConfig() : ocrConfig;
-                processHeaderConfig(httpHeaders, ocrConfig, key, X_TIKA_OCR_HEADER_PREFIX);
-            } else if (StringUtils.startsWith(key, X_TIKA_PDF_HEADER_PREFIX)) {
-                pdfParserConfig = (pdfParserConfig == null) ? new PDFParserConfig() : pdfParserConfig;
-                processHeaderConfig(httpHeaders, pdfParserConfig, key, X_TIKA_PDF_HEADER_PREFIX);
-            } else if (StringUtils.endsWithIgnoreCase(key, X_TIKA_SKIP_EMBEDDED_HEADER)) {
-                String skipEmbedded = httpHeaders.getFirst(key);
-                if (Boolean.parseBoolean(skipEmbedded)) {
-                    documentSelector = metadata -> false;
-                }
-            }
-        }
-        if (ocrConfig != null) {
-            parseContext.set(TesseractOCRConfig.class, ocrConfig);
-        }
-        if (pdfParserConfig != null) {
-            parseContext.set(PDFParserConfig.class, pdfParserConfig);
-        }
-        if (embeddedParser != null) {
-            parseContext.set(Parser.class, embeddedParser);
-        }
-        if (documentSelector != null) {
-            parseContext.set(DocumentSelector.class, documentSelector);
-        }
+    public static void fillParseContext(MultivaluedMap<String, String> httpHeaders,
+                                        Metadata metadata,
+                                        ParseContext parseContext) {
+        PARSE_CONTEXT_CONFIG.configure(httpHeaders, metadata, parseContext);
     }
 
     public static InputStream getInputStream(InputStream is, Metadata metadata, HttpHeaders headers) {
@@ -198,7 +162,7 @@ public class TikaResource {
      * @param prefix      the name of the HTTP Header prefix used to find property.
      * @throws WebApplicationException thrown when field cannot be found.
      */
-    private static void processHeaderConfig(MultivaluedMap<String, String> httpHeaders, Object object, String key, String prefix) {
+    public static void processHeaderConfig(MultivaluedMap<String, String> httpHeaders, Object object, String key, String prefix) {
 
         try {String property = StringUtils.removeStart(key, prefix);
             Field field = null;
@@ -305,7 +269,8 @@ public class TikaResource {
     }
 
     @SuppressWarnings("serial")
-    public static void fillMetadata(Parser parser, Metadata metadata, ParseContext context, MultivaluedMap<String, String> httpHeaders) {
+    public static void fillMetadata(Parser parser, Metadata metadata,
+                                    MultivaluedMap<String, String> httpHeaders) {
         String fileName = detectFilename(httpHeaders);
         if (fileName != null) {
             metadata.set(TikaCoreProperties.RESOURCE_NAME_KEY, fileName);
@@ -344,27 +309,6 @@ public class TikaResource {
                 }
             });
         }
-
-        String tmpPassword = httpHeaders.getFirst(PASSWORD_BASE64_UTF8);
-        if (tmpPassword != null) {
-            tmpPassword = decodeBase64UTF8(tmpPassword);
-        } else {
-            tmpPassword = httpHeaders.getFirst(PASSWORD);
-        }
-        if (tmpPassword != null) {
-            final String password = tmpPassword;
-            context.set(PasswordProvider.class, new PasswordProvider() {
-                @Override
-                public String getPassword(Metadata metadata) {
-                    return password;
-                }
-            });
-        }
-    }
-
-    private static String decodeBase64UTF8(String s) {
-        byte[] bytes = BASE_64.decode(s);
-        return new String(bytes, UTF_8);
     }
 
     public static void setDetector(Parser p, Detector detector) {
@@ -487,8 +431,8 @@ public class TikaResource {
         final Metadata metadata = new Metadata();
         final ParseContext context = new ParseContext();
 
-        fillMetadata(parser, metadata, context, httpHeaders);
-        fillParseContext(context, httpHeaders, parser);
+        fillMetadata(parser, metadata, httpHeaders);
+        fillParseContext(httpHeaders, metadata, context);
 
         logRequest(LOG, info, metadata);
 
@@ -516,8 +460,8 @@ public class TikaResource {
         final Parser parser = createParser();
         final ParseContext context = new ParseContext();
 
-        fillMetadata(parser, metadata, context, httpHeaders);
-        fillParseContext(context, httpHeaders, parser);
+        fillMetadata(parser, metadata, httpHeaders);
+        fillParseContext(httpHeaders, metadata, context);
 
         logRequest(LOG, info, metadata);
 
@@ -572,8 +516,8 @@ public class TikaResource {
         final Parser parser = createParser();
         final ParseContext context = new ParseContext();
 
-        fillMetadata(parser, metadata, context, httpHeaders);
-        fillParseContext(context, httpHeaders, parser);
+        fillMetadata(parser, metadata, httpHeaders);
+        fillParseContext(httpHeaders, metadata, context);
 
 
         logRequest(LOG, info, metadata);
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaServerStatus.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaServerStatus.java
similarity index 94%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaServerStatus.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaServerStatus.java
index fbbf382..5d708c3 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaServerStatus.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaServerStatus.java
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
-import org.apache.tika.server.ServerStatus;
+import org.apache.tika.server.core.ServerStatus;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaVersion.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaVersion.java
similarity index 96%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaVersion.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaVersion.java
index a892716..664ed7e 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaVersion.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaVersion.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TikaWelcome.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaWelcome.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TikaWelcome.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaWelcome.java
index 0b4e35f..ad5c65a 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TikaWelcome.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TikaWelcome.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
@@ -24,8 +24,6 @@ import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -41,7 +39,7 @@ import java.util.regex.Pattern;
 
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.tika.Tika;
-import org.apache.tika.server.HTMLHelper;
+import org.apache.tika.server.core.HTMLHelper;
 
 /**
  * <p>Provides a basic welcome to the Apache Tika Server.</p>
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/TranslateResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java
similarity index 96%
rename from tika-server/src/main/java/org/apache/tika/server/resource/TranslateResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java
index bc10e59..e7391fc 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/TranslateResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/TranslateResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -29,8 +29,6 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Response;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.tika.config.LoadErrorHandler;
@@ -39,7 +37,7 @@ import org.apache.tika.exception.TikaException;
 import org.apache.tika.langdetect.optimaize.OptimaizeLangDetector;
 import org.apache.tika.language.detect.LanguageResult;
 import org.apache.tika.language.translate.Translator;
-import org.apache.tika.server.ServerStatus;
+import org.apache.tika.server.core.ServerStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/resource/UnpackerResource.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java
similarity index 92%
rename from tika-server/src/main/java/org/apache/tika/server/resource/UnpackerResource.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java
index c8ad8c8..8b674c8 100644
--- a/tika-server/src/main/java/org/apache/tika/server/resource/UnpackerResource.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/resource/UnpackerResource.java
@@ -15,9 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.resource;
+package org.apache.tika.server.core.resource;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.tika.server.core.resource.TikaResource.fillMetadata;
+import static org.apache.tika.server.core.resource.TikaResource.fillParseContext;
 
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
@@ -42,26 +44,17 @@ import java.util.UUID;
 import au.com.bytecode.opencsv.CSVWriter;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.io.IOExceptionWithCause;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.mutable.MutableInt;
-import org.apache.poi.poifs.filesystem.DirectoryEntry;
-import org.apache.poi.poifs.filesystem.DocumentEntry;
-import org.apache.poi.poifs.filesystem.DocumentInputStream;
-import org.apache.poi.poifs.filesystem.Entry;
-import org.apache.poi.poifs.filesystem.Ole10Native;
-import org.apache.poi.poifs.filesystem.Ole10NativeException;
-import org.apache.poi.poifs.filesystem.POIFSFileSystem;
-import org.apache.poi.util.IOUtils;
 import org.apache.tika.exception.TikaMemoryLimitException;
 import org.apache.tika.extractor.EmbeddedDocumentExtractor;
 import org.apache.tika.io.BoundedInputStream;
-import org.apache.tika.io.TikaInputStream;
 import org.apache.tika.metadata.Metadata;
 import org.apache.tika.metadata.TikaCoreProperties;
 import org.apache.tika.mime.MimeTypeException;
 import org.apache.tika.parser.DigestingParser;
 import org.apache.tika.parser.ParseContext;
 import org.apache.tika.parser.Parser;
-import org.apache.tika.parser.microsoft.OfficeParser;
 import org.apache.tika.sax.BodyContentHandler;
 import org.apache.tika.sax.RichTextContentHandler;
 import org.slf4j.Logger;
@@ -129,8 +122,9 @@ public class UnpackerResource {
             //no need to digest for unwrapping
             parser = ((DigestingParser)parser).getWrappedParser();
         }
-        TikaResource.fillParseContext(pc, httpHeaders.getRequestHeaders(), null);
-        TikaResource.fillMetadata(parser, metadata, pc, httpHeaders.getRequestHeaders());
+        fillMetadata(parser, metadata, httpHeaders.getRequestHeaders());
+        fillParseContext(httpHeaders.getRequestHeaders(), metadata, pc);
+
         TikaResource.logRequest(LOG, info, metadata);
         //even though we aren't currently parsing embedded documents,
         //we need to add this to allow for "inline" use of other parsers.
@@ -210,7 +204,7 @@ public class UnpackerResource {
             }
 
             if ("application/vnd.openxmlformats-officedocument.oleObject".equals(contentType)) {
-                POIFSFileSystem poifs = new POIFSFileSystem(new ByteArrayInputStream(data));
+                /*POIFSFileSystem poifs = new POIFSFileSystem(new ByteArrayInputStream(data));
                 OfficeParser.POIFSDocumentType type = OfficeParser.POIFSDocumentType.detectType(poifs);
 
                 if (type == OfficeParser.POIFSDocumentType.OLE10_NATIVE) {
@@ -232,7 +226,7 @@ public class UnpackerResource {
                     }
                 } else {
                     name += '.' + type.getExtension();
-                }
+                }*/
             }
 
             final String finalName = getFinalName(name, zout);
@@ -242,6 +236,7 @@ public class UnpackerResource {
 
                 count.increment();
             } else {
+                /*
                 if (inputStream instanceof TikaInputStream) {
                     TikaInputStream tin = (TikaInputStream) inputStream;
 
@@ -254,7 +249,7 @@ public class UnpackerResource {
 
                         zout.put(finalName, bos2.toByteArray());
                     }
-                }
+                }*/
             }
         }
 
@@ -280,7 +275,7 @@ public class UnpackerResource {
             return normalizedName;
         }
 
-        protected void copy(DirectoryEntry sourceDir, DirectoryEntry destDir)
+/*        protected void copy(DirectoryEntry sourceDir, DirectoryEntry destDir)
                 throws IOException {
             for (Entry entry : sourceDir) {
                 if (entry instanceof DirectoryEntry) {
@@ -294,6 +289,6 @@ public class UnpackerResource {
                     }
                 }
             }
-        }
+        }*/
     }
 }
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/CSVMessageBodyWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/CSVMessageBodyWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/CSVMessageBodyWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/CSVMessageBodyWriter.java
index fcb14d3a..5e61a31 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/CSVMessageBodyWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/CSVMessageBodyWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/JSONMessageBodyWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONMessageBodyWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/JSONMessageBodyWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONMessageBodyWriter.java
index 1cb9600..d3ff0a8 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/JSONMessageBodyWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONMessageBodyWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/JSONObjWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONObjWriter.java
similarity index 94%
rename from tika-server/src/main/java/org/apache/tika/server/writer/JSONObjWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONObjWriter.java
index 08851d6..f71fde3 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/JSONObjWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/JSONObjWriter.java
@@ -15,13 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.serialization.JsonMetadata;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/MetadataListMessageBodyWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/MetadataListMessageBodyWriter.java
similarity index 96%
rename from tika-server/src/main/java/org/apache/tika/server/writer/MetadataListMessageBodyWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/MetadataListMessageBodyWriter.java
index 0b6eff4..cedfcba 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/MetadataListMessageBodyWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/MetadataListMessageBodyWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -33,7 +33,7 @@ import java.lang.reflect.Type;
 
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.metadata.serialization.JsonMetadataList;
-import org.apache.tika.server.MetadataList;
+import org.apache.tika.server.core.MetadataList;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/TarWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TarWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/TarWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TarWriter.java
index bb4dec4..b53019a 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/TarWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TarWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/TextMessageBodyWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TextMessageBodyWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/TextMessageBodyWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TextMessageBodyWriter.java
index d7b79fa..e55b7cd 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/TextMessageBodyWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/TextMessageBodyWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/src/main/java/org/apache/tika/server/writer/ZipWriter.java b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/ZipWriter.java
similarity index 98%
rename from tika-server/src/main/java/org/apache/tika/server/writer/ZipWriter.java
rename to tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/ZipWriter.java
index 24cae80..2c2d7f4 100644
--- a/tika-server/src/main/java/org/apache/tika/server/writer/ZipWriter.java
+++ b/tika-server/tika-server-core/src/main/java/org/apache/tika/server/core/writer/ZipWriter.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server.writer;
+package org.apache.tika.server.core.writer;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
diff --git a/tika-server/tika-server-core/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig b/tika-server/tika-server-core/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig
new file mode 100644
index 0000000..7996345
--- /dev/null
+++ b/tika-server/tika-server-core/src/main/resources/META-INF/services/org.apache.tika.server.core.ParseContextConfig
@@ -0,0 +1,16 @@
+#  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.
+org.apache.tika.server.core.config.PasswordProviderConfig
+org.apache.tika.server.core.config.DocumentSelectorConfig
\ No newline at end of file
diff --git a/tika-server/src/main/resources/log4j.properties b/tika-server/tika-server-core/src/main/resources/log4j.properties
similarity index 100%
rename from tika-server/src/main/resources/log4j.properties
rename to tika-server/tika-server-core/src/main/resources/log4j.properties
diff --git a/tika-server/src/main/resources/tikaserver-template.html b/tika-server/tika-server-core/src/main/resources/tikaserver-template.html
similarity index 100%
rename from tika-server/src/main/resources/tikaserver-template.html
rename to tika-server/tika-server-core/src/main/resources/tikaserver-template.html
diff --git a/tika-server/src/main/resources/tikaserver-version.properties b/tika-server/tika-server-core/src/main/resources/tikaserver-version.properties
similarity index 100%
rename from tika-server/src/main/resources/tikaserver-version.properties
rename to tika-server/tika-server-core/src/main/resources/tikaserver-version.properties
diff --git a/tika-server/src/test/java/org/apache/tika/server/CXFTestBase.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
similarity index 93%
rename from tika-server/src/test/java/org/apache/tika/server/CXFTestBase.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
index c9a8203..b503213 100644
--- a/tika-server/src/test/java/org/apache/tika/server/CXFTestBase.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/CXFTestBase.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.Assert.assertFalse;
@@ -29,11 +29,9 @@ import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.codec.digest.DigestUtils;
@@ -51,8 +49,11 @@ import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
 import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor;
 import org.apache.tika.config.TikaConfig;
 import org.apache.tika.parser.digestutils.CommonsDigester;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.resource.UnpackerResource;
+import org.apache.tika.server.core.DefaultInputStreamFactory;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TikaServerCli;
+import org.apache.tika.server.core.resource.TikaResource;
+import org.apache.tika.server.core.resource.UnpackerResource;
 import org.junit.After;
 import org.junit.Before;
 
@@ -120,7 +121,7 @@ public abstract class CXFTestBase {
     }
 
     protected InputStream getTikaConfigInputStream() {
-        return getClass().getResourceAsStream("tika-config-for-server-tests.xml");
+        return getClass().getResourceAsStream("/config/tika-config-for-server-tests.xml");
     }
 
     /**
@@ -140,7 +141,7 @@ public abstract class CXFTestBase {
         server.destroy();
     }
 
-    static String getStringFromInputStream(InputStream in) throws Exception {
+    protected static String getStringFromInputStream(InputStream in) throws Exception {
         return IOUtils.toString(in, UTF_8);
     }
 
diff --git a/tika-server/src/test/java/org/apache/tika/server/LanguageResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
similarity index 90%
rename from tika-server/src/test/java/org/apache/tika/server/LanguageResourceTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
index c3ca475..f58638a 100644
--- a/tika-server/src/test/java/org/apache/tika/server/LanguageResourceTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/LanguageResourceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -26,12 +26,13 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.LanguageResource;
-import org.apache.tika.server.writer.TarWriter;
-import org.apache.tika.server.writer.ZipWriter;
+import org.apache.tika.server.core.resource.LanguageResource;
+import org.apache.tika.server.core.writer.TarWriter;
+import org.apache.tika.server.core.writer.ZipWriter;
 import org.junit.Test;
 
 public class LanguageResourceTest extends CXFTestBase {
@@ -87,7 +88,7 @@ public class LanguageResourceTest extends CXFTestBase {
 		String url = endPoint + LANG_STREAM_PATH;
 		Response response = WebClient.create(url).type("text/plain")
 				.accept("text/plain")
-				.put(ClassLoader.getSystemResourceAsStream("english.txt"));
+				.put(getClass().getResourceAsStream("/test-documents/english.txt"));
 		assertNotNull(response);
 		String readLang = getStringFromInputStream((InputStream) response
 				.getEntity());
@@ -99,7 +100,7 @@ public class LanguageResourceTest extends CXFTestBase {
 		String url = endPoint + LANG_STREAM_PATH;
 		Response response = WebClient.create(url).type("text/plain")
 				.accept("text/plain")
-				.put(ClassLoader.getSystemResourceAsStream("french.txt"));
+				.put(getClass().getResourceAsStream("/test-documents/french.txt"));
 		assertNotNull(response);
 		String readLang = getStringFromInputStream((InputStream) response
 				.getEntity());
diff --git a/tika-server/src/test/java/org/apache/tika/server/NullWebClientLogger.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/NullWebClientLogger.java
similarity index 93%
rename from tika-server/src/test/java/org/apache/tika/server/NullWebClientLogger.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/NullWebClientLogger.java
index d41a4e7..9a7a9e8 100644
--- a/tika-server/src/test/java/org/apache/tika/server/NullWebClientLogger.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/NullWebClientLogger.java
@@ -14,9 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import org.apache.cxf.common.logging.AbstractDelegatingLogger;
+import org.apache.tika.server.core.TikaServerIntegrationTest;
 
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
diff --git a/tika-server/src/test/java/org/apache/tika/server/ServerStatusTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ServerStatusTest.java
similarity index 96%
rename from tika-server/src/test/java/org/apache/tika/server/ServerStatusTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ServerStatusTest.java
index 0ad8f26..66deafe 100644
--- a/tika-server/src/test/java/org/apache/tika/server/ServerStatusTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/ServerStatusTest.java
@@ -14,8 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TaskStatus;
 import org.junit.Test;
 
 import java.util.Map;
diff --git a/tika-server/src/test/java/org/apache/tika/server/StackTraceOffTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceOffTest.java
similarity index 82%
rename from tika-server/src/test/java/org/apache/tika/server/StackTraceOffTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceOffTest.java
index 58ca94f..1613a47 100644
--- a/tika-server/src/test/java/org/apache/tika/server/StackTraceOffTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceOffTest.java
@@ -1,4 +1,4 @@
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -31,16 +31,16 @@ import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.DetectorResource;
-import org.apache.tika.server.resource.MetadataResource;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.resource.UnpackerResource;
-import org.apache.tika.server.writer.CSVMessageBodyWriter;
-import org.apache.tika.server.writer.JSONMessageBodyWriter;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
-import org.apache.tika.server.writer.TextMessageBodyWriter;
-import org.apache.tika.server.writer.XMPMessageBodyWriter;
+import org.apache.tika.server.core.resource.DetectorResource;
+import org.apache.tika.server.core.resource.MetadataResource;
+import org.apache.tika.server.core.resource.RecursiveMetadataResource;
+import org.apache.tika.server.core.resource.TikaResource;
+import org.apache.tika.server.core.resource.UnpackerResource;
+import org.apache.tika.server.core.writer.CSVMessageBodyWriter;
+import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
+import org.apache.tika.server.core.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.writer.TextMessageBodyWriter;
+//import org.apache.tika.server.core.writer.XMPMessageBodyWriter;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -50,8 +50,11 @@ import org.junit.Test;
  * when the stack trace param is set to false.
  */
 public class StackTraceOffTest extends CXFTestBase {
-    public static final String TEST_NULL = "mock/null_pointer.xml";
-    public static final String TEST_PASSWORD_PROTECTED = "password.xls";
+
+    private static final String TEST_HELLO_WORLD = "test-documents/mock/hello_world.xml";
+    private static final String TEST_NULL = "test-documents/mock/null_pointer.xml";
+    private static final String TEST_PASSWORD_PROTECTED = "test-documents/mock/encrypted_document_exception.xml";
+
 
     private static final String[] PATHS = new String[]{
             "/tika",
@@ -78,7 +81,6 @@ public class StackTraceOffTest extends CXFTestBase {
         providers.add(new TikaServerParseExceptionMapper(false));
         providers.add(new JSONMessageBodyWriter());
         providers.add(new CSVMessageBodyWriter());
-        providers.add(new XMPMessageBodyWriter());
         providers.add(new TextMessageBodyWriter());
         providers.add(new MetadataListMessageBodyWriter());
         sf.setProviders(providers);
@@ -132,7 +134,7 @@ public class StackTraceOffTest extends CXFTestBase {
             Response response = WebClient
                     .create(endPoint + path)
                     .accept("*:*")
-                    .put(ClassLoader.getSystemResourceAsStream("testDigilite.fdf"));
+                    .put(getClass().getResourceAsStream("/test-documents/testDigilite.fdf"));
             if (path.equals("/unpack")) {
                 //"NO CONTENT"
                 assertEquals("bad type: " + path, 204, response.getStatus());
@@ -149,10 +151,11 @@ public class StackTraceOffTest extends CXFTestBase {
     //exceptions as the others...
     @Test
     public void testMeta() throws Exception {
-        InputStream stream = ClassLoader.getSystemResourceAsStream(TikaResourceTest.TEST_DOC);
+        InputStream stream = ClassLoader.getSystemResourceAsStream(TEST_HELLO_WORLD);
 
-        Response response = WebClient.create(endPoint + "/meta" + "/Author").type("application/msword")
-                .accept(MediaType.TEXT_PLAIN).put(copy(stream, 8000));
+        Response response = WebClient.create(endPoint + "/meta" + "/Author")
+                .type("application/mock+xml")
+                .accept(MediaType.TEXT_PLAIN).put(copy(stream, 100));
         Assert.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         String msg = getStringFromInputStream((InputStream) response.getEntity());
         assertEquals("Failed to get metadata field Author", msg);
diff --git a/tika-server/src/test/java/org/apache/tika/server/StackTraceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
similarity index 82%
rename from tika-server/src/test/java/org/apache/tika/server/StackTraceTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
index 5115fd0..89a665a 100644
--- a/tika-server/src/test/java/org/apache/tika/server/StackTraceTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/StackTraceTest.java
@@ -1,4 +1,4 @@
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -30,22 +30,24 @@ import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.DetectorResource;
-import org.apache.tika.server.resource.MetadataResource;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.resource.UnpackerResource;
-import org.apache.tika.server.writer.CSVMessageBodyWriter;
-import org.apache.tika.server.writer.JSONMessageBodyWriter;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
-import org.apache.tika.server.writer.TextMessageBodyWriter;
-import org.apache.tika.server.writer.XMPMessageBodyWriter;
+import org.apache.tika.server.core.resource.DetectorResource;
+import org.apache.tika.server.core.resource.MetadataResource;
+import org.apache.tika.server.core.resource.RecursiveMetadataResource;
+import org.apache.tika.server.core.resource.TikaResource;
+import org.apache.tika.server.core.resource.UnpackerResource;
+import org.apache.tika.server.core.writer.CSVMessageBodyWriter;
+import org.apache.tika.server.core.writer.JSONMessageBodyWriter;
+import org.apache.tika.server.core.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.writer.TextMessageBodyWriter;
+//import org.apache.tika.server.core.writer.XMPMessageBodyWriter;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class StackTraceTest extends CXFTestBase {
-    public static final String TEST_NULL = "mock/null_pointer.xml";
-    public static final String TEST_PASSWORD_PROTECTED = "password.xls";
+
+    private static final String TEST_HELLO_WORLD = "test-documents/mock/hello_world.xml";
+    private static final String TEST_NULL = "test-documents/mock/null_pointer.xml";
+    private static final String TEST_PASSWORD_PROTECTED = "test-documents/mock/encrypted_document_exception.xml";
 
     private static final String[] PATHS = new String[]{
             "/tika",
@@ -72,7 +74,7 @@ public class StackTraceTest extends CXFTestBase {
         providers.add(new TikaServerParseExceptionMapper(true));
         providers.add(new JSONMessageBodyWriter());
         providers.add(new CSVMessageBodyWriter());
-        providers.add(new XMPMessageBodyWriter());
+        //providers.add(new XMPMessageBodyWriter());
         providers.add(new TextMessageBodyWriter());
         providers.add(new MetadataListMessageBodyWriter());
         sf.setProviders(providers);
@@ -128,7 +130,7 @@ public class StackTraceTest extends CXFTestBase {
             Response response = WebClient
                     .create(endPoint + path)
                     .accept("*:*")
-                    .put(ClassLoader.getSystemResourceAsStream("testDigilite.fdf"));
+                    .put(ClassLoader.getSystemResourceAsStream("test-documents/testDigilite.fdf"));
             if (path.equals("/unpack")) {
                 //"NO CONTENT"
                 assertEquals("bad type: " + path, 204, response.getStatus());
@@ -146,10 +148,10 @@ public class StackTraceTest extends CXFTestBase {
     //exceptions as the others...
     @Test
     public void testMeta() throws Exception {
-        InputStream stream = ClassLoader.getSystemResourceAsStream(TikaResourceTest.TEST_DOC);
+        InputStream stream = ClassLoader.getSystemResourceAsStream(TEST_HELLO_WORLD);
 
-        Response response = WebClient.create(endPoint + "/meta" + "/Author").type("application/msword")
-                .accept(MediaType.TEXT_PLAIN).put(copy(stream, 8000));
+        Response response = WebClient.create(endPoint + "/meta" + "/Author").type("application/mock+xml")
+                .accept(MediaType.TEXT_PLAIN).put(copy(stream, 100));
         Assert.assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         String msg = getStringFromInputStream((InputStream) response.getEntity());
         assertEquals("Failed to get metadata field Author", msg);
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java
similarity index 65%
rename from tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java
index 6b2be33..567e681 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaMimeTypesTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaMimeTypesTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -31,7 +31,8 @@ import com.google.gson.GsonBuilder;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.TikaMimeTypes;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.TikaMimeTypes;
 import org.junit.Test;
 
 public class TikaMimeTypesTest extends CXFTestBase {
@@ -92,38 +93,5 @@ public class TikaMimeTypesTest extends CXFTestBase {
         assertContains("Alias: image/x-ms-bmp", text);
     }
 
-    @Test
-    @SuppressWarnings("unchecked")
-    public void testGetJSON() throws Exception {
-        Response response = WebClient
-                .create(endPoint + MIMETYPES_PATH)
-                .type(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-                .accept(javax.ws.rs.core.MediaType.APPLICATION_JSON)
-                .get();
-
-        String jsonStr = getStringFromInputStream((InputStream) response.getEntity());
-        Map<String, Map<String, Object>> json = (Map<String, Map<String, Object>>)
-                GSON.fromJson(jsonStr, Map.class);
 
-        assertEquals(true, json.containsKey("text/plain"));
-        assertEquals(true, json.containsKey("application/xml"));
-        assertEquals(true, json.containsKey("video/x-ogm"));
-        assertEquals(true, json.containsKey("image/bmp"));
-
-        Map<String, Object> bmp = json.get("image/bmp");
-        assertEquals(true, bmp.containsKey("alias"));
-        List<Object> aliases = (List) bmp.get("alias");
-        assertEquals(2, aliases.size());
-
-        assertEquals("image/x-bmp", aliases.get(0));
-        assertEquals("image/x-ms-bmp", aliases.get(1));
-
-        String whichParser = bmp.get("parser").toString();
-        assertTrue("Which parser", whichParser.equals("org.apache.tika.parser.ocr.TesseractOCRParser") ||
-                whichParser.equals("org.apache.tika.parser.image.ImageParser"));
-
-        Map<String, Object> ogm = json.get("video/x-ogm");
-        assertEquals("video/ogg", ogm.get("supertype"));
-        assertEquals("org.gagravarr.tika.OggParser", ogm.get("parser"));
-    }
 }
diff --git a/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
new file mode 100644
index 0000000..d8f93ce
--- /dev/null
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaResourceTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.server.core;
+
+import org.apache.cxf.attachment.AttachmentUtil;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.tika.server.core.resource.TikaResource;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.cxf.helpers.HttpHeaderHelper.CONTENT_ENCODING;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class TikaResourceTest extends CXFTestBase {
+    public static final String TEST_HELLO_WORLD = "test-documents/mock/hello_world.xml";
+    public static final String TEST_OOM = "test-documents/mock/fake_oom.xml";
+
+    private static final String STREAM_CLOSED_FAULT = "java.io.IOException: Stream Closed";
+
+    private static final String TIKA_PATH = "/tika";
+    private static final int UNPROCESSEABLE = 422;
+
+    @Override
+    protected void setUpResources(JAXRSServerFactoryBean sf) {
+        sf.setResourceClasses(TikaResource.class);
+        sf.setResourceProvider(TikaResource.class,
+                new SingletonResourceProvider(new TikaResource()));
+    }
+
+    @Override
+    protected void setUpProviders(JAXRSServerFactoryBean sf) {
+        List<Object> providers = new ArrayList<Object>();
+        providers.add(new TikaServerParseExceptionMapper(false));
+        sf.setProviders(providers);
+    }
+
+    @Test
+    public void testHelloWorld() throws Exception {
+        Response response = WebClient.create(endPoint + TIKA_PATH)
+                .type("text/plain").accept("text/plain").get();
+        assertEquals(TikaResource.GREETING,
+                getStringFromInputStream((InputStream) response.getEntity()));
+    }
+
+
+    @Test
+    public void testJAXBAndActivationDependency() {
+        //TIKA-2778
+        AttachmentUtil.getCommandMap();
+    }
+
+    @Test
+    public void testOOMInLegacyMode() throws Exception {
+
+        Response response = null;
+        try {
+            response = WebClient
+                    .create(endPoint + TIKA_PATH)
+                    .accept("text/plain")
+                    .put(ClassLoader
+                            .getSystemResourceAsStream(TEST_OOM));
+        } catch (Exception e) {
+            //oom may or may not cause an exception depending
+            //on the timing
+        }
+
+        response = WebClient
+                .create(endPoint + TIKA_PATH)
+                .accept("text/plain")
+                .put(ClassLoader
+                        .getSystemResourceAsStream(TEST_HELLO_WORLD));
+        String responseMsg = getStringFromInputStream((InputStream) response.getEntity());
+
+        assertContains("hello world", responseMsg);
+    }
+    @Test
+    public void testApplicationWadl() throws Exception {
+        Response response = WebClient
+                .create(endPoint + TIKA_PATH + "?_wadl")
+                .accept("text/plain").get();
+        String resp = getStringFromInputStream((InputStream) response
+                .getEntity());
+        assertTrue(resp.startsWith("<application"));
+    }
+}
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaServerIntegrationTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerIntegrationTest.java
similarity index 94%
rename from tika-server/src/test/java/org/apache/tika/server/TikaServerIntegrationTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerIntegrationTest.java
index abce3cf..59592e3 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaServerIntegrationTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerIntegrationTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
@@ -22,7 +22,6 @@ import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.tika.TikaTest;
 import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.OfficeOpenXMLExtended;
 import org.apache.tika.metadata.serialization.JsonMetadataList;
 import org.junit.After;
 import org.junit.AfterClass;
@@ -55,13 +54,13 @@ public class TikaServerIntegrationTest extends TikaTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(TikaServerIntegrationTest.class);
 
-    private static final String TEST_RECURSIVE_DOC = "test_recursive_embedded.docx";
-    private static final String TEST_OOM = "mock/fake_oom.xml";
-    private static final String TEST_SYSTEM_EXIT = "mock/system_exit.xml";
-    private static final String TEST_HEAVY_HANG = "mock/heavy_hang_30000.xml";
-    private static final String TEST_HEAVY_HANG_SHORT = "mock/heavy_hang_100.xml";
-    private static final String TEST_STDOUT_STDERR = "mock/testStdOutErr.xml";
-    private static final String TEST_STATIC_STDOUT_STDERR = "mock/testStaticStdOutErr.xml";
+    private static final String TEST_HELLO_WORLD = "test-documents/mock/hello_world.xml";
+    private static final String TEST_OOM = "test-documents/mock/fake_oom.xml";
+    private static final String TEST_SYSTEM_EXIT = "test-documents/mock/system_exit.xml";
+    private static final String TEST_HEAVY_HANG = "test-documents/mock/heavy_hang_30000.xml";
+    private static final String TEST_HEAVY_HANG_SHORT = "test-documents/mock/heavy_hang_100.xml";
+    private static final String TEST_STDOUT_STDERR = "test-documents/mock/testStdOutErr.xml";
+    private static final String TEST_STATIC_STDOUT_STDERR = "test-documents/mock/testStaticStdOutErr.xml";
     private static final String META_PATH = "/rmeta";
     private static final String STATUS_PATH = "/status";
 
@@ -585,7 +584,7 @@ public class TikaServerIntegrationTest extends TikaTest {
             System.out.println("FILE # "+i);
             boolean ex = false;
             Response response = null;
-            String file = TEST_RECURSIVE_DOC;
+            String file = TEST_HELLO_WORLD;
             try {
                 if (r.nextFloat() < 0.01) {
                     file = TEST_SYSTEM_EXIT;
@@ -611,12 +610,12 @@ public class TikaServerIntegrationTest extends TikaTest {
                 System.out.println("done awaiting");
                 continue;
             }
-            if (file.equals(TEST_RECURSIVE_DOC)) {
+            if (file.equals(TEST_HELLO_WORLD)) {
                 Reader reader = new InputStreamReader((InputStream) response.getEntity(), UTF_8);
                 List<Metadata> metadataList = JsonMetadataList.fromJson(reader);
-                assertEquals(12, metadataList.size());
-                assertEquals("Microsoft Office Word", metadataList.get(0).get(OfficeOpenXMLExtended.APPLICATION));
-                assertContains("plundered our seas", metadataList.get(6).get("X-TIKA:content"));
+                assertEquals(1, metadataList.size());
+                assertEquals("Nikolai Lobachevsky", metadataList.get(0).get("author"));
+                assertContains("hello world", metadataList.get(0).get("X-TIKA:content"));
             }
             //assertEquals("a38e6c7b38541af87148dee9634cb811", metadataList.get(10).get("X-TIKA:digest:MD5"));
         }
@@ -630,11 +629,11 @@ public class TikaServerIntegrationTest extends TikaTest {
                 .create(endPoint + META_PATH)
                 .accept("application/json")
                 .put(ClassLoader
-                        .getSystemResourceAsStream(TEST_RECURSIVE_DOC));
+                        .getSystemResourceAsStream(TEST_HELLO_WORLD));
         Reader reader = new InputStreamReader((InputStream) response.getEntity(), UTF_8);
         List<Metadata> metadataList = JsonMetadataList.fromJson(reader);
-        assertEquals(12, metadataList.size());
-        assertEquals("Microsoft Office Word", metadataList.get(0).get(OfficeOpenXMLExtended.APPLICATION));
-        assertContains("plundered our seas", metadataList.get(6).get("X-TIKA:content"));
+        assertEquals(1, metadataList.size());
+        assertEquals("Nikolai Lobachevsky", metadataList.get(0).get("author"));
+        assertContains("hello world", metadataList.get(0).get("X-TIKA:content"));
     }
 }
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaServerStatusTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerStatusTest.java
similarity index 88%
rename from tika-server/src/test/java/org/apache/tika/server/TikaServerStatusTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerStatusTest.java
index eb3f2d0..556ac01 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaServerStatusTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaServerStatusTest.java
@@ -14,19 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.RecursiveMetadataResource;
-import org.apache.tika.server.resource.TikaResource;
-import org.apache.tika.server.resource.TikaServerStatus;
-import org.apache.tika.server.writer.JSONMessageBodyWriter;
-import org.apache.tika.server.writer.JSONObjWriter;
-import org.apache.tika.server.writer.MetadataListMessageBodyWriter;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.resource.TikaServerStatus;
+import org.apache.tika.server.core.writer.JSONObjWriter;
 import org.junit.Test;
 
 import javax.ws.rs.core.Response;
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaVersionTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaVersionTest.java
similarity index 93%
rename from tika-server/src/test/java/org/apache/tika/server/TikaVersionTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaVersionTest.java
index 7104244..5b96b4b 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaVersionTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaVersionTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import static org.junit.Assert.assertEquals;
 
@@ -27,7 +27,8 @@ import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.Tika;
-import org.apache.tika.server.resource.TikaVersion;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.resource.TikaVersion;
 import org.junit.Test;
 
 public class TikaVersionTest extends CXFTestBase {
diff --git a/tika-server/src/test/java/org/apache/tika/server/TikaWelcomeTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java
similarity index 90%
rename from tika-server/src/test/java/org/apache/tika/server/TikaWelcomeTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java
index f0f3dac..c7763ef 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TikaWelcomeTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TikaWelcomeTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import javax.ws.rs.core.Response;
 
@@ -28,10 +28,13 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
 import org.apache.tika.Tika;
-import org.apache.tika.server.resource.DetectorResource;
-import org.apache.tika.server.resource.MetadataResource;
-import org.apache.tika.server.resource.TikaVersion;
-import org.apache.tika.server.resource.TikaWelcome;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TikaVersionTest;
+import org.apache.tika.server.core.resource.DetectorResource;
+import org.apache.tika.server.core.resource.MetadataResource;
+import org.apache.tika.server.core.resource.TikaVersion;
+import org.apache.tika.server.core.resource.TikaWelcome;
 import org.junit.Test;
 
 public class TikaWelcomeTest extends CXFTestBase {
diff --git a/tika-server/src/test/java/org/apache/tika/server/TranslateResourceTest.java b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
similarity index 88%
rename from tika-server/src/test/java/org/apache/tika/server/TranslateResourceTest.java
rename to tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
index 501dcdd..8722113 100644
--- a/tika-server/src/test/java/org/apache/tika/server/TranslateResourceTest.java
+++ b/tika-server/tika-server-core/src/test/java/org/apache/tika/server/core/TranslateResourceTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.tika.server;
+package org.apache.tika.server.core;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -29,9 +29,12 @@ import java.util.List;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
-import org.apache.tika.server.resource.TranslateResource;
-import org.apache.tika.server.writer.TarWriter;
-import org.apache.tika.server.writer.ZipWriter;
+import org.apache.tika.server.core.CXFTestBase;
+import org.apache.tika.server.core.ServerStatus;
+import org.apache.tika.server.core.TikaServerParseExceptionMapper;
+import org.apache.tika.server.core.resource.TranslateResource;
+import org.apache.tika.server.core.writer.TarWriter;
+import org.apache.tika.server.core.writer.ZipWriter;
 import org.junit.Test;
 
 public class TranslateResourceTest extends CXFTestBase {
diff --git a/tika-server/src/test/resources/org/apache/tika/server/tika-config-for-server-tests.xml b/tika-server/tika-server-core/src/test/resources/config/tika-config-for-server-tests.xml
similarity index 100%
rename from tika-server/src/test/resources/org/apache/tika/server/tika-config-for-server-tests.xml
rename to tika-server/tika-server-core/src/test/resources/config/tika-config-for-server-tests.xml
diff --git a/tika-server/src/test/resources/log4j.properties b/tika-server/tika-server-core/src/test/resources/log4j.properties
similarity index 97%
rename from tika-server/src/test/resources/log4j.properties
rename to tika-server/tika-server-core/src/test/resources/log4j.properties
index 6aa860a..c3676a2 100644
--- a/tika-server/src/test/resources/log4j.properties
+++ b/tika-server/tika-server-core/src/test/resources/log4j.properties
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 #info,debug, error,fatal ...
-log4j.rootLogger=info,stderr
+log4j.rootLogger=warn,stderr
 
 #console
 log4j.appender.stderr=org.apache.log4j.ConsoleAppender
diff --git a/tika-server/src/test/resources/logging/log4j_child.xml b/tika-server/tika-server-core/src/test/resources/logging/log4j_child.xml
similarity index 96%
rename from tika-server/src/test/resources/logging/log4j_child.xml
rename to tika-server/tika-server-core/src/test/resources/logging/log4j_child.xml
index 01c4a7b..42b5009 100644
--- a/tika-server/src/test/resources/logging/log4j_child.xml
+++ b/tika-server/tika-server-core/src/test/resources/logging/log4j_child.xml
@@ -34,11 +34,11 @@
         </layout>
     </appender>
     <logger name="org.apache" additivity="true">
-        <level value="info"/>
+        <level value="warn"/>
         <appender-ref ref="stdout"/>
     </logger>
     <logger name="org.apache.cxf" additivity="true">
-        <level value="info"/>
+        <level value="warn"/>
         <appender-ref ref="stderr"/>
     </logger>
 
diff --git a/tika-server/src/test/resources/english.txt b/tika-server/tika-server-core/src/test/resources/test-documents/english.txt
similarity index 100%
rename from tika-server/src/test/resources/english.txt
rename to tika-server/tika-server-core/src/test/resources/test-documents/english.txt
diff --git a/tika-server/src/test/resources/french.txt b/tika-server/tika-server-core/src/test/resources/test-documents/french.txt
similarity index 100%
rename from tika-server/src/test/resources/french.txt
rename to tika-server/tika-server-core/src/test/resources/test-documents/french.txt
diff --git a/tika-server/src/test/resources/testDigilite.fdf b/tika-server/tika-server-core/src/test/resources/test-documents/testDigilite.fdf
similarity index 100%
rename from tika-server/src/test/resources/testDigilite.fdf
rename to tika-server/tika-server-core/src/test/resources/test-documents/testDigilite.fdf