You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opennlp.apache.org by ma...@apache.org on 2023/01/29 18:25:41 UTC

[opennlp-sandbox] branch master updated: introduce-common-maven-module-structure-for-corpus-server-components (#74)

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

mawiesne pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/opennlp-sandbox.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b8bc07  introduce-common-maven-module-structure-for-corpus-server-components (#74)
6b8bc07 is described below

commit 6b8bc074af7d88ecc71827ea636990a93ebaaf2c
Author: Martin Wiesner <ma...@users.noreply.github.com>
AuthorDate: Sun Jan 29 19:25:35 2023 +0100

    introduce-common-maven-module-structure-for-corpus-server-components (#74)
---
 .../corpus_server/connector/CSCasConsumerTest.java |  59 -----
 .../connector/CSCollectionReaderTest.java          |  77 ------
 corpus-server-impl/pom.xml                         | 155 ------------
 .../corpus-server-connector}/desc/CSCasWriter.xml  | 120 +++++-----
 .../desc/CSQueueCollectionReader.xml               | 216 ++++++++---------
 .../desc/EngPersonNameFinderTrainerCPE.xml         |   0
 .../desc/EngTokenizerAndSentdetectCPE.xml          |   0
 .../desc/PersonNameFinderTrainer.xml               |   0
 .../desc/SentenceDetector.xml                      |   0
 .../corpus-server-connector}/desc/Tokenizer.xml    |   0
 .../desc/TokenizerAndSentdetectAAE.xml             |   0
 .../corpus-server-connector}/pom.xml               |  67 +++---
 .../corpus_server/connector/CSCasWriter.java       |   5 +-
 .../connector/CSQueueCollectionReader.java         |   2 +-
 .../opennlp/corpus_server/connector/UimaUtil.java  |   3 +-
 .../corpus_server/connector/AbstractCSTest.java    |  37 ++-
 .../corpus_server/connector/CSCasWriterTest.java   |  84 +++++++
 .../connector/CSCollectionReaderTest.java          | 112 +++++++++
 .../corpus_server/connector}/TestCorpusServer.java |   4 +-
 .../test/resources/CSCasConsumerTestDescriptor.xml |   2 +-
 .../resources/CSCollectionReaderTestDescriptor.xml |   2 +-
 .../src/test/resources}/TypeSystem.xml             |   0
 corpus-server/{ => corpus-server-core}/feature.xml |   4 +-
 corpus-server/corpus-server-core/pom.xml           | 120 ++++++++++
 .../opennlp/corpus_server/CorporaResource.java     |  10 +-
 .../opennlp/corpus_server/CorpusResource.java      |   0
 .../apache/opennlp/corpus_server/CorpusServer.java |   6 +-
 .../corpus_server/CorpusServerApplication.java     |   0
 .../opennlp/corpus_server/CorpusServerBundle.java  |   0
 .../opennlp/corpus_server/TaskQueueResource.java   |   0
 .../opennlp/corpus_server/TaskQueuesResource.java  |   0
 .../corpus_server/search/SearchService.java        |   0
 .../corpus_server/store/AbstractCorporaStore.java  |   2 +-
 .../corpus_server/store/CorporaChangeListener.java |   0
 .../opennlp/corpus_server/store/CorporaStore.java  |   8 +-
 .../opennlp/corpus_server/store/CorpusStore.java   |   0
 .../corpus_server/store/MemoryCorporaStore.java    |  10 +-
 .../corpus_server/store/MemoryCorpusStore.java     |   0
 .../corpus_server/taskqueue/MemoryTaskQueue.java   |   0
 .../taskqueue/MemoryTaskQueueService.java          |   0
 .../opennlp/corpus_server/taskqueue/TaskQueue.java |   0
 .../corpus_server/taskqueue/TaskQueueService.java  |   0
 .../corpus_server/search}/IndexWriter.properties   |   0
 .../opennlp/corpus_server/search/LuceneIndexer.xml |   0
 .../opennlp/corpus_server/search/TypeSystem.xml    |   0
 .../src/main/webapp/WEB-INF/web.xml                |   0
 .../corpus_server/util/TestCorpusServer.java       |   0
 .../corpus-server-impl}/feature.xml                |   4 +-
 corpus-server/corpus-server-impl/pom.xml           | 144 ++++++++++++
 .../opennlp/corpus_server/impl/Activator.java      |   2 +-
 .../corpus_server/impl/CorpusServerImpl.java       |   7 +-
 .../corpus_server/impl/DerbyCorporaStore.java      | 106 +++++----
 .../corpus_server/impl/DerbyCorpusStore.java       |  13 +-
 .../opennlp/corpus_server/impl/LuceneIndexer.java  |   0
 .../corpus_server/impl/LuceneSearchService.java    |   6 +-
 .../opennlp/corpus_server/impl/UimaUtil.java       |   0
 .../corpus_server/impl}/IndexWriter.properties     |   0
 .../opennlp/corpus_server/impl/LuceneIndexer.xml   |   0
 .../opennlp/corpus_server/impl/TypeSystem.xml      |   0
 .../corpus-server-tools}/bin/cs-tools              |   0
 .../corpus-server-tools}/pom.xml                   |  44 ++--
 .../opennlp/corpus_server/tools/CASImporter.java   |   0
 .../opennlp/corpus_server/tools/CorpusBackup.java  |   0
 .../opennlp/corpus_server/tools/CreateCorpus.java  |   0
 .../corpus_server/tools/CreateTaskQueue.java       |   0
 .../opennlp/corpus_server/tools/DropCorpus.java    |   0
 .../opennlp/corpus_server/tools/FileUtil.java      |   0
 .../opennlp/corpus_server/tools/RemoveCAS.java     |   0
 .../corpus_server/tools/ReplaceTypeSystem.java     |   0
 .../opennlp/corpus_server/tools/SearchCorpus.java  |   0
 corpus-server/pom.xml                              | 260 +++++++++------------
 71 files changed, 900 insertions(+), 791 deletions(-)

diff --git a/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasConsumerTest.java b/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasConsumerTest.java
deleted file mode 100644
index 7f2896e..0000000
--- a/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasConsumerTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.opennlp.corpus_server.connector;
-
-
-public class CSCasConsumerTest {
-
-//  private static final String CCPATH = "src/test/resources/org/apache/opennlp/corpus_server/CSCasConsumerTestDescriptor.xml";
-//
-//  @Before
-//  public void setUp() throws Exception {
-//    InputStream in = CorpusServer.class
-//            .getResourceAsStream("/org/apache/opennlp/corpus_server/search/TypeSystem.xml");
-//    TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
-//    ByteArrayOutputStream os = new ByteArrayOutputStream();
-//    tsd.toXML(os);
-//    CorporaStore corporaStore = new DerbyCorporaStore();
-//    try {
-//      corporaStore.initialize();
-//      corporaStore.createCorpus("wikinews", os.toByteArray());
-//    } catch (Exception e) {
-//      // do nothing
-//    }
-//    new TestCorpusServer();
-//  }
-//
-//  @Test
-//  public void testCasWrite() {
-//    try {
-//      XMLInputSource s = new XMLInputSource(new File(CCPATH));
-//      ResourceSpecifier rs = UIMAFramework.getXMLParser().parseCasConsumerDescription(s);
-//      CasConsumer casConsumer = UIMAFramework.produceCasConsumer(rs);
-//      InputStream in = CorpusServer.class
-//              .getResourceAsStream("/org/apache/opennlp/corpus_server/WikinewsTypeSystem.xml");
-//      TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
-//      CAS cas = UimaUtil.createEmptyCAS(tsd);
-//      cas.setDocumentText("this cas needs to be stored");
-//      casConsumer.processCas(cas);
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//      fail(e.getLocalizedMessage());
-//    }
-//  }
-}
diff --git a/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java b/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java
deleted file mode 100644
index 3bd90cd..0000000
--- a/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.opennlp.corpus_server.connector;
-
-
-public class CSCollectionReaderTest {
-
-  private static final String CRDPATH = "src/test/resources/org/apache/opennlp/corpus_server/CSCollectionReaderTestDescriptor.xml";
-
-//  @BeforeClass
-//  public static void setUp() throws Exception {
-//    InputStream in = CorpusServer.class
-//            .getResourceAsStream("/org/apache/opennlp/corpus_server/search/TypeSystem.xml");
-//    TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
-//    ByteArrayOutputStream os = new ByteArrayOutputStream();
-//    tsd.toXML(os);
-//    CorporaStore corporaStore = new DerbyCorporaStore();
-//    try {
-//      corporaStore.initialize();
-//      corporaStore.createCorpus("wikinews", os.toByteArray());
-//    } catch (Exception e) {
-//      // do nothing
-//    }
-//    os.reset();
-//    CAS cas = UimaUtil.createEmptyCAS(tsd);
-//    cas.setDocumentText("this is a test text");
-//    Annotation a = new Annotation(cas.getJCas());
-//    a.setBegin(0);
-//    a.setEnd(4);
-//    a.addToIndexes();
-//    XmiCasSerializer.serialize(cas, os);
-//    try {
-//      corporaStore.getCorpus("wikinews").addCAS("111", os.toByteArray());
-//      corporaStore.getCorpus("wikinews").addCAS("222", os.toByteArray());
-//    } catch (Exception e) {
-//      // do nothing
-//    }
-//    new TestCorpusServer();
-//  }
-//
-//  @Test
-//  public void explicitCRTest() {
-//    try {
-//      XMLInputSource s = new XMLInputSource(new File(CRDPATH));
-//      ResourceSpecifier rs = UIMAFramework.getXMLParser().parseCollectionReaderDescription(s);
-//      CollectionReader cr = UIMAFramework.produceCollectionReader(rs);
-//      CAS cas = CasCreationUtils.createCas(new ArrayList<MetaDataObject>(0));
-//      assertTrue(cr.hasNext());
-//      cr.getNext(cas);
-//      assertNotNull(cas);
-//      AnnotationIndex<AnnotationFS> annotationIndex = cas.getAnnotationIndex();
-//      assertTrue(annotationIndex.size() == 2);
-//      assertTrue(cr.hasNext());
-//      cr.getNext(cas);
-//      assertFalse(cr.hasNext());
-//    } catch (Exception e) {
-//      e.printStackTrace();
-//      fail(e.getLocalizedMessage());
-//    }
-//  }
-
-}
diff --git a/corpus-server-impl/pom.xml b/corpus-server-impl/pom.xml
deleted file mode 100644
index d28808c..0000000
--- a/corpus-server-impl/pom.xml
+++ /dev/null
@@ -1,155 +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.    
--->
-
-<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>
-
-	<parent>
-		<groupId>org.apache</groupId>
-		<artifactId>apache</artifactId>
-		<version>9</version>
-		<relativePath />
-	</parent>
-
-	<groupId>org.apache.opennlp</groupId>
-	<artifactId>corpus-server-impl</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>bundle</packaging>
-
-	<name>Apache OpenNLP Corpus Server Implementation</name>
-	
-	<dependencies>
-
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>4.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <version>4.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        
-		<dependency>
-			<groupId>org.apache.opennlp</groupId>
-			<artifactId>corpus-server</artifactId>
-			<version>0.0.1-SNAPSHOT</version>
-			<scope>provided</scope>
-		</dependency>
-
-		<dependency>
-		    <groupId>org.apache.derby</groupId>
-		    <artifactId>derby</artifactId>
-		    <version>10.8.1.2</version>
-		    <scope>provided</scope>
-		</dependency>
-
-		<!-- UIMA and Lucas must be embedded to work properly! -->
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-			<version>2.3.1</version>
-			<scope>compile</scope>
-		</dependency>
-		
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>Lucas</artifactId>
-			<version>2.3.1</version>
-			<scope>compile</scope>
-		</dependency>
-		
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.8.1</version>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-	
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.6</source>
-					<target>1.6</target>
-          			<compilerArgument>-Xlint</compilerArgument>
-				</configuration>
-			</plugin>
-			
-			<!-- to generate the MANIFEST-FILE required by the bundle -->
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>2.3.7</version>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <instructions>
-                    	<Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>
-                    	<Embed-Transitive>true</Embed-Transitive>
-                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                        	!com.sun.jdmk.comm,
-                        	!javax.persistence.*,
-                        	!javax.servlet.annotation,
-                        	!javax.servlet.jsp.*,
-                        	!javax.microedition.*,
-                        	!javax.mail.*,
-                        	!javax.transaction.xa,
-                        	!javax.jms,
-                        	!javax.interceptor,!javax.inject,
-                        	!javax.enterprise.*,
-                        	!javax.annotation.security,
-                        	!javax.ejb,
-                        	!com.sun.xml.fastinfoset.*,
-                        	!org.jvnet.*,
-                        	!org.apache.derby.impl.drda,
-                        	!com.ibm.jvm,
-                        	!com.sun.net.httpserver,
-                        	!sun.misc,
-                        	*,
-                        	org.apache.opennlp.corpus_server,
-                        	org.apache.derby.jdbc
-                        	</Import-Package>
-                        <!-- Import-Package>!com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
-                        <Export-Package>org.apache.opennlp.corpus_server.impl</Export-Package>
-                        <Bundle-Activator>org.apache.opennlp.corpus_server.impl.Activator</Bundle-Activator>
-                    </instructions>
-                </configuration>
-            </plugin>
-		</plugins>
-	</build>
-</project>
\ No newline at end of file
diff --git a/corpus-server-connector/desc/CSCasWriter.xml b/corpus-server/corpus-server-connector/desc/CSCasWriter.xml
similarity index 97%
rename from corpus-server-connector/desc/CSCasWriter.xml
rename to corpus-server/corpus-server-connector/desc/CSCasWriter.xml
index fcb1696..ec39576 100644
--- a/corpus-server-connector/desc/CSCasWriter.xml
+++ b/corpus-server/corpus-server-connector/desc/CSCasWriter.xml
@@ -1,60 +1,60 @@
-<?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. *************************************************************** -->
-
-<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
-	<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-	<primitive>true</primitive>
-	<annotatorImplementationName>org.apache.opennlp.corpus_server.connector.CSCasWriter
-	</annotatorImplementationName>
-	<analysisEngineMetaData>
-		<name>Corpus Server Cas Writer</name>
-		<description>Writes a CAS (back) to the Corpus Server.</description>
-		<configurationParameters>
-			<configurationParameter>
-				<name>ServerAddress</name>
-				<description>The location of the server.</description>
-				<type>String</type>
-				<multiValued>false</multiValued>
-				<mandatory>true</mandatory>
-			</configurationParameter>
-			<configurationParameter>
-				<name>CorpusName</name>
-				<description>The id of the corpus which should be processed.
-				</description>
-				<type>String</type>
-				<multiValued>false</multiValued>
-				<mandatory>true</mandatory>
-			</configurationParameter>
-		</configurationParameters>
-
-		<typeSystemDescription>
-			<imports>
-				<import name="org.apache.uima.examples.SourceDocumentInformation" />
-			</imports>
-		</typeSystemDescription>
-		<capabilities>
-			<capability>
-				<inputs />
-				<outputs />
-				<languagesSupported />
-			</capability>
-		</capabilities>
-		<operationalProperties>
-			<modifiesCas>true</modifiesCas>
-			<multipleDeploymentAllowed>true</multipleDeploymentAllowed>
-			<outputsNewCASes>false</outputsNewCASes>
-		</operationalProperties>
-	</analysisEngineMetaData>
-</analysisEngineDescription>
+<?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. *************************************************************** -->
+
+<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
+	<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
+	<primitive>true</primitive>
+	<annotatorImplementationName>org.apache.opennlp.corpus_server.connector.CSCasWriter
+	</annotatorImplementationName>
+	<analysisEngineMetaData>
+		<name>Corpus Server Cas Writer</name>
+		<description>Writes a CAS (back) to the Corpus Server.</description>
+		<configurationParameters>
+			<configurationParameter>
+				<name>ServerAddress</name>
+				<description>The location of the server.</description>
+				<type>String</type>
+				<multiValued>false</multiValued>
+				<mandatory>true</mandatory>
+			</configurationParameter>
+			<configurationParameter>
+				<name>CorpusName</name>
+				<description>The id of the corpus which should be processed.
+				</description>
+				<type>String</type>
+				<multiValued>false</multiValued>
+				<mandatory>true</mandatory>
+			</configurationParameter>
+		</configurationParameters>
+
+		<typeSystemDescription>
+			<imports>
+				<import name="org.apache.uima.examples.SourceDocumentInformation" />
+			</imports>
+		</typeSystemDescription>
+		<capabilities>
+			<capability>
+				<inputs />
+				<outputs />
+				<languagesSupported />
+			</capability>
+		</capabilities>
+		<operationalProperties>
+			<modifiesCas>true</modifiesCas>
+			<multipleDeploymentAllowed>true</multipleDeploymentAllowed>
+			<outputsNewCASes>false</outputsNewCASes>
+		</operationalProperties>
+	</analysisEngineMetaData>
+</analysisEngineDescription>
diff --git a/corpus-server-connector/desc/CSQueueCollectionReader.xml b/corpus-server/corpus-server-connector/desc/CSQueueCollectionReader.xml
similarity index 97%
rename from corpus-server-connector/desc/CSQueueCollectionReader.xml
rename to corpus-server/corpus-server-connector/desc/CSQueueCollectionReader.xml
index eaa52c6..a32c65f 100644
--- a/corpus-server-connector/desc/CSQueueCollectionReader.xml
+++ b/corpus-server/corpus-server-connector/desc/CSQueueCollectionReader.xml
@@ -1,108 +1,108 @@
-<?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.
-	 ***************************************************************
-   -->
-   
-<collectionReaderDescription  xmlns="http://uima.apache.org/resourceSpecifier">
-    <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-    <implementationName>org.apache.opennlp.corpus_server.connector.CSQueueCollectionReader</implementationName>
-    <processingResourceMetaData>
-        <name>Corpus Server Collection Reader</name>
-        <description>Reads CASes from a Corpus Server Queue.</description>
-        <version>1.0</version>
-        <vendor>The Apache Software Foundation</vendor>
-        <configurationParameters>
-            <configurationParameter>
-                <name>ServerAddress</name>
-                <description>The location of the server.</description>
-                <type>String</type>
-                <multiValued>false</multiValued>
-                <mandatory>true</mandatory>
-            </configurationParameter>
-            <configurationParameter>
-                <name>CorpusName</name>
-                <description>The id of the corpus which should be processed.</description>
-                <type>String</type>
-                <multiValued>false</multiValued>
-                <mandatory>true</mandatory>
-            </configurationParameter>
-            <configurationParameter>
-                <name>SearchQuery</name>
-                <description>The query to populate the queue.</description>
-                <type>String</type>
-                <multiValued>false</multiValued>
-                <mandatory>true</mandatory>
-            </configurationParameter>
-            <configurationParameter>
-                <name>QueueName</name>
-                <description>Name of the queue to create with the search query.</description>
-                <type>String</type>
-                <multiValued>false</multiValued>
-                <mandatory>true</mandatory>
-            </configurationParameter>
-        </configurationParameters>
-		<configurationParameterSettings>
-		    <nameValuePair>
-		        <name>ServerAddress</name>
-		        <value>
-		            <string>http://localhost:8080/rest</string>
-		        </value>
-		    </nameValuePair>
-		    <nameValuePair>
-		        <name>CorpusName</name>
-		        <value>
-		            <string>enwikinews</string>
-		        </value>
-		    </nameValuePair>
-		    <nameValuePair>
-		        <name>SearchQuery</name>
-		        <value>
-		            <string>status-token:true</string>
-		        </value>
-		    </nameValuePair>
-		    <nameValuePair>
-		        <name>QueueName</name>
-		        <value>
-		            <string>EnglishTokenizerTraining</string>
-		        </value>
-		    </nameValuePair>
-		</configurationParameterSettings>
-		
-		<!-- Type System must be compatible with the one used for the corpus. -->
-        <typeSystemDescription>
-          <imports>
-            <import location="TypeSystem.xml"/>
-          </imports>
-        </typeSystemDescription>
-
-        <capabilities>
-          	<capability>
-          		<inputs/>
-          		<outputs/>
-          	</capability>
-        </capabilities>
-		<operationalProperties>
-			<modifiesCas>true</modifiesCas>
-			<multipleDeploymentAllowed>false</multipleDeploymentAllowed>
-			<outputsNewCASes>true</outputsNewCASes>
-		</operationalProperties>		
-    </processingResourceMetaData>
-</collectionReaderDescription>
+<?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.
+	 ***************************************************************
+   -->
+   
+<collectionReaderDescription  xmlns="http://uima.apache.org/resourceSpecifier">
+    <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
+    <implementationName>org.apache.opennlp.corpus_server.connector.CSQueueCollectionReader</implementationName>
+    <processingResourceMetaData>
+        <name>Corpus Server Collection Reader</name>
+        <description>Reads CASes from a Corpus Server Queue.</description>
+        <version>1.0</version>
+        <vendor>The Apache Software Foundation</vendor>
+        <configurationParameters>
+            <configurationParameter>
+                <name>ServerAddress</name>
+                <description>The location of the server.</description>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>true</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>CorpusName</name>
+                <description>The id of the corpus which should be processed.</description>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>true</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>SearchQuery</name>
+                <description>The query to populate the queue.</description>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>true</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>QueueName</name>
+                <description>Name of the queue to create with the search query.</description>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>true</mandatory>
+            </configurationParameter>
+        </configurationParameters>
+		<configurationParameterSettings>
+		    <nameValuePair>
+		        <name>ServerAddress</name>
+		        <value>
+		            <string>http://localhost:8080/rest</string>
+		        </value>
+		    </nameValuePair>
+		    <nameValuePair>
+		        <name>CorpusName</name>
+		        <value>
+		            <string>enwikinews</string>
+		        </value>
+		    </nameValuePair>
+		    <nameValuePair>
+		        <name>SearchQuery</name>
+		        <value>
+		            <string>status-token:true</string>
+		        </value>
+		    </nameValuePair>
+		    <nameValuePair>
+		        <name>QueueName</name>
+		        <value>
+		            <string>EnglishTokenizerTraining</string>
+		        </value>
+		    </nameValuePair>
+		</configurationParameterSettings>
+		
+		<!-- Type System must be compatible with the one used for the corpus. -->
+        <typeSystemDescription>
+          <imports>
+            <import location="TypeSystem.xml"/>
+          </imports>
+        </typeSystemDescription>
+
+        <capabilities>
+          	<capability>
+          		<inputs/>
+          		<outputs/>
+          	</capability>
+        </capabilities>
+		<operationalProperties>
+			<modifiesCas>true</modifiesCas>
+			<multipleDeploymentAllowed>false</multipleDeploymentAllowed>
+			<outputsNewCASes>true</outputsNewCASes>
+		</operationalProperties>		
+    </processingResourceMetaData>
+</collectionReaderDescription>
diff --git a/corpus-server-connector/desc/EngPersonNameFinderTrainerCPE.xml b/corpus-server/corpus-server-connector/desc/EngPersonNameFinderTrainerCPE.xml
similarity index 100%
rename from corpus-server-connector/desc/EngPersonNameFinderTrainerCPE.xml
rename to corpus-server/corpus-server-connector/desc/EngPersonNameFinderTrainerCPE.xml
diff --git a/corpus-server-connector/desc/EngTokenizerAndSentdetectCPE.xml b/corpus-server/corpus-server-connector/desc/EngTokenizerAndSentdetectCPE.xml
similarity index 100%
rename from corpus-server-connector/desc/EngTokenizerAndSentdetectCPE.xml
rename to corpus-server/corpus-server-connector/desc/EngTokenizerAndSentdetectCPE.xml
diff --git a/corpus-server-connector/desc/PersonNameFinderTrainer.xml b/corpus-server/corpus-server-connector/desc/PersonNameFinderTrainer.xml
similarity index 100%
rename from corpus-server-connector/desc/PersonNameFinderTrainer.xml
rename to corpus-server/corpus-server-connector/desc/PersonNameFinderTrainer.xml
diff --git a/corpus-server-connector/desc/SentenceDetector.xml b/corpus-server/corpus-server-connector/desc/SentenceDetector.xml
similarity index 100%
rename from corpus-server-connector/desc/SentenceDetector.xml
rename to corpus-server/corpus-server-connector/desc/SentenceDetector.xml
diff --git a/corpus-server-connector/desc/Tokenizer.xml b/corpus-server/corpus-server-connector/desc/Tokenizer.xml
similarity index 100%
rename from corpus-server-connector/desc/Tokenizer.xml
rename to corpus-server/corpus-server-connector/desc/Tokenizer.xml
diff --git a/corpus-server-connector/desc/TokenizerAndSentdetectAAE.xml b/corpus-server/corpus-server-connector/desc/TokenizerAndSentdetectAAE.xml
similarity index 100%
rename from corpus-server-connector/desc/TokenizerAndSentdetectAAE.xml
rename to corpus-server/corpus-server-connector/desc/TokenizerAndSentdetectAAE.xml
diff --git a/corpus-server-connector/pom.xml b/corpus-server/corpus-server-connector/pom.xml
similarity index 63%
rename from corpus-server-connector/pom.xml
rename to corpus-server/corpus-server-connector/pom.xml
index 0b181d7..3dec8ed 100644
--- a/corpus-server-connector/pom.xml
+++ b/corpus-server/corpus-server-connector/pom.xml
@@ -21,58 +21,58 @@
 
 <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>
-
 	<parent>
-		<groupId>org.apache</groupId>
-		<artifactId>apache</artifactId>
-		<version>9</version>
-		<relativePath />
+		<groupId>org.apache.opennlp</groupId>
+		<artifactId>corpus-server</artifactId>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 
-	<groupId>org.apache.opennlp</groupId>
 	<artifactId>corpus-server-connector</artifactId>
-	<version>0.0.1-incubating-SNAPSHOT</version>
 	<packaging>jar</packaging>
 
-	<name>OpenNLP Corpus Server UIMA Connector</name>
-
-	<prerequisites>
-		<maven>3.0</maven>
-	</prerequisites>
+	<name>Apache OpenNLP Corpus Server UIMA Connector</name>
 
-	<repositories>
-		<repository>
-			<id>maven2-repository.java.net</id>
-			<name>Java.net Repository for Maven</name>
-			<url>http://download.java.net/maven/2/</url>
-			<layout>default</layout>
-		</repository>
-	</repositories>
-	
 	<dependencies>
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
-		    <version>1.8</version>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-core</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>provided</scope>
+		</dependency>
+		
+		<dependency>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-impl</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-json</artifactId>
 		</dependency>
 
 		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
-		    <version>1.8</version>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-client</artifactId>
 		</dependency>
-    
+
     	<dependency>
 			<groupId>org.apache.uima</groupId>
 			<artifactId>uimaj-core</artifactId>
-			<version>2.3.1</version>
+			<version>${uimaj.version}</version>
 			<scope>compile</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
-			<version>4.8.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.derby</groupId>
+			<artifactId>derby</artifactId>
+			<version>${derby.version}</version>
 			<scope>test</scope>
 		</dependency>
 	</dependencies>
@@ -82,11 +82,6 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.6</source>
-					<target>1.6</target>
-          			<compilerArgument>-Xlint</compilerArgument>
-				</configuration>
 			</plugin>
 		</plugins>
 	</build>
diff --git a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
similarity index 96%
rename from corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
rename to corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
index 138e492..5399c46 100644
--- a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSCasWriter.java
@@ -50,7 +50,7 @@ public class CSCasWriter extends CasAnnotator_ImplBase {
   private String corpusName;
 
   // TODO: Make it configurable
-  private String action = "update";
+  private final String action = "update";
   
   private Type idType;
   private Feature idFeature;
@@ -93,9 +93,8 @@ public class CSCasWriter extends CasAnnotator_ImplBase {
       cas.removeFsFromIndexes(idFs);
       
       ByteArrayOutputStream xmiBytes = new ByteArrayOutputStream();
-      XmiCasSerializer serializer = new XmiCasSerializer(cas.getTypeSystem());
       try {
-        serializer.serialize(cas, xmiBytes);
+        XmiCasSerializer.serialize(cas, xmiBytes);
       } catch (SAXException e) {
         throw new AnalysisEngineProcessException();
       }
diff --git a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
similarity index 99%
rename from corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
rename to corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
index fb06d79..1529333 100644
--- a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/CSQueueCollectionReader.java
@@ -43,7 +43,7 @@ import com.sun.jersey.api.client.WebResource;
 
 /**
  * a {@link org.apache.uima.collection.CollectionReader} which reads {@link CAS}s from a corpus
- * in the {@link CorpusServer}
+ * in the {@link org.apache.opennlp.corpus_server.CorpusServer}
  */
 public class CSQueueCollectionReader extends CollectionReader_ImplBase {
 
diff --git a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
similarity index 97%
rename from corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
rename to corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
index 37616cb..6db5573 100644
--- a/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
+++ b/corpus-server/corpus-server-connector/src/main/java/org/apache/opennlp/corpus_server/connector/UimaUtil.java
@@ -55,8 +55,7 @@ public class UimaUtil {
     TypeSystemDescription typeSystemDesciptor;
 
     try {
-      typeSystemDesciptor = (TypeSystemDescription) xmlParser
-          .parse(xmlTypeSystemSource);
+      typeSystemDesciptor = (TypeSystemDescription) xmlParser.parse(xmlTypeSystemSource);
 
       typeSystemDesciptor.resolveImports();
     } catch (InvalidXMLException e) {
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/AbstractCSTest.java
similarity index 53%
copy from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
copy to corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/AbstractCSTest.java
index a3a8dd5..39c62e3 100644
--- a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
+++ b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/AbstractCSTest.java
@@ -15,35 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.opennlp.corpus_server.tools;
+package org.apache.opennlp.corpus_server.connector;
+
+import org.apache.opennlp.corpus_server.impl.DerbyCorporaStore;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-
-public class FileUtil {
-
-  static byte[] fileToBytes(File file) throws IOException {
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
 
-    ByteArrayOutputStream fileBytes = new ByteArrayOutputStream(
-        (int) file.length());
+public abstract class AbstractCSTest {
 
-    InputStream fileIn = new FileInputStream(file);
+  protected static final String BASE_PATH = CSCollectionReaderTest.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm();
 
-    try {
-      byte buffer[] = new byte[1024];
-      int length;
-      while ((length = fileIn.read(buffer)) > 0) {
-        fileBytes.write(buffer, 0, length);
+  protected static void cleanTestDB() throws IOException {
+    String baseDir = BASE_PATH.replace("file:", "").replace("/test-classes", "");
+    String dbDir = baseDir + DerbyCorporaStore.DB_NAME;
+    Path p = Path.of(dbDir);
+    if (p.toFile().exists()) {
+      try (var dirStream = Files.walk(p)) {
+        dirStream.map(Path::toFile).sorted(Comparator.reverseOrder()).forEach(File::delete);
       }
     }
-    finally {
-      fileIn.close();
-    }
-    
-    return fileBytes.toByteArray();
   }
-
 }
diff --git a/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasWriterTest.java b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasWriterTest.java
new file mode 100644
index 0000000..7bbe3dd
--- /dev/null
+++ b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCasWriterTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.opennlp.corpus_server.connector;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.opennlp.corpus_server.impl.DerbyCorporaStore;
+import org.apache.opennlp.corpus_server.store.CorporaStore;
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.collection.CasConsumer;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.util.XMLInputSource;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class CSCasWriterTest extends AbstractCSTest {
+
+  private static final String CCPATH = "/CSCasConsumerTestDescriptor.xml";
+
+  private static final String BASE_PATH = CSCasWriterTest.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm();
+
+  @BeforeClass
+  public static void setUp() throws IOException {
+    // kick out the old db instances that might be present already in this environment
+    cleanTestDB();
+
+    // init the new Derby instance with schema and demo data
+    try (InputStream in = CSCasWriterTest.class.getResourceAsStream("/TypeSystem.xml");
+         ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+      TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
+      tsd.toXML(os);
+      CorporaStore corporaStore = new DerbyCorporaStore();
+      corporaStore.initialize(BASE_PATH.replace("file:", "").replace("/test-classes", ""));
+      byte[] indexMapping = new byte[]{};
+      corporaStore.createCorpus("wikinews", os.toByteArray(), indexMapping);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getLocalizedMessage());
+    }
+    new TestCorpusServer();
+  }
+
+  @Test
+  @Ignore
+  // TODO Investigate why this test fails with:
+  //  A CasConsumer descriptor specified implementation class "org.apache.opennlp.corpus_server.connector.CSCasWriter",
+  //  but this class does not implement the CasConsumer interface.
+  public void testCasWrite() {
+    try (InputStream in = CSCasWriterTest.class.getResourceAsStream("/TypeSystem.xml")) {
+      XMLInputSource s = new XMLInputSource(CSCasWriterTest.class.getResource(CCPATH));
+      ResourceSpecifier rs = UIMAFramework.getXMLParser().parseCasConsumerDescription(s);
+      CasConsumer casConsumer = UIMAFramework.produceCasConsumer(rs);
+      TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
+      CAS cas = UimaUtil.createEmptyCAS(tsd);
+      cas.setDocumentText("this cas needs to be stored");
+      casConsumer.processCas(cas);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getLocalizedMessage());
+    }
+  }
+}
diff --git a/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java
new file mode 100644
index 0000000..2d58c50
--- /dev/null
+++ b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/CSCollectionReaderTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.opennlp.corpus_server.connector;
+
+
+import org.apache.opennlp.corpus_server.CorpusServer;
+import org.apache.opennlp.corpus_server.impl.DerbyCorporaStore;
+import org.apache.opennlp.corpus_server.store.CorporaStore;
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.impl.XmiCasSerializer;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.collection.CollectionReader;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.ResourceSpecifier;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.util.CasCreationUtils;
+import org.apache.uima.util.XMLInputSource;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class CSCollectionReaderTest extends AbstractCSTest {
+
+  private static final String CRDPATH = "/CSCollectionReaderTestDescriptor.xml";
+
+  @BeforeClass
+  public static void setUp() throws IOException {
+    // kick out the old db instances that might be present already in this environment
+    cleanTestDB();
+
+    // init the new Derby instance with schema and demo data
+    try (InputStream in = CSCollectionReaderTest.class.getResourceAsStream("/TypeSystem.xml");
+         ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+      TypeSystemDescription tsd = UimaUtil.createTypeSystemDescription(in);
+      tsd.toXML(os);
+      CorporaStore corporaStore = new DerbyCorporaStore();
+
+      corporaStore.initialize(BASE_PATH.replace("file:", "").replace("/test-classes", ""));
+      byte[] indexMapping = new byte[]{};
+      corporaStore.createCorpus("wikinews", os.toByteArray(), indexMapping);
+
+      os.reset();
+      CAS cas = UimaUtil.createEmptyCAS(tsd);
+      cas.setDocumentText("this is a test text");
+      Annotation a = new Annotation(cas.getJCas());
+      a.setBegin(0);
+      a.setEnd(4);
+      a.addToIndexes();
+      XmiCasSerializer.serialize(cas, os);
+
+      corporaStore.getCorpus("wikinews").addCAS("111", os.toByteArray());
+      corporaStore.getCorpus("wikinews").addCAS("222", os.toByteArray());
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getLocalizedMessage());
+    }
+    new TestCorpusServer();
+  }
+
+  @Test
+  @Ignore
+  // TODO Investigate why this test fails with:
+  //  No value has been assigned to the mandatory configuration parameter corpusName.
+  public void explicitCRTest() {
+    try {
+      XMLInputSource s = new XMLInputSource(CSCollectionReaderTest.class.getResource(CRDPATH));
+      ResourceSpecifier rs = UIMAFramework.getXMLParser().parseCollectionReaderDescription(s);
+      CollectionReader cr = UIMAFramework.produceCollectionReader(rs);
+      CAS cas = CasCreationUtils.createCas(new ArrayList<>(0));
+      assertTrue(cr.hasNext());
+      cr.getNext(cas);
+      assertNotNull(cas);
+      AnnotationIndex<AnnotationFS> annotationIndex = cas.getAnnotationIndex();
+      assertEquals(2, annotationIndex.size());
+      assertTrue(cr.hasNext());
+      cr.getNext(cas);
+      assertFalse(cr.hasNext());
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getLocalizedMessage());
+    }
+  }
+
+}
diff --git a/corpus-server/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/TestCorpusServer.java
similarity index 90%
copy from corpus-server/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java
copy to corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/TestCorpusServer.java
index da2fdf8..05485fd 100644
--- a/corpus-server/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java
+++ b/corpus-server/corpus-server-connector/src/test/java/org/apache/opennlp/corpus_server/connector/TestCorpusServer.java
@@ -15,9 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.opennlp.corpus_server.util;
-
-import org.apache.opennlp.corpus_server.CorpusServer;
+package org.apache.opennlp.corpus_server.connector;
 
 /**
  * Utility CorpusServer extension class that can be used for test purposes.
diff --git a/corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCasConsumerDescriptor.xml b/corpus-server/corpus-server-connector/src/test/resources/CSCasConsumerTestDescriptor.xml
similarity index 99%
rename from corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCasConsumerDescriptor.xml
rename to corpus-server/corpus-server-connector/src/test/resources/CSCasConsumerTestDescriptor.xml
index 122348f..d88c77f 100644
--- a/corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCasConsumerDescriptor.xml
+++ b/corpus-server/corpus-server-connector/src/test/resources/CSCasConsumerTestDescriptor.xml
@@ -20,7 +20,7 @@
 <casConsumerDescription xmlns="http://uima.apache.org/resourceSpecifier">
   <frameworkImplementation>org.apache.uima.java
   </frameworkImplementation>
-  <implementationName>org.apache.opennlp.corpus_server.connector.CSCasConsumer
+  <implementationName>org.apache.opennlp.corpus_server.connector.CSCasWriter
   </implementationName>
   <processingResourceMetaData>
     <name>CSCasConsumerDescriptor</name>
diff --git a/corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCollectionReaderDescriptor.xml b/corpus-server/corpus-server-connector/src/test/resources/CSCollectionReaderTestDescriptor.xml
similarity index 97%
rename from corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCollectionReaderDescriptor.xml
rename to corpus-server/corpus-server-connector/src/test/resources/CSCollectionReaderTestDescriptor.xml
index fdcd605..5caba80 100644
--- a/corpus-server-connector/src/test/resources/org/apache/opennlp/corpus_server/connector/CSCollectionReaderDescriptor.xml
+++ b/corpus-server/corpus-server-connector/src/test/resources/CSCollectionReaderTestDescriptor.xml
@@ -19,7 +19,7 @@
 -->
 <collectionReaderDescription xmlns="http://uima.apache.org/resourceSpecifier">
   <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-  <implementationName>org.apache.opennlp.corpus_server.connector.CSCollectionReader</implementationName>
+  <implementationName>org.apache.opennlp.corpus_server.connector.CSQueueCollectionReader</implementationName>
   <processingResourceMetaData>
     <name>CSCollectionReaderDescriptor</name>
     <description></description>
diff --git a/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml b/corpus-server/corpus-server-connector/src/test/resources/TypeSystem.xml
similarity index 100%
copy from corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml
copy to corpus-server/corpus-server-connector/src/test/resources/TypeSystem.xml
diff --git a/corpus-server/feature.xml b/corpus-server/corpus-server-core/feature.xml
similarity index 94%
rename from corpus-server/feature.xml
rename to corpus-server/corpus-server-core/feature.xml
index ab05e8a..a7804ab 100644
--- a/corpus-server/feature.xml
+++ b/corpus-server/corpus-server-core/feature.xml
@@ -21,7 +21,7 @@
 
 <features>
 	<!-- This feature.xml should be automatically be generated, all dependencies are duplicated here! -->
-    <feature name="opennlp-corpus-server" version="0.0.1.SNAPSHOT">
+    <feature name="opennlp-corpus-server" version="2.1.1.SNAPSHOT">
         <bundle>http://repo1.maven.org/maven2/org/ops4j/pax/web/pax-web-jetty-bundle/0.7.1/pax-web-jetty-bundle-0.7.1.jar</bundle>
         <bundle>http://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-extender-war/0.7.1/pax-web-extender-war-0.7.1.jar</bundle>
         <bundle>https://maven.java.net/service/local/artifact/maven/redirect?r=releases&amp;g=com.sun.jersey&amp;a=jersey-core&amp;v=1.12&amp;e=jar</bundle>
@@ -33,6 +33,6 @@
         <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-xc/1.9.2/jackson-xc-1.9.2.jar</bundle>
         <bundle>http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-mapper-asl/1.9.2/jackson-mapper-asl-1.9.2.jar</bundle>
         <bundle>http://repo1.maven.org/maven2/org/codehaus/jettison/jettison/1.3.1/jettison-1.3.1.jar</bundle>
-        <bundle>mvn:org.apache.opennlp/corpus-server/0.0.1-SNAPSHOT</bundle>
+        <bundle>mvn:org.apache.opennlp/corpus-server/2.1.1-SNAPSHOT</bundle>
     </feature>
 </features>
\ No newline at end of file
diff --git a/corpus-server/corpus-server-core/pom.xml b/corpus-server/corpus-server-core/pom.xml
new file mode 100644
index 0000000..d54f879
--- /dev/null
+++ b/corpus-server/corpus-server-core/pom.xml
@@ -0,0 +1,120 @@
+<?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">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.opennlp</groupId>
+    <artifactId>corpus-server</artifactId>
+    <version>2.1.1-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>corpus-server-core</artifactId>
+  <name>Apache OpenNLP Corpus Server Core</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>servlet-api</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.core</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.compendium</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-servlet</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-json</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>com.sun.jersey</groupId>
+      <artifactId>jersey-client</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+
+      <!-- to generate the MANIFEST-FILE required by the bundle -->
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>5.1.8</version>
+        <extensions>true</extensions>
+        <executions>
+          <execution>
+            <id>bundle-manifest</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>manifest</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
+          <instructions>
+            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+            <Import-Package>
+              !javax.persistence.*,
+              !javax.servlet.annotation,
+              !javax.servlet.jsp.*,
+              !javax.microedition.*,
+              !javax.mail.*,
+              !javax.transaction.xa,
+              !javax.jms,
+              !javax.interceptor,!javax.inject,
+              !javax.enterprise.*,
+              !javax.annotation.security,
+              !javax.ejb,
+              !com.sun.xml.fastinfoset.*,
+              !org.jvnet.*,
+              !org.apache.derby.impl.drda,
+              !com.ibm.jvm,
+              !com.sun.jdmk.comm,
+              !com.sun.net.httpserver,
+              !sun.misc,
+              javax.servlet,
+              *,
+              com.sun.jersey.json.impl.provider.entity.*,
+              com.sun.jersey.json.*,
+              org.codehaus.jackson.*,
+              org.codehaus.jackson.xc,
+              org.apache.opennlp.corpus_server,
+              com.sun.jersey.api.core,
+              com.sun.jersey.spi.container.servlet</Import-Package>
+            <!-- Import-Package>org.apache.derby.jdbc, !com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
+            <Export-Package>org.apache.opennlp.corpus_server.*, org.apache.opennlp.corpus_server.search</Export-Package>
+            <Webapp-Context>rest</Webapp-Context>
+            <Web-ContextPath>rest</Web-ContextPath>
+            <Bundle-Activator>org.apache.opennlp.corpus_server.CorpusServerBundle</Bundle-Activator>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
\ No newline at end of file
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java
similarity index 92%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java
index 72d4620..1e87855 100644
--- a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorporaResource.java
@@ -37,14 +37,13 @@ public class CorporaResource {
 	 * <br>
 	 * Note: Type system references are not supported currently!
 	 * 
-	 * @param casId
-	 * @param typeSystemBytes
+	 * @param corpusName
+	 * @param resources
 	 */
 	@POST
 	@Consumes(MediaType.APPLICATION_JSON)
 	@Path("_createCorpus")
-	public void createCorpus(@QueryParam("corpusName") String corpusName,
-			byte[][] resources) throws IOException {
+	public void createCorpus(@QueryParam("corpusName") String corpusName, byte[][] resources) throws IOException {
 	  
 	  if (resources.length != 2) {
 	    // TODO: throw exception
@@ -58,8 +57,7 @@ public class CorporaResource {
 	}
 
   @Path("{corpus}")
-	public CorpusResource getCorpus(
-			@PathParam("corpus") String corpusId) throws IOException {
+	public CorpusResource getCorpus(@PathParam("corpus") String corpusId) throws IOException {
     
       CorpusServer corpusServer = CorpusServerBundle.getInstance().getCorpusServer();
       CorporaStore store = corpusServer.getStore();
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusResource.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusResource.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusResource.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusResource.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java
similarity index 89%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java
index b7dea02..549e1d9 100644
--- a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServer.java
@@ -23,9 +23,9 @@ import org.apache.opennlp.corpus_server.taskqueue.TaskQueueService;
 
 public interface CorpusServer {
 
-  public CorporaStore getStore();
+  CorporaStore getStore();
   
-  public SearchService getSearchService();
+  SearchService getSearchService();
   
-  public TaskQueueService getTaskQueueService();
+  TaskQueueService getTaskQueueService();
 }
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServerApplication.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerApplication.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServerApplication.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerApplication.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/CorpusServerBundle.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/TaskQueueResource.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/TaskQueueResource.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/TaskQueueResource.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/TaskQueueResource.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/TaskQueuesResource.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/TaskQueuesResource.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/TaskQueuesResource.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/TaskQueuesResource.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/search/SearchService.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/search/SearchService.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/search/SearchService.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/search/SearchService.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java
similarity index 94%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java
index f438c33..fd0b191 100644
--- a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/AbstractCorporaStore.java
@@ -23,7 +23,7 @@ import java.util.Set;
 
 public abstract class AbstractCorporaStore implements CorporaStore {
 
-  private Set<CorporaChangeListener> listeners = new HashSet<CorporaChangeListener>();
+  private final Set<CorporaChangeListener> listeners = new HashSet<>();
   
   @Override
   public void addCorpusChangeListener(CorporaChangeListener listener) {
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorporaChangeListener.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorporaChangeListener.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorporaChangeListener.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorporaChangeListener.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java
similarity index 86%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java
index 98c9c70..0c25a6a 100644
--- a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorporaStore.java
@@ -32,8 +32,11 @@ public interface CorporaStore {
   /**
    * Initializes the corpora store. Must be called before any other method
    * of the store is called.
+   *
+   * @param basePath The directory path to initialize the database in. If {@code null},
+   *                 the related database files are created in the current working directory.
    */
-  void initialize() throws IOException;
+  void initialize(String basePath) throws IOException;
   
   /**
    * Creates a new corpus. 
@@ -45,8 +48,7 @@ public interface CorporaStore {
    * @param typeSystemBytes
    * @param indexMapping
    */
-  void createCorpus(String corpusName, byte typeSystemBytes[],
-      byte indexMapping[]) throws IOException;
+  void createCorpus(String corpusName, byte[] typeSystemBytes, byte[] indexMapping) throws IOException;
   
   Set<String> getCorpusIds() throws IOException;
   
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorpusStore.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorpusStore.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/CorpusStore.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/CorpusStore.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java
similarity index 93%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java
index bd71d8a..782f03d 100644
--- a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java
+++ b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorporaStore.java
@@ -27,11 +27,13 @@ public class MemoryCorporaStore extends AbstractCorporaStore {
 	
 	private static MemoryCorporaStore instance;
 	
-	private Map<String, MemoryCorpusStore> corpora = new HashMap<String, MemoryCorpusStore>();
-	
-	public void initialize() {
+	private final Map<String, MemoryCorpusStore> corpora = new HashMap<>();
+
+	@Override
+	public void initialize(String basePath) {
 	}
-	
+
+	@Override
 	public void shutdown() {
 	}
 	
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorpusStore.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorpusStore.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorpusStore.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/store/MemoryCorpusStore.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueue.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueue.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueue.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueue.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueueService.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueueService.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueueService.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/MemoryTaskQueueService.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueue.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueue.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueue.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueue.java
diff --git a/corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueueService.java b/corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueueService.java
similarity index 100%
rename from corpus-server/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueueService.java
rename to corpus-server/corpus-server-core/src/main/java/org/apache/opennlp/corpus_server/taskqueue/TaskQueueService.java
diff --git a/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/IndexWriter.properties b/corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/IndexWriter.properties
similarity index 100%
rename from corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/IndexWriter.properties
rename to corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/IndexWriter.properties
diff --git a/corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/LuceneIndexer.xml b/corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/LuceneIndexer.xml
similarity index 100%
rename from corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/LuceneIndexer.xml
rename to corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/LuceneIndexer.xml
diff --git a/corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/TypeSystem.xml b/corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/TypeSystem.xml
similarity index 100%
rename from corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/TypeSystem.xml
rename to corpus-server/corpus-server-core/src/main/resources/org/apache/opennlp/corpus_server/search/TypeSystem.xml
diff --git a/corpus-server/src/main/webapp/WEB-INF/web.xml b/corpus-server/corpus-server-core/src/main/webapp/WEB-INF/web.xml
similarity index 100%
rename from corpus-server/src/main/webapp/WEB-INF/web.xml
rename to corpus-server/corpus-server-core/src/main/webapp/WEB-INF/web.xml
diff --git a/corpus-server/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java b/corpus-server/corpus-server-core/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java
similarity index 100%
rename from corpus-server/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java
rename to corpus-server/corpus-server-core/src/test/java/org/apache/opennlp/corpus_server/util/TestCorpusServer.java
diff --git a/corpus-server-impl/feature.xml b/corpus-server/corpus-server-impl/feature.xml
similarity index 88%
rename from corpus-server-impl/feature.xml
rename to corpus-server/corpus-server-impl/feature.xml
index eac4a04..d0b89b7 100644
--- a/corpus-server-impl/feature.xml
+++ b/corpus-server/corpus-server-impl/feature.xml
@@ -22,7 +22,7 @@
 <features>
 	<!-- This feature.xml should be automatically be generated, all dependencies are duplicated here! -->
     <feature name="opennlp-corpus-server-impl" version="0.0.1.SNAPSHOT">
-        <bundle>mvn:org.apache.derby/derby/10.8.1.2</bundle>
-        <bundle>mvn:org.apache.opennlp/corpus-server-impl/0.0.1-SNAPSHOT</bundle>
+        <bundle>mvn:org.apache.derby/derby/10.14.2.0</bundle>
+        <bundle>mvn:org.apache.opennlp/corpus-server-impl/2.1.1-SNAPSHOT</bundle>
     </feature>
 </features>
\ No newline at end of file
diff --git a/corpus-server/corpus-server-impl/pom.xml b/corpus-server/corpus-server-impl/pom.xml
new file mode 100644
index 0000000..316c56e
--- /dev/null
+++ b/corpus-server/corpus-server-impl/pom.xml
@@ -0,0 +1,144 @@
+<?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.    
+-->
+
+<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>
+	<parent>
+		<groupId>org.apache.opennlp</groupId>
+		<artifactId>corpus-server</artifactId>
+		<version>2.1.1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>corpus-server-impl</artifactId>
+	<version>2.1.1-SNAPSHOT</version>
+	<packaging>bundle</packaging>
+
+	<name>Apache OpenNLP Corpus Server Implementation</name>
+	
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-core</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+				<groupId>org.osgi</groupId>
+				<artifactId>org.osgi.core</artifactId>
+				<version>4.2.0</version>
+				<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+				<groupId>org.osgi</groupId>
+				<artifactId>org.osgi.compendium</artifactId>
+				<version>4.2.0</version>
+				<scope>provided</scope>
+		</dependency>
+
+		<dependency>
+		    <groupId>org.apache.derby</groupId>
+		    <artifactId>derby</artifactId>
+		    <version>10.14.2.0</version>
+		    <scope>provided</scope>
+		</dependency>
+
+		<!-- UIMA and Lucas must be embedded to work properly! -->
+		<dependency>
+			<groupId>org.apache.uima</groupId>
+			<artifactId>uimaj-core</artifactId>
+			<version>${uimaj.version}</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.uima</groupId>
+			<artifactId>Lucas</artifactId>
+			<version>2.3.1</version>
+			<scope>compile</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+	</dependencies>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
+			
+			<!-- to generate the MANIFEST-FILE required by the bundle -->
+			<plugin>
+					<groupId>org.apache.felix</groupId>
+					<artifactId>maven-bundle-plugin</artifactId>
+					<version>5.1.8</version>
+					<extensions>true</extensions>
+					<executions>
+							<execution>
+									<id>bundle-manifest</id>
+									<phase>process-classes</phase>
+									<goals>
+											<goal>manifest</goal>
+									</goals>
+							</execution>
+					</executions>
+					<configuration>
+							<instructions>
+								<Embed-Dependency>*;scope=compile;inline=false</Embed-Dependency>
+								<Embed-Transitive>true</Embed-Transitive>
+									<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+									<Import-Package>
+										!com.sun.jdmk.comm,
+										!javax.persistence.*,
+										!javax.servlet.annotation,
+										!javax.servlet.jsp.*,
+										!javax.microedition.*,
+										!javax.mail.*,
+										!javax.transaction.xa,
+										!javax.jms,
+										!javax.interceptor,!javax.inject,
+										!javax.enterprise.*,
+										!javax.annotation.security,
+										!javax.ejb,
+										!com.sun.xml.fastinfoset.*,
+										!org.jvnet.*,
+										!org.apache.derby.impl.drda,
+										!com.ibm.jvm,
+										!com.sun.net.httpserver,
+										!sun.misc,
+										*,
+										org.apache.opennlp.corpus_server,
+										org.apache.derby.jdbc
+										</Import-Package>
+									<!-- Import-Package>!com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
+									<Export-Package>org.apache.opennlp.corpus_server.impl</Export-Package>
+									<Bundle-Activator>org.apache.opennlp.corpus_server.impl.Activator</Bundle-Activator>
+							</instructions>
+					</configuration>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java
similarity index 98%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java
index b7b778f..712f5fe 100644
--- a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java
+++ b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/Activator.java
@@ -33,7 +33,7 @@ public class Activator implements BundleActivator {
     
     corpusServer.start();
     
-    context.registerService(CorpusServer.class.getName(), corpusServer, new Hashtable());
+    context.registerService(CorpusServer.class.getName(), corpusServer, new Hashtable<>());
   }
 
   @Override
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java
similarity index 98%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java
index 734d848..f94390d 100644
--- a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java
+++ b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/CorpusServerImpl.java
@@ -99,7 +99,7 @@ public class CorpusServerImpl implements CorpusServer {
   public void start() {
     store = new DerbyCorporaStore();
     try {
-      store.initialize();
+      store.initialize(null);
     } catch (IOException e) {
       LOGGER.log(Level.SEVERE, "Failed to start corpora store!", e);
       return;
@@ -154,15 +154,18 @@ public class CorpusServerImpl implements CorpusServer {
   }
     
   }
-  
+
+  @Override
   public CorporaStore getStore() {
     return store;
   }
 
+  @Override
   public SearchService getSearchService() {
     return searchService;
   }
 
+  @Override
   public TaskQueueService getTaskQueueService() {
     return taskQueueService;
   }
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java
similarity index 68%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java
index 5f1e634..90e0ff9 100644
--- a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java
+++ b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorporaStore.java
@@ -34,74 +34,92 @@ import java.util.logging.Logger;
 
 import javax.sql.DataSource;
 
-import org.apache.derby.jdbc.EmbeddedDataSource40;
+import org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource;
+import org.apache.derby.jdbc.EmbeddedDataSource;
 import org.apache.opennlp.corpus_server.store.AbstractCorporaStore;
 import org.apache.opennlp.corpus_server.store.CorporaChangeListener;
 import org.apache.opennlp.corpus_server.store.CorpusStore;
 
 public class DerbyCorporaStore extends AbstractCorporaStore {
 
-  private final static Logger LOGGER = Logger.getLogger(
-      DerbyCorporaStore.class .getName());
-  
+  private final static Logger LOGGER = Logger.getLogger(DerbyCorporaStore.class .getName());
+  public static final String DB_NAME = "XmiCasDB";
+
   private DataSource dataSource = null;
 
   @Override
-  public void initialize() {
+  public void initialize(String basePath) {
 
-    EmbeddedDataSource40 ds = new EmbeddedDataSource40(); 
-    ds.setDatabaseName("XmiCasDB");
+    EmbeddedDataSource ds = new EmbeddedConnectionPoolDataSource();
+    String dbName = DB_NAME;
+    if (basePath != null) {
+      dbName = basePath + DB_NAME;
+    }
+    ds.setDatabaseName(dbName);
     ds.setCreateDatabase("create");
-    
+
     dataSource = ds;
   }
 
+  private Set<String> getAllTables(Connection targetDBConn) throws SQLException {
+    Set<String> tables = new HashSet<>();
+    DatabaseMetaData md = targetDBConn.getMetaData();
+    readTable(tables, md, "TABLE", null);
+    readTable(tables, md, "VIEW", null);
+    return tables;
+  }
+
+  private void readTable(Set<String> set, DatabaseMetaData md, String searchCriteria, String schema)
+          throws SQLException {
+    ResultSet rs = md.getTables(null, schema, null, new String[]{ searchCriteria });
+    while (rs.next()) {
+      set.add(rs.getString("TABLE_NAME").toLowerCase());
+    }
+  }
+
   @Override
-  public void createCorpus(String corpusName, byte[] typeSystemBytes, byte indexMapping[])
+  public void createCorpus(String corpusName, byte[] typeSystemBytes, byte[] indexMapping)
       throws IOException {
     
-    try {
-      Connection conn = dataSource.getConnection();
-      Statement s = conn.createStatement();
-      s.execute("create table " + corpusName + 
-          "(name varchar(1024), cas blob, unique (name))");
-      
-      s.close();
-      
-      // Insert the type system
-      PreparedStatement typeSystemPS = conn.prepareStatement("insert into " + corpusName
-          + " values (?, ?)");
+    try (Connection conn = dataSource.getConnection()) {
+      Set<String> existingTables = getAllTables(conn);
+      if (!existingTables.contains(corpusName)) {
+        Statement s = conn.createStatement();
+        s.execute("create table " + corpusName + "(name varchar(1024), cas blob, unique (name))");
+        s.close();
+        // Insert the type system
+        PreparedStatement typeSystemPS = conn.prepareStatement("insert into " + corpusName
+                + " values (?, ?)");
 
-      typeSystemPS.setString(1, "_typesystem");
+        typeSystemPS.setString(1, "_typesystem");
 
-      Blob typeSystemBlob = conn.createBlob();
-      typeSystemBlob.setBytes(1, typeSystemBytes);
-      typeSystemPS.setBlob(2, typeSystemBlob);
+        Blob typeSystemBlob = conn.createBlob();
+        typeSystemBlob.setBytes(1, typeSystemBytes);
+        typeSystemPS.setBlob(2, typeSystemBlob);
 
-      typeSystemPS.executeUpdate();
+        typeSystemPS.executeUpdate();
 
-      PreparedStatement indexMappingPS = conn.prepareStatement("insert into " + corpusName
-          + " values (?, ?)");
-      
-      indexMappingPS.setString(1, "_indexMapping");
-      
-      Blob indexMappingBlob = conn.createBlob();
-      indexMappingBlob.setBytes(1, indexMapping);
-      indexMappingPS.setBlob(2, indexMappingBlob);
-      
-      indexMappingPS.executeUpdate();
-      
-      conn.commit();
-      
-      typeSystemPS.close();
-      indexMappingPS.close();
-      conn.close();
+        PreparedStatement indexMappingPS = conn.prepareStatement("insert into " + corpusName
+                + " values (?, ?)");
+
+        indexMappingPS.setString(1, "_indexMapping");
+
+        Blob indexMappingBlob = conn.createBlob();
+        indexMappingBlob.setBytes(1, indexMapping);
+        indexMappingPS.setBlob(2, indexMappingBlob);
+
+        indexMappingPS.executeUpdate();
+
+        conn.commit();
+
+        typeSystemPS.close();
+        indexMappingPS.close();
+      }
 
     } catch (SQLException e) {
       
       if (LOGGER.isLoggable(Level.SEVERE)) {
-        LOGGER.log(Level.SEVERE, "Failed to create corpus: " + 
-            corpusName, e);
+        LOGGER.log(Level.SEVERE, "Failed to create corpus: " + corpusName, e);
       }
       
       throw new IOException(e);
@@ -118,7 +136,7 @@ public class DerbyCorporaStore extends AbstractCorporaStore {
 
   public Set<String> getCorpusIds() throws IOException {
     
-    Set<String> corpusIds = new HashSet<String>();
+    Set<String> corpusIds = new HashSet<>();
     
     try {
       Connection conn = dataSource.getConnection();
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java
similarity index 96%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java
index 6bc3241..5e48821 100644
--- a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java
+++ b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/DerbyCorpusStore.java
@@ -34,11 +34,10 @@ import org.apache.opennlp.corpus_server.store.CorpusStore;
 
 public class DerbyCorpusStore implements CorpusStore {
 
-  private final static Logger LOGGER = Logger.getLogger(
-      DerbyCorpusStore.class .getName());
+  private final static Logger LOGGER = Logger.getLogger(DerbyCorpusStore.class .getName());
 
-  private DataSource dataSource;
-  private DerbyCorporaStore store;
+  private final DataSource dataSource;
+  private final DerbyCorporaStore store;
   private final String corpusName;
   
   DerbyCorpusStore(DataSource dataSource, DerbyCorporaStore store, String corpusName) {
@@ -55,7 +54,7 @@ public class DerbyCorpusStore implements CorpusStore {
   @Override
   public byte[] getCAS(String casId) throws IOException {
     
-    byte casBytes[]  = null;
+    byte[] casBytes  = null;
     
     try {
       Connection conn = dataSource.getConnection();
@@ -220,7 +219,7 @@ public class DerbyCorpusStore implements CorpusStore {
   @Override
   public byte[] getTypeSystem() throws IOException {
     
-    byte tsBytes[];
+    byte[] tsBytes;
     
     try {
       Connection conn = dataSource.getConnection();
@@ -252,7 +251,7 @@ public class DerbyCorpusStore implements CorpusStore {
   
   @Override
   public byte[] getIndexMapping() throws IOException {
-    byte indexMappingBytes[] = null;
+    byte[] indexMappingBytes = null;
     
     try {
       Connection conn = dataSource.getConnection();
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneIndexer.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneIndexer.java
similarity index 100%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneIndexer.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneIndexer.java
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java
similarity index 98%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java
index 5f830e2..44611ae 100644
--- a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java
+++ b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/LuceneSearchService.java
@@ -76,13 +76,13 @@ public class LuceneSearchService implements SearchService {
   /**
    * Maps the corpus id to the Lucas Indexer Analysis Engine.
    */
-  private Map<String, AnalysisEngine> corpusIndexerMap = new HashMap<String, AnalysisEngine>();
+  private final Map<String, AnalysisEngine> corpusIndexerMap = new HashMap<>();
   
   /**
    * Maps the corpus id to the Index Server instance, if one exists, otherwise
    * it will be created on first access.
    */
-  private Map<String, IndexSearcher> corpusSearcherMap = new HashMap<String, IndexSearcher>();
+  private final Map<String, IndexSearcher> corpusSearcherMap = new HashMap<>();
   
   private static File getIndexDirectory(String corpusId) {
     return new File("index" + File.separator + corpusId);
@@ -188,7 +188,7 @@ public class LuceneSearchService implements SearchService {
       }
       
       FileResourceSpecifier indexWriterFileSpecifier = new FileResourceSpecifier_impl();
-      indexWriterFileSpecifier.setFileUrl(indexWriterTmpFile.toURL().toString());
+      indexWriterFileSpecifier.setFileUrl(indexWriterTmpFile.toURI().toString());
       // TODO: This will fail ...
       specifier.getResourceManagerConfiguration().getExternalResources()[0].setResourceSpecifier(indexWriterFileSpecifier);
       
diff --git a/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/UimaUtil.java b/corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/UimaUtil.java
similarity index 100%
rename from corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/UimaUtil.java
rename to corpus-server/corpus-server-impl/src/main/java/org/apache/opennlp/corpus_server/impl/UimaUtil.java
diff --git a/corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/IndexWriter.properties b/corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/IndexWriter.properties
similarity index 100%
rename from corpus-server/src/main/resources/org/apache/opennlp/corpus_server/search/IndexWriter.properties
rename to corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/IndexWriter.properties
diff --git a/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/LuceneIndexer.xml b/corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/LuceneIndexer.xml
similarity index 100%
rename from corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/LuceneIndexer.xml
rename to corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/LuceneIndexer.xml
diff --git a/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml b/corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml
similarity index 100%
rename from corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml
rename to corpus-server/corpus-server-impl/src/main/resources/org/apache/opennlp/corpus_server/impl/TypeSystem.xml
diff --git a/corpus-server-tools/bin/cs-tools b/corpus-server/corpus-server-tools/bin/cs-tools
similarity index 100%
rename from corpus-server-tools/bin/cs-tools
rename to corpus-server/corpus-server-tools/bin/cs-tools
diff --git a/corpus-server-tools/pom.xml b/corpus-server/corpus-server-tools/pom.xml
similarity index 69%
rename from corpus-server-tools/pom.xml
rename to corpus-server/corpus-server-tools/pom.xml
index a490d58..843d3eb 100644
--- a/corpus-server-tools/pom.xml
+++ b/corpus-server/corpus-server-tools/pom.xml
@@ -21,59 +21,46 @@
 
 <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>
-
 	<parent>
-		<groupId>org.apache</groupId>
-		<artifactId>apache</artifactId>
-		<version>9</version>
-		<relativePath />
+		<groupId>org.apache.opennlp</groupId>
+		<artifactId>corpus-server</artifactId>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 
-	<groupId>org.apache.opennlp</groupId>
 	<artifactId>corpus-server-tools</artifactId>
-	<version>0.0.1-incubating-SNAPSHOT</version>
+	<version>2.1.1-incubating-SNAPSHOT</version>
 	<packaging>jar</packaging>
 
-	<name>OpenNLP Corpus Server Shell</name>
-
-	<prerequisites>
-		<maven>3.0</maven>
-	</prerequisites>
+	<name>Apache OpenNLP Corpus Server Shell</name>
 
-	<repositories>
-		<repository>
-			<id>maven2-repository.java.net</id>
-			<name>Java.net Repository for Maven</name>
-			<url>http://download.java.net/maven/2/</url>
-			<layout>default</layout>
-		</repository>
-	</repositories>
-	
 	<dependencies>
+		<dependency>
+			<groupId>org.apache.opennlp</groupId>
+			<artifactId>corpus-server-core</artifactId>
+			<version>2.1.1-SNAPSHOT</version>
+			<scope>provided</scope>
+		</dependency>
+
 		<dependency>
 		    <groupId>com.sun.jersey</groupId>
 		    <artifactId>jersey-json</artifactId>
-		    <version>1.8</version>
 		</dependency>
 
 		<dependency>
 		    <groupId>com.sun.jersey</groupId>
 		    <artifactId>jersey-client</artifactId>
-		    <version>1.8</version>
 		</dependency>
     
     	<dependency>
 			<groupId>org.apache.uima</groupId>
 			<artifactId>uimaj-core</artifactId>
-			<version>2.3.1</version>
+			<version>${uimaj.version}</version>
 			<scope>compile</scope>
 		</dependency>
 		
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
-			<version>4.8.1</version>
-			<scope>test</scope>
 		</dependency>
 	</dependencies>
 	
@@ -82,11 +69,6 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.6</source>
-					<target>1.6</target>
-          			<compilerArgument>-Xlint</compilerArgument>
-				</configuration>
 			</plugin>
 		</plugins>
 	</build>
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CASImporter.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CorpusBackup.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateCorpus.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/CreateTaskQueue.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/DropCorpus.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/FileUtil.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/RemoveCAS.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/ReplaceTypeSystem.java
diff --git a/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java b/corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
similarity index 100%
rename from corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
rename to corpus-server/corpus-server-tools/src/main/java/org/apache/opennlp/corpus_server/tools/SearchCorpus.java
diff --git a/corpus-server/pom.xml b/corpus-server/pom.xml
index 3b210c1..6d0b918 100644
--- a/corpus-server/pom.xml
+++ b/corpus-server/pom.xml
@@ -21,170 +21,122 @@
 
 <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>
-
 	<parent>
-		<groupId>org.apache</groupId>
-		<artifactId>apache</artifactId>
-		<version>9</version>
-		<relativePath />
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <!-- TODO OPENNLP-1452 once this is resolved, move to 29 as well. -->
+    <version>18</version>
+    <relativePath />
 	</parent>
 
 	<groupId>org.apache.opennlp</groupId>
 	<artifactId>corpus-server</artifactId>
-	<version>0.0.1-SNAPSHOT</version>
-	<packaging>bundle</packaging>
-
-	<name>OpenNLP Corpus Server</name>
-
-	<prerequisites>
-		<maven>3.0</maven>
-	</prerequisites>
-
-	<repositories>
-		<repository>
-		    <id>maven2-repository.java.net</id>
-		    <name>Java.net Repository for Maven</name>
-		    <url>http://download.java.net/maven/2/</url>
-		    <layout>default</layout>
-		</repository>
-	</repositories>
-	
-	<dependencies>
-	
-	    <dependency>
-      		<groupId>javax.servlet</groupId>
-      		<artifactId>servlet-api</artifactId>
-      		<version>2.5</version>
-      		<scope>provided</scope>
-    	</dependency>
-    
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>4.2.0</version>
-            <scope>provided</scope>
-        </dependency>
-        
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <version>4.2.0</version>
+	<version>2.1.1-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+	<name>Apache OpenNLP Corpus Server</name>
+
+	<modules>
+		<module>corpus-server-core</module>
+		<module>corpus-server-impl</module>
+		<module>corpus-server-tools</module>
+		<module>corpus-server-connector</module>
+	</modules>
+
+  <properties>
+    <maven.compiler.source>11</maven.compiler.source>
+    <maven.compiler.target>11</maven.compiler.target>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+    <derby.version>10.14.2.0</derby.version>
+    <uimaj.version>3.3.1</uimaj.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
             <scope>provided</scope>
         </dependency>
 
-		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-servlet</artifactId>
-			<version>1.12</version>
-			<scope>provided</scope>
-		</dependency>
-		
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-json</artifactId>
-		    <version>1.12</version>
-		    <scope>provided</scope>
-		</dependency>
-
-		<dependency>
-		    <groupId>com.sun.jersey</groupId>
-		    <artifactId>jersey-client</artifactId>
-		    <version>1.12</version>
-		    <scope>test</scope>
-		</dependency>
-
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>4.8.1</version>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-	
+      <dependency>
+          <groupId>org.osgi</groupId>
+          <artifactId>org.osgi.core</artifactId>
+          <version>4.2.0</version>
+          <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+          <groupId>org.osgi</groupId>
+          <artifactId>org.osgi.compendium</artifactId>
+          <version>4.2.0</version>
+          <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>com.sun.jersey</groupId>
+        <artifactId>jersey-servlet</artifactId>
+        <version>1.12</version>
+        <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+          <groupId>com.sun.jersey</groupId>
+          <artifactId>jersey-json</artifactId>
+          <version>1.12</version>
+          <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+          <groupId>com.sun.jersey</groupId>
+          <artifactId>jersey-client</artifactId>
+          <version>1.12</version>
+          <scope>provided</scope>
+      </dependency>
+
+      <dependency>
+        <groupId>junit</groupId>
+        <artifactId>junit</artifactId>
+        <version>4.13.2</version>
+        <scope>test</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
 	<build>
+	  <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <configuration>
+            <source>${maven.compiler.source}</source>
+            <target>${maven.compiler.target}</target>
+            <compilerArgument>-Xlint</compilerArgument>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
 		<plugins>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.6</source>
-					<target>1.6</target>
-          			<compilerArgument>-Xlint</compilerArgument>
-				</configuration>
-			</plugin>
-			
-			<!-- to generate the MANIFEST-FILE required by the bundle -->
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <version>2.3.7</version>
-                <extensions>true</extensions>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
-                <configuration>
-                    <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
-                    <instructions>
-                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Import-Package>
-                        	!javax.persistence.*,
-                        	!javax.servlet.annotation,
-                        	!javax.servlet.jsp.*,
-                        	!javax.microedition.*,
-                        	!javax.mail.*,
-                        	!javax.transaction.xa,
-                        	!javax.jms,
-                        	!javax.interceptor,!javax.inject,
-                        	!javax.enterprise.*,
-                        	!javax.annotation.security,
-                        	!javax.ejb,
-                        	!com.sun.xml.fastinfoset.*,
-                        	!org.jvnet.*,
-                        	!org.apache.derby.impl.drda,
-                        	!com.ibm.jvm,
-                        	!com.sun.jdmk.comm,
-                        	!com.sun.net.httpserver,
-                        	!sun.misc,
-                        	javax.servlet,
-                        	*,
-                        	com.sun.jersey.json.impl.provider.entity.*,
-                        	com.sun.jersey.json.*,
-                        	org.codehaus.jackson.*,
-                        	org.codehaus.jackson.xc,
-                        	org.apache.opennlp.corpus_server,
-                        	com.sun.jersey.api.core,
-                        	com.sun.jersey.spi.container.servlet</Import-Package>
-                        <!-- Import-Package>org.apache.derby.jdbc, !com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
-                        <Export-Package>org.apache.opennlp.corpus_server.*, org.apache.opennlp.corpus_server.search</Export-Package>
-                        <Webapp-Context>rest</Webapp-Context>
-                        <Web-ContextPath>rest</Web-ContextPath>
-                        <Bundle-Activator>org.apache.opennlp.corpus_server.CorpusServerBundle</Bundle-Activator>
-                    </instructions>
-                </configuration>
-            </plugin>
-            
-            <!-- plugin>
-	        <groupId>org.apache.karaf.tooling</groupId>
-	        <artifactId>features-maven-plugin</artifactId>
-	        <version>2.2.4</version>
-	        <executions>
-	          <execution>
-	            <id>generate-features-file</id>
-	            <goals>
-	              <goal>generate-features-file</goal>
-	            </goals>
-	            <configuration>
-	              <karafVersion>2.2.4</karafVersion>
-	            </configuration>
-	          </execution>
-	        </executions>
-	      </plugin -->
+
+      <!-- plugin>
+				<groupId>org.apache.karaf.tooling</groupId>
+				<artifactId>features-maven-plugin</artifactId>
+				<version>2.2.4</version>
+				<executions>
+					<execution>
+						<id>generate-features-file</id>
+						<goals>
+							<goal>generate-features-file</goal>
+						</goals>
+						<configuration>
+							<karafVersion>2.2.4</karafVersion>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin -->
       
 		</plugins>
 	</build>