diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 98ba25a..add194b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,8 +13,7 @@
 
 ## Preparing a Pull Request (PR)
 
-In order to contribute to the uimaFIT project, you need to create a **pull request**. This section
-briefly guides you through the best way of doing this:
+In order to contribute to the uimaFIT project, you need to create a **pull request**. This section briefly guides you through the best way of doing this:
 
 * Before creating a pull request, create an issue in the issue tracker of the project to which
   you wish to contribute
diff --git a/README b/README
index 59e67fb..ed5b172 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 
-      Apache uimaFIT (TM) v2.5.0
+      Apache uimaFIT (TM) v3.1.0
       --------------------------
 
 
@@ -37,37 +37,36 @@
      SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
 
 
-What's New in 2.5.0
+What's New in 3.1.0
 -------------------
 
-uimaFIT 2.5.0 is a minor feature and bugfix release. On supported platforms, it should should serve
-as a drop-in replacement for previous uimaFIT 2.x versions.
+uimaFIT 3.1.0 is a minor feature and bugfix release. On supported platforms, it serves mostly as 
+a drop-in replacement for previous uimaFIT 3.x versions. However, due to a clash in method
+signatures, you may notice incompatible changes in the methods provided ExternalResourceFactory.
+For details, please refer to the migration section in the documentation.
 
-Notable changes include:
+Notable changes in this release include:
 
  * Added support for PEARs in AnalysisEngineFactory
- * Added support for destroying auto-created resource managers if feasible
- * Added CasFactory
- * Added CasUtil.exists(...) method
- * Added support for Charset-typed parameters in components
  * Added ExternalResourceFactory.createResource(...) methods for instantiating resources
+ * Added support for Charset-typed parameters in components
  * Added ability to set number of threads in CpePipeline.runPipeline(...)
- * Fixed FSUtil.getFeature(...) failing when called with Object.class on multi-valued features
  * Fixed issue with non-XML 1.0 characters in parameter values when running CPEs
  * Fixed JCasIterable.iterator() destroying the ResourceManager before it is even used
- * Fixed CollectionReaderFactory.createReaderDescription(...) not discovering type prios and indexes
  * Fixed issue causing component parameters to be used when initializing resources
- * Upgraded to UIMA 2.10.4
+ * Fixed CollectionReaderFactory.createReaderDescription(...) not discovering type prios and indexes
+ * Fixed clashing method signatures of ExternalResourceFactory.bindResource(...)
+ * Upgraded to UIMA 3.1.1
  * Upgraded to Spring 4.3.26
-
+ 
 A full list of issues addressed in this release can be found on the Apache issue tracker:
 
-  https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310570&version=12339544
+  https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310570&version=12343882
 
 Supported Platforms
 -------------------
 
-uimaFIT requires Java 1.8 or higher, UIMA 2.10.4 or higher, and the Spring Framework 4.3.26 or higher.
+uimaFIT requires Java 1.8 or higher, UIMA 3.1.1 or higher, and the Spring Framework 4.3.26 or higher.
 
 
 Availability
@@ -84,7 +83,7 @@
   <dependency>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-core</artifactId>
-    <version>2.5.0</version>
+    <version>3.1.0</version>
   </dependency>
 
 
@@ -98,11 +97,6 @@
 uimafit-junit          - convenience code facilitating the implementation of UIMA/uimaFIT tests
                          in JUnit tests
 uimafit-assertj        - adds assertions for UIMA/uimaFIT types via the AssertJ framework
-uimafit-legacy-support - allows uimaFIT 2.x.0 to use uimaFIT 1.4.x meta data like Java annotations
-                         and META-INF/org.uimafit/types.txt files. Pipelines mixing uimaFIT 1.4.x
-                         and 2.x components MUST be created using the 2.x factories, because the
-                         1.4.x factories will NOT understand how to handle uimaFIT 2.x components
-                         or auto-configuration.
 uimafit-spring         - an experimental module serving as a proof-of-concept for the integration of
                          UIMA with the Spring Framework. It is currently not considered finished and
                          uses invasive reflection in order to patch the UIMA framework such that it
diff --git a/api-change-report.html b/api-change-report.html
index f4a27fd..406fe0c 100644
--- a/api-change-report.html
+++ b/api-change-report.html
@@ -1,4 +1,4 @@
-	<!--
+<!--
     ***************************************************************
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
@@ -17,20 +17,19 @@
     * specific language governing permissions and limitations
     * under the License.
     ***************************************************************
-   -->
+-->
 <html>
 <head>
-  <title>API Change Report - Apache uimaFIT</title>
+  <title>API Change Report - Apache UIMA uimaFIT</title>
 </head>
 <body>
-<h1>Apache uimaFIT API Change Report</h1>
+<h1>Apache UIMA (Unstructured Information Management Architecture) uimaFIT API Change Report</h1>
 
 <h2>Contents</h2>
 <p>
 <a href="#description">What is an API change report?</a><br/>
 <a target="_blank" href="uimafit-core/api-change-report/japicmp.html">API Changes: uimafit-core</a><br/>
 <a target="_blank" href="uimafit-cpe/api-change-report/japicmp.html">API Changes: uimafit-cpe</a><br/>
-<a target="_blank" href="uimafit-legacy-support/api-change-report/japicmp.html">API Changes: uimafit-legacy-support</a><br/>
 <a target="_blank" href="uimafit-spring/api-change-report/japicmp.html">API Changes: uimafit-spring</a><br/>
 <a href-"#running-more-reports">Running your own custom reports</a>
 </p>  
@@ -38,7 +37,7 @@
 <h2><a id="description">What is an API change report?</a></h2>
 
      <p>
-  			Four of the uimaFIT modules track API changes from version to version.
+  			Three of the modules in uimaFIT track API changes from version to version.
   			The changes between this current version and the last previously released version are
   			reported below.  Each report includes a summary of Classes that were changed, together with
   			a flag indicating if the change was a source or binary incompatible change.
@@ -46,7 +45,7 @@
   	 </p>
   	 
   	 <p>
-  	   Follow the links above to get the report for each of the four modules.		
+  	   Follow the links above to get the report for each of the 3 modules.		
   	 </p>
   	 
  
diff --git a/pom.xml b/pom.xml
index d098714..a00e3d6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,11 +28,11 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>uimafit-parent</relativePath>
   </parent>
   <properties>
-    <jiraVersion>2.5.0uimaFIT</jiraVersion>
+    <jiraVersion>3.1.0uimaFIT</jiraVersion>
   </properties>
   <scm>
     <connection>scm:git:git://github.com/apache/uima-uimafit</connection>
@@ -51,27 +51,22 @@
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-cpe</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-junit</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-assertj</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>uimafit-legacy-support</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
   </dependencies>
   <build>
@@ -113,23 +108,27 @@
           </execution>
         </executions>
       </plugin>
-      <plugin>
-        <groupId>org.apache.rat</groupId>
-        <artifactId>apache-rat-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>default-cli</id>
-            <configuration>
-              <excludes combine.children="append">
-                <!-- These files are unreasonable to bear a license header -->
-                <exclude>.github/**/*</exclude>
-                <exclude>CONTRIBUTING.md</exclude>
-              </excludes>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
     </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <executions>
+            <execution>
+              <id>default-cli</id>
+              <configuration>
+                <excludes combine.children="append">
+                  <!-- These configuration files cannot bear a license header -->
+                  <exclude>.github/**/*</exclude>
+                  <exclude>CONTRIBUTING.md</exclude>
+                </excludes>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+      </plugins>
+    </pluginManagement>
   </build>
 
   <modules>
@@ -139,7 +138,6 @@
     <module>uimafit-examples</module>
     <module>uimafit-spring</module>
     <module>uimafit-maven-plugin</module>
-    <module>uimafit-legacy-support</module>
     <module>uimafit-doc</module>
     <module>uimafit-cpe</module>
     <module>uimafit-benchmark</module>
@@ -176,4 +174,4 @@
       </build>
     </profile>
   </profiles>
-</project>
\ No newline at end of file
+</project>
diff --git a/src/main/assembly/bin.xml b/src/main/assembly/bin.xml
index 066cb11..3490e56 100644
--- a/src/main/assembly/bin.xml
+++ b/src/main/assembly/bin.xml
@@ -44,7 +44,6 @@
         <exclude>org.springframework:spring-aop</exclude>
         <exclude>aopalliance:aopalliance</exclude>
         <exclude>org.apache.uima:uimafit-cpe</exclude>
-        <exclude>org.apache.uima:uimafit-legacy-support</exclude>
       </excludes>
     </dependencySet>
     
@@ -56,7 +55,6 @@
       <useTransitiveFiltering>true</useTransitiveFiltering>
       <includes>
         <include>org.apache.uima:uimafit-cpe</include>
-        <include>org.apache.uima:uimafit-legacy-support</include>
       </includes>
     </dependencySet>
   </dependencySets>  
@@ -136,5 +134,31 @@
       <fileMode>644</fileMode>
       <directoryMode>755</directoryMode>        
     </fileSet>
+    
+    <!-- Copy the API Change reports -->
+    <fileSet>
+      <directory>uimafit-core/api-change-report</directory>
+      <outputDirectory>uimafit-core/api-change-report</outputDirectory>
+      <fileMode>644</fileMode>
+      <directoryMode>755</directoryMode>
+    </fileSet>
+    <fileSet>
+      <directory>uimafit-cpe/api-change-report</directory>
+      <outputDirectory>uimafit-cpe/api-change-report</outputDirectory>
+      <directoryMode>755</directoryMode>
+      <fileMode>644</fileMode>
+    </fileSet>
+    <fileSet>
+      <directory>uimafit-spring/api-change-report</directory>
+      <outputDirectory>uimafit-spring/api-change-report</outputDirectory>
+      <fileMode>644</fileMode>
+      <directoryMode>755</directoryMode>
+    </fileSet>
   </fileSets>
+  <files>
+    <file>
+      <source>api-change-report.html</source>
+      <outputDirectory>.</outputDirectory>
+    </file>
+  </files>
 </assembly>
\ No newline at end of file
diff --git a/src/main/dist-bin/LICENSE b/src/main/dist-bin/LICENSE
index 1a12bb2..df56428 100644
--- a/src/main/dist-bin/LICENSE
+++ b/src/main/dist-bin/LICENSE
@@ -201,7 +201,7 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 
-=======================================================================   
+=======================================================================
 
 SPRING FRAMEWORK 4.3.26.RELEASE SUBCOMPONENTS:
 
diff --git a/src/main/dist-bin/NOTICE b/src/main/dist-bin/NOTICE
index 912e97a..a8becec 100644
--- a/src/main/dist-bin/NOTICE
+++ b/src/main/dist-bin/NOTICE
@@ -26,10 +26,10 @@
 
 ----------------------------------------------------------------
 
-Apache UIMA Base 2.10.4: uimaj-core
-Apache UIMA Base 2.10.4: jVinci: Vinci Transport Library
-Apache UIMA Base 2.10.4: uimaj-adapter-vinci: Vinci Adapter
-Apache UIMA Base 2.10.4: uimaj-cpe: Collection Processing Engine
+Apache UIMA Base 3.1.1: uimaj-core
+Apache UIMA Base 3.1.1: jVinci: Vinci Transport Library
+Apache UIMA Base 3.1.1: uimaj-adapter-vinci: Vinci Adapter
+Apache UIMA Base 3.1.1: uimaj-cpe: Collection Processing Engine
 Copyright 2006-2019 The Apache Software Foundation
 
 Portions of Apache UIMA were originally developed by
@@ -41,13 +41,13 @@
 
 ----------------------------------------------------------------
 
-Apache Commons IO 2.2
-Copyright 2002-2012 The Apache Software Foundation
+Apache Commons IO 2.6
+Copyright 2002-2017 The Apache Software Foundation
 
 ----------------------------------------------------------------
 
-Apache Commons Lang 2.6
-Copyright 2001-2011 The Apache Software Foundation
+Apache Commons Lang 3.8.1
+Copyright 2001-2018 The Apache Software Foundation
 
 ----------------------------------------------------------------
 
diff --git a/uimafit-assertj/pom.xml b/uimafit-assertj/pom.xml
index eab3ac3..61d4e60 100644
--- a/uimafit-assertj/pom.xml
+++ b/uimafit-assertj/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <artifactId>uimafit-assertj</artifactId>
@@ -33,7 +33,7 @@
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
diff --git a/uimafit-benchmark/pom.xml b/uimafit-benchmark/pom.xml
index 622a471..4b7d651 100644
--- a/uimafit-benchmark/pom.xml
+++ b/uimafit-benchmark/pom.xml
@@ -27,19 +27,21 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <properties>
     <maven.deploy.skip>true</maven.deploy.skip>
-    <maven.compiler.source>1.8</maven.compiler.source>
-    <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
   <dependencies>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
@@ -47,13 +49,14 @@
       <version>3.6.1</version>
     </dependency>
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>uimaj-core</artifactId>
-    </dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
   </dependencies>
   <licenses>
     <license>
@@ -114,8 +117,6 @@
               <id>default-cli</id>
               <configuration>
                 <excludes combine.children="append">
-                  <!-- These test files are unreasonable to bear a license header -->
-                  <exclude>src/test/resources/log4j.properties</exclude>
                   <!-- These configuration files cannot bear a license header -->
                   <exclude>src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
                 </excludes>
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
index 1b998e3..b589e92 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
@@ -24,7 +24,7 @@
 import java.util.function.IntFunction;
 import java.util.function.LongSupplier;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 public class Benchmark {
     private IntConsumer initializer = t -> {};
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
index 8cb98be..cbd62e0 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
@@ -19,5 +19,5 @@
 package org.apache.uima.fit.benchmark;
 
 public interface RunnableWithExceptions {
-    void run() throws Exception;
-  }
\ No newline at end of file
+	void run() throws Exception;
+}
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
index 673491b..52f2c6c 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
@@ -28,9 +28,12 @@
 import static org.apache.uima.fit.util.CasUtil.selectCovered;
 import static org.apache.uima.fit.util.CasUtil.selectCovering;
 import static org.apache.uima.fit.util.CasUtil.selectFS;
+import static org.apache.uima.fit.util.CasUtil.selectOverlapping;
 
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.fit.util.AnnotationPredicates;
 import org.apache.uima.util.CasCreationUtils;
 import org.junit.Before;
 import org.junit.Test;
@@ -63,10 +66,18 @@
       .measure(() -> select(cas, getType(cas, TYPE_NAME_TOKEN)))
       .run();
 
+    new Benchmark("CAS select Token v3", template)
+      .measure(() -> cas.select(getType(cas, TYPE_NAME_TOKEN)))
+      .run();
+
     new Benchmark("CAS select Token and iterate", template)
       .measure(() -> select(cas, getType(cas, TYPE_NAME_TOKEN)).forEach(v -> {}))
       .run();
 
+    new Benchmark("CAS select Token and iterate v3", template)
+      .measure(() -> cas.select(getType(cas, TYPE_NAME_TOKEN)).forEach(v -> {}))
+      .run();
+
     new Benchmark("CAS select Sentence", template)
       .measure(() -> select(cas, getType(cas, TYPE_NAME_SENTENCE)))
       .run();
@@ -83,6 +94,10 @@
       .measure(() -> selectFS(cas, getType(cas, CAS.TYPE_NAME_TOP)).forEach(v -> {}))
       .run();
 
+    new Benchmark("CAS select TOP and iterate v3", template)
+      .measure(() -> cas.select(getType(cas, CAS.TYPE_NAME_TOP)).forEach(v -> {}))
+      .run();
+
     new Benchmark("CAS select ALL", template)
       .measure(() -> selectAll(cas))
       .run();
@@ -90,6 +105,37 @@
     new Benchmark("CAS select ALL and iterate", template)
       .measure(() -> selectAll(cas).forEach(v -> {}))
       .run();
+
+    new Benchmark("CAS select ALL and iterate v3", template)
+      .measure(() -> cas.select().forEach(v -> {}))
+      .run();
+  }
+  
+  @Test
+  public void benchmarkSelectOverlapping() {
+    Benchmark template = new Benchmark("TEMPLATE")
+        .initialize(n -> initRandomCas(cas, n))
+        .magnitude(10)
+        .magnitudeIncrement(count -> count * 10)
+        .incrementTimes(4);
+    
+    new Benchmark("CAS selectOverlapping", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        select(cas, sentenceType).forEach(s -> selectOverlapping(cas, tokenType, s).forEach(t -> {}));
+      })
+      .run();
+
+    new Benchmark("CAS selectOverlapping v3", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        cas.select(sentenceType).forEach(s -> cas.select(tokenType)
+            .filter(t -> AnnotationPredicates.overlaps((AnnotationFS) t, (AnnotationFS)s))
+            .forEach(t -> {}));
+      })
+      .run();
   }
   
   @Test
@@ -108,6 +154,14 @@
       })
       .run();
 
+    new Benchmark("CAS selectCovered v3", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        cas.select(sentenceType).forEach(s -> cas.select(tokenType).coveredBy((AnnotationFS) s).forEach(t -> {}));
+      })
+      .run();
+
     new Benchmark("CAS indexCovered", template)
       .measure(() -> indexCovered(cas, getType(cas, TYPE_NAME_SENTENCE), getType(cas, TYPE_NAME_TOKEN))
           .forEach((s, l) -> l.forEach(t -> {})))
@@ -138,6 +192,14 @@
       })
       .run();
 
+    new Benchmark("CAS selectCovering v3", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        cas.select(tokenType).forEach(t -> cas.select(sentenceType).covering((AnnotationFS) t).forEach(s -> {}));
+      })
+      .run();
+
     new Benchmark("CAS indexCovering", template)
       .measure(() -> indexCovering(cas, getType(cas, TYPE_NAME_TOKEN), getType(cas, TYPE_NAME_SENTENCE))
           .forEach((t, l) -> l.forEach(s -> {})))
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
index 591dfb8..303c125 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
@@ -19,6 +19,7 @@
 package org.apache.uima.fit.benchmark;
 
 import static org.apache.uima.fit.benchmark.CasInitializationUtils.initRandomCas;
+import static org.apache.uima.fit.util.JCasUtil.selectOverlapping;
 import static org.apache.uima.fit.util.JCasUtil.indexCovered;
 import static org.apache.uima.fit.util.JCasUtil.indexCovering;
 import static org.apache.uima.fit.util.JCasUtil.select;
@@ -29,6 +30,7 @@
 import org.apache.uima.fit.factory.JCasFactory;
 import org.apache.uima.fit.type.Sentence;
 import org.apache.uima.fit.type.Token;
+import org.apache.uima.fit.util.AnnotationPredicates;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.jcas.cas.TOP;
 import org.junit.Before;
@@ -59,10 +61,18 @@
       .measure(() -> select(jcas, Token.class))
       .run();
 
+    new Benchmark("JCas select Token v3", template)
+      .measure(() -> jcas.select(Token.class))
+      .run();
+
     new Benchmark("JCas select Token and iterate", template)
       .measure(() -> select(jcas, Token.class).forEach(v -> {}))
       .run();
 
+    new Benchmark("JCas select Token and iterate v3", template)
+      .measure(() -> jcas.select(Token.class).forEach(v -> {}))
+      .run();
+
     new Benchmark("JCas select Sentence", template)
       .measure(() -> select(jcas, Sentence.class))
       .run();
@@ -79,6 +89,10 @@
       .measure(() -> select(jcas, TOP.class).forEach(v -> {}))
       .run();
     
+    new Benchmark("JCas select TOP and iterate v3", template)
+      .measure(() -> jcas.select(TOP.class).forEach(v -> {}))
+      .run();
+
     new Benchmark("JCas select ALL", template)
       .measure(() -> selectAll(jcas))
       .run();
@@ -86,6 +100,49 @@
     new Benchmark("JCas select ALL and iterate", template)
       .measure(() -> selectAll(jcas).forEach(v -> {}))
       .run();
+    new Benchmark("JCas select ALL and iterate v3", template)
+      .measure(() -> jcas.select().forEach(v -> {}))
+      .run();
+  }
+  
+  @Test
+  public void benchmarkSelectOverlapping() {
+    Benchmark template = new Benchmark("TEMPLATE")
+      .initialize(n -> initRandomCas(jcas.getCas(), n))
+      .magnitude(10)
+      .magnitudeIncrement(count -> count * 10)
+      .incrementTimes(4);
+    
+    new Benchmark("CAS selectOverlapping", template)
+      .measure(() -> {
+        select(jcas, Sentence.class).forEach(s -> selectOverlapping(jcas, Token.class, s)
+            .forEach(t -> {}));
+      })
+      .run();
+
+    new Benchmark("CAS overlapping via index v3 (stream)", template)
+      .measure(() -> {
+        jcas.getAnnotationIndex(Sentence.class).forEach(s -> jcas.getAnnotationIndex(Token.class)
+            .stream()
+            .filter(t -> AnnotationPredicates.overlaps(t, s))
+            .forEach(t -> {}));
+      })
+      .run();
+
+    new Benchmark("CAS overlapping via index v3 (forEach)", template)
+      .measure(() -> {
+        jcas.getAnnotationIndex(Sentence.class).forEach(s -> jcas.getAnnotationIndex(Token.class)
+            .forEach(t -> AnnotationPredicates.overlaps(t, s)));
+      })
+      .run();
+
+    new Benchmark("CAS selectOverlapping v3", template)
+      .measure(() -> {
+        jcas.select(Sentence.class).forEach(s -> jcas.select(Token.class)
+            .filter(t -> AnnotationPredicates.overlaps(t, s))
+            .forEach(t -> {}));
+      })
+      .run();
   }
   
   @Test
@@ -100,6 +157,12 @@
       .measure(() -> select(jcas, Sentence.class).forEach(s -> selectCovered(Token.class, s)))
       .run();
 
+    new Benchmark("JCas selectCovered v3", template)
+      .measure(() -> {
+          jcas.select(Sentence.class).forEach(s -> jcas.select(Token.class).coveredBy(s).forEach(t -> {}));
+      })
+    .run();
+
     new Benchmark("JCas indexCovered", template)
       .measure(() -> indexCovered(jcas, Sentence.class, Token.class).forEach((s, l) -> l.forEach(t -> {})))
       .run();
@@ -117,6 +180,12 @@
       .measure(() -> select(jcas, Token.class).forEach(t -> selectCovering(Sentence.class, t)))
       .run();
 
+    new Benchmark("JCas selectCovering v3", template)
+      .measure(() -> {
+          jcas.select(Token.class).forEach(t -> jcas.select(Sentence.class).covering(t).forEach(s -> {}));
+      })
+    .run();
+
     new Benchmark("JCas indexCovering", template)
       .measure(() -> indexCovering(jcas, Token.class, Sentence.class).forEach((t, l) -> l.forEach(s -> {})))
       .run();
diff --git a/uimafit-benchmark/src/test/resources/simplelogger.properties b/uimafit-benchmark/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-benchmark/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-core/NOTICE b/uimafit-core/NOTICE
index 8de1481..28fa12a 100644
--- a/uimafit-core/NOTICE
+++ b/uimafit-core/NOTICE
@@ -1,3 +1,7 @@
+Apache UIMA uimaFIT
+Copyright 2013-2019 The Apache Software Foundation
+
+
 Copyright 2009-2012 Regents of the University of Colorado.
 All rights reserved.
 
diff --git a/uimafit-core/pom.xml b/uimafit-core/pom.xml
index 2d24d46..23bfdd1 100644
--- a/uimafit-core/pom.xml
+++ b/uimafit-core/pom.xml
@@ -27,23 +27,19 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <dependencies>
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging-api</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimaj-core</artifactId>
     </dependency>
@@ -60,6 +56,10 @@
       <artifactId>spring-beans</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-collections4</artifactId>
       <version>4.4</version>
@@ -73,10 +73,14 @@
     <dependency> <!-- https://issues.apache.org/jira/browse/UIMA-5173 -->
       <groupId>xmlunit</groupId>
       <artifactId>xmlunit</artifactId>
-      <version>1.5</version>
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+    <dependency>    
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>
@@ -86,30 +90,6 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.15</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <artifactId>jmxtools</artifactId>
-          <groupId>com.sun.jdmk</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jmxri</artifactId>
-          <groupId>com.sun.jmx</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jms</artifactId>
-          <groupId>javax.jms</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>mail</artifactId>
-          <groupId>javax.mail</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
   </dependencies>
   <licenses>
     <license>
@@ -172,6 +152,15 @@
                 <excludes combine.children="append">
                   <!-- These test files are unreasonable to bear a license header -->
                   <exclude>src/test/resources/log4j.properties</exclude>
+                  <!-- Plain documentation -->
+                  <exclude>README*</exclude>
+                  <!-- Release files -->
+                  <exclude>RELEASE_NOTES*</exclude>
+                  <exclude>issuesFixed/**</exclude>
+                  <exclude>release.properties</exclude>
+                  <!-- Build controls -->
+                  <exclude>.activate-enforce-compatibility</exclude>
+                  <!-- These test files are unreasonable to bear a license header -->
                   <exclude>src/test/resources/data/docs/unix-newlines.txt.bin</exclude>
                   <exclude>src/test/resources/data/docs/windows-newlines.txt.bin</exclude>
                   <exclude>src/test/resources/data/docs/bad.xcas</exclude>
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasAnnotator_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasAnnotator_ImplBase.java
index 014e0bf..e7c2ef9 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasAnnotator_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasAnnotator_ImplBase.java
@@ -22,7 +22,6 @@
 import org.apache.uima.UimaContext;
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -31,20 +30,6 @@
  */
 public abstract class CasAnnotator_ImplBase extends
         org.apache.uima.analysis_component.CasAnnotator_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasCollectionReader_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasCollectionReader_ImplBase.java
index b5dd35c..eca9ef2 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasCollectionReader_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasCollectionReader_ImplBase.java
@@ -25,7 +25,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -34,16 +33,6 @@
  */
 @OperationalProperties(outputsNewCases = true)
 public abstract class CasCollectionReader_ImplBase extends CollectionReader_ImplBase {
-  private ExtendedLogger logger;
-
-  @Override
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getUimaContext());
-    }
-    return logger;
-  }
-
   @Override
   // This method should not be overwritten. Overwrite initialize(UimaContext) instead.
   public final void initialize() throws ResourceInitializationException {
@@ -65,6 +54,7 @@
     // Nothing by default
   }
 
+  @Override
   public void close() throws IOException {
     // Nothing by default
   }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasConsumer_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasConsumer_ImplBase.java
index c72840b..9d599ca 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasConsumer_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasConsumer_ImplBase.java
@@ -22,7 +22,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -34,20 +33,6 @@
 @OperationalProperties(multipleDeploymentAllowed = false)
 public abstract class CasConsumer_ImplBase extends
         org.apache.uima.analysis_component.CasAnnotator_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasFlowController_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasFlowController_ImplBase.java
index 6936486..feca365 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasFlowController_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasFlowController_ImplBase.java
@@ -20,7 +20,6 @@
 
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.flow.FlowControllerContext;
 import org.apache.uima.resource.ResourceInitializationException;
 
@@ -29,20 +28,6 @@
 
 public abstract class CasFlowController_ImplBase extends
         org.apache.uima.flow.CasFlowController_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final FlowControllerContext context)
           throws ResourceInitializationException {
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasMultiplier_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasMultiplier_ImplBase.java
index 89cfeb6..3497d5f 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/CasMultiplier_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/CasMultiplier_ImplBase.java
@@ -22,7 +22,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -32,20 +31,6 @@
 @OperationalProperties(outputsNewCases = true)
 public abstract class CasMultiplier_ImplBase extends
         org.apache.uima.analysis_component.CasMultiplier_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/ExternalResourceAware.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/ExternalResourceAware.java
index ed88342..f5edff0 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/ExternalResourceAware.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/ExternalResourceAware.java
@@ -25,14 +25,12 @@
 /**
  * Allows an external resource to use the {@link ExternalResource} annotation on member variables to
  * gain access to other external resources.
- * 
  */
 public interface ExternalResourceAware {
   /**
-   * Get the name of the resource. This is set by
-   * {@link ExternalResourceFactory#bindExternalResource(org.apache.uima.resource.ResourceCreationSpecifier, String, org.apache.uima.resource.ExternalResourceDescription)
-   * bindExternalResource()} as the parameter {@link ExternalResourceFactory#PARAM_RESOURCE_NAME
-   * PARAM_RESOURCE_NAME}. <br>
+   * Get the name of the resource. This is set by the different variations of
+   * {@link ExternalResourceFactory#bindResourceOnce} which internally call {@code ExternalResourceFactory.bindNestedResources(...)}
+   * to set the parameter {@link ExternalResourceFactory#PARAM_RESOURCE_NAME PARAM_RESOURCE_NAME}.<br>
    * <b>It is mandatory that any resource implementing this interface declares the configuration
    * parameter {@link ExternalResourceFactory#PARAM_RESOURCE_NAME PARAM_RESOURCE_NAME}.</b>
    * 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasAnnotator_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasAnnotator_ImplBase.java
index 0c7ff9d..5483899 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasAnnotator_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasAnnotator_ImplBase.java
@@ -21,7 +21,6 @@
 import org.apache.uima.UimaContext;
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -30,20 +29,6 @@
  */
 public abstract class JCasAnnotator_ImplBase extends
         org.apache.uima.analysis_component.JCasAnnotator_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBase.java
index 10aa63c..0a7f0f4 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBase.java
@@ -28,7 +28,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.resource.ResourceInitializationException;
 
@@ -38,16 +37,6 @@
  */
 @OperationalProperties(outputsNewCases = true)
 public abstract class JCasCollectionReader_ImplBase extends CollectionReader_ImplBase {
-  private ExtendedLogger logger;
-
-  @Override
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getUimaContext());
-    }
-    return logger;
-  }
-
   // This method should not be overwritten. Overwrite initialize(UimaContext) instead.
   @Override
   public final void initialize() throws ResourceInitializationException {
@@ -69,6 +58,7 @@
   }
 
   // This method should not be overwritten. Overwrite getNext(JCas) instead.
+  @Override
   public final void getNext(final CAS cas) throws IOException, CollectionException {
     try {
       getNext(cas.getJCas());
@@ -89,6 +79,7 @@
    */
   public abstract void getNext(JCas jCas) throws IOException, CollectionException;
 
+  @Override
   public void close() throws IOException {
     // Do nothing per default
   }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasConsumer_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasConsumer_ImplBase.java
index 67b161e..2ca2a98 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasConsumer_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasConsumer_ImplBase.java
@@ -22,7 +22,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -34,20 +33,6 @@
 @OperationalProperties(multipleDeploymentAllowed = false)
 public abstract class JCasConsumer_ImplBase extends
         org.apache.uima.analysis_component.JCasAnnotator_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasFlowController_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasFlowController_ImplBase.java
index c659a94..dcdb34c 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasFlowController_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasFlowController_ImplBase.java
@@ -20,7 +20,6 @@
 
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.flow.FlowControllerContext;
 import org.apache.uima.resource.ResourceInitializationException;
 
@@ -29,20 +28,6 @@
 
 public abstract class JCasFlowController_ImplBase extends
         org.apache.uima.flow.JCasFlowController_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final FlowControllerContext context)
           throws ResourceInitializationException {
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasMultiplier_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasMultiplier_ImplBase.java
index bb179f3..52df95d 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasMultiplier_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/JCasMultiplier_ImplBase.java
@@ -22,7 +22,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
 import org.apache.uima.fit.descriptor.OperationalProperties;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 
 /**
@@ -32,20 +31,6 @@
 @OperationalProperties(outputsNewCases = true)
 public abstract class JCasMultiplier_ImplBase extends
         org.apache.uima.analysis_component.JCasMultiplier_ImplBase {
-  private ExtendedLogger logger;
-
-  /**
-   * Get the logger.
-   * 
-   * @return the logger.
-   */
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getContext());
-    }
-    return logger;
-  }
-
   @Override
   public void initialize(final UimaContext context) throws ResourceInitializationException {
     super.initialize(context);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/component/Resource_ImplBase.java b/uimafit-core/src/main/java/org/apache/uima/fit/component/Resource_ImplBase.java
index af3698e..2088069 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/component/Resource_ImplBase.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/component/Resource_ImplBase.java
@@ -23,7 +23,6 @@
 import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
 import org.apache.uima.fit.descriptor.ConfigurationParameter;
 import org.apache.uima.fit.factory.ExternalResourceFactory;
-import org.apache.uima.fit.internal.ExtendedLogger;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceSpecifier;
 
@@ -33,21 +32,10 @@
  */
 public abstract class Resource_ImplBase extends org.apache.uima.resource.Resource_ImplBase
         implements ExternalResourceAware {
-
-  private ExtendedLogger logger;
-
   @ConfigurationParameter(name = ExternalResourceFactory.PARAM_RESOURCE_NAME, mandatory = false)
   private String resourceName;
 
   @Override
-  public ExtendedLogger getLogger() {
-    if (logger == null) {
-      logger = new ExtendedLogger(getUimaContext());
-    }
-    return logger;
-  }
-
-  @Override
   public boolean initialize(final ResourceSpecifier aSpecifier,
           final Map<String, Object> aAdditionalParams) throws ResourceInitializationException {
     if (!super.initialize(aSpecifier, aAdditionalParams)) {
@@ -63,10 +51,12 @@
     return true;
   }
 
+  @Override
   public String getResourceName() {
     return resourceName;
   }
 
+  @Override
   public void afterResourcesInitialized() throws ResourceInitializationException {
     // Per default nothing is done here.
   }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/AnalysisEngineFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/AnalysisEngineFactory.java
index f817a68..52058e8 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/AnalysisEngineFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/AnalysisEngineFactory.java
@@ -25,8 +25,8 @@
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.createConfigurationData;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.ensureParametersComeInPairs;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.setParameters;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnce;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDependencies;
 import static org.apache.uima.fit.factory.FsIndexFactory.createFsIndexCollection;
 import static org.apache.uima.fit.factory.TypePrioritiesFactory.createTypePriorities;
 import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
@@ -1138,7 +1138,7 @@
     // Extract ExternalResourceDescriptions from configurationData
     // <ParamterName, ExternalResourceDescription> will be stored in this map
     Map<String, ExternalResourceDescription> externalResources = ExternalResourceFactory
-            .extractExternalResourceParameters(configurationData);
+            .extractResourceParameters(configurationData);
 
     // Create primitive description normally
     ConfigurationData cdata = createConfigurationData(configurationData);
@@ -1357,12 +1357,12 @@
     }
 
     // Extract external resource dependencies
-    desc.setExternalResourceDependencies(createExternalResourceDependencies(componentClass));
+    desc.setExternalResourceDependencies(createResourceDependencies(componentClass));
 
     // Bind External Resources
     if (externalResources != null) {
       for (Entry<String, ExternalResourceDescription> e : externalResources.entrySet()) {
-        bindExternalResource(desc, e.getKey(), e.getValue());
+        bindResourceOnce(desc, e.getKey(), e.getValue());
       }
     }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/CasFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/CasFactory.java
index 5c57b35..77a1d26 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/CasFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/CasFactory.java
@@ -27,9 +27,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.uima.UIMAException;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
+import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.metadata.FsIndexCollection;
 import org.apache.uima.resource.metadata.TypePriorities;
@@ -54,10 +54,10 @@
    * @param aText
    *          the document text to be set in the new CAS.
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createText(String aText) throws UIMAException {
+  public static CAS createText(String aText) throws ResourceInitializationException {
     return createText(aText, null);
   }
 
@@ -72,10 +72,11 @@
    * @param aLanguage 
    *          the document language to be set in the new CAS.
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createText(String aText, String aLanguage) throws UIMAException {
+  public static CAS createText(String aText, String aLanguage)
+          throws ResourceInitializationException {
     CAS cas = createCas();
     if (aText != null) {
       cas.setDocumentText(aText);
@@ -93,10 +94,10 @@
    * detected automatically using {@link FsIndexFactory#createFsIndexCollection()}.
    * 
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createCas() throws UIMAException {
+  public static CAS createCas() throws ResourceInitializationException {
     TypeSystemDescription tsd = createTypeSystemDescription();
     TypePriorities tp = createTypePriorities();
     FsIndexCollection indexes = createFsIndexCollection();
@@ -112,10 +113,11 @@
    *          names of the type system descriptors on the classpath used to initialize the CAS (in
    *          Java notation, e.g. "my.package.TypeSystem" without the ".xml" extension)
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createCas(String... typeSystemDescriptorNames) throws UIMAException {
+  public static CAS createCas(String... typeSystemDescriptorNames)
+          throws ResourceInitializationException {
     return CasCreationUtils.createCas(createTypeSystemDescription(typeSystemDescriptorNames), null,
             null);
   }
@@ -127,10 +129,11 @@
    * @param typeSystemDescriptorPaths
    *          paths to type system descriptor files
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createCasFromPath(String... typeSystemDescriptorPaths) throws UIMAException {
+  public static CAS createCasFromPath(String... typeSystemDescriptorPaths)
+          throws ResourceInitializationException {
     return createCas(createTypeSystemDescriptionFromPath(typeSystemDescriptorPaths));
   }
 
@@ -141,10 +144,11 @@
    * @param typeSystemDescription
    *          a type system description to initialize the CAS
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    */
-  public static CAS createCas(TypeSystemDescription typeSystemDescription) throws UIMAException {
+  public static CAS createCas(TypeSystemDescription typeSystemDescription)
+          throws ResourceInitializationException {
     return CasCreationUtils.createCas(typeSystemDescription, null, null);
   }
 
@@ -156,13 +160,13 @@
    * @param typeSystemDescription
    *          a type system description to initialize the CAS
    * @return a new CAS
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the CAS could not be initialized
    * @throws IOException
    *           if there is a problem reading the file
    */
   public static CAS createCas(String fileName, TypeSystemDescription typeSystemDescription)
-          throws UIMAException, IOException {
+          throws ResourceInitializationException, IOException {
     CAS cas = createCas(typeSystemDescription);
     try (InputStream is = new FileInputStream(fileName)) {
       CasIOUtils.load(is, cas);
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/CollectionReaderFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/CollectionReaderFactory.java
index 86df13d..850463c 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/CollectionReaderFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/CollectionReaderFactory.java
@@ -21,8 +21,8 @@
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.createConfigurationData;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.ensureParametersComeInPairs;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.setParameters;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnce;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDependencies;
 import static org.apache.uima.fit.factory.FsIndexFactory.createFsIndexCollection;
 import static org.apache.uima.fit.factory.ResourceCreationSpecifierFactory.createResourceCreationSpecifier;
 import static org.apache.uima.fit.factory.TypePrioritiesFactory.createTypePriorities;
@@ -34,7 +34,6 @@
 import java.util.Map.Entry;
 
 import org.apache.uima.Constants;
-import org.apache.uima.UIMAException;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.collection.CollectionReader;
 import org.apache.uima.collection.CollectionReaderDescription;
@@ -52,6 +51,7 @@
 import org.apache.uima.resource.metadata.ResourceMetaData;
 import org.apache.uima.resource.metadata.TypePriorities;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.util.InvalidXMLException;
 
 /**
  */
@@ -70,13 +70,16 @@
    *          Any additional configuration parameters to be set. These should be supplied as (name,
    *          value) pairs, so there should always be an even number of parameters.
    * @return The CollectionReader created from the XML descriptor and the configuration parameters.
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the descriptor could not be created or if the component could not be instantiated
+   * @throws InvalidXMLException
+   *           if the descriptor could not be created
    * @throws IOException
    *           if the descriptor could not be read
    */
   public static CollectionReader createReaderFromPath(String descriptorPath,
-          Object... configurationData) throws UIMAException, IOException {
+          Object... configurationData)
+          throws ResourceInitializationException, InvalidXMLException, IOException {
     CollectionReaderDescription desc = createReaderDescriptionFromPath(descriptorPath,
             configurationData);
     return UIMAFramework.produceCollectionReader(desc, ResourceManagerFactory.newResourceManager(),
@@ -93,14 +96,17 @@
    *          value) pairs, so there should always be an even number of parameters.
    * @return The CollectionReader created from the XML descriptor and the configuration parameters.
    * @deprecated use {@link #createReaderFromPath(String, Object...)}
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if the descriptor could not be created or if the component could not be instantiated
+   * @throws InvalidXMLException
+   *           if the descriptor could not be created
    * @throws IOException
    *           if the descriptor could not be read
    */
   @Deprecated
   public static CollectionReader createCollectionReaderFromPath(String descriptorPath,
-          Object... configurationData) throws UIMAException, IOException {
+          Object... configurationData)
+          throws ResourceInitializationException, InvalidXMLException, IOException {
     return createReaderFromPath(descriptorPath, configurationData);
   }
 
@@ -113,13 +119,13 @@
    *          Any additional configuration parameters to be set. These should be supplied as (name,
    *          value) pairs, so there should always be an even number of parameters.
    * @return the description created from the XML descriptor and the configuration parameters.
-   * @throws UIMAException
+   * @throws InvalidXMLException
    *           if the descriptor could not be created or if the component could not be instantiated
    * @throws IOException
    *           if the descriptor could not be read
    */
   public static CollectionReaderDescription createReaderDescriptionFromPath(String descriptorPath,
-          Object... configurationData) throws UIMAException, IOException {
+          Object... configurationData) throws InvalidXMLException, IOException {
     ResourceCreationSpecifier specifier = createResourceCreationSpecifier(descriptorPath,
             configurationData);
     return (CollectionReaderDescription) specifier;
@@ -135,14 +141,15 @@
    *          value) pairs, so there should always be an even number of parameters.
    * @return The CollectionReader created from the XML descriptor and the configuration parameters.
    * @deprecated use {@link #createReaderDescriptionFromPath(String, Object...)}
-   * @throws UIMAException
+   * @throws InvalidXMLException
    *           if the descriptor could not be created or if the component could not be instantiated
    * @throws IOException
    *           if the descriptor could not be read
    */
   @Deprecated
   public static CollectionReaderDescription createCollectionReaderDescriptionFromPath(
-          String descriptorPath, Object... configurationData) throws UIMAException, IOException {
+          String descriptorPath, Object... configurationData)
+          throws InvalidXMLException, IOException {
     return createReaderDescriptionFromPath(descriptorPath, configurationData);
   }
 
@@ -156,13 +163,15 @@
    *          Any additional configuration parameters to be set. These should be supplied as (name,
    *          value) pairs, so there should always be an even number of parameters.
    * @return The AnalysisEngine created from the XML descriptor and the configuration parameters.
-   * @throws UIMAException
+   * @throws ResourceInitializationException 
    *           if the descriptor could not be created or if the component could not be instantiated
+   * @throws InvalidXMLException 
+   *           if the descriptor could not be created
    * @throws IOException
    *           if the descriptor could not be read
    */
-  public static CollectionReader createReader(String descriptorName,
-          Object... configurationData) throws UIMAException, IOException {
+  public static CollectionReader createReader(String descriptorName, Object... configurationData)
+          throws IOException, ResourceInitializationException, InvalidXMLException {
     ResourceManager resMgr = ResourceManagerFactory.newResourceManager();
     Import imp = UIMAFramework.getResourceSpecifierFactory().createImport();
     imp.setName(descriptorName);
@@ -182,14 +191,17 @@
    *          value) pairs, so there should always be an even number of parameters.
    * @return The AnalysisEngine created from the XML descriptor and the configuration parameters.
    * @deprecated use {@link #createReader(String, Object...)}
-   * @throws UIMAException
+   * @throws ResourceInitializationException 
    *           if the descriptor could not be created or if the component could not be instantiated
+   * @throws InvalidXMLException 
+   *           if the descriptor could not be created
    * @throws IOException
    *           if the descriptor could not be read
    */
   @Deprecated
   public static CollectionReader createCollectionReader(String descriptorName,
-          Object... configurationData) throws UIMAException, IOException {
+          Object... configurationData)
+          throws IOException, ResourceInitializationException, InvalidXMLException {
     return createReader(descriptorName, configurationData);
   }
 
@@ -661,7 +673,7 @@
     // Extract ExternalResourceDescriptions from configurationData
     // <ParamterName, ExternalResourceDescription> will be stored in this map
     Map<String, ExternalResourceDescription> externalResources = ExternalResourceFactory
-            .extractExternalResourceParameters(configurationData);
+            .extractResourceParameters(configurationData);
 
     // Create description normally
     ConfigurationData cdata = createConfigurationData(configurationData);
@@ -833,12 +845,12 @@
     }
 
     // Extract external resource dependencies
-    desc.setExternalResourceDependencies(createExternalResourceDependencies(readerClass));
+    desc.setExternalResourceDependencies(createResourceDependencies(readerClass));
 
     // Bind External Resources
     if (externalResources != null) {
       for (Entry<String, ExternalResourceDescription> e : externalResources.entrySet()) {
-        bindExternalResource(desc, e.getKey(), e.getValue());
+        bindResourceOnce(desc, e.getKey(), e.getValue());
       }
     }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
index 281d365..067de15 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
@@ -26,8 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.IllegalClassException;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.uima.UIMA_IllegalArgumentException;
 import org.apache.uima.fit.factory.ExternalResourceFactory.ResourceValueType;
 import org.apache.uima.fit.internal.ReflectionUtil;
@@ -383,7 +382,7 @@
       Object value = configurationData[i * 2 + 1];
 
       if (value == null
-              || ExternalResourceFactory.getExternalResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
+              || ExternalResourceFactory.getResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
         continue;
       }
 
@@ -563,7 +562,7 @@
         settings.put(p.getName(), p.getValue());
       }
     } else {
-      throw new IllegalClassException("Unsupported resource specifier class [" + spec.getClass()
+      throw new IllegalArgumentException("Unsupported resource specifier class [" + spec.getClass()
               + "]");
     }
     return settings;
@@ -579,13 +578,13 @@
    *          the parameter name.
    * @param value
    *          the parameter value.
-   * @throws IllegalClassException
+   * @throws IllegalArgumentException
    *           if the value is not of a supported type for the given specifier.
    */
   public static void setParameter(ResourceSpecifier aSpec, String name, Object value) {
     if (aSpec instanceof CustomResourceSpecifier) {
       if (!(value instanceof String || value == null)) {
-        throw new IllegalClassException(String.class, value);
+        throw new IllegalArgumentException("Value must be a string");
       }
       CustomResourceSpecifier spec = (CustomResourceSpecifier) aSpec;
 
@@ -651,7 +650,7 @@
       md.getConfigurationParameterSettings().setParameterValue(name,
               convertParameterValue(param, value));
     } else {
-      throw new IllegalClassException("Unsupported resource specifier class [" + aSpec.getClass()
+      throw new IllegalArgumentException("Unsupported resource specifier class [" + aSpec.getClass()
               + "]");
     }
   }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java
index 86869ad..20b1f5c 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java
@@ -21,6 +21,7 @@
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.emptyMap;
+import static org.apache.uima.UIMAFramework.getResourceSpecifierFactory;
 import static org.apache.uima.UIMAFramework.produceResource;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.canParameterBeSet;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.createConfigurationData;
@@ -38,7 +39,8 @@
 import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.uima.ResourceSpecifierFactory;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.collection.CollectionReaderDescription;
@@ -63,13 +65,11 @@
 import org.apache.uima.resource.SharedResourceObject;
 import org.apache.uima.resource.impl.ConfigurableDataResourceSpecifier_impl;
 import org.apache.uima.resource.impl.ConfigurableDataResource_impl;
-import org.apache.uima.resource.impl.ExternalResourceDependency_impl;
 import org.apache.uima.resource.impl.ExternalResourceDescription_impl;
 import org.apache.uima.resource.impl.FileResourceSpecifier_impl;
 import org.apache.uima.resource.impl.Parameter_impl;
 import org.apache.uima.resource.metadata.ExternalResourceBinding;
 import org.apache.uima.resource.metadata.ResourceManagerConfiguration;
-import org.apache.uima.resource.metadata.impl.ExternalResourceBinding_impl;
 import org.apache.uima.resource.metadata.impl.ResourceManagerConfiguration_impl;
 import org.apache.uima.resource.metadata.impl.ResourceMetaData_impl;
 import org.apache.uima.util.InvalidXMLException;
@@ -118,9 +118,9 @@
    * @return the description.
    * @see CustomResourceSpecifier
    */
-  public static ExternalResourceDescription createExternalResourceDescription(
+  public static ExternalResourceDescription createResourceDescription(
           Class<? extends Resource> aInterface, Object... aParams) {
-    return createExternalResourceDescription(uniqueResourceKey(aInterface.getName()), aInterface,
+    return createNamedResourceDescription(uniqueResourceKey(aInterface.getName()), aInterface,
             aParams);
   }
 
@@ -136,16 +136,16 @@
    * @return the description.
    * @see CustomResourceSpecifier
    */
-  public static ExternalResourceDescription createExternalResourceDescription(final String aName,
+  public static ExternalResourceDescription createNamedResourceDescription(final String aName,
           Class<? extends Resource> aInterface, Object... aParams) {
     ConfigurationParameterFactory.ensureParametersComeInPairs(aParams);
 
     // Extract ExternalResourceDescriptions from configurationData
     List<ExternalResourceBinding> bindings = new ArrayList<ExternalResourceBinding>();
     List<ExternalResourceDescription> descs = new ArrayList<ExternalResourceDescription>();
-    for (Entry<String, ExternalResourceDescription> res : extractExternalResourceParameters(aParams)
+    for (Entry<String, ExternalResourceDescription> res : extractResourceParameters(aParams)
             .entrySet()) {
-      bindings.add(createExternalResourceBinding(res.getKey(), res.getValue()));
+      bindings.add(createResourceBinding(res.getKey(), res.getValue()));
       descs.add(res.getValue());
     }
 
@@ -169,7 +169,7 @@
       List<Parameter> params = new ArrayList<Parameter>();
       if (aParams != null) {
         for (int i = 0; i < aParams.length / 2; i++) {
-          if (ExternalResourceFactory.getExternalResourceParameterType(aParams[i * 2 + 1]) != ResourceValueType.NO_RESOURCE) {
+          if (ExternalResourceFactory.getResourceParameterType(aParams[i * 2 + 1]) != ResourceValueType.NO_RESOURCE) {
             continue;
           }
 
@@ -198,59 +198,59 @@
 
   /**
    * Create an external resource description for a {@link SharedResourceObject}.
-   * 
-   * @param aInterface
-   *          the interface the resource should implement.
    * @param aUrl
    *          the URL from which the resource is initialized.
+   * @param aInterface
+   *          the interface the resource should implement.
    * @param aParams
    *          parameters passed to the resource when it is created.
+   * 
    * @return the description.
    * @see ConfigurableDataResourceSpecifier
    * @see SharedResourceObject
    */
-  public static ExternalResourceDescription createExternalResourceDescription(
-          Class<? extends SharedResourceObject> aInterface, String aUrl, Object... aParams) {
-    return createExternalResourceDescription(uniqueResourceKey(aInterface.getName()), aInterface,
+  public static ExternalResourceDescription createSharedResourceDescription(
+          String aUrl, Class<? extends SharedResourceObject> aInterface, Object... aParams) {
+    return createNamedResourceDescriptionUsingUrl(uniqueResourceKey(aInterface.getName()), aInterface,
             aUrl, aParams);
   }
 
   /**
    * Create an external resource description for a {@link SharedResourceObject}.
-   * 
-   * @param aInterface
-   *          the interface the resource should implement.
    * @param aUrl
    *          the URL from which the resource is initialized.
+   * @param aInterface
+   *          the interface the resource should implement.
    * @param aParams
    *          parameters passed to the resource when it is created.
+   * 
    * @return the description.
    * @see ConfigurableDataResourceSpecifier
    * @see SharedResourceObject
    */
-  public static ExternalResourceDescription createExternalResourceDescription(
-          Class<? extends SharedResourceObject> aInterface, URL aUrl, Object... aParams) {
-    return createExternalResourceDescription(uniqueResourceKey(aInterface.getName()), aInterface,
+  public static ExternalResourceDescription createSharedResourceDescription(
+          URL aUrl, Class<? extends SharedResourceObject> aInterface, Object... aParams) {
+    return createNamedResourceDescriptionUsingUrl(uniqueResourceKey(aInterface.getName()), aInterface,
             aUrl.toString(), aParams);
   }
 
   /**
    * Create an external resource description for a {@link SharedResourceObject}.
-   * 
-   * @param aInterface
-   *          the interface the resource should implement.
    * @param aFile
    *          the file from which the resource is initialized.
+   * @param aInterface
+   *          the interface the resource should implement.
    * @param aParams
    *          parameters passed to the resource when it is created.
+   * 
    * @return the description.
    * @see ConfigurableDataResourceSpecifier
    * @see SharedResourceObject
    */
-  public static ExternalResourceDescription createExternalResourceDescription(
-          Class<? extends SharedResourceObject> aInterface, File aFile, Object... aParams) {
+  public static ExternalResourceDescription createSharedResourceDescription(
+          File aFile, Class<? extends SharedResourceObject> aInterface, Object... aParams) {
     try {
-      return createExternalResourceDescription(aInterface, aFile.toURI().toURL(), aParams);
+      return createSharedResourceDescription(aFile.toURI().toURL(), aInterface, aParams);
     } catch (MalformedURLException e) {
       // This is something that usually cannot happen, so we degrade this to an
       // IllegalArgumentException which is a RuntimeException that does not need to be caught.
@@ -273,14 +273,14 @@
    * @see ConfigurableDataResourceSpecifier
    * @see SharedResourceObject
    */
-  public static ExternalResourceDescription createExternalResourceDescription(final String aName,
+  public static ExternalResourceDescription createNamedResourceDescriptionUsingUrl(final String aName,
           Class<? extends SharedResourceObject> aInterface, String aUrl, Object... aParams) {
     // Extract ExternalResourceDescriptions from configurationData
     List<ExternalResourceBinding> bindings = new ArrayList<ExternalResourceBinding>();
     List<ExternalResourceDescription> descs = new ArrayList<ExternalResourceDescription>();
-    for (Entry<String, ExternalResourceDescription> res : extractExternalResourceParameters(aParams)
+    for (Entry<String, ExternalResourceDescription> res : extractResourceParameters(aParams)
             .entrySet()) {
-      bindings.add(createExternalResourceBinding(res.getKey(), res.getValue()));
+      bindings.add(createResourceBinding(res.getKey(), res.getValue()));
       descs.add(res.getValue());
     }
 
@@ -318,8 +318,8 @@
    * @return the description.
    * @see FileResourceSpecifier
    */
-  public static ExternalResourceDescription createExternalResourceDescription(final String aName,
-          String aUrl) {
+  public static ExternalResourceDescription createNamedFileResourceDescription(
+          final String aName, String aUrl) {
     ExternalResourceDescription extRes = new ExternalResourceDescription_impl();
     extRes.setName(aName);
     FileResourceSpecifier frs = new FileResourceSpecifier_impl();
@@ -337,13 +337,16 @@
    *          the resource to bind.
    * @return the description.
    */
-  public static ExternalResourceBinding createExternalResourceBinding(final String aKey,
+  public static ExternalResourceBinding createResourceBinding(final String aKey,
           final ExternalResourceDescription aResource) {
-    return createExternalResourceBinding(aKey, aResource.getName());
+    return createResourceBinding(aKey, aResource.getName());
   }
 
   /**
-   * Create an external resource binding.
+   * Create an external resource binding. This is a more convenient method of creating an
+   * {@link ExternalResourceBinding} than calling
+   * {@link ResourceSpecifierFactory#createExternalResourceBinding()} and setting the resource name
+   * and key manually.
    * 
    * @param aKey
    *          the key to bind to.
@@ -351,24 +354,25 @@
    *          the resource key to bind.
    * @return the description.
    */
-  public static ExternalResourceBinding createExternalResourceBinding(final String aKey,
+  public static ExternalResourceBinding createResourceBinding(final String aKey,
           final String aResourceKey) {
-    ExternalResourceBinding extResBind = new ExternalResourceBinding_impl();
+    ExternalResourceBinding extResBind = getResourceSpecifierFactory()
+            .createExternalResourceBinding();
     extResBind.setResourceName(aResourceKey);
     extResBind.setKey(aKey);
     return extResBind;
   }
 
   /**
-   * Creates an ExternalResourceDependency for a field annotated with
-   * {@link org.apache.uima.fit.descriptor.ExternalResource}.
+   * Creates an {@link ExternalResourceDependency} for a field annotated with
+   * {@link ExternalResource}.
    * 
    * @param field
    *          the field to analyze
    * @return a external resource dependency
    */
   @SuppressWarnings({ "unchecked", "rawtypes" })
-  public static ExternalResourceDependency createExternalResourceDependency(Field field) {
+  public static ExternalResourceDependency createResourceDependency(Field field) {
     ExternalResource era = ReflectionUtil.getAnnotation(field, ExternalResource.class);
 
     // Get the binding key for the specified field. If no key is set, use the field name as key.
@@ -380,10 +384,13 @@
     // Get the type of class/interface a resource has to implement to bind to the annotated field.
     // If no API is set, get it from the annotated field type.
     Class<? extends Resource> api = era.api();
-    // If no api is specified, look at the annotated field
+    
+    // If no API is specified, look at the annotated field
     if (api == Resource.class) {
-      if (Resource.class.isAssignableFrom(field.getType())
-              || SharedResourceObject.class.isAssignableFrom(field.getType())) {
+      if (
+              Resource.class.isAssignableFrom(field.getType()) || 
+              SharedResourceObject.class.isAssignableFrom(field.getType())
+      ) {
         // If no API is set, check if the field type is already a resource type
         api = (Class<? extends Resource>) field.getType();
       } else {
@@ -395,12 +402,14 @@
       }
     }
 
-    return ExternalResourceFactory.createExternalResourceDependency(key, api, !era.mandatory(),
-            era.description());
+    return createResourceDependency(key, api, !era.mandatory(), era.description());
   }
 
   /**
-   * Creates an ExternalResourceDependency for a given key and interface
+   * Creates an ExternalResourceDependency for a given key and interface. This is a more convenient
+   * method of creating an {@link ExternalResourceDependency} than calling
+   * {@link ResourceSpecifierFactory#createExternalResourceDependency()} and setting the fields
+   * manually.
    * 
    * @param aKey
    *          the resource key
@@ -412,9 +421,10 @@
    *          a description of the resource
    * @return the external resource dependency
    */
-  public static ExternalResourceDependency createExternalResourceDependency(final String aKey,
+  public static ExternalResourceDependency createResourceDependency(final String aKey,
           final Class<?> aInterface, final boolean aOptional, String aDescription) {
-    ExternalResourceDependency dep = new ExternalResourceDependency_impl();
+    ExternalResourceDependency dep = getResourceSpecifierFactory()
+            .createExternalResourceDependency();
     dep.setInterfaceName(aInterface.getName());
     dep.setKey(aKey);
     dep.setOptional(aOptional);
@@ -429,19 +439,19 @@
    * @throws ResourceInitializationException
    *           if the external resource dependencies could not be created
    */
-  public static ExternalResourceDependency[] createExternalResourceDependencies(
+  public static ExternalResourceDependency[] createResourceDependencies(
           Class<?> cls) throws ResourceInitializationException {
     Map<String, ExternalResourceDependency> depMap = new HashMap<String, ExternalResourceDependency>();
-    ExternalResourceFactory.createExternalResourceDependencies(cls, cls, depMap);
+    ExternalResourceFactory.createResourceDependencies(cls, cls, depMap);
     Collection<ExternalResourceDependency> deps = depMap.values();
     return deps.toArray(new ExternalResourceDependency[deps.size()]);
   }
 
-  private static <T> void createExternalResourceDependencies(Class<?> baseCls, Class<?> cls,
+  private static <T> void createResourceDependencies(Class<?> baseCls, Class<?> cls,
           Map<String, ExternalResourceDependency> dependencies)
           throws ResourceInitializationException {
     if (cls.getSuperclass() != null) {
-      createExternalResourceDependencies(baseCls, cls.getSuperclass(), dependencies);
+      createResourceDependencies(baseCls, cls.getSuperclass(), dependencies);
     }
 
     for (Field field : cls.getDeclaredFields()) {
@@ -449,7 +459,7 @@
         continue;
       }
 
-      ExternalResourceDependency dep = createExternalResourceDependency(field);
+      ExternalResourceDependency dep = createResourceDependency(field);
 
       if (dependencies.containsKey(dep.getKey())) {
         throw new ResourceInitializationException(new IllegalStateException("Key [" + dep.getKey()
@@ -520,7 +530,35 @@
 
   /**
    * Scan the given resource specifier for external resource dependencies and whenever a dependency
-   * is encounter that has the specified key, the resource will be bound.
+   * is encountered that has the specified key, the resource will be bound.
+   * <p>
+   * <b>Caveat</b>: If you use this method, you may expect that {@link DataResource#getUrl()} or
+   * {@link DataResource#getUri()} will return the same URL that you have specified here. This is
+   * may <b>NOT</b> be the case. UIMA will internally try to resolve the URL via a
+   * {@link ResourceManager}. If it cannot resolve a remove URL, this mechanism will think it may be
+   * a local file and will return some local path - or it may redirect it to some location as though
+   * fit by the {@link ResourceManager}.
+   * 
+   * @param aDesc
+   *          a description.
+   * @param aKey
+   *          the key to bind to.
+   * @param aUrl
+   *          a URL.
+   * @throws InvalidXMLException
+   *           if import resolution failed
+   * @see FileResourceSpecifier
+   * @deprecated Use {@link #bindResourceUsingUrl(ResourceSpecifier, String, String)}
+   */
+  @Deprecated
+  public static void bindResource(ResourceSpecifier aDesc, String aKey, String aUrl)
+          throws InvalidXMLException {
+    bindResourceUsingUrl(aDesc, aKey, aUrl);
+  }
+  
+  /**
+   * Scan the given resource specifier for external resource dependencies and whenever a dependency
+   * is encountered that has the specified key, the resource will be bound.
    * <p>
    * <b>Caveat</b>: If you use this method, you may expect that {@link DataResource#getUrl()} or
    * {@link DataResource#getUri()} will return the same URL that you have specified here. This is
@@ -539,9 +577,9 @@
    *           if import resolution failed
    * @see FileResourceSpecifier
    */
-  public static void bindResource(ResourceSpecifier aDesc, String aKey, String aUrl)
+  public static void bindResourceUsingUrl(ResourceSpecifier aDesc, String aKey, String aUrl)
           throws InvalidXMLException {
-    ExternalResourceDescription extRes = createExternalResourceDescription(aKey, aUrl);
+    ExternalResourceDescription extRes = createNamedFileResourceDescription(aKey, aUrl);
     bindResource(aDesc, aKey, extRes);
   }
 
@@ -589,7 +627,7 @@
           ClassNotFoundException {
     // Appending a disambiguation suffix it possible to have multiple instances of the same
     // resource with different settings to different keys.
-    ExternalResourceDescription extRes = createExternalResourceDescription(
+    ExternalResourceDescription extRes = createNamedResourceDescription(
             uniqueResourceKey(aRes.getName()), aRes, (Object[]) aParams);
     bindResource(aDesc, extRes);
   }
@@ -612,12 +650,12 @@
    *           if the resource implementation class or interface class could not be accessed
    * @see SharedResourceObject
    */
-  public static void bindResource(ResourceSpecifier aDesc,
+  public static void bindResourceUsingUrl(ResourceSpecifier aDesc,
           Class<? extends SharedResourceObject> aRes, String aUrl, Object... aParams)
           throws InvalidXMLException, ClassNotFoundException {
-    ExternalResourceDescription extRes = createExternalResourceDescription(
+    ExternalResourceDescription extRes = createNamedResourceDescriptionUsingUrl(
             uniqueResourceKey(aRes.getName()), aRes, aUrl, aParams);
-    bind((AnalysisEngineDescription) aDesc, extRes);
+    scanRecursivelyForDependenciesByInterfaceAndBind((AnalysisEngineDescription) aDesc, extRes);
   }
 
   /**
@@ -638,10 +676,10 @@
    *           if import resolution failed
    * @see SharedResourceObject
    */
-  public static void bindResource(ResourceSpecifier aDesc, Class<?> aApi,
+  public static void bindResourceUsingUrl(ResourceSpecifier aDesc, Class<?> aApi,
           Class<? extends SharedResourceObject> aRes, String aUrl, Object... aParams)
           throws InvalidXMLException {
-    bindResource(aDesc, aApi.getName(), aRes, aUrl, aParams);
+    bindResourceUsingUrl(aDesc, aApi.getName(), aRes, aUrl, aParams);
   }
 
   /**
@@ -662,12 +700,12 @@
    *           if import resolution failed
    * @see SharedResourceObject
    */
-  public static void bindResource(ResourceSpecifier aDesc, String aKey,
+  public static void bindResourceUsingUrl(ResourceSpecifier aDesc, String aKey,
           Class<? extends SharedResourceObject> aRes, String aUrl, Object... aParams)
           throws InvalidXMLException {
-    ExternalResourceDescription extRes = createExternalResourceDescription(
+    ExternalResourceDescription extRes = createNamedResourceDescriptionUsingUrl(
             uniqueResourceKey(aRes.getName()), aRes, aUrl, aParams);
-    bind((AnalysisEngineDescription) aDesc, aKey, extRes);
+    scanRecursivelyForDependenciesByKeyAndBind((AnalysisEngineDescription) aDesc, aKey, extRes);
   }
 
   /**
@@ -694,7 +732,7 @@
 
     // Appending a disambiguation suffix it possible to have multiple instances of the same
     // resource with different settings to different keys.
-    ExternalResourceDescription extRes = createExternalResourceDescription(
+    ExternalResourceDescription extRes = createNamedResourceDescription(
             uniqueResourceKey(aRes.getName()), aRes, (Object[]) aParams);
     bindResource(aDesc, aKey, extRes);
   }
@@ -716,7 +754,7 @@
           throws InvalidXMLException, ClassNotFoundException {
     // Dispatch
     if (aDesc instanceof AnalysisEngineDescription) {
-      bind((AnalysisEngineDescription) aDesc, aResDesc);
+      scanRecursivelyForDependenciesByInterfaceAndBind((AnalysisEngineDescription) aDesc, aResDesc);
     }
   }
 
@@ -737,7 +775,7 @@
           ExternalResourceDescription aResDesc) throws InvalidXMLException {
     // Dispatch
     if (aDesc instanceof AnalysisEngineDescription) {
-      bind((AnalysisEngineDescription) aDesc, aKey, aResDesc);
+      scanRecursivelyForDependenciesByKeyAndBind((AnalysisEngineDescription) aDesc, aKey, aResDesc);
     }
   }
 
@@ -802,7 +840,7 @@
    *          the resource API.
    */
   public static void createDependency(ResourceSpecifier aDesc, String aKey, Class<?> aApi) {
-    ExternalResourceDependency[] deps = getExternalResourceDependencies(aDesc);
+    ExternalResourceDependency[] deps = getResourceDependencies(aDesc);
     if (deps == null) {
       deps = new ExternalResourceDependency[] {};
     }
@@ -818,10 +856,10 @@
 
     // If not, create one
     if (!found) {
-      setExternalResourceDependencies(
+      setResourceDependencies(
               aDesc,
-              (ExternalResourceDependency[]) ArrayUtils.add(deps,
-                      createExternalResourceDependency(aKey, aApi, false, null)));
+              ArrayUtils.add(deps,
+                      createResourceDependency(aKey, aApi, false, null)));
     }
   }
 
@@ -832,7 +870,7 @@
    * @throws IllegalArgumentException
    *           if the sub-class passed is not supported.
    */
-  private static void setExternalResourceDependencies(ResourceSpecifier aDesc,
+  private static void setResourceDependencies(ResourceSpecifier aDesc,
           ExternalResourceDependency[] aDependencies) {
     if (aDesc instanceof CollectionReaderDescription) {
       ((CollectionReaderDescription) aDesc).setExternalResourceDependencies(aDependencies);
@@ -851,7 +889,7 @@
    * @throws IllegalArgumentException
    *           if the sub-class passed is not supported.
    */
-  private static ExternalResourceDependency[] getExternalResourceDependencies(
+  private static ExternalResourceDependency[] getResourceDependencies(
           ResourceSpecifier aDesc) {
     if (aDesc instanceof CollectionReaderDescription) {
       return ((CollectionReaderDescription) aDesc).getExternalResourceDependencies();
@@ -881,7 +919,7 @@
    * @throws InvalidXMLException
    *           if import resolution failed
    */
-  public static void createDependencyAndBind(AnalysisEngineDescription aDesc, String aKey,
+  public static void createDependencyAndBindUsingUrl(AnalysisEngineDescription aDesc, String aKey,
           Class<? extends SharedResourceObject> aImpl, String aUrl, Object... aParams)
           throws InvalidXMLException {
     if (aDesc.getExternalResourceDependency(aKey) == null) {
@@ -889,10 +927,10 @@
       if (deps == null) {
         deps = new ExternalResourceDependency[] {};
       }
-      aDesc.setExternalResourceDependencies((ExternalResourceDependency[]) ArrayUtils.add(deps,
-              createExternalResourceDependency(aKey, aImpl, false, null)));
+      aDesc.setExternalResourceDependencies(ArrayUtils.add(deps,
+              createResourceDependency(aKey, aImpl, false, null)));
     }
-    bindResource(aDesc, aKey, aImpl, aUrl, aParams);
+    bindResourceUsingUrl(aDesc, aKey, aImpl, aUrl, aParams);
   }
 
   /**
@@ -904,12 +942,13 @@
    * @param aResDesc
    *          the resource description.
    */
-  private static void bind(AnalysisEngineDescription aDesc, ExternalResourceDescription aResDesc)
+  private static void scanRecursivelyForDependenciesByInterfaceAndBind(
+          AnalysisEngineDescription aDesc, ExternalResourceDescription aResDesc)
           throws InvalidXMLException, ClassNotFoundException {
     // Recursively address delegates
     if (!aDesc.isPrimitive()) {
-      for (Object delegate : aDesc.getDelegateAnalysisEngineSpecifiers().values()) {
-        bindResource((ResourceSpecifier) delegate, aResDesc);
+      for (ResourceSpecifier delegate : aDesc.getDelegateAnalysisEngineSpecifiers().values()) {
+        bindResource(delegate, aResDesc);
       }
     }
 
@@ -924,7 +963,7 @@
       }
 
       if (apiClass.isAssignableFrom(resClass)) {
-        bindExternalResource(aDesc, dep.getKey(), aResDesc);
+        bindResourceOnce(aDesc, dep.getKey(), aResDesc);
       }
     }
   }
@@ -940,25 +979,52 @@
    * @param aResDesc
    *          the resource description.
    */
-  private static void bind(AnalysisEngineDescription aDesc, String aKey,
-          ExternalResourceDescription aResDesc) throws InvalidXMLException {
+  private static void scanRecursivelyForDependenciesByKeyAndBind(AnalysisEngineDescription aDesc,
+          String aKey, ExternalResourceDescription aResDesc) throws InvalidXMLException {
     // Recursively address delegates
     if (!aDesc.isPrimitive()) {
-      for (Object delegate : aDesc.getDelegateAnalysisEngineSpecifiers().values()) {
-        bindResource((ResourceSpecifier) delegate, aKey, aResDesc);
+      for (ResourceSpecifier delegate : aDesc.getDelegateAnalysisEngineSpecifiers().values()) {
+        bindResource(delegate, aKey, aResDesc);
       }
     }
 
     // Bind if necessary
     for (ExternalResourceDependency dep : aDesc.getExternalResourceDependencies()) {
       if (aKey.equals(dep.getKey())) {
-        bindExternalResource(aDesc, aKey, aResDesc);
+        bindResourceOnce(aDesc, aKey, aResDesc);
       }
     }
   }
 
   /**
-   * Create a new external resource binding.
+   * Create a binding for the given external resource in the given resource manager. This method
+   * also scans the given external resource for any nested external resources and creates
+   * bindings for them as well.
+   * 
+   * @param aResMgrCfg
+   *          the resource manager to create the binding in.
+   * @param aBindTo
+   *          what key to bind to.
+   * @param aRes
+   *          the resource that should be bound.
+   * @deprecated Use {@link #bindResourceOnce(ResourceManagerConfiguration, String, ExternalResourceDescription)}
+   */
+  @Deprecated
+  public static void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
+          ExternalResourceDescription aRes) {
+    bindResourceOnce(aResMgrCfg, aBindTo, aRes);
+  }
+  
+  /**
+   * Create a binding for the given external resource in the given resource manager. This method
+   * also scans the given external resource for any nested external resources and creates
+   * bindings for them as well.
+   * <p>
+   * <b>NOTE:</b>If you use this method on resource manager configurations of aggregate analysis
+   * engine descriptions because it will <b>not have any effects on the delegate analysis
+   * engines</b> of the aggregate. If you want to recursively bind an external resource to the
+   * delegates in an aggregate engine, use e.g.
+   * {@link #bindResource(ResourceSpecifier, String, ExternalResourceDescription)}.
    * 
    * @param aResMgrCfg
    *          the resource manager to create the binding in.
@@ -967,22 +1033,22 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
+  public static void bindResourceOnce(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
           ExternalResourceDescription aRes) {
     // Create a map of all bindings
-    Map<String, ExternalResourceBinding> bindings = new HashMap<String, ExternalResourceBinding>();
+    Map<String, ExternalResourceBinding> bindings = new HashMap<>();
     for (ExternalResourceBinding b : aResMgrCfg.getExternalResourceBindings()) {
       bindings.put(b.getKey(), b);
     }
 
     // Create a map of all resources
-    Map<String, ExternalResourceDescription> resources = new HashMap<String, ExternalResourceDescription>();
+    Map<String, ExternalResourceDescription> resources = new HashMap<>();
     for (ExternalResourceDescription r : aResMgrCfg.getExternalResources()) {
       resources.put(r.getName(), r);
     }
 
     // For the current resource, add resource and binding
-    ExternalResourceBinding extResBind = createExternalResourceBinding(aBindTo, aRes);
+    ExternalResourceBinding extResBind = createResourceBinding(aBindTo, aRes);
     bindings.put(extResBind.getKey(), extResBind);
     resources.put(aRes.getName(), aRes);
 
@@ -1005,8 +1071,36 @@
    *          what key to bind to.
    * @param aNestedRes
    *          the resource that should be bound.
+   * @deprecated Use {@link #bindResourceOnce(ExternalResourceDescription, String, ExternalResourceDescription)}
    */
-  public static void bindExternalResource(ExternalResourceDescription aRes, String aBindTo,
+  @Deprecated
+  public static void bindResource(ExternalResourceDescription aRes, String aBindTo,
+          ExternalResourceDescription aNestedRes) {
+    bindResourceOnce(aRes, aBindTo, aNestedRes);
+  }
+  
+  /**
+   * Create a binding for the given external resource in the given resource. This method also scans
+   * the given external resource for any nested external resources and creates bindings for them as
+   * well.
+   * <p>
+   * <b>NOTE:</b> This method only works on {@link ExtendedExternalResourceDescription_impl}
+   * instances. Any {@link ExternalResourceDescription} instances created with uimaFIT use this
+   * implementation. For reasons of convenience, the method signature uses
+   * {@link ExternalResourceDescription} but will thrown an {@link IllegalArgumentException} if the
+   * wrong implementations are provided.
+   * 
+   * @param aRes
+   *          the resource to bind to
+   * @param aBindTo
+   *          what key to bind to.
+   * @param aNestedRes
+   *          the resource that should be bound.
+   * @throws IllegalArgumentException
+   *           if the given resource description is not an instance of
+   *           {@link ExtendedExternalResourceDescription_impl}.
+   */
+  public static void bindResourceOnce(ExternalResourceDescription aRes, String aBindTo,
           ExternalResourceDescription aNestedRes) {
     if (!(aRes instanceof ExtendedExternalResourceDescription_impl)) {
       throw new IllegalArgumentException("Nested resources are only supported on instances of ["
@@ -1029,7 +1123,7 @@
     }
 
     // For the current resource, add resource and binding
-    ExternalResourceBinding extResBind = createExternalResourceBinding(aBindTo, aNestedRes);
+    ExternalResourceBinding extResBind = createResourceBinding(aBindTo, aNestedRes);
     bindings.put(extResBind.getKey(), extResBind);
     resources.put(aNestedRes.getName(), aNestedRes);
 
@@ -1039,11 +1133,10 @@
     // Commit everything to the resource manager configuration
     extRes.setExternalResourceBindings(bindings.values());
     extRes.setExternalResources(resources.values());
-
   }
 
   /**
-   * Helper method to recursively bind resources bound to resources.
+   * Helper method to recursively bind resources bound to other resources (a.k.a. nested resources).
    * 
    * @param aRes
    *          resource.
@@ -1096,7 +1189,15 @@
   }
 
   /**
-   * Create a new external resource binding.
+   * Create a binding for the given external resource in the resource manager configuration of the
+   * given resource. If no resource manager configuration exists yet, it will be created. This
+   * method also scans the given external resource for any nested external resources and creates
+   * bindings for them as well.
+   * <p>
+   * <b>NOTE:</b>IF you use this method with aggregate analysis engine descriptions because it will
+   * <b>not have any effects on the delegate analysis engines</b> of the aggregate. If you want to
+   * recursively bind an external resource to the delegates in an aggregate engine, use e.g.
+   * {@link #bindResource(ResourceSpecifier, String, ExternalResourceDescription)}.
    * 
    * @param aDesc
    *          the specifier to create the binding in.
@@ -1105,7 +1206,7 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceCreationSpecifier aDesc, String aBindTo,
+  public static void bindResourceOnce(ResourceCreationSpecifier aDesc, String aBindTo,
           ExternalResourceDescription aRes) {
     ResourceManagerConfiguration resMgrCfg = aDesc.getResourceManagerConfiguration();
     if (resMgrCfg == null) {
@@ -1113,11 +1214,49 @@
       aDesc.setResourceManagerConfiguration(resMgrCfg);
     }
 
-    bindExternalResource(resMgrCfg, aBindTo, aRes);
+    bindResourceOnce(resMgrCfg, aBindTo, aRes);
   }
 
   /**
-   * Create a new external resource binding.
+   * Create a binding for the given external resource in the given resource manager configuration.
+   * This method <b>does not</b> scan the given external resource for any nested external resources
+   * and <b>does not</b> create bindings for them. Use
+   * {@link #bindResourceOnce(ResourceCreationSpecifier, String, ExternalResourceDescription)} if
+   * you wish to bind nested resources as well.
+   * <p>
+   * <b>NOTE:</b>If you use this method on resource manager configurations of aggregate analysis
+   * engine descriptions because it will <b>not have any effects on the delegate analysis
+   * engines</b> of the aggregate. If you want to recursively bind an external resource to the
+   * delegates in an aggregate engine, use e.g.
+   * {@link #bindResource(ResourceSpecifier, String, ExternalResourceDescription)}.
+   * 
+   * @param aResMgrCfg
+   *          the resource manager to create the binding in.
+   * @param aBindTo
+   *          what key to bind to.
+   * @param aRes
+   *          the resource that should be bound.
+   * @deprecated Use
+   *             {@link #bindResourceOnceWithoutNested(ResourceManagerConfiguration, String, String)}.
+   */
+  @Deprecated
+  public static void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
+          String aRes) {
+    bindResourceOnceWithoutNested(aResMgrCfg, aBindTo, aRes);
+  }
+
+  /**
+   * Create a binding for the given external resource in the given resource manager configuration.
+   * This method <b>does not</b> scan the given external resource for any nested external resources
+   * and <b>does not</b> create bindings for them. Use
+   * {@link #bindResourceOnce(ResourceCreationSpecifier, String, ExternalResourceDescription)} if
+   * you wish to bind nested resources as well.
+   * <p>
+   * <b>NOTE:</b>If you use this method on resource manager configurations of aggregate analysis
+   * engine descriptions because it will <b>not have any effects on the delegate analysis
+   * engines</b> of the aggregate. If you want to recursively bind an external resource to the
+   * delegates in an aggregate engine, use e.g.
+   * {@link #bindResource(ResourceSpecifier, String, ExternalResourceDescription)}.
    * 
    * @param aResMgrCfg
    *          the resource manager to create the binding in.
@@ -1126,14 +1265,25 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
-          String aRes) {
-    ExternalResourceBinding extResBind = createExternalResourceBinding(aBindTo, aRes);
+  public static void bindResourceOnceWithoutNested(ResourceManagerConfiguration aResMgrCfg,
+          String aBindTo, String aRes) {
+    ExternalResourceBinding extResBind = createResourceBinding(aBindTo, aRes);
     aResMgrCfg.addExternalResourceBinding(extResBind);
   }
-
+  
+  
   /**
-   * Create a new external resource binding.
+   * Create a binding for the given external resource in resource manager configuration of the given
+   * resource creation specified. If no resource manager configuration exists yet, it is created.
+   * This method <b>does not</b> scan the given external resource for any nested external resources
+   * and <b>does not</b> create bindings for them. Use
+   * {@link #bindResourceOnce(ResourceCreationSpecifier, String, ExternalResourceDescription)} if
+   * you wish to bind nested resources as well.
+   * <p>
+   * <b>NOTE:</b>If you use this method on an aggregate analysis engine description, it will <b>not
+   * have any effects on the delegate analysis engines</b> of the aggregate. If you want to
+   * recursively bind an external resource to the delegates in an aggregate engine, use e.g.
+   * {@link #bindResource(ResourceSpecifier, String, ExternalResourceDescription)}.
    * 
    * @param aDesc
    *          the specifier to create the binding in.
@@ -1142,15 +1292,14 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceCreationSpecifier aDesc, String aBindTo,
-          String aRes) {
+  public static void bindResourceOnceWithoutNested(ResourceCreationSpecifier aDesc, String aBindTo, String aRes) {
     ResourceManagerConfiguration resMgrCfg = aDesc.getResourceManagerConfiguration();
     if (resMgrCfg == null) {
       resMgrCfg = new ResourceManagerConfiguration_impl();
       aDesc.setResourceManagerConfiguration(resMgrCfg);
     }
 
-    bindExternalResource(resMgrCfg, aBindTo, aRes);
+    bindResourceOnceWithoutNested(resMgrCfg, aBindTo, aRes);
   }
 
   static String uniqueResourceKey(String aKey) {
@@ -1182,7 +1331,7 @@
    *          the configuration parameters.
    * @return extRes the external resource parameters.
    */
-  protected static Map<String, ExternalResourceDescription> extractExternalResourceParameters(
+  protected static Map<String, ExternalResourceDescription> extractResourceParameters(
           final Object[] configurationData) {
     if (configurationData == null) {
       return Collections.emptyMap();
@@ -1198,7 +1347,7 @@
       }
       
       // Store External Resource parameters separately
-      ResourceValueType type = getExternalResourceParameterType(value);
+      ResourceValueType type = getResourceParameterType(value);
       if (type == ResourceValueType.PRIMITIVE) {
         ExternalResourceDescription description = (ExternalResourceDescription) value;
         extRes.put(key, description);
@@ -1224,7 +1373,7 @@
         }
         
         // Record the list and attach the list elements to the list
-        extRes.put(key, createExternalResourceDescription(ResourceList.class, params.toArray()));
+        extRes.put(key, createResourceDescription(ResourceList.class, params.toArray()));
       }
     }
 
@@ -1236,7 +1385,7 @@
    * uimaFIT internal use. This method is required by the ConfigurationParameterFactory, so it is
    * package private instead of private.
    */
-  static ResourceValueType getExternalResourceParameterType(Object aValue) {
+  static ResourceValueType getResourceParameterType(Object aValue) {
     if (aValue == null) {
       return ResourceValueType.NO_RESOURCE;
     }
@@ -1297,7 +1446,7 @@
   @SuppressWarnings("unchecked")
   public static <R extends Resource> R createResource(Class<R> resourceClass,
           ResourceManager resMgr, Object... params) throws ResourceInitializationException {
-    ExternalResourceDescription res = createExternalResourceDescription(resourceClass, params);
+    ExternalResourceDescription res = createResourceDescription(resourceClass, params);
     return (R) produceResource(resourceClass, res.getResourceSpecifier(), resMgr, emptyMap());
   }
   
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/FlowControllerFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/FlowControllerFactory.java
index b0484d3..9e986a9 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/FlowControllerFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/FlowControllerFactory.java
@@ -21,8 +21,8 @@
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.createConfigurationData;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.ensureParametersComeInPairs;
 import static org.apache.uima.fit.factory.ConfigurationParameterFactory.setParameters;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnce;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDependencies;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -65,7 +65,7 @@
     // Extract ExternalResourceDescriptions from configurationData
     // <ParamterName, ExternalResourceDescription> will be stored in this map
     Map<String, ExternalResourceDescription> externalResources = ExternalResourceFactory
-            .extractExternalResourceParameters(configurationData);
+            .extractResourceParameters(configurationData);
 
     // Create description normally
     ConfigurationData cdata = createConfigurationData(configurationData);
@@ -125,12 +125,12 @@
     ResourceMetaDataFactory.configureResourceMetaData(meta, flowControllerClass);
 
     // Extract external resource dependencies
-    desc.setExternalResourceDependencies(createExternalResourceDependencies(flowControllerClass));
+    desc.setExternalResourceDependencies(createResourceDependencies(flowControllerClass));
 
     // Bind External Resources
     if (externalResources != null) {
       for (Entry<String, ExternalResourceDescription> e : externalResources.entrySet()) {
-        bindExternalResource(desc, e.getKey(), e.getValue());
+        bindResourceOnce(desc, e.getKey(), e.getValue());
       }
     }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
index 33c717b..10827f4 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/FsIndexFactory.java
@@ -28,7 +28,6 @@
 import java.util.List;
 import java.util.WeakHashMap;
 
-import org.apache.commons.logging.LogFactory;
 import org.apache.uima.fit.descriptor.FsIndex;
 import org.apache.uima.fit.descriptor.FsIndexKey;
 import org.apache.uima.fit.internal.ClassLoaderUtils;
@@ -44,10 +43,14 @@
 import org.apache.uima.resource.metadata.impl.Import_impl;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  */
 public final class FsIndexFactory {
+  private static Logger LOG = LoggerFactory.getLogger(FsIndexFactory.class);
+
   /**
    * Comparator that orders FeatureStructures according to the standard order of their key features.
    * For integer and float values, this is the standard linear order, and for strings it is
@@ -270,12 +273,11 @@
             FsIndexCollection fsIdxCol = getXMLParser().parseFsIndexCollection(xmlInput);
             fsIdxCol.resolveImports();
             fsIndexList.addAll(asList(fsIdxCol.getFsIndexes()));
-            LogFactory.getLog(FsIndexFactory.class).debug("Detected index at [" + location + "]");
+            LOG.debug("Detected index at [{}]", location);
           } catch (IOException e) {
             throw new ResourceInitializationException(e);
           } catch (InvalidXMLException e) {
-            LogFactory.getLog(FsIndexFactory.class)
-            .warn("[" + location + "] is not a index descriptor file. Ignoring.", e);
+            LOG.warn("[{}] is not a index descriptor file. Ignoring.", location, e);
           }
         }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/JCasFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/JCasFactory.java
index 9597d65..57d1285 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/JCasFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/JCasFactory.java
@@ -20,8 +20,9 @@
 
 import java.io.IOException;
 
-import org.apache.uima.UIMAException;
+import org.apache.uima.cas.CASException;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 
 /**
@@ -41,10 +42,12 @@
    * @param aText
    *          the document text to be set in the new JCas.
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createText(String aText) throws UIMAException {
+  public static JCas createText(String aText) throws ResourceInitializationException, CASException {
     return CasFactory.createText(aText, null).getJCas();
   }
 
@@ -59,10 +62,13 @@
    * @param aLanguage 
    *          the document language to be set in the new JCas.
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createText(String aText, String aLanguage) throws UIMAException {
+  public static JCas createText(String aText, String aLanguage)
+          throws ResourceInitializationException, CASException {
     return CasFactory.createText(aText, aLanguage).getJCas();
   }
   
@@ -73,10 +79,12 @@
    * detected automatically using {@link FsIndexFactory#createFsIndexCollection()}.
    * 
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createJCas() throws UIMAException {
+  public static JCas createJCas() throws ResourceInitializationException, CASException {
     return CasFactory.createCas().getJCas();
   }
 
@@ -88,10 +96,13 @@
    *          names of the type system descriptors on the classpath used to initialize the JCas (in
    *          Java notation, e.g. "my.package.TypeSystem" without the ".xml" extension)
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createJCas(String... typeSystemDescriptorNames) throws UIMAException {
+  public static JCas createJCas(String... typeSystemDescriptorNames)
+          throws ResourceInitializationException, CASException {
     return CasFactory.createCas(typeSystemDescriptorNames).getJCas();
   }
 
@@ -102,10 +113,13 @@
    * @param typeSystemDescriptorPaths
    *          paths to type system descriptor files
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createJCasFromPath(String... typeSystemDescriptorPaths) throws UIMAException {
+  public static JCas createJCasFromPath(String... typeSystemDescriptorPaths)
+          throws ResourceInitializationException, CASException {
     return CasFactory.createCasFromPath(typeSystemDescriptorPaths).getJCas();
   }
 
@@ -116,10 +130,13 @@
    * @param typeSystemDescription
    *          a type system description to initialize the JCas
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    */
-  public static JCas createJCas(TypeSystemDescription typeSystemDescription) throws UIMAException {
+  public static JCas createJCas(TypeSystemDescription typeSystemDescription)
+          throws ResourceInitializationException, CASException {
     return CasFactory.createCas(typeSystemDescription).getJCas();
   }
 
@@ -131,13 +148,15 @@
    * @param typeSystemDescription
    *          a type system description to initialize the JCas
    * @return a new JCas
-   * @throws UIMAException
+   * @throws ResourceInitializationException
+   *           if the CAS could not be initialized
+   * @throws CASException 
    *           if the JCas could not be initialized
    * @throws IOException
    *           if there is a problem reading the file
    */
   public static JCas createJCas(String fileName, TypeSystemDescription typeSystemDescription)
-          throws UIMAException, IOException {
+          throws ResourceInitializationException, CASException, IOException {
     return CasFactory.createCas(fileName, typeSystemDescription).getJCas();
   }
 }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
index e01eb3d..4c83f45 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypePrioritiesFactory.java
@@ -27,10 +27,10 @@
 import java.util.List;
 import java.util.WeakHashMap;
 
-import org.apache.commons.logging.LogFactory;
 import org.apache.uima.fit.internal.ClassLoaderUtils;
 import org.apache.uima.fit.internal.MetaDataType;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
+import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.apache.uima.resource.ResourceManager;
 import org.apache.uima.resource.metadata.TypePriorities;
@@ -39,8 +39,12 @@
 import org.apache.uima.util.CasCreationUtils;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class TypePrioritiesFactory {
+  private static final Logger LOG = LoggerFactory.getLogger(TypePrioritiesFactory.class);
+
   private static final Object SCAN_LOCK = new Object();
 
   private static final Object CREATE_LOCK = new Object();
@@ -65,9 +69,14 @@
    *          a sequence of ordered type classes
    * @return type priorities created from the ordered JCas classes
    */
-  public static TypePriorities createTypePriorities(Class<?>... prioritizedTypes) {
+  @SafeVarargs
+  public static TypePriorities createTypePriorities(Class<? extends TOP>... prioritizedTypes) {
     String[] typeNames = new String[prioritizedTypes.length];
     for (int i = 0; i < prioritizedTypes.length; i++) {
+      if (!TOP.class.isAssignableFrom(prioritizedTypes[i])) {
+        throw new IllegalArgumentException("[" + prioritizedTypes[i] + "] is not a JCas type");
+      }
+
       String typeName = prioritizedTypes[i].getName();
       if (typeName.startsWith(UIMA_BUILTIN_JCAS_PREFIX)) {
         typeName = "uima." + typeName.substring(UIMA_BUILTIN_JCAS_PREFIX.length());
@@ -116,13 +125,11 @@
             TypePriorities typePriorities = getXMLParser().parseTypePriorities(xmlInput);
             typePriorities.resolveImports();
             typePrioritiesList.add(typePriorities);
-            LogFactory.getLog(TypePrioritiesFactory.class)
-            .debug("Detected type priorities at [" + location + "]");
+            LOG.debug("Detected type priorities at [{}]", location);
           } catch (IOException e) {
             throw new ResourceInitializationException(e);
           } catch (InvalidXMLException e) {
-            LogFactory.getLog(TypePrioritiesFactory.class).warn(
-                    "[" + location + "] is not a type priorities descriptor file. Ignoring.", e);
+            LOG.warn("[{}] is not a type priorities descriptor file. Ignoring.", location, e);
           }
         }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
index e3b2d99..0c1af58 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactory.java
@@ -27,7 +27,6 @@
 import java.util.List;
 import java.util.WeakHashMap;
 
-import org.apache.commons.logging.LogFactory;
 import org.apache.uima.fit.internal.ClassLoaderUtils;
 import org.apache.uima.fit.internal.MetaDataType;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
@@ -39,8 +38,12 @@
 import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class TypeSystemDescriptionFactory {
+  private static final Logger LOG = LoggerFactory.getLogger(TypeSystemDescriptionFactory.class);
+
   private static final Object SCAN_LOCK = new Object();
 
   private static final Object CREATE_LOCK = new Object();
@@ -119,13 +122,11 @@
           try {
             XMLInputSource xmlInputType1 = new XMLInputSource(location);
             tsdList.add(getXMLParser().parseTypeSystemDescription(xmlInputType1));
-            LogFactory.getLog(TypeSystemDescription.class)
-            .debug("Detected type system at [" + location + "]");
+            LOG.debug("Detected type system at [{}]", location);
           } catch (IOException e) {
             throw new ResourceInitializationException(e);
           } catch (InvalidXMLException e) {
-            LogFactory.getLog(TypeSystemDescription.class)
-            .warn("[" + location + "] is not a type file. Ignoring.", e);
+            LOG.warn("[{}] is not a type file. Ignoring.", location, e);
           }
         }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/internal/ExtendedLogger.java b/uimafit-core/src/main/java/org/apache/uima/fit/internal/ExtendedLogger.java
deleted file mode 100644
index de014c4..0000000
--- a/uimafit-core/src/main/java/org/apache/uima/fit/internal/ExtendedLogger.java
+++ /dev/null
@@ -1,450 +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.uima.fit.internal;
-
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.text.MessageFormat;
-
-import org.apache.uima.UimaContext;
-import org.apache.uima.UimaContextAdmin;
-import org.apache.uima.internal.util.I18nUtil;
-import org.apache.uima.resource.ResourceManager;
-import org.apache.uima.util.Level;
-import org.apache.uima.util.Logger;
-import org.apache.uima.util.impl.JSR47Logger_impl;
-
-/**
- * INTERNAL API - Wrapper for the UIMA {@link Logger} offering a more convenient API similar to that
- * of the Apache Commons Logging interface {@link org.apache.commons.logging.Log Log} or to that of
- * Log4J's {@code Category} and SLF4J's {@code Logger}, using the names {@code error}, {@code warn},
- * {@code info}, {@code debug} and {@code trace} and mapping these to UIMA logging levels.
- * 
- */
-public class ExtendedLogger implements Logger {
-
-  private final UimaContext context;
-
-  public ExtendedLogger(final UimaContext aContext) {
-    context = aContext;
-  }
-
-  @Deprecated
-  public void log(String aMessage) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        logger.log(aMessage);
-      }
-    }
-  }
-
-  @Deprecated
-  public void log(String aResourceBundleName, String aMessageKey, Object[] aArguments) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        logger.log(aResourceBundleName, aMessageKey, aArguments);
-      }
-    }
-  }
-
-  @Deprecated
-  public void logException(Exception aException) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        logger.logException(aException);
-      }
-    }
-  }
-
-  @Deprecated
-  public void setOutputStream(PrintStream aStream) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().setOutputStream(aStream);
-      }
-    }
-  }
-
-  @Deprecated
-  public void setOutputStream(OutputStream aStream) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().setOutputStream(aStream);
-      }
-    }
-  }
-
-  public void log(Level level, String aMessage) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        logger.log(getClass().getName(), level, aMessage, null);
-      }
-    }
-  }
-
-  public void log(Level level, String aMessage, Object param1) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = MessageFormat.format(aMessage, new Object[] { param1 });
-        logger.log(getClass().getName(), level, result, null);
-      }
-    }
-  }
-
-  public void log(Level level, String aMessage, Object[] params) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = MessageFormat.format(aMessage, params);
-        logger.log(getClass().getName(), level, result, null);
-      }
-    }
-  }
-
-  public void log(Level level, String aMessage, Throwable thrown) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        logger.log(getClass().getName(), level, aMessage, thrown);
-      }
-    }
-  }
-
-  public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName,
-          String msgKey) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = I18nUtil.localizeMessage(bundleName, msgKey, null,
-                getExtensionClassLoader());
-        logger.log(getClass().getName(), level, result, null);
-      }
-    }
-  }
-
-  public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName,
-          String msgKey, Object param1) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = I18nUtil.localizeMessage(bundleName, msgKey, new Object[] { param1 },
-                getExtensionClassLoader());
-        logger.log(getClass().getName(), level, result, null);
-      }
-    }
-  }
-
-  public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName,
-          String msgKey, Object[] params) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = I18nUtil.localizeMessage(bundleName, msgKey, params,
-                getExtensionClassLoader());
-        logger.log(getClass().getName(), level, result, null);
-      }
-    }
-  }
-
-  public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName,
-          String msgKey, Throwable thrown) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null && logger.isLoggable(level)) {
-        String result = I18nUtil.localizeMessage(bundleName, msgKey, null,
-                getExtensionClassLoader());
-        logger.log(getClass().getName(), level, result, thrown);
-      }
-    }
-  }
-
-  public void log(String wrapperFQCN, Level level, String message, Throwable thrown) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(wrapperFQCN, level, message, thrown);
-      }
-    }
-  }
-
-  public boolean isLoggable(Level level) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(level);
-      }
-    }
-    return false;
-  }
-
-  public void setLevel(Level level) {
-    context.getLogger().setLevel(level);
-  }
-
-  public void setResourceManager(ResourceManager resourceManager) {
-    context.getLogger().setResourceManager(resourceManager);
-  }
-
-  /**
-   * Logs a message at {@link Level#FINE}.
-   * 
-   * @param paramObject
-   *          a message.
-   */
-  public void debug(Object paramObject) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger()
-                .log(getClass().getName(), Level.FINE, String.valueOf(paramObject), null);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#FINE}.
-   * 
-   * @param paramObject
-   *          a message.
-   * @param paramThrowable
-   *          a cause.
-   */
-  public void debug(Object paramObject, Throwable paramThrowable) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.FINE, String.valueOf(paramObject),
-                paramThrowable);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#SEVERE}.
-   * 
-   * @param paramObject
-   *          a message.
-   */
-  public void error(Object paramObject) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.SEVERE, String.valueOf(paramObject),
-                null);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#SEVERE}.
-   * 
-   * @param paramObject
-   *          a message.
-   * @param paramThrowable
-   *          a cause.
-   */
-  public void error(Object paramObject, Throwable paramThrowable) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.SEVERE, String.valueOf(paramObject),
-                paramThrowable);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#INFO}.
-   * 
-   * @param paramObject
-   *          a message.
-   */
-  public void info(Object paramObject) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        if (context.getLogger() instanceof JSR47Logger_impl) {
-          JSR47Logger_impl impl = (JSR47Logger_impl) context.getLogger();
-        }
-        context.getLogger()
-                .log(getClass().getName(), Level.INFO, String.valueOf(paramObject), null);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#INFO}.
-   * 
-   * @param paramObject
-   *          a message.
-   * @param paramThrowable
-   *          a cause.
-   */
-  public void info(Object paramObject, Throwable paramThrowable) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.INFO, String.valueOf(paramObject),
-                paramThrowable);
-      }
-    }
-  }
-
-  public boolean isDebugEnabled() {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(Level.FINE);
-      }
-    }
-    return false;
-  }
-
-  public boolean isErrorEnabled() {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(Level.SEVERE);
-      }
-    }
-    return false;
-  }
-
-  public boolean isInfoEnabled() {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(Level.INFO);
-      }
-    }
-    return false;
-  }
-
-  public boolean isTraceEnabled() {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(Level.FINER);
-      }
-    }
-    return false;
-  }
-
-  public boolean isWarnEnabled() {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        return context.getLogger().isLoggable(Level.WARNING);
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Logs a message at {@link Level#FINER}.
-   * 
-   * @param paramObject
-   *          a message.
-   */
-  public void trace(Object paramObject) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.FINER, String.valueOf(paramObject),
-                null);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#FINER}.
-   * 
-   * @param paramObject
-   *          a message.
-   * @param paramThrowable
-   *          a cause.
-   */
-  public void trace(Object paramObject, Throwable paramThrowable) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.FINER, String.valueOf(paramObject),
-                paramThrowable);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#WARNING}.
-   * 
-   * @param paramObject
-   *          a message.
-   */
-  public void warn(Object paramObject) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.WARNING, String.valueOf(paramObject),
-                null);
-      }
-    }
-  }
-
-  /**
-   * Logs a message at {@link Level#WARNING}.
-   * 
-   * @param paramObject
-   *          a message.
-   * @param paramThrowable
-   *          a cause.
-   */
-  public void warn(Object paramObject, Throwable paramThrowable) {
-    if (context != null) {
-      Logger logger = context.getLogger();
-      if (logger != null) {
-        context.getLogger().log(getClass().getName(), Level.WARNING, String.valueOf(paramObject),
-                paramThrowable);
-      }
-    }
-  }
-  
-  /**
-   * Gets the extension ClassLoader to used to locate the message digests. If this returns null,
-   * then message digests will be searched for using this.class.getClassLoader().
-   */
-  private ClassLoader getExtensionClassLoader() {
-    if (context instanceof UimaContextAdmin) {
-      ResourceManager resMgr = ((UimaContextAdmin) context).getResourceManager();
-      if (resMgr != null) {
-        return resMgr.getExtensionClassLoader();
-      }
-      else {
-        return null;
-      }
-    }
-    return null;
-  }
-}
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/internal/MetaDataUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/internal/MetaDataUtil.java
index 814f6aa..6b13c56 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/internal/MetaDataUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/internal/MetaDataUtil.java
@@ -29,7 +29,7 @@
 import java.util.TreeSet;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.uima.resource.ResourceInitializationException;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/internal/ResourceManagerFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/internal/ResourceManagerFactory.java
index b62dc86..11e1f59 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/internal/ResourceManagerFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/internal/ResourceManagerFactory.java
@@ -18,8 +18,6 @@
  */
 package org.apache.uima.fit.internal;
 
-import java.net.MalformedURLException;
-
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.UimaContext;
 import org.apache.uima.UimaContextAdmin;
@@ -41,8 +39,7 @@
     // No instances
   }
 
-  public static ResourceManager newResourceManager() throws ResourceInitializationException
-  {
+  public static ResourceManager newResourceManager() throws ResourceInitializationException {
     return resourceManagerCreator.newResourceManager();
   }
 
@@ -68,48 +65,42 @@
   public static class DefaultResourceManagerCreator implements ResourceManagerCreator {
     @Override
     public ResourceManager newResourceManager() throws ResourceInitializationException {
-      try {
-        UimaContext activeContext = UimaContextHolder.getContext();
-        if (activeContext != null) {
-          // If we are already in a UIMA context, then we re-use it. Mind that the JCas cannot
-          // handle switching across more than one classloader.
-          // This can be done since UIMA 2.9.0 and starts being handled in uimaFIT 2.3.0
-          // See https://issues.apache.org/jira/browse/UIMA-5056
-          return ((UimaContextAdmin) activeContext).getResourceManager();
-        }
-
-        // If there is no UIMA context, then we create a new resource manager
-        // UIMA core still does not fall back to the context classloader in all cases.
-        // This was the default behavior until uimaFIT 2.2.0.
-        ResourceManager resMgr;
-        if (Thread.currentThread().getContextClassLoader() != null) {
-          // If the context classloader is set, then we want the resource manager to fallb
-          // back to it. However, it may not reliably do that that unless we explictly pass
-          // null here. See. UIMA-6239.
-          resMgr = new ResourceManager_impl(null);
-        }
-        else {
-          resMgr = UIMAFramework.newDefaultResourceManager();
-        }
-
-        // Since UIMA Core version 2.10.3 and 3.0.1 the thread context classloader is taken
-        // into account by the core framework. Thus, we no longer have to explicitly set a
-        // classloader these or more recent versions. (cf. UIMA-5802)
-        short maj = UimaVersion.getMajorVersion();
-        short min = UimaVersion.getMinorVersion();
-        short rev = UimaVersion.getBuildRevision();
-        boolean uimaCoreIgnoresContextClassloader =
-                (maj == 2 && (min < 10 || (min == 10 && rev < 3))) || // version < 2.10.3
-                (maj == 3 && ((min == 0 && rev < 1)));                // version < 3.0.1
-        if (uimaCoreIgnoresContextClassloader) {
-          resMgr.setExtensionClassPath(ClassLoaderUtils.findClassloader(), "", true);
-        }
-
-        return resMgr;
+      UimaContext activeContext = UimaContextHolder.getContext();
+      if (activeContext != null) {
+        // If we are already in a UIMA context, then we re-use it. Mind that the JCas cannot
+        // handle switching across more than one classloader.
+        // This can be done since UIMA 2.9.0 and starts being handled in uimaFIT 2.3.0
+        // See https://issues.apache.org/jira/browse/UIMA-5056
+        return ((UimaContextAdmin) activeContext).getResourceManager();
       }
-      catch (MalformedURLException e) {
-        throw new ResourceInitializationException(e);
+
+      // If there is no UIMA context, then we create a new resource manager
+      // UIMA core still does not fall back to the context classloader in all cases.
+      // This was the default behavior until uimaFIT 2.2.0.
+      ResourceManager resMgr;
+      if (Thread.currentThread().getContextClassLoader() != null) {
+        // If the context classloader is set, then we want the resource manager to fallb
+        // back to it. However, it may not reliably do that that unless we explictly pass
+        // null here. See. UIMA-6239.
+        resMgr = new ResourceManager_impl(null);
+      } else {
+        resMgr = UIMAFramework.newDefaultResourceManager();
       }
+
+      // Since UIMA Core version 2.10.3 and 3.0.1 the thread context classloader is taken
+      // into account by the core framework. Thus, we no longer have to explicitly set a
+      // classloader these or more recent versions. (cf. UIMA-5802)
+      short maj = UimaVersion.getMajorVersion();
+      short min = UimaVersion.getMinorVersion();
+      short rev = UimaVersion.getBuildRevision();
+      boolean uimaCoreIgnoresContextClassloader = 
+              (maj == 2 && (min < 10 || (min == 10 && rev < 3))) || // version < 2.10.3
+              (maj == 3 && ((min == 0 && rev < 1)));                // version < 3.0.1
+      if (uimaCoreIgnoresContextClassloader) {
+        resMgr.setExtensionClassLoader(ClassLoaderUtils.findClassloader(), true);
+      }
+
+      return resMgr;
     }
   }
 }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/pipeline/SimplePipeline.java b/uimafit-core/src/main/java/org/apache/uima/fit/pipeline/SimplePipeline.java
index 25ab4ff..6591428 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/pipeline/SimplePipeline.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/pipeline/SimplePipeline.java
@@ -26,12 +26,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.uima.UIMAException;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.cas.CAS;
+import org.apache.uima.collection.CollectionException;
 import org.apache.uima.collection.CollectionReader;
 import org.apache.uima.collection.CollectionReaderDescription;
 import org.apache.uima.fit.factory.AnalysisEngineFactory;
@@ -77,13 +77,18 @@
    *          Primitive AnalysisEngineDescriptions that process the CAS, in order. If you have a mix
    *          of primitive and aggregate engines, then please create the AnalysisEngines yourself
    *          and call the other runPipeline method.
-   * @throws UIMAException
-   *           if there is a problem initializing or running the CPE.
    * @throws IOException
    *           if there is an I/O problem in the reader
+   * @throws ResourceInitializationException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws CollectionException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws AnalysisEngineProcessException 
+   *           if there is a problem initializing or running the pipeline.
    */
   public static void runPipeline(final CollectionReader reader,
-          final AnalysisEngineDescription... descs) throws UIMAException, IOException {
+          final AnalysisEngineDescription... descs) throws IOException,
+          ResourceInitializationException, AnalysisEngineProcessException, CollectionException {
     AnalysisEngine aae = null;
     try {
       // Create AAE
@@ -145,14 +150,18 @@
    *          Primitive AnalysisEngineDescriptions that process the CAS, in order. If you have a mix
    *          of primitive and aggregate engines, then please create the AnalysisEngines yourself
    *          and call the other runPipeline method.
-   * @throws UIMAException
-   *           if there is a problem initializing or running the CPE.
    * @throws IOException
    *           if there is an I/O problem in the reader
+   * @throws ResourceInitializationException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws CollectionException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws AnalysisEngineProcessException 
+   *           if there is a problem initializing or running the pipeline.
    */
   public static void runPipeline(final CollectionReaderDescription readerDesc,
-          final AnalysisEngineDescription... descs) throws UIMAException, IOException {
-    
+          final AnalysisEngineDescription... descs) throws IOException,
+          ResourceInitializationException, AnalysisEngineProcessException, CollectionException {
     CollectionReader reader = null;
     AnalysisEngine aae = null;
     ResourceManager resMgr = null;
@@ -211,13 +220,18 @@
    *          a collection reader
    * @param engines
    *          a sequence of analysis engines
-   * @throws UIMAException
-   *           if there is a problem initializing or running the CPE.
    * @throws IOException
    *           if there is an I/O problem in the reader
+   * @throws CollectionException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws ResourceInitializationException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws AnalysisEngineProcessException 
+   *           if there is a problem initializing or running the pipeline.
    */
   public static void runPipeline(final CollectionReader reader, final AnalysisEngine... engines)
-          throws UIMAException, IOException {
+          throws IOException, AnalysisEngineProcessException, ResourceInitializationException,
+          CollectionException {
     runPipeline(reader.getResourceManager(), reader, engines);
   }
   
@@ -242,13 +256,18 @@
    *          a collection reader
    * @param engines
    *          a sequence of analysis engines
-   * @throws UIMAException
-   *           if there is a problem initializing or running the CPE.
    * @throws IOException
    *           if there is an I/O problem in the reader
+   * @throws ResourceInitializationException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws CollectionException 
+   *           if there is a problem initializing or running the pipeline.
+   * @throws AnalysisEngineProcessException 
+   *           if there is a problem initializing or running the pipeline.
    */
   public static void runPipeline(final ResourceManager aResMgr, final CollectionReader reader,
-          final AnalysisEngine... engines) throws UIMAException, IOException {
+          final AnalysisEngine... engines) throws IOException, ResourceInitializationException,
+          AnalysisEngineProcessException, CollectionException {
     final List<ResourceMetaData> metaData = new ArrayList<ResourceMetaData>();
     metaData.add(reader.getMetaData());
     for (AnalysisEngine engine : engines) {
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/testing/factory/TokenBuilder.java b/uimafit-core/src/main/java/org/apache/uima/fit/testing/factory/TokenBuilder.java
index 624340e..9f83fcc 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/testing/factory/TokenBuilder.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/testing/factory/TokenBuilder.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.uima.UIMAException;
 import org.apache.uima.cas.Feature;
 import org.apache.uima.fit.factory.AnnotationFactory;
 import org.apache.uima.jcas.JCas;
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/AnnotationPredicates.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/AnnotationPredicates.java
new file mode 100644
index 0000000..75c7385
--- /dev/null
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/AnnotationPredicates.java
@@ -0,0 +1,217 @@
+/*
+ * 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.uima.fit.util;
+
+import org.apache.uima.cas.text.AnnotationFS;
+
+public final class AnnotationPredicates {
+  private AnnotationPredicates() {
+    // No instances
+  }
+  
+  public static boolean coveredBy(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aYBegin <= aXBegin && aXEnd <= aYEnd && (aXBegin == aYBegin || aXBegin != aYEnd);
+  }
+
+  public static boolean coveredBy(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xBegin = aX.getBegin();
+    return aYBegin <= xBegin && (xBegin == aYBegin || xBegin != aYEnd) && aX.getEnd() <= aYEnd;
+  }
+
+  /**
+   * Y is starting before or at the same position as A and ends after or at the same position as X.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X is covered by Y.
+   */
+  public static boolean coveredBy(AnnotationFS aX, AnnotationFS aY) {
+    int xBegin = aX.getBegin();
+    int yBegin = aY.getBegin();
+    int yEnd = aY.getEnd();
+    return yBegin <= xBegin && (xBegin == yBegin || xBegin != yEnd) && aX.getEnd() <= yEnd;
+  }
+
+  public static boolean covers(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aXBegin <= aYBegin && aYEnd <= aXEnd && (aYBegin == aXBegin || aYBegin != aXEnd);
+  }
+
+  public static boolean covers(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xBegin = aX.getBegin();
+    int xEnd = aX.getEnd();
+    return xBegin <= aYBegin && aYEnd <= xEnd && (aYBegin == xBegin || aYBegin != xEnd);
+  }
+
+  /**
+   * X is starting before or at the same position as Y and ends after or at the same position as Y.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X is covering Y.
+   */
+  public static boolean covers(AnnotationFS aX, AnnotationFS aY) {
+    int xBegin = aX.getBegin();
+    int xEnd = aX.getEnd();
+    int yBegin = aY.getBegin();
+    return xBegin <= yBegin && (yBegin == xBegin || yBegin != xEnd) && aY.getEnd() <= xEnd;
+  }
+
+  public static boolean colocated(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aXBegin == aYBegin && aXEnd == aYEnd;
+  }
+
+  public static boolean colocated(AnnotationFS aX, int aYBegin, int aYEnd) {
+    return aX.getBegin() == aYBegin && aX.getEnd() == aYEnd;
+  }
+
+  /**
+   * X starts and ends at the same position as Y.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X is at the same location as Y.
+   */
+  public static boolean colocated(AnnotationFS aX, AnnotationFS aY) {
+    return aX.getBegin() == aY.getBegin() && aX.getEnd() == aY.getEnd();
+  }
+
+  public static boolean overlaps(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aYBegin == aXBegin || (aXBegin < aYEnd && aYBegin < aXEnd);
+  }
+
+  public static boolean overlaps(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xBegin = aX.getBegin();
+    return aYBegin == xBegin || (xBegin < aYEnd && aYBegin < aX.getEnd());
+  }
+
+  /**
+   * The intersection of the spans X and Y is non-empty. If either X or Y have a zero-width, then
+   * the intersection is considered to be non-empty if the begin of X is either within Y or the same
+   * as the begin of Y - and vice versa.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X overlaps with Y in any way.
+   */
+  public static boolean overlaps(AnnotationFS aX, AnnotationFS aY) {
+    int xBegin = aX.getBegin();
+    int yBegin = aY.getBegin();
+    return yBegin == xBegin || (xBegin < aY.getEnd() && yBegin < aX.getEnd());
+  }
+
+  public static boolean overlapsLeft(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aXBegin < aYBegin && aYBegin < aXEnd && aXEnd < aYEnd;
+  }
+
+  public static boolean overlapsLeft(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xEnd = aX.getEnd();
+    return aYBegin < xEnd && xEnd < aYEnd && aX.getBegin() < aYBegin;
+  }
+
+  /**
+   * X is starting before or at the same position as Y and ends before Y ends.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X overlaps Y on the left.
+   */
+  public static boolean overlapsLeft(AnnotationFS aX, AnnotationFS aY) {
+    int xEnd = aX.getEnd();
+    int yBegin = aY.getBegin();
+    return yBegin < xEnd && xEnd < aY.getEnd() && aX.getBegin() < yBegin;
+  }
+
+  public static boolean overlapsRight(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aYBegin < aXBegin && aXBegin < aYEnd && aYEnd < aXEnd;
+  }
+
+  public static boolean overlapsRight(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xBegin = aX.getBegin();
+    return aYBegin < xBegin && xBegin < aYEnd && aYEnd < aX.getEnd();
+  }
+
+  /**
+   * X is starting after Y starts and ends after or at the same position as Y.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X overlaps Y on the right.
+   */
+  public static boolean overlapsRight(AnnotationFS aX, AnnotationFS aY) {
+    int xBegin = aX.getBegin();
+    int yEnd = aY.getEnd();
+    return xBegin < yEnd && aY.getBegin() < xBegin && yEnd < aX.getEnd();
+  }
+
+  public static boolean rightOf(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aXBegin >= aYEnd && aXBegin != aYBegin;
+  }
+
+  public static boolean rightOf(AnnotationFS aX, int aYBegin, int aYEnd) {
+    int xBegin = aX.getBegin();
+    return xBegin >= aYEnd && xBegin != aYBegin;
+  }
+
+  /**
+   * X starts at or after the position that Y ends.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X is right of Y.
+   */
+  public static boolean rightOf(AnnotationFS aX, AnnotationFS aY) {
+    int xBegin = aX.getBegin();
+    return xBegin >= aY.getEnd() && xBegin != aY.getBegin();
+  }
+
+  public static boolean leftOf(int aXBegin, int aXEnd, int aYBegin, int aYEnd) {
+    return aYBegin >= aXEnd && aXBegin != aYBegin;
+  }
+
+  public static boolean leftOf(AnnotationFS aX, int aYBegin, int aYEnd) {
+    return aYBegin >= aX.getEnd() && aX.getBegin() != aYBegin;
+  }
+
+  /**
+   * X ends before or at the position that Y starts.
+   * 
+   * @param aX
+   *          X
+   * @param aY
+   *          Y
+   * @return whether X left of Y.
+   */
+  public static boolean leftOf(AnnotationFS aX, AnnotationFS aY) {
+    return aY.getBegin() >= aX.getEnd() && aX.getBegin() != aY.getBegin();
+  }
+}
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
index dc97d5e..187fe00 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
@@ -33,9 +33,9 @@
 import java.util.Deque;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.uima.cas.ArrayFS;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.CASRuntimeException;
@@ -74,7 +74,9 @@
    *          a type.
    * @return a return value.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code cas.select(type).iterator()}
    */
+  @Deprecated
   @SuppressWarnings("unchecked")
   public static <T extends FeatureStructure> Iterator<T> iteratorFS(CAS cas, Type type) {
     return (Iterator<T>) FSCollectionFactory.create(cas, type).iterator();
@@ -155,10 +157,7 @@
    */
   public static Type getAnnotationType(CAS aCas, Class<?> aJCasClass) {
     final Type type = getType(aCas, aJCasClass);
-    if (!aCas.getTypeSystem().subsumes(aCas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + aJCasClass.getName()
-              + "] is not an annotation type");
-    }
+    requireAnnotationType(aCas, type);
     return type;
   }
 
@@ -173,9 +172,7 @@
    */
   public static Type getAnnotationType(CAS aCas, String aTypeName) {
     Type type = getType(aCas, aTypeName);
-    if (!aCas.getTypeSystem().subsumes(aCas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + aTypeName + "] is not an annotation type");
-    }
+    requireAnnotationType(aCas, type);
     return type;
   }
 
@@ -189,7 +186,7 @@
    * @return A collection of the selected type.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Collection<FeatureStructure> selectFS(ArrayFS array, Type type) {
+  public static List<FeatureStructure> selectFS(ArrayFS array, Type type) {
     return FSCollectionFactory.create(array, type);
   }
 
@@ -204,12 +201,10 @@
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
   @SuppressWarnings({ "unchecked", "rawtypes" })
-  public static Collection<AnnotationFS> select(ArrayFS array, Type type) {
+  public static List<AnnotationFS> select(ArrayFS array, Type type) {
     final CAS cas = array.getCAS();
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
-    return (Collection) FSCollectionFactory.create(array, type);
+    requireAnnotationType(cas, type);
+    return (List) FSCollectionFactory.create(array, type);
   }
 
   /**
@@ -233,9 +228,12 @@
    *          the type.
    * @return A collection of the selected type.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code cas.select(type).asList()}
    */
-  public static Collection<FeatureStructure> selectFS(final CAS cas, final Type type) {
-    return FSCollectionFactory.create(cas, type);
+  @SuppressWarnings("unchecked")
+  @Deprecated
+  public static <T extends FeatureStructure> List<T> selectFS(final CAS cas, final Type type) {
+    return (List<T>) FSCollectionFactory.create(cas, type);
   }
 
   /**
@@ -262,10 +260,8 @@
    */
   @SuppressWarnings({ "unchecked", "rawtypes" })
   public static Collection<AnnotationFS> select(final CAS cas, final Type type) {
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
-    return (Collection) FSCollectionFactory.create(cas.getAnnotationIndex(type));
+    requireAnnotationType(cas, type);
+    return (Collection) cas.getAnnotationIndex(type).select().asList();
   }
   
   /**
@@ -757,14 +753,14 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Map<AnnotationFS, Collection<AnnotationFS>> indexCovering(CAS cas, Type type,
+  public static Map<AnnotationFS, List<AnnotationFS>> indexCovering(CAS cas, Type type,
           Type coveringType) {
-    Map<AnnotationFS, Collection<AnnotationFS>> index = new HashMap<AnnotationFS, Collection<AnnotationFS>>() {
+    Map<AnnotationFS, List<AnnotationFS>> index = new HashMap<AnnotationFS, List<AnnotationFS>>() {
       private static final long serialVersionUID = 1L;
 
       @Override
-      public Collection<AnnotationFS> get(Object paramObject) {
-        Collection<AnnotationFS> res = super.get(paramObject);
+      public List<AnnotationFS> get(Object paramObject) {
+        List<AnnotationFS> res = super.get(paramObject);
         if (res == null) {
           return emptyList();
         } else {
@@ -774,9 +770,9 @@
     };
     for (AnnotationFS s : select(cas, coveringType)) {
       for (AnnotationFS u : selectCovered(cas, type, s)) {
-        Collection<AnnotationFS> c = index.get(u);
+        List<AnnotationFS> c = index.get(u);
         if (c == EMPTY_LIST) {
-          c = new LinkedList<AnnotationFS>();
+          c = new ArrayList<AnnotationFS>();
           index.put(u, c);
         }
         c.add(s);
@@ -807,14 +803,14 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Map<AnnotationFS, Collection<AnnotationFS>> indexCovered(CAS cas, Type type,
+  public static Map<AnnotationFS, List<AnnotationFS>> indexCovered(CAS cas, Type type,
           Type coveredType) {
-    Map<AnnotationFS, Collection<AnnotationFS>> index = new HashMap<AnnotationFS, Collection<AnnotationFS>>() {
+    Map<AnnotationFS, List<AnnotationFS>> index = new HashMap<AnnotationFS, List<AnnotationFS>>() {
       private static final long serialVersionUID = 1L;
 
       @Override
-      public Collection<AnnotationFS> get(Object paramObject) {
-        Collection<AnnotationFS> res = super.get(paramObject);
+      public List<AnnotationFS> get(Object paramObject) {
+        List<AnnotationFS> res = super.get(paramObject);
         if (res == null) {
           return emptyList();
         } else {
@@ -873,9 +869,9 @@
         // Record covered annotations
         for (AnnotationFS covering : memory) {
           if (covering.getBegin() <= iFSbegin && iFS.getEnd() <= covering.getEnd()) {
-            Collection<AnnotationFS> c = index.get(covering);
+            List<AnnotationFS> c = index.get(covering);
             if (c == EMPTY_LIST) {
-              c = new LinkedList<AnnotationFS>();
+              c = new ArrayList<AnnotationFS>();
               index.put(covering, c);
             }
             if (iFS != covering) {
@@ -904,7 +900,66 @@
 
     return unmodifiableMap(index);
   }
+  
+  /**
+   * Get a list of annotations of the given annotation type overlapping the given annotation. Does 
+   * not use subiterators and does not respect type prioritites.
+   * 
+   * @param aCas
+   *          a CAS.
+   * @param aType
+   *          a UIMA type.
+   * @param  aBoundaryAnnotation
+   *          the covering annotation.
+   * @return a list of overlapping annotations.
+   * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   */  
+  public static List<AnnotationFS> selectOverlapping(CAS aCas, Type aType,
+          AnnotationFS aBoundaryAnnotation) {
+    return selectOverlapping(aCas, aType, aBoundaryAnnotation.getBegin(),
+            aBoundaryAnnotation.getEnd());
+  }  
+  
+  /**
+   * Get a list of annotations of the given annotation type overlapping the given span. Does not use
+   * subiterators and does not respect type prioritites.
+   * 
+   * @param aCas
+   *          a CAS.
+   * @param aType
+   *          a UIMA type.
+   * @param aSelBegin
+   *          begin offset.
+   * @param aSelEnd
+   *          end offset.
+   * @return a list of overlapping annotations.
+   * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   */  
+  public static List<AnnotationFS> selectOverlapping(CAS aCas, Type aType, int aSelBegin,
+          int aSelEnd) {
+    requireAnnotationType(aCas, aType);
+    
+    List<AnnotationFS> annotations = new ArrayList<>();
+    for (AnnotationFS t : aCas.getAnnotationIndex(aType)) {
+      int begin = t.getBegin();
+      int end = t.getEnd();
 
+      // Annotation is fully right of selection (not overlapping)
+      if (aSelBegin != begin && begin >= aSelEnd) {
+        break;
+      }
+      
+      // not yet there
+      if (aSelBegin != begin && end <= aSelBegin) {
+        continue;
+      }
+      
+      annotations.add(t);
+    }
+
+    return annotations;
+  }
+  
   /**
    * This method exists simply as a convenience method for unit testing. It is not very efficient
    * and should not, in general be used outside the context of unit testing.
@@ -920,9 +975,8 @@
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
   public static AnnotationFS selectByIndex(CAS cas, Type type, int index) {
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
+    requireAnnotationType(cas, type);
+
     // withSnapshotIterators() not needed here since we return only one result   
     FSIterator<AnnotationFS> i = cas.getAnnotationIndex(type).iterator();
     int n = index;
@@ -945,7 +999,7 @@
   }
 
   /**
-   * Get the single instance of the specified type from the JCas.
+   * Get the single instance of the specified type from the CAS.
    * 
    * @param cas
    *          a CAS containing the annotation.
@@ -954,7 +1008,33 @@
    * @return the single instance of the given type. throws IllegalArgumentException if not exactly
    *         one instance if the given type is present.
    */
-  public static FeatureStructure selectSingle(CAS cas, Type type) {
+  public static AnnotationFS selectSingle(CAS cas, Type type) {
+    FSIterator<AnnotationFS> iterator = cas.getAnnotationIndex(type).iterator();
+
+    if (!iterator.hasNext()) {
+      throw new IllegalArgumentException("CAS does not contain any [" + type.getName() + "]");
+    }
+
+    AnnotationFS result = iterator.next();
+
+    if (iterator.hasNext()) {
+      throw new IllegalArgumentException("CAS contains more than one [" + type.getName() + "]");
+    }
+
+    return result;
+  }
+  
+  /**
+   * Get the single instance of the specified type from the CAS.
+   * 
+   * @param cas
+   *          a CAS containing the annotation.
+   * @param type
+   *          a UIMA type.
+   * @return the single instance of the given type. throws IllegalArgumentException if not exactly
+   *         one instance if the given type is present.
+   */
+  public static FeatureStructure selectSingleFS(CAS cas, Type type) {
     FSIterator<FeatureStructure> iterator = cas.getIndexRepository().getAllIndexedFS(type);
 
     if (!iterator.hasNext()) {
@@ -1011,9 +1091,7 @@
    */
   public static AnnotationFS selectSingleRelative(CAS cas, Type type, AnnotationFS aAnchor,
           int aPosition) {
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
+    requireAnnotationType(cas, type);
 
     // move to first previous annotation
     FSIterator<AnnotationFS> itr = cas.getAnnotationIndex(type).iterator();
@@ -1097,11 +1175,9 @@
    */
   public static List<AnnotationFS> selectPreceding(CAS cas, Type type, AnnotationFS annotation,
           int count) {
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
+    requireAnnotationType(cas, type);
 
-    List<AnnotationFS> precedingAnnotations = new LinkedList<AnnotationFS>();
+    List<AnnotationFS> precedingAnnotations = new ArrayList<AnnotationFS>();
 
     // Seek annotation in index
     // withSnapshotIterators() not needed here since we copy the FSes to a list anyway    
@@ -1155,9 +1231,7 @@
    */
   public static List<AnnotationFS> selectFollowing(CAS cas, Type type, AnnotationFS annotation,
           int count) {
-    if (!cas.getTypeSystem().subsumes(cas.getAnnotationType(), type)) {
-      throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation type");
-    }
+    requireAnnotationType(cas, type);
 
     // Seek annotation in index
     // withSnapshotIterators() not needed here since we copy the FSes to a list anyway    
@@ -1180,7 +1254,7 @@
     }
 
     // add annotations from the iterator into the result list
-    List<AnnotationFS> followingAnnotations = new LinkedList<AnnotationFS>();
+    List<AnnotationFS> followingAnnotations = new ArrayList<AnnotationFS>();
     for (int i = 0; i < count && itr.isValid(); i++, itr.moveToNext()) {
       followingAnnotations.add(itr.get());
     }
@@ -1285,4 +1359,16 @@
     }
     return text;
   }
+
+  public static boolean isAnnotationType(CAS aCas, Type aType)
+  {
+    return aCas.getTypeSystem().subsumes(aCas.getAnnotationType(), aType);
+  }
+
+  public static void requireAnnotationType(CAS aCas, Type aType) {
+    if (!isAnnotationType(aCas, aType)) {
+      throw new IllegalArgumentException(
+              "Type [" + aType.getName() + "] is not an annotation type");
+    }
+  }
 }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/FSCollectionFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/FSCollectionFactory.java
index 1ff9750..40e39a6 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/FSCollectionFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/FSCollectionFactory.java
@@ -70,11 +70,8 @@
 /**
  * Bridge between Java {@link Collection Collections} from different representations of collections
  * of UIMA {@link FeatureStructure FeatureStructures}.
- * 
- * @param <T>
- *          data type.
  */
-public abstract class FSCollectionFactory<T extends FeatureStructure> {
+public abstract class FSCollectionFactory {
 
   private FSCollectionFactory() {
     // No instances.
@@ -91,17 +88,19 @@
    *          the type of feature structures to select. All sub-types are returned as well.
    * @return a {@link Collection} of the given type of feature structures backed live by the CAS.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code cas.select(type).asList()}
    */
+  @Deprecated
   @SuppressWarnings({ "unchecked", "rawtypes" })
-  public static Collection<FeatureStructure> create(CAS cas, Type type) {
+  public static List<FeatureStructure> create(CAS cas, Type type) {
     // If the type is an annotation type, we can use the annotation index, which directly
     // provides us with its size. If not, we have to use getAllIndexedFS() which we have to
     // scan from beginning to end in order to determine its size.
     TypeSystem ts = cas.getTypeSystem();
     if (ts.subsumes(cas.getAnnotationType(), type)) {
-      return (Collection) create(cas.getAnnotationIndex(type));
+      return (List) create(cas.getAnnotationIndex(type));
     } else {
-      return create(cas.getIndexRepository().getAllIndexedFS(type));
+      return (List) cas.select(type).asList();
     }
   }
 
@@ -128,9 +127,11 @@
    *          the index to convert.
    * @return the wrapped index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code index.select().asList()}
    */
-  public static <T extends AnnotationFS> Collection<T> create(AnnotationIndex<T> aIndex) {
-    return new AnnotationIndexAdapter<T>(aIndex);
+  @Deprecated
+  public static <T extends AnnotationFS> List<T> create(AnnotationIndex<T> aIndex) {
+    return aIndex.select().asList();
   }
 
   /**
@@ -141,7 +142,7 @@
    * @return a new collection containing the same feature structures as the provided array.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Collection<FeatureStructure> create(ArrayFS aArray) {
+  public static <T extends FeatureStructure> List<T> create(ArrayFS<T> aArray) {
     return create(aArray, (Type) null);
   }
 
@@ -157,8 +158,8 @@
    * @return a new collection of all feature structures of the given type.
    */
   @SuppressWarnings({ "unchecked", "rawtypes" })
-  public static <T extends TOP> Collection<T> create(ArrayFS aArray, Class<T> aType) {
-    return (Collection) create(aArray, CasUtil.getType(aArray.getCAS(), aType));
+  public static <T extends TOP> List<T> create(ArrayFS aArray, Class<T> aType) {
+    return create(aArray, CasUtil.getType(aArray.getCAS(), aType));
   }
 
   /**
@@ -170,7 +171,7 @@
    *          the CAS type.
    * @return a new collection of all feature structures of the given type.
    */
-  public static Collection<FeatureStructure> create(ArrayFS aArray, Type aType) {
+  public static <T extends FeatureStructure> List<T> create(ArrayFS<T> aArray, Type aType) {
     TypeSystem ts = aArray.getCAS().getTypeSystem();
     List<FeatureStructure> data = new ArrayList<FeatureStructure>(aArray.size());
     for (int i = 0; i < aArray.size(); i++) {
@@ -179,282 +180,359 @@
         data.add(value);
       }
     }
-    return asList(data.toArray(new FeatureStructure[data.size()]));
+    return (List<T>) asList(data.toArray(new FeatureStructure[data.size()]));
   }
 
-  public static ArrayFS createArrayFS(CAS aCas, Collection<? extends FeatureStructure> aCollection) {
+  public static <T extends FeatureStructure> ArrayFS<T> createArrayFS(CAS aCas,
+          Collection<T> aCollection) {
     return fillArrayFS(aCas.createArrayFS(aCollection.size()), aCollection);
   }
 
-  public static ArrayFS createArrayFS(CAS aCas, FeatureStructure[] aArray) {
+  public static <T extends FeatureStructure> ArrayFS<T> createArrayFS(CAS aCas, T... aArray) {
     return fillArrayFS(aCas.createArrayFS(aArray.length), asList(aArray));
   }
 
-  public static FSArray createFSArray(JCas aJCas, Collection<? extends FeatureStructure> aCollection) {
-    return fillArrayFS(new FSArray(aJCas, aCollection.size()), aCollection);
+  public static <T extends FeatureStructure> FSArray<T> createFSArray(JCas aJCas,
+          Collection<T> aCollection) {
+    return fillArray(new FSArray<T>(aJCas, aCollection.size()), aCollection);
   }
 
-  public static FSArray createFSArray(JCas aJCas, FeatureStructure[] aArray) {
-    return fillArrayFS(new FSArray(aJCas, aArray.length), asList(aArray));
+  public static <T extends FeatureStructure> FSArray<T> createFSArray(JCas aJCas, T... aArray) {
+    return fillArray(new FSArray<T>(aJCas, aArray.length), asList(aArray));
   }
 
-  public static BooleanArrayFS createBooleanArray(CAS aCas, Collection<Boolean> aCollection) {
+  public static BooleanArrayFS createBooleanArrayFS(CAS aCas, Collection<Boolean> aCollection) {
     return fillArrayFS(aCas.createBooleanArrayFS(aCollection.size()), aCollection);
   }
 
-  public static BooleanArrayFS createBooleanArray(CAS aCas, boolean[] aArray) {
+  public static BooleanArrayFS createBooleanArrayFS(CAS aCas, boolean... aArray) {
     return fillArrayFS(aCas.createBooleanArrayFS(aArray.length), aArray);
   }
 
-  public static BooleanArrayFS createBooleanArray(JCas aJCas, Collection<Boolean> aCollection) {
-    return fillArrayFS(new BooleanArray(aJCas, aCollection.size()), aCollection);
+  public static BooleanArray createBooleanArray(JCas aJCas, Collection<Boolean> aCollection) {
+    return fillArray(new BooleanArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static BooleanArrayFS createBooleanArray(JCas aJCas, boolean[] aArray) {
-    return fillArrayFS(new BooleanArray(aJCas, aArray.length), aArray);
+  public static BooleanArray createBooleanArray(JCas aJCas, boolean... aArray) {
+    return fillArray(new BooleanArray(aJCas, aArray.length), aArray);
   }
 
-  public static ByteArrayFS createByteArray(CAS aCas, Collection<Byte> aCollection) {
+  public static ByteArrayFS createByteArrayFS(CAS aCas, Collection<Byte> aCollection) {
     return fillArrayFS(aCas.createByteArrayFS(aCollection.size()), aCollection);
   }
 
-  public static ByteArrayFS createByteArray(CAS aCas, byte[] aArray) {
+  public static ByteArrayFS createByteArrayFS(CAS aCas, byte... aArray) {
     return fillArrayFS(aCas.createByteArrayFS(aArray.length), aArray);
   }
 
-  public static ByteArrayFS createByteArray(JCas aJCas, Collection<Byte> aCollection) {
-    return fillArrayFS(new ByteArray(aJCas, aCollection.size()), aCollection);
+  public static ByteArray createByteArray(JCas aJCas, Collection<Byte> aCollection) {
+    return fillArray(new ByteArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static ByteArrayFS createByteArray(JCas aJCas, byte[] aArray) {
-    return fillArrayFS(new ByteArray(aJCas, aArray.length), aArray);
+  public static ByteArray createByteArray(JCas aJCas, byte... aArray) {
+    return fillArray(new ByteArray(aJCas, aArray.length), aArray);
   }
 
-  public static DoubleArrayFS createDoubleArray(CAS aCas, Collection<Double> aCollection) {
+  public static DoubleArrayFS createDoubleArrayFS(CAS aCas, Collection<Double> aCollection) {
     return fillArrayFS(aCas.createDoubleArrayFS(aCollection.size()), aCollection);
   }
 
-  public static DoubleArrayFS createDoubleArray(CAS aCas, double[] aArray) {
+  public static DoubleArrayFS createDoubleArrayFS(CAS aCas, double... aArray) {
     return fillArrayFS(aCas.createDoubleArrayFS(aArray.length), aArray);
   }
 
-  public static DoubleArrayFS createDoubleArray(JCas aJCas, Collection<Double> aCollection) {
-    return fillArrayFS(new DoubleArray(aJCas, aCollection.size()), aCollection);
+  public static DoubleArray createDoubleArray(JCas aJCas, Collection<Double> aCollection) {
+    return fillArray(new DoubleArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static DoubleArrayFS createDoubleArray(JCas aJCas, double[] aArray) {
-    return fillArrayFS(new DoubleArray(aJCas, aArray.length), aArray);
+  public static DoubleArray createDoubleArray(JCas aJCas, double... aArray) {
+    return fillArray(new DoubleArray(aJCas, aArray.length), aArray);
   }
 
-  public static FloatArrayFS createFloatArray(CAS aCas, Collection<Float> aCollection) {
+  public static FloatArrayFS createFloatArrayFS(CAS aCas, Collection<Float> aCollection) {
     return fillArrayFS(aCas.createFloatArrayFS(aCollection.size()), aCollection);
   }
 
-  public static FloatArrayFS createFloatArray(CAS aCas, float[] aArray) {
+  public static FloatArrayFS createFloatArrayFS(CAS aCas, float... aArray) {
     return fillArrayFS(aCas.createFloatArrayFS(aArray.length), aArray);
   }
 
-  public static FloatArrayFS createFloatArray(JCas aJCas, Collection<Float> aCollection) {
-    return fillArrayFS(new FloatArray(aJCas, aCollection.size()), aCollection);
+  public static FloatArray createFloatArray(JCas aJCas, Collection<Float> aCollection) {
+    return fillArray(new FloatArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static FloatArrayFS createFloatArray(JCas aJCas, float[] aArray) {
-    return fillArrayFS(new FloatArray(aJCas, aArray.length), aArray);
+  public static FloatArray createFloatArray(JCas aJCas, float... aArray) {
+    return fillArray(new FloatArray(aJCas, aArray.length), aArray);
   }
 
-  public static IntArrayFS createIntArray(CAS aCas, Collection<Integer> aCollection) {
+  public static IntArrayFS createIntArrayFS(CAS aCas, Collection<Integer> aCollection) {
     return fillArrayFS(aCas.createIntArrayFS(aCollection.size()), aCollection);
   }
 
-  public static IntArrayFS createIntArray(CAS aCas, int[] aArray) {
+  public static IntArrayFS createIntArrayFS(CAS aCas, int... aArray) {
     return fillArrayFS(aCas.createIntArrayFS(aArray.length), aArray);
   }
 
-  public static IntArrayFS createIntArray(JCas aJCas, Collection<Integer> aCollection) {
-    return fillArrayFS(new IntegerArray(aJCas, aCollection.size()), aCollection);
+  public static IntegerArray createIntArray(JCas aJCas, Collection<Integer> aCollection) {
+    return fillArray(new IntegerArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static IntArrayFS createIntArray(JCas aJCas, int[] aArray) {
-    return fillArrayFS(new IntegerArray(aJCas, aArray.length), aArray);
+  public static IntegerArray createIntArray(JCas aJCas, int... aArray) {
+    return fillArray(new IntegerArray(aJCas, aArray.length), aArray);
   }
 
-  public static LongArrayFS createLongArray(CAS aCas, Collection<Long> aCollection) {
+  public static LongArrayFS createLongArrayFS(CAS aCas, Collection<Long> aCollection) {
     return fillArrayFS(aCas.createLongArrayFS(aCollection.size()), aCollection);
   }
 
-  public static LongArrayFS createLongArray(CAS aCas, long[] aArray) {
+  public static LongArrayFS createLongArrayFS(CAS aCas, long... aArray) {
     return fillArrayFS(aCas.createLongArrayFS(aArray.length), aArray);
   }
 
-  public static LongArrayFS createLongArray(JCas aJCas, Collection<Long> aCollection) {
-    return fillArrayFS(new LongArray(aJCas, aCollection.size()), aCollection);
+  public static LongArray createLongArray(JCas aJCas, Collection<Long> aCollection) {
+    return fillArray(new LongArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static LongArrayFS createLongArray(JCas aJCas, long[] aArray) {
-    return fillArrayFS(new LongArray(aJCas, aArray.length), aArray);
+  public static LongArray createLongArray(JCas aJCas, long... aArray) {
+    return fillArray(new LongArray(aJCas, aArray.length), aArray);
   }
 
-  public static ShortArrayFS createShortArray(CAS aCas, Collection<Short> aCollection) {
+  public static ShortArrayFS createShortArrayFS(CAS aCas, Collection<Short> aCollection) {
     return fillArrayFS(aCas.createShortArrayFS(aCollection.size()), aCollection);
   }
 
-  public static ShortArrayFS createShortArray(CAS aCas, short[] aArray) {
+  public static ShortArrayFS createShortArrayFS(CAS aCas, short... aArray) {
     return fillArrayFS(aCas.createShortArrayFS(aArray.length), aArray);
   }
 
-  public static ShortArrayFS createShortArray(JCas aJCas, Collection<Short> aCollection) {
-    return fillArrayFS(new ShortArray(aJCas, aCollection.size()), aCollection);
+  public static ShortArray createShortArray(JCas aJCas, Collection<Short> aCollection) {
+    return fillArray(new ShortArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static ShortArrayFS createShortArray(JCas aJCas, short[] aArray) {
-    return fillArrayFS(new ShortArray(aJCas, aArray.length), aArray);
+  public static ShortArray createShortArray(JCas aJCas, short... aArray) {
+    return fillArray(new ShortArray(aJCas, aArray.length), aArray);
   }
 
-  public static StringArrayFS createStringArray(CAS aCas, Collection<String> aCollection) {
+  public static StringArrayFS createStringArrayFS(CAS aCas, Collection<String> aCollection) {
     return fillArrayFS(aCas.createStringArrayFS(aCollection.size()), aCollection);
   }
 
-  public static StringArrayFS createStringArray(CAS aCas, String[] aArray) {
+  public static StringArrayFS createStringArrayFS(CAS aCas, String... aArray) {
     return fillArrayFS(aCas.createStringArrayFS(aArray.length), aArray);
   }
 
-  public static StringArrayFS createStringArray(JCas aJCas, Collection<String> aCollection) {
-    return fillArrayFS(new StringArray(aJCas, aCollection.size()), aCollection);
+  public static StringArray createStringArray(JCas aJCas, Collection<String> aCollection) {
+    return fillArray(new StringArray(aJCas, aCollection.size()), aCollection);
   }
 
-  public static StringArrayFS createStringArray(JCas aJCas, String[] aArray) {
-    return fillArrayFS(new StringArray(aJCas, aArray.length), aArray);
+  public static StringArray createStringArray(JCas aJCas, String... aArray) {
+    return fillArray(new StringArray(aJCas, aArray.length), aArray);
   }
 
-  public static <T extends ArrayFS> T fillArrayFS(T aArrayFs,
-          Iterable<? extends FeatureStructure> aCollection) {
+  public static <T extends FeatureStructure> FSArray<T> fillArray(FSArray<T> aArray,
+          Iterable<? extends T> aValues) {
+    return (FSArray<T>) fillArrayFS(aArray, aValues);
+  }
+
+  public static <T extends FeatureStructure> FSArray<T> fillArray(FSArray<T> aArray,
+          FeatureStructure... aValues) {
+    return (FSArray<T>) fillArrayFS(aArray, aValues);
+  }
+
+  public static <T extends FeatureStructure> ArrayFS<T> fillArrayFS(ArrayFS<T> aArrayFs,
+          Iterable<? extends T> aCollection) {
     int i = 0;
-    for (FeatureStructure fs : aCollection) {
+    for (T fs : aCollection) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static ArrayFS fillArrayFS(ArrayFS aArrayFs, FeatureStructure[] aArray) {
+  public static <T extends FeatureStructure> ArrayFS<T> fillArrayFS(ArrayFS<T> aArrayFs,
+          FeatureStructure... aArray) {
     aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static BooleanArrayFS fillArrayFS(BooleanArrayFS aArrayFs, Iterable<Boolean> aCollection) {
+  public static BooleanArray fillArray(BooleanArray aArray, Iterable<Boolean> aValues) {
+    return (BooleanArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static BooleanArray fillArray(BooleanArray aArray, boolean... aValues) {
+    return (BooleanArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static BooleanArrayFS fillArrayFS(BooleanArrayFS aArrayFs, Iterable<Boolean> aValues) {
     int i = 0;
-    for (Boolean fs : aCollection) {
+    for (Boolean fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static BooleanArrayFS fillArrayFS(BooleanArrayFS aArrayFs, boolean[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static BooleanArrayFS fillArrayFS(BooleanArrayFS aArrayFs, boolean... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static ByteArrayFS fillArrayFS(ByteArrayFS aArrayFs, Iterable<Byte> aCollection) {
+  public static ByteArray fillArray(ByteArray aArray, Iterable<Byte> aValues) {
+    return (ByteArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static ByteArray fillArray(ByteArray aArray, byte... aValues) {
+    return (ByteArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static ByteArrayFS fillArrayFS(ByteArrayFS aArrayFs, Iterable<Byte> aValues) {
     int i = 0;
-    for (Byte fs : aCollection) {
+    for (Byte fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static ByteArrayFS fillArrayFS(ByteArrayFS aArrayFs, byte[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static ByteArrayFS fillArrayFS(ByteArrayFS aArrayFs, byte... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static DoubleArrayFS fillArrayFS(DoubleArrayFS aArrayFs, Iterable<Double> aCollection) {
+  public static DoubleArray fillArray(DoubleArray aArray, Iterable<Double> aValues) {
+    return (DoubleArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static DoubleArray fillArray(DoubleArray aArray, double... aValues) {
+    return (DoubleArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static DoubleArrayFS fillArrayFS(DoubleArrayFS aArrayFs, Iterable<Double> aValues) {
     int i = 0;
-    for (Double fs : aCollection) {
+    for (Double fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static DoubleArrayFS fillArrayFS(DoubleArrayFS aArrayFs, double[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static DoubleArrayFS fillArrayFS(DoubleArrayFS aArrayFs, double... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static FloatArrayFS fillArrayFS(FloatArrayFS aArrayFs, Iterable<Float> aCollection) {
+  public static FloatArray fillArray(FloatArray aArray, Iterable<Float> aValues) {
+    return (FloatArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static FloatArray fillArray(FloatArray aArray, float... aValues) {
+    return (FloatArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static FloatArrayFS fillArrayFS(FloatArrayFS aArrayFs, Iterable<Float> aValues) {
     int i = 0;
-    for (Float fs : aCollection) {
+    for (Float fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static FloatArrayFS fillArrayFS(FloatArrayFS aArrayFs, float[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static FloatArrayFS fillArrayFS(FloatArrayFS aArrayFs, float... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static IntArrayFS fillArrayFS(IntArrayFS aArrayFs, Iterable<Integer> aCollection) {
+  public static IntegerArray fillArray(IntegerArray aArray, Iterable<Integer> aValues) {
+    return (IntegerArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static IntegerArray fillArray(IntegerArray aArray, int... aValues) {
+    return (IntegerArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static IntArrayFS fillArrayFS(IntArrayFS aArrayFs, Iterable<Integer> aValues) {
     int i = 0;
-    for (Integer fs : aCollection) {
+    for (Integer fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static IntArrayFS fillArrayFS(IntArrayFS aArrayFs, int[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static IntArrayFS fillArrayFS(IntArrayFS aArrayFs, int... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static LongArrayFS fillArrayFS(LongArrayFS aArrayFs, Iterable<Long> aCollection) {
+  public static LongArray fillArray(LongArray aArray, Iterable<Long> aValues) {
+    return (LongArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static LongArray fillArray(LongArray aArray, long... aValues) {
+    return (LongArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static LongArrayFS fillArrayFS(LongArrayFS aArrayFs, Iterable<Long> aValues) {
     int i = 0;
-    for (Long fs : aCollection) {
+    for (Long fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static LongArrayFS fillArrayFS(LongArrayFS aArrayFs, long[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static LongArrayFS fillArrayFS(LongArrayFS aArrayFs, long... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static ShortArrayFS fillArrayFS(ShortArrayFS aArrayFs, Iterable<Short> aCollection) {
+  public static ShortArray fillArray(ShortArray aArray, Iterable<Short> aValues) {
+    return (ShortArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static ShortArray fillArray(ShortArray aArray, short... aValues) {
+    return (ShortArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static ShortArrayFS fillArrayFS(ShortArrayFS aArrayFs, Iterable<Short> aValues) {
     int i = 0;
-    for (Short fs : aCollection) {
+    for (Short fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static ShortArrayFS fillArrayFS(ShortArrayFS aArrayFs, short[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static ShortArrayFS fillArrayFS(ShortArrayFS aArrayFs, short... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
-  public static StringArrayFS fillArrayFS(StringArrayFS aArrayFs, Iterable<String> aCollection) {
+  public static StringArray fillArray(StringArray aArray, Iterable<String> aValues) {
+    return (StringArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static StringArray fillArray(StringArray aArray, String... aValues) {
+    return (StringArray) fillArrayFS(aArray, aValues);
+  }
+
+  public static StringArrayFS fillArrayFS(StringArrayFS aArrayFs, Iterable<String> aValues) {
     int i = 0;
-    for (String fs : aCollection) {
+    for (String fs : aValues) {
       aArrayFs.set(i, fs);
       i++;
     }
     return aArrayFs;
   }
 
-  public static StringArrayFS fillArrayFS(StringArrayFS aArrayFs, String[] aArray) {
-    aArrayFs.copyFromArray(aArray, 0, 0, aArrayFs.size());
+  public static StringArrayFS fillArrayFS(StringArrayFS aArrayFs, String... aValues) {
+    aArrayFs.copyFromArray(aValues, 0, 0, aArrayFs.size());
     return aArrayFs;
   }
 
   // Using TOP here because FSList is only available in the JCas.
-  public static Collection<TOP> create(FSList aList) {
+  public static <T extends TOP> Collection<T> create(FSList<T> aList) {
     return create(aList, (Type) null);
   }
 
@@ -469,18 +547,17 @@
    *          the JCas wrapper class.
    * @return a new collection of all feature structures of the given type.
    */
-  @SuppressWarnings("unchecked")
-  public static <T extends TOP> Collection<T> create(FSList aList, Class<T> aType) {
-    return (Collection<T>) create(aList, CasUtil.getType(aList.getCAS(), aType));
+  public static <T extends TOP> Collection<T> create(FSList<T> aList, Class<? extends T> aType) {
+    return create(aList, CasUtil.getType(aList.getCAS(), aType));
   }
 
   // Using TOP here because FSList is only available in the JCas.
-  public static Collection<TOP> create(FSList aList, Type type) {
+  public static <T extends TOP> List<T> create(FSList<T> aList, Type type) {
     TypeSystem ts = aList.getCAS().getTypeSystem();
     List<FeatureStructure> data = new ArrayList<FeatureStructure>();
-    FSList i = aList;
+    FSList<T> i = aList;
     while (i instanceof NonEmptyFSList) {
-      NonEmptyFSList l = (NonEmptyFSList) i;
+      NonEmptyFSList<T> l = (NonEmptyFSList<T>) i;
       TOP value = l.getHead();
       if (value != null && (type == null || ts.subsumes(type, value.getType()))) {
         data.add(l.getHead());
@@ -488,10 +565,10 @@
       i = l.getTail();
     }
 
-    return asList(data.toArray(new TOP[data.size()]));
+    return (List<T>) asList(data.toArray(new TOP[data.size()]));
   }
 
-  public static Collection<String> create(StringList aList) {
+  public static List<String> create(StringList aList) {
     List<String> data = new ArrayList<String>();
     StringList i = aList;
     while (i instanceof NonEmptyStringList) {
@@ -503,7 +580,7 @@
     return asList(data.toArray(new String[data.size()]));
   }
 
-  public static Collection<Integer> create(IntegerList aList) {
+  public static List<Integer> create(IntegerList aList) {
     List<Integer> data = new ArrayList<Integer>();
     IntegerList i = aList;
     while (i instanceof NonEmptyIntegerList) {
@@ -515,7 +592,7 @@
     return asList(data.toArray(new Integer[data.size()]));
   }
 
-  public static Collection<Float> create(FloatList aList) {
+  public static List<Float> create(FloatList aList) {
     List<Float> data = new ArrayList<Float>();
     FloatList i = aList;
     while (i instanceof NonEmptyFloatList) {
@@ -527,26 +604,23 @@
     return asList(data.toArray(new Float[data.size()]));
   }
 
-  public static FSList createFSList(JCas aJCas, Collection<? extends TOP> aCollection) {
+  public static <T extends TOP> FSList<T> createFSList(JCas aJCas, Collection<T> aCollection) {
     return createFSList(aJCas.getCas(), aCollection);
   }
 
-  public static <T extends FeatureStructure> T createFSList(CAS aCas, FeatureStructure... aValues) {
+  public static <T extends TOP> FSList<T> createFSList(CAS aCas, T... aValues) {
     return createFSList(aCas, asList(aValues));
   }
   
-  public static <T extends FeatureStructure> T createFSList(CAS aCas,
-          Collection<? extends FeatureStructure> aValues) {
+  public static <T extends TOP> FSList<T> createFSList(CAS aCas, Collection<T> aValues) {
     if (aValues == null) {
       return null;
     }
     
     TypeSystem ts = aCas.getTypeSystem();
 
-    Type emptyType = ts.getType(CAS.TYPE_NAME_EMPTY_FS_LIST);
-
     if (aValues.size() == 0) {
-      return aCas.createFS(emptyType);
+      return aCas.emptyFSList();
     }
     
     Type nonEmptyType = ts.getType(CAS.TYPE_NAME_NON_EMPTY_FS_LIST);
@@ -563,11 +637,11 @@
         head.setFeatureValue(tailFeature, tail);
         head = tail;
       } else {
-        head.setFeatureValue(tailFeature, aCas.createFS(emptyType));
+        head.setFeatureValue(tailFeature, aCas.emptyFSList());
       }
     }
 
-    return (T) list;
+    return (FSList<T>) list;
   }
 
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/FSUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/FSUtil.java
index 5e6feee..180b5ca 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/FSUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/FSUtil.java
@@ -20,17 +20,17 @@
 
 import static java.util.Arrays.asList;
 import static org.apache.uima.fit.util.FSCollectionFactory.createArrayFS;
-import static org.apache.uima.fit.util.FSCollectionFactory.createBooleanArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createByteArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createDoubleArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createBooleanArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createByteArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createDoubleArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createFSList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFloatArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createFloatArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createFloatList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createIntArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createIntArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createIntegerList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createLongArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createShortArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createStringArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createLongArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createShortArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createStringArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createStringList;
 
 import java.lang.reflect.Array;
@@ -55,6 +55,7 @@
 import org.apache.uima.cas.StringArrayFS;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.TypeSystem;
+import org.apache.uima.jcas.cas.TOP;
 
 public class FSUtil {
   private static Feature getMandatoryFeature(FeatureStructure aFS, String aFeature)
@@ -118,7 +119,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else {
-      aFS.setFeatureValue(feat, createBooleanArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createBooleanArrayFS(aFS.getCAS(), aValue));
     }
   }
 
@@ -132,7 +133,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else {
-      aFS.setFeatureValue(feat, createByteArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createByteArrayFS(aFS.getCAS(), aValue));
     }
   }
 
@@ -146,7 +147,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else {
-      aFS.setFeatureValue(feat, createDoubleArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createDoubleArrayFS(aFS.getCAS(), aValue));
     }
   }
 
@@ -160,7 +161,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else if (feat.getRange().isArray()) {
-      aFS.setFeatureValue(feat, createFloatArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createFloatArrayFS(aFS.getCAS(), aValue));
     }
     else {
       aFS.setFeatureValue(feat, createFloatList(aFS.getCAS(), aValue));
@@ -177,7 +178,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else if (feat.getRange().isArray()) {
-      aFS.setFeatureValue(feat, createIntArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createIntArrayFS(aFS.getCAS(), aValue));
     }
     else {
       aFS.setFeatureValue(feat, createIntegerList(aFS.getCAS(), aValue));
@@ -194,7 +195,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else {
-      aFS.setFeatureValue(feat, createLongArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createLongArrayFS(aFS.getCAS(), aValue));
     }
   }
 
@@ -208,7 +209,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else {
-      aFS.setFeatureValue(feat, createShortArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createShortArrayFS(aFS.getCAS(), aValue));
     }
   }
 
@@ -222,7 +223,7 @@
       aFS.setFeatureValue(feat, null);
     }
     else if (feat.getRange().isArray()) {
-      aFS.setFeatureValue(feat, createStringArray(aFS.getCAS(), aValue));
+      aFS.setFeatureValue(feat, createStringArrayFS(aFS.getCAS(), aValue));
     }
     else {
       aFS.setFeatureValue(feat, createStringList(aFS.getCAS(), aValue));
@@ -238,7 +239,9 @@
       aFS.setFeatureValue(feat, null);
     }
     else if (isListType(aFS.getCAS().getTypeSystem(), feat.getRange())) {
-      aFS.setFeatureValue(feat, createFSList(aFS.getCAS(), aValue));
+      TOP[] values = new TOP[aValue.length];
+      System.arraycopy(aValue, 0, values, 0, aValue.length);
+      aFS.setFeatureValue(feat, createFSList(aFS.getCAS(), values));
     }
     else {
       requireSingleValue(feat, aValue);
@@ -255,28 +258,28 @@
     else if (feat.getRange().isArray()) {
       switch (feat.getRange().getName()) {
         case CAS.TYPE_NAME_BOOLEAN_ARRAY:
-          aFS.setFeatureValue(feat, createBooleanArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createBooleanArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_BYTE_ARRAY:
-          aFS.setFeatureValue(feat, createByteArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createByteArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_DOUBLE_ARRAY:
-          aFS.setFeatureValue(feat, createDoubleArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createDoubleArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_FLOAT_ARRAY:
-          aFS.setFeatureValue(feat, createFloatArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createFloatArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_INTEGER_ARRAY:
-          aFS.setFeatureValue(feat, createIntArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createIntArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_LONG_ARRAY:
-          aFS.setFeatureValue(feat, createLongArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createLongArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_SHORT_ARRAY:
-          aFS.setFeatureValue(feat, createShortArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createShortArrayFS(aFS.getCAS(), aValue));
           break;
         case CAS.TYPE_NAME_STRING_ARRAY:
-          aFS.setFeatureValue(feat, createStringArray(aFS.getCAS(), aValue));
+          aFS.setFeatureValue(feat, createStringArrayFS(aFS.getCAS(), aValue));
           break;
         default:
           aFS.setFeatureValue(feat, createArrayFS(aFS.getCAS(), aValue));
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/util/JCasUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/JCasUtil.java
index 97aae8d..7d8695a 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/JCasUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/JCasUtil.java
@@ -85,10 +85,11 @@
    *          a type.
    * @return a return value.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code jcas.select(type).iterator()}
    */
-  @SuppressWarnings({ "unchecked", "rawtypes" })
+  @Deprecated
   public static <T extends TOP> Iterator<T> iterator(JCas jCas, Class<T> type) {
-    return (Iterator) FSCollectionFactory.create(jCas.getCas(), getType(jCas, type)).iterator();
+    return jCas.select(type).iterator();
   }
 
   /**
@@ -154,7 +155,7 @@
    * @return A collection of the selected type.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static <T extends TOP> Collection<T> select(final FSArray array, final Class<T> type) {
+  public static <T extends TOP> List<T> select(final FSArray array, final Class<T> type) {
     return cast(CasUtil.selectFS(array, CasUtil.getType(array.getCAS(), type.getName())));
   }
 
@@ -170,7 +171,7 @@
    * @return A collection of the selected type.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static <T extends TOP> Collection<T> select(final FSList list, final Class<T> type) {
+  public static <T extends TOP> List<T> select(final FSList list, final Class<T> type) {
     return cast(FSCollectionFactory.create(list, CasUtil.getType(list.getCAS(), type.getName())));
   }
 
@@ -500,7 +501,7 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static <T extends Annotation, S extends Annotation> Map<T, Collection<S>> indexCovering(
+  public static <T extends Annotation, S extends Annotation> Map<T, List<S>> indexCovering(
           JCas jCas, Class<? extends T> type, Class<? extends S> coveringType) {
     return cast(CasUtil.indexCovering(jCas.getCas(), getType(jCas, type),
             getType(jCas, coveringType)));
@@ -533,13 +534,52 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static <T extends Annotation, S extends Annotation> Map<T, Collection<S>> indexCovered(
+  public static <T extends Annotation, S extends Annotation> Map<T, List<S>> indexCovered(
           JCas jCas, Class<? extends T> type, Class<? extends S> coveredType) {
     return cast(CasUtil
             .indexCovered(jCas.getCas(), getType(jCas, type), getType(jCas, coveredType)));
   }
 
   /**
+   * Get a list of annotations of the given annotation type overlapping the given annotation. Does 
+   * not use subiterators and does not respect type prioritites.
+   * 
+   * @param aJCas
+   *          a CAS.
+   * @param aType
+   *          a UIMA type.
+   * @param  aBoundaryAnnotation
+   *          the covering annotation.
+   * @return a list of overlapping annotations.
+   * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   */  
+  public static <T extends Annotation> List<T> selectOverlapping(JCas aJCas, Class<T> aType,
+          AnnotationFS aBoundaryAnnotation) {
+    return cast(
+            CasUtil.selectOverlapping(aJCas.getCas(), getType(aJCas, aType), aBoundaryAnnotation));
+  }  
+  
+  /**
+   * Get a list of annotations of the given annotation type overlapping the given span. Does not use
+   * subiterators and does not respect type prioritites.
+   * 
+   * @param aJCas
+   *          a CAS.
+   * @param aType
+   *          a UIMA type.
+   * @param aBegin
+   *          begin offset.
+   * @param aEnd
+   *          end offset.
+   * @return a list of overlapping annotations.
+   * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   */  
+  public static <T extends Annotation> List<T> selectOverlapping(JCas aJCas, Class<T> aType,
+          int aBegin, int aEnd) {    
+    return cast(CasUtil.selectOverlapping(aJCas.getCas(), getType(aJCas, aType), aBegin, aEnd));
+  }
+  
+  /**
    * Check if the given annotation contains any annotation of the given type.
    * 
    * @param jCas
@@ -595,7 +635,7 @@
    */
   @SuppressWarnings("unchecked")
   public static <T extends TOP> T selectSingle(JCas jCas, Class<T> type) {
-    return (T) CasUtil.selectSingle(jCas.getCas(), getType(jCas, type));
+    return (T) CasUtil.selectSingleFS(jCas.getCas(), getType(jCas, type));
   }
 
   /**
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java
index dc6f5f9..2adc920 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java
@@ -21,8 +21,9 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnce;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.ByteArrayInputStream;
@@ -60,7 +61,7 @@
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class,
             TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
+            createResourceDescription(TestExternalResource.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE)));
 
     AnalysisEngine ae = createEngine(aeDesc);
@@ -72,7 +73,7 @@
    */
   @Test
   public void resource_testSharedInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource.class, TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE);
 
@@ -104,12 +105,12 @@
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class,
             TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(
+            createResourceDescription(
                     TestExternalResource2.class,
                     TestExternalResource.PARAM_VALUE,
                     TestExternalResource.EXPECTED_VALUE,
                     TestExternalResource2.PARAM_RESOURCE,
-                    createExternalResourceDescription(TestExternalResource.class,
+                    createResourceDescription(TestExternalResource.class,
                             TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE))));
 
     AnalysisEngine ae = createEngine(aeDesc);
@@ -121,12 +122,12 @@
    */
   @Test
   public void resource_testSharedSimpleNesting() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource2.class,
             TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE,
             TestExternalResource2.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
+            createResourceDescription(TestExternalResource.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE));
 
     AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
@@ -156,18 +157,18 @@
    */
   @Test
   public void resource_testDeeperNesting() throws Exception {
-    ExternalResourceDescription resDesc2 = createExternalResourceDescription(
+    ExternalResourceDescription resDesc2 = createResourceDescription(
             TestExternalResource.class, TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE);
 
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource2.class, TestExternalResource2.PARAM_RESOURCE, resDesc2,
             TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE);
 
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class,
             TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource2.class,
+            createResourceDescription(TestExternalResource2.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE,
                     TestExternalResource2.PARAM_RESOURCE, resDesc)));
 
@@ -182,10 +183,10 @@
    */
   @Test
   public void resource_testSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource2.class, TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
+    bindResourceOnce(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
@@ -202,10 +203,10 @@
    */
   @Test
   public void resource_testDoubleSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource2.class, TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
+    bindResourceOnce(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
@@ -235,7 +236,7 @@
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
             TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE,
-            createExternalResourceDescription(TestSharedResourceObject.class, "http://dumm.my",
+            createSharedResourceDescription("http://dumm.my", TestSharedResourceObject.class,
                     TestSharedResourceObject.PARAM_VALUE, TestSharedResourceObject.EXPECTED_VALUE)));
 
     AnalysisEngine ae = createEngine(aeDesc);
@@ -247,8 +248,8 @@
    */
   @Test
   public void sharedObject_testSharedInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestSharedResourceObject.class, "http://dumm.my", TestSharedResourceObject.PARAM_VALUE,
+    ExternalResourceDescription resDesc = createSharedResourceDescription(
+            "http://dumm.my", TestSharedResourceObject.class, TestSharedResourceObject.PARAM_VALUE,
             TestSharedResourceObject.EXPECTED_VALUE);
 
     AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
@@ -279,14 +280,14 @@
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
             TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE,
-            createExternalResourceDescription(
-                    TestSharedResourceObject2.class,
+            createSharedResourceDescription(
                     "http://dumm.my",
+                    TestSharedResourceObject2.class,
                     TestSharedResourceObject2.PARAM_VALUE,
                     TestSharedResourceObject2.EXPECTED_VALUE,
                     TestSharedResourceObject2.PARAM_RESOURCE,
-                    createExternalResourceDescription(TestSharedResourceObject.class,
-                            "http://dumm.my", TestSharedResourceObject.PARAM_VALUE,
+                    createSharedResourceDescription("http://dumm.my",
+                            TestSharedResourceObject.class, TestSharedResourceObject.PARAM_VALUE,
                             TestSharedResourceObject.EXPECTED_VALUE))));
 
     AnalysisEngine ae = createEngine(aeDesc);
@@ -298,15 +299,15 @@
    */
   @Test
   public void sharedObject_testSimpleNestingViaBind() throws Exception {
-    ExternalResourceDescription res2 = createExternalResourceDescription(
-            TestSharedResourceObject.class, "http://dumm.my", 
+    ExternalResourceDescription res2 = createSharedResourceDescription(
+            "http://dumm.my", TestSharedResourceObject.class, 
             TestSharedResourceObject.PARAM_VALUE, TestSharedResourceObject.EXPECTED_VALUE);
 
-    ExternalResourceDescription res1 = createExternalResourceDescription(
-            TestSharedResourceObject2.class, "http://dumm.my",
+    ExternalResourceDescription res1 = createSharedResourceDescription(
+            "http://dumm.my", TestSharedResourceObject2.class,
             TestSharedResourceObject2.PARAM_VALUE, TestSharedResourceObject2.EXPECTED_VALUE);
 
-    bindExternalResource(res1, TestSharedResourceObject2.PARAM_RESOURCE, res2);
+    bindResourceOnce(res1, TestSharedResourceObject2.PARAM_RESOURCE, res2);
     
     AnalysisEngineDescription aeDesc =createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
@@ -323,10 +324,10 @@
    */
   @Test
   public void sharedObject_testSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestSharedResourceObject2.class, "http://dumm.my",
+    ExternalResourceDescription resDesc = createSharedResourceDescription(
+            "http://dumm.my", TestSharedResourceObject2.class,
             TestSharedResourceObject.PARAM_VALUE, TestSharedResourceObject.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestSharedResourceObject2.PARAM_RESOURCE, resDesc);
+    bindResourceOnce(resDesc, TestSharedResourceObject2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
index daf29bf..570fbc6 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
@@ -39,7 +39,7 @@
 package org.apache.uima.fit.factory;
 
 import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
@@ -62,7 +62,7 @@
     CollectionReader reader = createReader(
             TestReader.class,
             TestReader.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
+            createResourceDescription(TestExternalResource.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE));
 
     reader.hasNext();
@@ -74,16 +74,19 @@
     @ExternalResource(key = PARAM_RESOURCE)
     private TestExternalResource resource;
 
+    @Override
     public boolean hasNext() throws IOException, CollectionException {
       assertNotNull(resource);
       resource.assertConfiguredOk();
       return false;
     }
 
+    @Override
     public void getNext(CAS aCAS) throws IOException, CollectionException {
       // This is never called
     }
 
+    @Override
     public Progress[] getProgress() {
       return new Progress[0];
     }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
index fd38846..049a692 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
@@ -20,7 +20,7 @@
 package org.apache.uima.fit.factory;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDependencies;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -41,7 +41,7 @@
 public class ExternalResourceConfiguratorTest extends ComponentTestBase {
   @Test
   public void testAnalyze() throws Exception {
-    ExternalResourceDependency[] deps = createExternalResourceDependencies(ParameterizedAE2.class);
+    ExternalResourceDependency[] deps = createResourceDependencies(ParameterizedAE2.class);
 
     verify(deps);
   }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
index ad4843e..6bc7b2f 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
@@ -22,10 +22,13 @@
 import static java.util.Arrays.asList;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
 import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createDependencyAndBind;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnceWithoutNested;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createNamedResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
+import static org.apache.uima.fit.factory.JCasFactory.createJCas;
+import static org.apache.uima.fit.pipeline.SimplePipeline.runPipeline;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -59,6 +62,8 @@
 import org.apache.uima.fit.factory.locator.JndiResourceLocator;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
 import org.apache.uima.fit.pipeline.SimplePipeline;
+import org.apache.uima.fit.type.AnalyzedText;
+import org.apache.uima.fit.util.JCasUtil;
 import org.apache.uima.fit.util.SimpleNamedResourceManager;
 import org.apache.uima.jcas.JCas;
 import org.apache.uima.resource.DataResource;
@@ -78,7 +83,8 @@
  * 
  */
 public class ExternalResourceFactoryTest extends ComponentTestBase {
-  private static final String EX_URI = "http://dum.my";
+  // https://issues.apache.org/jira/browse/UIMA-5555
+  // private static final String EX_URI = "http://dum.my";
 
   private static final String EX_FILE_1 = "src/test/resources/data/docs/test.xcas";
 
@@ -133,7 +139,7 @@
   public void testAccessResourceFromAE() throws Exception {
     AnalysisEngine ae = createEngine(
             DummyAE3.class,
-            DummyAE3.RES_KEY_1, createExternalResourceDescription(
+            DummyAE3.RES_KEY_1, createNamedResourceDescription(
                     "lala", AnnotatedResource.class,
                     AnnotatedResource.PARAM_VALUE, "1"));
 
@@ -167,8 +173,8 @@
     bindResources(desc);
 
     // Bind external resources for DummyAE2 - necessary because autowiring is disabled
-    bindExternalResource(desc, DummyAE2.RES_INJECTED_POJO1, "pojoName1");
-    bindExternalResource(desc, DummyAE2.RES_INJECTED_POJO2, "pojoName2");
+    bindResourceOnceWithoutNested(desc, DummyAE2.RES_INJECTED_POJO1, "pojoName1");
+    bindResourceOnceWithoutNested(desc, DummyAE2.RES_INJECTED_POJO2, "pojoName2");
 
     // Create a custom resource manager that allows to inject any Java object as an external
     // dependency
@@ -213,7 +219,7 @@
 
   @Test
   public void testMultiBinding() throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc = createResourceDescription(ResourceWithAssert.class);
 
     // Binding external resource to each Annotator individually
     AnalysisEngineDescription aed1 = createEngineDescription(MultiBindAE.class,
@@ -235,10 +241,10 @@
   
   @Test
   public void testMultiBoundNested() throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(
+    ExternalResourceDescription extDesc = createResourceDescription(
             IntermediateResourceWithAssert.class,
             IntermediateResourceWithAssert.PARAM_NESTED_RESOURCE,
-            createExternalResourceDescription(ResourceWithAssert.class));
+            createResourceDescription(ResourceWithAssert.class));
 
     // Binding external resource to each Annotator individually
     AnalysisEngineDescription aed1 = createEngineDescription(MultiBindAE.class,
@@ -264,8 +270,8 @@
    */
   @Test
   public void testMultiValue() throws Exception {
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(MultiValuedResourceAE.class,
             MultiValuedResourceAE.RES_RESOURCE_ARRAY, asList(extDesc1, extDesc2));
@@ -282,8 +288,8 @@
   public void testMultiValue2() throws Exception {
     MultiValuedResourceAE.resources.clear();
     
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(
             createEngineDescription(MultiValuedResourceAE.class,
@@ -306,8 +312,8 @@
   public void testMultiValue3() throws Exception {
     MultiValuedResourceAE.resources.clear();
     
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(
             createEngineDescription(MultiValuedResourceAE.class,
@@ -328,17 +334,17 @@
    */
   @Test
   public void testMultiValue4() throws Exception {
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
     
-    ExternalResourceDescription extDesc3 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc4 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc3 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc4 = createResourceDescription(ResourceWithAssert.class);
 
-    ExternalResourceDescription mv1 = createExternalResourceDescription(MultiValuedResource.class,
+    ExternalResourceDescription mv1 = createResourceDescription(MultiValuedResource.class,
             MultiValuedResource.RES_RESOURCE_LIST, new ExternalResourceDescription[] { extDesc1,
                 extDesc2 });
 
-    ExternalResourceDescription mv2 = createExternalResourceDescription(MultiValuedResource.class,
+    ExternalResourceDescription mv2 = createResourceDescription(MultiValuedResource.class,
             MultiValuedResource.RES_RESOURCE_LIST, new ExternalResourceDescription[] { extDesc3,
                 extDesc4 });
 
@@ -349,7 +355,61 @@
     ae.process(ae.newJCas());
     ae.collectionProcessComplete();
   }
-  
+
+  @Test
+  public void testNestedAggregateBinding() throws Exception {
+    ExternalResourceDescription resourceDescription = createSharedResourceDescription("",
+            DummyResource.class);
+
+    AggregateBuilder builder = new AggregateBuilder();
+    builder.add(createEngineDescription(ResourceDependent.class));
+    AnalysisEngineDescription aggregateDescription = builder.createAggregateDescription();
+
+    bindResource(aggregateDescription, DummyResource.RESOURCE_KEY, resourceDescription);
+
+    JCas jCas = createJCas();
+    jCas.setDocumentText("Hello");
+
+    runPipeline(jCas, aggregateDescription);
+    int count = 0;
+    for (AnalyzedText annotation : JCasUtil.select(jCas, AnalyzedText.class)) {
+      assertEquals("World", annotation.getText());
+      count++;
+    }
+
+    assertEquals(1, count);
+  }
+
+  public static class DummyResource implements SharedResourceObject {
+
+    public static final String RESOURCE_KEY = "DummyResource";
+
+    public DummyResource() {
+    }
+
+    @Override
+    public void load(DataResource aData) throws ResourceInitializationException {
+      // Nothing to do
+    }
+
+    public String getText() {
+      return "World";
+    }
+  }
+
+  public static class ResourceDependent extends JCasAnnotator_ImplBase {
+
+      @ExternalResource(key = DummyResource.RESOURCE_KEY)
+      private DummyResource dummyResource;
+
+      @Override
+      public void process(JCas aJCas) throws AnalysisEngineProcessException {
+        // Just marking up that the AE was executed as expected, so that it can be verified.
+        AnalyzedText annotation = new AnalyzedText(aJCas, 0, aJCas.getDocumentText().length());
+        annotation.setText(dummyResource.getText());
+        annotation.addToIndexes();
+      }
+  }
   
   private static void bindResources(AnalysisEngineDescription desc) throws Exception {
     bindResource(desc, ResourceWithAssert.class);
@@ -359,9 +419,11 @@
             AnnotatedResource.PARAM_VALUE, "2");
     bindResource(desc, DummyAE.RES_KEY_3, AnnotatedParametrizedDataResource.class,
             AnnotatedParametrizedDataResource.PARAM_EXTENSION, ".lala");
-    bindResource(desc, DummySharedResourceObject.class, EX_URI,
-            DummySharedResourceObject.PARAM_VALUE, "3",
-            DummySharedResourceObject.PARAM_ARRAY_VALUE, new String[] {"1", "2", "3"});
+    // https://issues.apache.org/jira/browse/UIMA-5555
+    //    bindResource(desc, DummySharedResourceObject.class, EX_URI,
+    //            DummySharedResourceObject.PARAM_VALUE, "3",
+    //            DummySharedResourceObject.PARAM_ARRAY_VALUE, new String[] {"1", "2", "3"});
+    
     // An undefined URL may be used if the specified file/remote URL does not exist or if
     // the network is down.
     bindResource(desc, DummyAE.RES_SOME_URL, new File(EX_FILE_1).toURI().toURL());
@@ -369,9 +431,11 @@
     bindResource(desc, DummyAE.RES_SOME_FILE, new File(EX_FILE_1));
     bindResource(desc, DummyAE.RES_JNDI_OBJECT, JndiResourceLocator.class,
             JndiResourceLocator.PARAM_NAME, "dictionaries/german");
-    createDependencyAndBind(desc, "legacyResource", DummySharedResourceObject.class, EX_URI,
-            DummySharedResourceObject.PARAM_VALUE, "3",
-            DummySharedResourceObject.PARAM_ARRAY_VALUE, new String[] {"1", "2", "3"});
+
+    // https://issues.apache.org/jira/browse/UIMA-5555
+    //    createDependencyAndBind(desc, "legacyResource", DummySharedResourceObject.class, EX_URI,
+    //            DummySharedResourceObject.PARAM_VALUE, "3",
+    //            DummySharedResourceObject.PARAM_ARRAY_VALUE, new String[] {"1", "2", "3"});
   }
 
   public static class DummyAE extends JCasAnnotator_ImplBase {
@@ -390,8 +454,9 @@
 
     static final String RES_KEY_3 = "Key3";
 
-    @ExternalResource
-    DummySharedResourceObject sharedObject;
+    // https://issues.apache.org/jira/browse/UIMA-5555
+    //    @ExternalResource
+    //    DummySharedResourceObject sharedObject;
 
     static final String RES_SOME_URL = "SomeUrl";
 
@@ -432,12 +497,13 @@
         throw new AnalysisEngineProcessException(e);
       }
 
-      assertNotNull(sharedObject);
-      assertEquals("3", sharedObject.getValue());
-      assertEquals(asList("1", "2", "3"), asList(sharedObject.getArrayValue()));
-
-      assertNotNull(sharedObject);
-      assertEquals(EX_URI, sharedObject.getUrl().toString());
+      // https://issues.apache.org/jira/browse/UIMA-5555
+      //      assertNotNull(sharedObject);
+      //      assertEquals("3", sharedObject.getValue());
+      //      assertEquals(asList("1", "2", "3"), asList(sharedObject.getArrayValue()));
+      //
+      //      assertNotNull(sharedObject);
+      //      assertEquals(EX_URI, sharedObject.getUrl().toString());
 
       assertNotNull(jndiPropertes);
       assertEquals("proper noun", jndiPropertes.get("Hans"));
@@ -452,11 +518,12 @@
       assertTrue("URL [" + someFile.getUrl() + "] should end in [" + EX_FILE_1 + "]", someFile
               .getUrl().toString().endsWith(EX_FILE_1));
 
-      try {
-        assertNotNull(getContext().getResourceObject("legacyResource"));
-      } catch (ResourceAccessException e) {
-        throw new AnalysisEngineProcessException(e);
-      }
+      // https://issues.apache.org/jira/browse/UIMA-5555
+      //      try {
+      //        assertNotNull(getContext().getResourceObject("legacyResource"));
+      //      } catch (ResourceAccessException e) {
+      //        throw new AnalysisEngineProcessException(e);
+      //      }
     }
   }
 
@@ -619,14 +686,17 @@
     @ConfigurationParameter(name = PARAM_EXTENSION, mandatory = true)
     private String extension;
 
+    @Override
     public InputStream getInputStream() throws IOException {
       return null;
     }
 
+    @Override
     public URI getUri() {
       return URI.create(uri + extension);
     }
 
+    @Override
     public URL getUrl() {
       return null;
     }
@@ -639,11 +709,12 @@
     @ConfigurationParameter(name = PARAM_EXTENSION, mandatory = true)
     private String extension;
 
+    @Override
     public DataResource getDataResource(String[] aParams) throws ResourceInitializationException {
       List<String> params = new ArrayList<String>(Arrays.asList(aParams));
       params.add(AnnotatedDataResource.PARAM_EXTENSION);
       params.add(extension);
-      ExternalResourceDescription desc = ExternalResourceFactory.createExternalResourceDescription(
+      ExternalResourceDescription desc = ExternalResourceFactory.createNamedResourceDescription(
               null, AnnotatedDataResource.class, params.toArray(new String[params.size()]));
       return (DataResource) UIMAFramework.produceResource(desc.getResourceSpecifier(), null);
     }
@@ -658,17 +729,21 @@
     @ConfigurationParameter(name = PARAM_ARRAY_VALUE, mandatory = true)
     private String[] arrayValue;
 
-    private URI uri;
+    // https://issues.apache.org/jira/browse/UIMA-5555
+    //    private URI uri;
 
+    @Override
     public void load(DataResource aData) throws ResourceInitializationException {
       ConfigurationParameterInitializer.initialize(this, aData);
-      assertEquals(EX_URI, aData.getUri().toString());
-      uri = aData.getUri();
+      // https://issues.apache.org/jira/browse/UIMA-5555
+      //      assertEquals(EX_URI, aData.getUri().toString());
+      //      uri = aData.getUri();
     }
 
-    public URI getUrl() {
-      return uri;
-    }
+    // https://issues.apache.org/jira/browse/UIMA-5555
+    //    public URI getUrl() {
+    //      return uri;
+    //    }
 
     public String getValue() {
       return value;
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java
index 0692d6a..81a1eb8 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java
@@ -38,7 +38,7 @@
 
 package org.apache.uima.fit.factory;
 
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.apache.uima.fit.factory.FlowControllerFactory.createFlowControllerDescription;
 import static org.junit.Assert.assertNotNull;
 
@@ -65,7 +65,7 @@
     builder.setFlowControllerDescription(createFlowControllerDescription(
             TestFlowController.class,
             TestFlowController.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
+            createResourceDescription(TestExternalResource.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE)));
     AnalysisEngine aggregateEngine = builder.createAggregate();
     aggregateEngine.process(aggregateEngine.newCAS());
@@ -86,6 +86,7 @@
   }
 
   public static class TestFlowObject extends CasFlow_ImplBase {
+    @Override
     public Step next() throws AnalysisEngineProcessException {
       return new FinalStep();
     }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/LoggingTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/LoggingTest.java
deleted file mode 100644
index 31f0e6f..0000000
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/LoggingTest.java
+++ /dev/null
@@ -1,375 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Filter;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.LogRecord;
-
-import org.apache.log4j.Appender;
-import org.apache.log4j.BasicConfigurator;
-import org.apache.log4j.Logger;
-import org.apache.log4j.spi.LocationInfo;
-import org.apache.log4j.spi.LoggingEvent;
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.UimaContextAdmin;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.AbstractCas;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.fit.component.CasAnnotator_ImplBase;
-import org.apache.uima.fit.component.CasCollectionReader_ImplBase;
-import org.apache.uima.fit.component.CasConsumer_ImplBase;
-import org.apache.uima.fit.component.CasFlowController_ImplBase;
-import org.apache.uima.fit.component.CasMultiplier_ImplBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.JCasCollectionReader_ImplBase;
-import org.apache.uima.fit.component.JCasConsumer_ImplBase;
-import org.apache.uima.fit.component.JCasFlowController_ImplBase;
-import org.apache.uima.fit.component.JCasMultiplier_ImplBase;
-import org.apache.uima.fit.component.Resource_ImplBase;
-import org.apache.uima.fit.internal.ExtendedLogger;
-import org.apache.uima.flow.Flow;
-import org.apache.uima.impl.RootUimaContext_impl;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.ResourceSpecifier;
-import org.apache.uima.util.Progress;
-import org.apache.uima.util.impl.JSR47Logger_impl;
-import org.apache.uima.util.impl.Log4jLogger_impl;
-import org.junit.Test;
-
-public class LoggingTest {
-  @Test
-  public void testJSR47Logger() throws Exception {
-    final List<LogRecord> records = new ArrayList<LogRecord>();
-
-    // Tell the logger to log everything
-    ConsoleHandler handler = (ConsoleHandler) LogManager.getLogManager().getLogger("")
-            .getHandlers()[0];
-    java.util.logging.Level oldLevel = handler.getLevel();
-    handler.setLevel(Level.ALL);
-    // Capture the logging output without actually logging it
-    handler.setFilter(new Filter() {
-      public boolean isLoggable(LogRecord record) {
-        records.add(record);
-        System.out.printf("[%s] %s%n", record.getSourceClassName(), record.getMessage());
-        return false;
-      }
-    });
-
-    UIMAFramework.getLogger().setLevel(org.apache.uima.util.Level.INFO);
-
-    try {
-      UimaContextAdmin ctx = new RootUimaContext_impl();
-      ctx.setLogger(JSR47Logger_impl.getInstance());
-      ExtendedLogger logger = new ExtendedLogger(ctx);
-           
-      logger.setLevel(org.apache.uima.util.Level.ALL);
-      trigger(logger);
-      logger.setLevel(org.apache.uima.util.Level.OFF);
-      trigger(logger);
-
-      assertEquals(10, records.size());
-      assertEquals(Level.FINER, records.get(0).getLevel());
-      assertEquals(Level.FINER, records.get(1).getLevel());
-      assertEquals(Level.FINE, records.get(2).getLevel());
-      assertEquals(Level.FINE, records.get(3).getLevel());
-      assertEquals(Level.INFO, records.get(4).getLevel());
-      assertEquals(Level.INFO, records.get(5).getLevel());
-      assertEquals(Level.WARNING, records.get(6).getLevel());
-      assertEquals(Level.WARNING, records.get(7).getLevel());
-      assertEquals(Level.SEVERE, records.get(8).getLevel());
-      assertEquals(Level.SEVERE, records.get(9).getLevel());
-    } finally {
-      if (oldLevel != null) {
-        handler.setLevel(oldLevel);
-        handler.setFilter(null);
-      }
-    }
-  }
-
-  @Test
-  public void testLog4JLogger() {
-    final List<LoggingEvent> records = new ArrayList<LoggingEvent>();
-
-    BasicConfigurator.configure();
-
-    // Tell the logger to log everything
-    Logger rootLogger = org.apache.log4j.LogManager.getRootLogger();
-    org.apache.log4j.Level oldLevel = rootLogger.getLevel();
-    rootLogger.setLevel(org.apache.log4j.Level.ALL);
-    Appender appender = (Appender) rootLogger.getAllAppenders().nextElement();
-    // Capture the logging output without actually logging it
-    appender.addFilter(new org.apache.log4j.spi.Filter() {
-      @Override
-      public int decide(LoggingEvent event) {
-        records.add(event);
-        LocationInfo l = event.getLocationInformation();
-        System.out.printf("[%s:%s] %s%n", l.getFileName(), l.getLineNumber(), event.getMessage());
-        return org.apache.log4j.spi.Filter.DENY;
-      }
-    });
-
-    try {
-      UimaContextAdmin ctx = new RootUimaContext_impl();
-      ctx.setLogger(Log4jLogger_impl.getInstance());
-      ExtendedLogger logger = new ExtendedLogger(ctx);
-
-      logger.setLevel(org.apache.uima.util.Level.ALL);
-      trigger(logger);
-      logger.setLevel(org.apache.uima.util.Level.OFF);
-      trigger(logger);
-
-      assertEquals(10, records.size());
-      assertEquals(org.apache.log4j.Level.ALL, records.get(0).getLevel());
-      assertEquals(org.apache.log4j.Level.ALL, records.get(1).getLevel());
-      assertEquals(org.apache.log4j.Level.DEBUG, records.get(2).getLevel());
-      assertEquals(org.apache.log4j.Level.DEBUG, records.get(3).getLevel());
-      assertEquals(org.apache.log4j.Level.INFO, records.get(4).getLevel());
-      assertEquals(org.apache.log4j.Level.INFO, records.get(5).getLevel());
-      assertEquals(org.apache.log4j.Level.WARN, records.get(6).getLevel());
-      assertEquals(org.apache.log4j.Level.WARN, records.get(7).getLevel());
-      assertEquals(org.apache.log4j.Level.ERROR, records.get(8).getLevel());
-      assertEquals(org.apache.log4j.Level.ERROR, records.get(9).getLevel());
-    } finally {
-      if (oldLevel != null) {
-        rootLogger.setLevel(oldLevel);
-        appender.clearFilters();
-      }
-    }
-  }
-
-  private void trigger(ExtendedLogger aLogger) {
-    if (aLogger.isTraceEnabled()) {
-      aLogger.trace("Logging: " + getClass().getName());
-      aLogger.trace("Logging: " + getClass().getName(), new IllegalArgumentException());
-    }
-    if (aLogger.isDebugEnabled()) {
-      aLogger.debug("Logging: " + getClass().getName());
-      aLogger.debug("Logging: " + getClass().getName(), new IllegalArgumentException());
-    }
-    if (aLogger.isInfoEnabled()) {
-      aLogger.info("Logging: " + getClass().getName());
-      aLogger.info("Logging: " + getClass().getName(), new IllegalArgumentException());
-    }
-    if (aLogger.isWarnEnabled()) {
-      aLogger.warn("Logging: " + getClass().getName());
-      aLogger.warn("Logging: " + getClass().getName(), new IllegalArgumentException());
-    }
-    if (aLogger.isErrorEnabled()) {
-      aLogger.error("Logging: " + getClass().getName());
-      aLogger.error("Logging: " + getClass().getName(), new IllegalArgumentException());
-    }
-  }
-
-  @Test
-  public void testAllKindsOfComponents() throws Exception {
-    System.out.println("=== testAllKindsOfComponents ===");
-    final List<LogRecord> records = new ArrayList<LogRecord>();
-
-    // Tell the logger to log everything
-    ConsoleHandler handler = (ConsoleHandler) LogManager.getLogManager().getLogger("")
-            .getHandlers()[0];
-    java.util.logging.Level oldLevel = handler.getLevel();
-    handler.setLevel(Level.ALL);
-    // Capture the logging output without actually logging it
-    handler.setFilter(new Filter() {
-      public boolean isLoggable(LogRecord record) {
-        records.add(record);
-        System.out.printf("[%s] %s%n", record.getSourceClassName(), record.getMessage());
-        return false;
-      }
-    });
-    
-    UIMAFramework.getLogger().setLevel(org.apache.uima.util.Level.INFO);
-
-    try {
-      JCas jcas = JCasFactory.createJCas();
-
-      createReader(LoggingCasCollectionReader.class).hasNext();
-      assertLogDone(records);
-
-      createReader(LoggingJCasCollectionReader.class).hasNext();
-      assertLogDone(records);
-
-      // createFlowControllerDescription(LoggingJCasFlowController.class).
-      // assertLogDone(records);
-
-      createEngine(LoggingCasAnnotator.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasAnnotator.class).process(jcas);
-      assertLogDone(records);
-
-      createEngine(LoggingCasConsumer.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasConsumer.class).process(jcas);
-      assertLogDone(records);
-
-      createEngine(LoggingCasMultiplier.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasMultiplier.class).process(jcas);
-      assertLogDone(records);
-    } finally {
-      if (oldLevel != null) {
-        handler.setLevel(oldLevel);
-        handler.setFilter(null);
-      }
-    }
-  }
-
-  private void assertLogDone(List<LogRecord> records) {
-    assertEquals(1, records.size());
-    assertEquals(Level.INFO, records.get(0).getLevel());
-    records.clear();
-  }
-
-  public static class LoggingCasMultiplier extends CasMultiplier_ImplBase {
-
-    public boolean hasNext() throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public AbstractCas next() throws AnalysisEngineProcessException {
-      // Never called
-      return null;
-    }
-
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      // Never called
-    }
-  }
-
-  public static class LoggingJCasMultiplier extends JCasMultiplier_ImplBase {
-    public boolean hasNext() throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public AbstractCas next() throws AnalysisEngineProcessException {
-      // Never called
-      return null;
-    }
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      // Never called
-    }
-  }
-
-  public static class LoggingJCasCollectionReader extends JCasCollectionReader_ImplBase {
-    public boolean hasNext() throws IOException, CollectionException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-
-    @Override
-    public void getNext(JCas jCas) throws IOException, CollectionException {
-      // Never called
-    }
-  }
-
-  public static class LoggingResource extends Resource_ImplBase {
-    @Override
-    public boolean initialize(ResourceSpecifier aSpecifier, Map<String, Object> aAdditionalParams)
-            throws ResourceInitializationException {
-      boolean ret = super.initialize(aSpecifier, aAdditionalParams);
-      getLogger().info("Logging: " + getClass().getName());
-      return ret;
-    }
-  }
-
-  public static class LoggingCasCollectionReader extends CasCollectionReader_ImplBase {
-    public void getNext(CAS aCAS) throws IOException, CollectionException {
-      // Never called
-    }
-
-    public boolean hasNext() throws IOException, CollectionException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-  }
-
-  public static class LoggingCasAnnotator extends CasAnnotator_ImplBase {
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingCasConsumer extends CasConsumer_ImplBase {
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingJCasAnnotator extends JCasAnnotator_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingJCasConsumer extends JCasConsumer_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingCasFlowController extends CasFlowController_ImplBase {
-    @Override
-    public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return null;
-    }
-  }
-
-  public static class LoggingJCasFlowController extends JCasFlowController_ImplBase {
-    @Override
-    public Flow computeFlow(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return null;
-    }
-  }
-}
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java
index 97e0eaf..8d2978a 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java
@@ -22,8 +22,8 @@
 import static org.apache.uima.fit.factory.TypePrioritiesFactory.createTypePriorities;
 import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
 
+import org.apache.uima.cas.CAS;
 import org.apache.uima.fit.type.Sentence;
 import org.apache.uima.fit.type.Token;
 import org.apache.uima.jcas.tcas.Annotation;
@@ -34,27 +34,39 @@
 
 /**
  * Tests for the {@link TypePrioritiesFactory}.
- * 
  */
 public class TypePrioritiesFactoryTest {
 
   @Test
-  public void testCreateTypePrioritiesClassOfQArray() throws Exception {
+  public void testCreateTypePrioritiesFromTypeNames() throws Exception {
+    TypePriorities prio = createTypePriorities(CAS.TYPE_NAME_ANNOTATION);
+
+    CasCreationUtils.createCas(createTypeSystemDescription(), prio, null);
+
+    assertThat(prio.getPriorityLists()).hasSize(1);
+    assertThat(prio.getPriorityLists()[0].getTypes()).containsExactly(CAS.TYPE_NAME_ANNOTATION);
+  }
+  
+  @Test
+  public void testCreateTypePrioritiesFromClasses() throws Exception {
     TypePriorities prio = createTypePriorities(Annotation.class);
 
     CasCreationUtils.createCas(createTypeSystemDescription(), prio, null);
 
-    assertEquals(1, prio.getPriorityLists().length);
-    assertEquals(1, prio.getPriorityLists()[0].getTypes().length);
-    assertEquals("uima.tcas.Annotation", prio.getPriorityLists()[0].getTypes()[0]);
+    assertThat(prio.getPriorityLists()).hasSize(1);
+    assertThat(prio.getPriorityLists()[0].getTypes()).containsExactly(CAS.TYPE_NAME_ANNOTATION);
   }
   
-
+  @Test(expected = IllegalArgumentException.class)
+  public void testCreateTypePrioritiesFromBadClasses() throws Exception {
+    TypePriorities prio = createTypePriorities((Class) Integer.class);
+  }
+  
   @Test
   public void testAutoDetectTypePriorities() throws Exception {
-    TypePriorities typePriorities = createTypePriorities();
+    TypePriorities prio = createTypePriorities();
 
-    TypePriorityList[] typePrioritiesLists = typePriorities.getPriorityLists();
+    TypePriorityList[] typePrioritiesLists = prio.getPriorityLists();
     assertThat(typePrioritiesLists.length).isEqualTo(1);
     assertThat(typePrioritiesLists[0].getTypes())
         .as("Type priorities auto-detection")
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/JCasIterableTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/JCasIterableTest.java
index c45f1fa..f557f5f 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/JCasIterableTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/JCasIterableTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.uima.fit.pipeline;
 
-import static org.apache.uima.UIMAFramework.newDefaultResourceManager;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
 import static org.apache.uima.fit.factory.CollectionReaderFactory.createReaderDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.apache.uima.fit.internal.ResourceManagerFactory.getResourceManagerCreator;
+import static org.apache.uima.fit.internal.ResourceManagerFactory.newResourceManager;
 import static org.apache.uima.fit.internal.ResourceManagerFactory.setResourceManagerCreator;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -90,7 +90,7 @@
 
   @Test
   public void thatResourceCanBeShared() throws Exception {
-    ExternalResourceDescription res = createExternalResourceDescription(DummySharedResource.class);
+    ExternalResourceDescription res = createResourceDescription(DummySharedResource.class);
     
     consume(new JCasIterable(
             createReaderDescription(ThreeDocsReader.class, "resource", res),
@@ -103,7 +103,7 @@
   
   @Test 
   public void thatSharedResourceManagerIsNotDestroyed() throws Exception {
-    ResourceManager resMgr = spy(newDefaultResourceManager());
+    ResourceManager resMgr = spy(newResourceManager());
     
     consume(new JCasIterable(resMgr,
             createReaderDescription(ThreeDocsReader.class),
@@ -120,7 +120,7 @@
    */
   @Test 
   public void thatInternallyCreatedResourceManagerIsDestroyed() throws Exception {
-    ResourceManager resMgr = spy(newDefaultResourceManager());
+    ResourceManager resMgr = spy(newResourceManager());
     setResourceManagerCreator(() -> resMgr); 
     
     consume(new JCasIterable(
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/SimplePipelineTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/SimplePipelineTest.java
index 36dcdcc..c002a47 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/SimplePipelineTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/pipeline/SimplePipelineTest.java
@@ -22,7 +22,7 @@
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
 import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
 import static org.apache.uima.fit.factory.CollectionReaderFactory.createReaderDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -70,10 +70,12 @@
       initTypeSystemCalled = true;
     }
     
+    @Override
     public Progress[] getProgress() {
       return null;
     }
 
+    @Override
     public boolean hasNext() throws IOException, CollectionException {
       assertTrue("typeSystemInit() has not been called", initTypeSystemCalled);
       return this.current < this.size;
@@ -143,7 +145,7 @@
     Reader.resource = null;
     Annotator.resource = null;
     
-    ExternalResourceDescription res = createExternalResourceDescription(DummySharedResource.class);
+    ExternalResourceDescription res = createResourceDescription(DummySharedResource.class);
     SimplePipeline.runPipeline(createReaderDescription(Reader.class, "resource", res),
             createEngineDescription(Annotator.class, "resource", res));
     
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/AnnotationPredicatesTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/AnnotationPredicatesTest.java
new file mode 100644
index 0000000..a5bdfb0
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/AnnotationPredicatesTest.java
@@ -0,0 +1,382 @@
+/*
+ * 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.uima.fit.util;
+
+import static java.lang.Integer.MAX_VALUE;
+import static java.util.Arrays.asList;
+import static org.apache.uima.fit.util.AnnotationPredicates.colocated;
+import static org.apache.uima.fit.util.AnnotationPredicates.coveredBy;
+import static org.apache.uima.fit.util.AnnotationPredicates.covers;
+import static org.apache.uima.fit.util.AnnotationPredicates.leftOf;
+import static org.apache.uima.fit.util.AnnotationPredicates.overlaps;
+import static org.apache.uima.fit.util.AnnotationPredicates.overlapsLeft;
+import static org.apache.uima.fit.util.AnnotationPredicates.overlapsRight;
+import static org.apache.uima.fit.util.AnnotationPredicates.rightOf;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.COLOCATED;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.COVERED_BY;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.COVERING;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.LEFT_OF;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.OVERLAPPING;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.OVERLAPPING_LEFT;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.OVERLAPPING_RIGHT;
+import static org.apache.uima.fit.util.AnnotationPredicatesTest.RelativePosition.RIGHT_OF;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.Type;
+import org.apache.uima.fit.factory.CasFactory;
+import org.assertj.core.api.AutoCloseableSoftAssertions;
+import org.junit.Test;
+
+public class AnnotationPredicatesTest {
+    
+    static enum RelativePosition {
+      COLOCATED,
+      OVERLAPPING,
+      OVERLAPPING_LEFT,
+      OVERLAPPING_RIGHT,
+      COVERING,
+      COVERED_BY,
+      LEFT_OF,
+      RIGHT_OF
+}
+  
+    @Test
+    public void thatCoveringWithIntervalsWorks() throws Exception {
+      assertPosition(COVERING, AnnotationPredicates::covers);
+    }
+
+    @Test
+    public void thatCoveringWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COVERING, (beginA, endA, beginB,
+              endB) -> covers(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatCoveringWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COVERING,
+              (beginA, endA, beginB, endB) -> covers(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+    
+    @Test
+    public void thatCoveredByWithIntervalsWorks() throws Exception {
+      assertPosition(COVERED_BY, AnnotationPredicates::coveredBy);
+    }
+
+    @Test
+    public void thatCoveredByWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COVERED_BY, (beginA, endA, beginB,
+              endB) -> coveredBy(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatCoveredByWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COVERED_BY,
+              (beginA, endA, beginB, endB) -> coveredBy(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+
+    @Test
+    public void thatColocatedWithIntervalsWorks() throws Exception {
+      assertPosition(COLOCATED, AnnotationPredicates::colocated);
+      
+      // It must also work if we switch the of the spans
+      assertPosition(COLOCATED,
+              (beginA, endA, beginB, endB) -> colocated(beginB, endB, beginA, endA));
+    }
+
+    @Test
+    public void thatColocatedWithAnnotationAndIntervalWorks() throws Exception
+    {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COLOCATED, (beginA, endA, beginB,
+              endB) -> colocated(cas.createAnnotation(type, beginA, endA), beginB, endB));
+      
+      // It must also work if we switch the of the spans
+      assertPosition(COLOCATED, (beginA, endA, beginB,
+              endB) -> colocated(cas.createAnnotation(type, beginB, endB), beginA, endA));
+    }
+
+    @Test
+    public void thatColocatedWithAnnotationsWorks() throws Exception
+    {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(COLOCATED,
+              (beginA, endA, beginB, endB) -> colocated(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+      
+      // It must also work if we switch the of the spans
+      assertPosition(COLOCATED,
+              (beginA, endA, beginB, endB) -> colocated(cas.createAnnotation(type, beginB, endB),
+                      cas.createAnnotation(type, beginA, endA)));
+    }
+    
+    @Test
+    public void thatOverlapsLeftWithIntervalsWorks() throws Exception {
+      assertPosition(OVERLAPPING_LEFT, AnnotationPredicates::overlapsLeft);
+    }
+
+    @Test
+    public void thatOverlapsLeftWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING_LEFT, (beginA, endA, beginB,
+              endB) -> overlapsLeft(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatOverlapsLeftWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING_LEFT,
+              (beginA, endA, beginB, endB) -> overlapsLeft(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+
+    @Test
+    public void thatOverlapsRightWithIntervalsWorks() throws Exception {
+      assertPosition(OVERLAPPING_RIGHT, AnnotationPredicates::overlapsRight);
+    }
+
+    @Test
+    public void thatOverlapsRightWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING_RIGHT, (beginA, endA, beginB,
+              endB) -> overlapsRight(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatOverlapsRightWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING_RIGHT,
+              (beginA, endA, beginB, endB) -> overlapsRight(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+    
+    @Test
+    public void thatOverlapsWithIntervalsWorks() throws Exception {
+      assertPosition(OVERLAPPING, AnnotationPredicates::overlaps);
+
+      // It must also work if we switch the of the spans
+      assertPosition(OVERLAPPING,
+              (beginA, endA, beginB, endB) -> overlaps(beginB, endB, beginA, endA));
+    }
+
+    @Test
+    public void thatOverlapsWithAnnotationAndIntervalWorks() throws Exception
+    {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING, (beginA, endA, beginB,
+              endB) -> overlaps(cas.createAnnotation(type, beginA, endA), beginB, endB));
+      
+      // It must also work if we switch the of the spans
+      assertPosition(OVERLAPPING, (beginA, endA, beginB,
+              endB) -> overlaps(cas.createAnnotation(type, beginB, endB), beginA, endA));
+    }
+
+    @Test
+    public void thatOverlapsWithAnnotationsWorks() throws Exception
+    {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(OVERLAPPING,
+              (beginA, endA, beginB, endB) -> overlaps(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+      
+      // It must also work if we switch the of the spans
+      assertPosition(OVERLAPPING,
+              (beginA, endA, beginB, endB) -> overlaps(cas.createAnnotation(type, beginB, endB),
+                      cas.createAnnotation(type, beginA, endA)));
+    }
+    
+    @Test
+    public void thatLeftOfWithIntervalsWorks() throws Exception {
+      assertPosition(LEFT_OF, AnnotationPredicates::leftOf);
+    }
+
+    @Test
+    public void thatLeftOfWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(LEFT_OF, (beginA, endA, beginB,
+              endB) -> leftOf(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatLeftOfWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+      
+      assertPosition(LEFT_OF,
+              (beginA, endA, beginB, endB) -> leftOf(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+
+    @Test
+    public void thatRightOfWithIntervalsWorks() throws Exception {
+      assertPosition(RIGHT_OF, AnnotationPredicates::rightOf);
+    }
+
+    @Test
+    public void thatRightOfWithAnnotationAndIntervalWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+
+      assertPosition(RIGHT_OF, (beginA, endA, beginB,
+              endB) -> rightOf(cas.createAnnotation(type, beginA, endA), beginB, endB));
+    }
+
+    @Test
+    public void thatRightOfWithAnnotationsWorks() throws Exception {
+      CAS cas = CasFactory.createCas();
+      Type type = cas.getAnnotationType();
+
+      assertPosition(RIGHT_OF,
+              (beginA, endA, beginB, endB) -> rightOf(cas.createAnnotation(type, beginA, endA),
+                      cas.createAnnotation(type, beginB, endB)));
+    }
+
+    @FunctionalInterface
+    private static interface RelativePositionPredicate {
+      boolean apply(int beginA, int endA, int beginB, int endB);
+    }
+
+    public void assertPosition(RelativePosition aCondition, RelativePositionPredicate aPredicate)
+            throws Exception {
+        // Define a fixed interval around which we build most of the tests by applying different
+        // selections to it
+        int begin = 10;
+        int end = 20;
+
+        try (AutoCloseableSoftAssertions softly = new AutoCloseableSoftAssertions()) {
+          softly.assertThat(aPredicate.apply(begin, end, begin - 1, begin - 1))
+              .as("Zero-width B before A begins (| ###)")
+              .isEqualTo(asList(RIGHT_OF).contains(aCondition));
+        
+          softly.assertThat(aPredicate.apply(begin, end, 0, begin - 1))
+              .as("B begins and ends before A begins ([---] ###)")
+              .isEqualTo(asList(RIGHT_OF).contains(aCondition));
+        
+          softly.assertThat(aPredicate.apply(begin, end, 0, begin))
+              .as("B begins before and ends where A begins ([---]###)")
+              .isEqualTo(asList(RIGHT_OF).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, begin, begin))
+              .as("Zero-width B where A begins (|###)")
+              .isEqualTo(asList(OVERLAPPING, COVERING).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, 0, begin + 1))
+              .as("B begins before and ends within A ([--#]##)")
+              .isEqualTo(asList(OVERLAPPING, OVERLAPPING_RIGHT).contains(aCondition));
+        
+          softly.assertThat(aPredicate.apply(begin, end, begin + 1, end - 1))
+              .as("B begins and ends within A (#[#]#)")
+              .isEqualTo(asList(OVERLAPPING, COVERING).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, begin + 1, end))
+              .as("B begins after and ends at A's boundries (#[##])")
+              .isEqualTo(asList(OVERLAPPING, COVERING).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, begin - 1, end + 1))
+              .as("B begins and ends at A's boundries ([-###-])")
+              .isEqualTo(asList(OVERLAPPING, COVERED_BY).contains(aCondition));
+          
+          softly.assertThat(aPredicate.apply(begin, end, begin, end))
+              .as("B begins and ends at A's boundries ([###])")
+              .isEqualTo(asList(OVERLAPPING, COLOCATED, COVERED_BY, COVERING).contains(aCondition));
+        
+          softly.assertThat(aPredicate.apply(begin, end, begin + 1, begin + 1))
+              .as("Zero-width B within A (#|#)")
+              .isEqualTo(asList(OVERLAPPING, COVERING).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, begin, end - 1))
+              .as("B begins at and ends before A's boundries ([##]#)")
+              .isEqualTo(asList(OVERLAPPING, COVERING).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, end - 1 , MAX_VALUE))
+              .as("B begins before and ends within A (##[#--])")
+              .isEqualTo(asList(OVERLAPPING, OVERLAPPING_LEFT).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, end, MAX_VALUE))
+              .as("B begins at A's end and ends after A (###[---])")
+              .isEqualTo(asList(LEFT_OF).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, end, end))
+              .as("Zero-width B at A's end (###|)")
+              .isEqualTo(asList(LEFT_OF).contains(aCondition));
+
+          softly.assertThat(aPredicate.apply(begin, end, end + 1, MAX_VALUE))
+              .as("B begins and ends after A (### [---])")
+              .isEqualTo(asList(LEFT_OF).contains(aCondition));
+        
+          softly.assertThat(aPredicate.apply(begin, end, end + 1, end + 1))
+              .as("Zero-width B after A's end (### |)")
+              .isEqualTo(asList(LEFT_OF).contains(aCondition));
+        
+          begin = 10;
+          end = 10;
+          
+          softly.assertThat(aPredicate.apply(begin, end, 20, 30))
+              .as("Zero-width A before B start (# [---])")
+              .isEqualTo(asList(LEFT_OF).contains(aCondition));
+    
+          softly.assertThat(aPredicate.apply(begin, end, 10, 20))
+              .as("Zero-width A at B's start (#---])")
+              .isEqualTo(asList(OVERLAPPING, COVERED_BY).contains(aCondition));
+          
+          softly.assertThat(aPredicate.apply(begin, end, 0, 10))
+              .as("Zero-width A at B's end ([---#)")
+              .isEqualTo(asList(RIGHT_OF).contains(aCondition));
+    
+          softly.assertThat(aPredicate.apply(begin, end, 10, 10))
+              .as("Zero-width A matches zero-width B start/end (#)")
+              .isEqualTo(asList(OVERLAPPING, COVERED_BY, COVERING, COLOCATED).contains(aCondition));
+          
+          softly.assertThat(aPredicate.apply(begin, end, 0, 5))
+              .as("Zero-width A after B's end ([---] #)")
+              .isEqualTo(asList(RIGHT_OF).contains(aCondition));
+        }
+    }
+}
\ No newline at end of file
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java
index 8028ef1..46404e4 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java
@@ -22,22 +22,23 @@
 package org.apache.uima.fit.util;
 
 import static java.util.Arrays.asList;
-import static org.apache.commons.lang.ArrayUtils.toObject;
+import static org.apache.commons.lang3.ArrayUtils.toObject;
 import static org.apache.uima.fit.util.FSCollectionFactory.create;
-import static org.apache.uima.fit.util.FSCollectionFactory.createArrayFS;
-import static org.apache.uima.fit.util.FSCollectionFactory.createBooleanArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createByteArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createDoubleArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.*;
+import static org.apache.uima.fit.util.FSCollectionFactory.createBooleanArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createByteArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createDoubleArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createFSArray;
 import static org.apache.uima.fit.util.FSCollectionFactory.createFSList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFloatArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createFloatArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createFloatList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createIntArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createIntArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createIntegerList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createLongArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createShortArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createStringArray;
+import static org.apache.uima.fit.util.FSCollectionFactory.createLongArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createShortArrayFS;
+import static org.apache.uima.fit.util.FSCollectionFactory.createStringArrayFS;
 import static org.apache.uima.fit.util.FSCollectionFactory.createStringList;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
@@ -47,6 +48,8 @@
 import org.apache.uima.fit.factory.JCasFactory;
 import org.apache.uima.fit.type.Token;
 import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.IntegerArray;
+import org.apache.uima.jcas.cas.StringArray;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.junit.Before;
 import org.junit.Test;
@@ -103,9 +106,9 @@
   @Test
   public void testCreateBooleanArray() {
     assertEquals(asList(true, false),
-            asList(toObject(createBooleanArray(jcas.getCas(), asList(true, false)).toArray())));
+            asList(toObject(createBooleanArrayFS(jcas.getCas(), asList(true, false)).toArray())));
     assertEquals(asList(true, false),
-            asList(toObject(createBooleanArray(jcas.getCas(), new boolean[] { true, false })
+            asList(toObject(createBooleanArrayFS(jcas.getCas(), new boolean[] { true, false })
                     .toArray())));
     assertEquals(asList(true, false), asList(toObject(createBooleanArray(jcas, asList(true, false))
             .toArray())));
@@ -116,9 +119,9 @@
   @Test
   public void testCreateByteArray() {
     assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas.getCas(), asList((byte) 0, (byte) 1)).toArray())));
+            asList(toObject(createByteArrayFS(jcas.getCas(), asList((byte) 0, (byte) 1)).toArray())));
     assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas.getCas(), new byte[] { 0, 1 }).toArray())));
+            asList(toObject(createByteArrayFS(jcas.getCas(), new byte[] { 0, 1 }).toArray())));
     assertEquals(asList((byte) 0, (byte) 1),
             asList(toObject(createByteArray(jcas, asList((byte) 0, (byte) 1)).toArray())));
     assertEquals(asList((byte) 0, (byte) 1),
@@ -128,9 +131,9 @@
   @Test
   public void testCreateDoubleArray() {
     assertEquals(asList(0.0, 1.0),
-            asList(toObject(createDoubleArray(jcas.getCas(), asList(0.0, 1.0)).toArray())));
+            asList(toObject(createDoubleArrayFS(jcas.getCas(), asList(0.0, 1.0)).toArray())));
     assertEquals(asList(0.0, 1.0),
-            asList(toObject(createDoubleArray(jcas.getCas(), new double[] { 0.0, 1.0 }).toArray())));
+            asList(toObject(createDoubleArrayFS(jcas.getCas(), new double[] { 0.0, 1.0 }).toArray())));
     assertEquals(asList(0.0, 1.0), asList(toObject(createDoubleArray(jcas, asList(0.0, 1.0))
             .toArray())));
     assertEquals(asList(0.0, 1.0),
@@ -140,9 +143,9 @@
   @Test
   public void testCreateFloatArray() {
     assertEquals(asList(0.0f, 1.0f),
-            asList(toObject(createFloatArray(jcas.getCas(), asList(0.0f, 1.0f)).toArray())));
+            asList(toObject(createFloatArrayFS(jcas.getCas(), asList(0.0f, 1.0f)).toArray())));
     assertEquals(asList(0.0f, 1.0f),
-            asList(toObject(createFloatArray(jcas.getCas(), new float[] { 0.0f, 1.0f }).toArray())));
+            asList(toObject(createFloatArrayFS(jcas.getCas(), new float[] { 0.0f, 1.0f }).toArray())));
     assertEquals(asList(0.0f, 1.0f), asList(toObject(createFloatArray(jcas, asList(0.0f, 1.0f))
             .toArray())));
     assertEquals(asList(0.0f, 1.0f),
@@ -156,25 +159,33 @@
 
   @Test
   public void testCreateIntArray() {
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas.getCas(), asList(0, 1))
+    assertEquals(asList(0, 1), asList(toObject(createIntArrayFS(jcas.getCas(), asList(0, 1))
             .toArray())));
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas.getCas(), new int[] { 0, 1 })
+    assertEquals(asList(0, 1), asList(toObject(createIntArrayFS(jcas.getCas(), new int[] { 0, 1 })
             .toArray())));
     assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas, asList(0, 1)).toArray())));
     assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas, new int[] { 0, 1 }).toArray())));
   }
 
   @Test
+  public void testFillIntegerArray() {
+    assertArrayEquals(new int[] {0, 1}, fillArray(new IntegerArray(jcas, 2), asList(0, 1)).toArray());
+    assertArrayEquals(new int[] {0, 1}, fillArray(new IntegerArray(jcas, 2), 0, 1).toArray());
+    assertArrayEquals(new int[] {0, 1}, fillArray(new IntegerArray(jcas, 2), asList(0, 1)).toArray());
+    assertArrayEquals(new int[] {0, 1}, fillArray(new IntegerArray(jcas, 2), 0, 1).toArray());
+  }
+
+  @Test
   public void testCreateIntegerList() {
     assertEquals(asList(0, 1), create(createIntegerList(jcas, asList(0, 1))));
   }
 
   @Test
   public void testCreateLongArray() {
-    assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas.getCas(), asList(0l, 1l))
+    assertEquals(asList(0l, 1l), asList(toObject(createLongArrayFS(jcas.getCas(), asList(0l, 1l))
             .toArray())));
     assertEquals(asList(0l, 1l),
-            asList(toObject(createLongArray(jcas.getCas(), new long[] { 0l, 1l }).toArray())));
+            asList(toObject(createLongArrayFS(jcas.getCas(), new long[] { 0l, 1l }).toArray())));
     assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas, asList(0l, 1l)).toArray())));
     assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas, new long[] { 0l, 1l })
             .toArray())));
@@ -184,9 +195,9 @@
   public void testCreateShortArray() {
     assertEquals(
             asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas.getCas(), asList((short) 0, (short) 1)).toArray())));
+            asList(toObject(createShortArrayFS(jcas.getCas(), asList((short) 0, (short) 1)).toArray())));
     assertEquals(asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas.getCas(), new short[] { 0, 1 }).toArray())));
+            asList(toObject(createShortArrayFS(jcas.getCas(), new short[] { 0, 1 }).toArray())));
     assertEquals(asList((short) 0, (short) 1),
             asList(toObject(createShortArray(jcas, asList((short) 0, (short) 1)).toArray())));
     assertEquals(asList((short) 0, (short) 1),
@@ -195,13 +206,22 @@
 
   @Test
   public void testCreateStringArray() {
-    assertEquals(asList("0", "1"), asList(createStringArray(jcas.getCas(), asList("0", "1"))
+    assertEquals(asList("0", "1"), asList(createStringArrayFS(jcas.getCas(), asList("0", "1"))
             .toArray()));
     assertEquals(asList("0", "1"),
-            asList(createStringArray(jcas.getCas(), new String[] { "0", "1" }).toArray()));
+            asList(createStringArrayFS(jcas.getCas(), new String[] { "0", "1" }).toArray()));
     assertEquals(asList("0", "1"), asList(createStringArray(jcas, asList("0", "1")).toArray()));
-    assertEquals(asList("0", "1"), asList(createStringArray(jcas, new String[] { "0", "1" })
-            .toArray()));
+    assertEquals(asList("0", "1"), asList(createStringArray(jcas, "0", "1").toArray()));
+  }
+
+  @Test
+  public void testFillStringArray() {
+    assertEquals(asList("0", "1"),
+            asList(fillArray(new StringArray(jcas, 2), asList("0", "1")).toArray()));
+    assertEquals(asList("0", "1"), asList(fillArray(new StringArray(jcas, 2), "0", "1").toArray()));
+    assertEquals(asList("0", "1"),
+            asList(fillArray(new StringArray(jcas, 2), asList("0", "1")).toArray()));
+    assertEquals(asList("0", "1"), asList(fillArray(new StringArray(jcas, 2), "0", "1").toArray()));
   }
 
   @Test
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/FSUtilTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/FSUtilTest.java
index a611985..7325153 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/util/FSUtilTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/FSUtilTest.java
@@ -29,14 +29,12 @@
 import java.util.List;
 import java.util.Vector;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.cas.ArrayFS;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.Type;
-import org.apache.uima.cas.impl.AnnotationImpl;
-import org.apache.uima.cas.impl.ArrayFSImpl;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.jcas.cas.FSArray;
 import org.apache.uima.jcas.cas.TOP;
@@ -151,14 +149,7 @@
     assertThat((List) getFeature(fs, "TopValue", Object.class)).containsExactly(arrayElem);
     assertThat(getFeature(fs, "TopValue", ArrayFS.class).toArray())
             .containsExactly(arrayElem);
-    if (aActivateJCas) {
-      assertThat(getFeature(fs, "TopValue", TOP.class).getClass())
-              .isEqualTo(FSArray.class);
-    }
-    else {
-      assertThat(getFeature(fs, "TopValue", FeatureStructure.class).getClass())
-              .isEqualTo(ArrayFSImpl.class);
-    }
+    assertThat(getFeature(fs, "TopValue", TOP.class).getClass()).isEqualTo(FSArray.class);
 
     final AnnotationFS annVal = cas.createAnnotation(annotationType, 0, 1);
     setFeature(fs, "AnnotationValue", annVal);
@@ -168,7 +159,7 @@
       assertThat(getFeature(fs, "AnnotationValue", TOP.class)).isEqualTo(annVal);
     }
     else {
-      assertEquals(AnnotationImpl.class.getName(),
+      assertEquals(Annotation.class.getName(),
               getFeature(fs, "AnnotationValue", FeatureStructure.class).getClass().getName());
     }
     assertThat(getFeature(fs, "AnnotationValue", AnnotationFS.class)).isEqualTo(annVal);
@@ -224,14 +215,8 @@
             arg2);
     assertThat(getFeature(fs, "AnnotationArrayValue", ArrayFS.class).toArray())
             .containsExactly(arg1, arg2);
-    if (aActivateJCas) {
-      assertThat(getFeature(fs, "AnnotationArrayValue", TOP.class).getClass())
-              .isEqualTo(FSArray.class);
-    }
-    else {
-      assertThat(getFeature(fs, "AnnotationArrayValue", FeatureStructure.class).getClass())
-              .isEqualTo(ArrayFSImpl.class);
-    }
+    assertThat(getFeature(fs, "AnnotationArrayValue", TOP.class).getClass())
+            .isEqualTo(FSArray.class);
     assertThat(getFeature(fs, "AnnotationArrayValue", List.class)).containsExactly(arg1, arg2);
     assertThat((List) getFeature(fs, "AnnotationArrayValue", Object.class)).containsExactly(arg1,
             arg2);
@@ -269,7 +254,7 @@
       assertEquals(Annotation.class.getName(),
               getFeature(fs, "AnnotationListValue", AnnotationFS[].class)[0].getClass().getName());
     } else {
-      assertEquals(AnnotationImpl.class.getName(),
+      assertEquals(Annotation.class.getName(),
               getFeature(fs, "AnnotationListValue", AnnotationFS[].class)[0].getClass().getName());
     }
       
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
index 854fd9c..12290b6 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
@@ -15,14 +15,16 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
-
-
- getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
+ *
+ *
+ * getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
  */
 package org.apache.uima.fit.util;
 
 import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
 import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
+import static org.apache.uima.fit.util.AnnotationPredicates.overlaps;
 import static org.apache.uima.fit.util.JCasUtil.contains;
 import static org.apache.uima.fit.util.JCasUtil.exists;
 import static org.apache.uima.fit.util.JCasUtil.getAnnotationType;
@@ -36,11 +38,13 @@
 import static org.apache.uima.fit.util.JCasUtil.selectCovered;
 import static org.apache.uima.fit.util.JCasUtil.selectCovering;
 import static org.apache.uima.fit.util.JCasUtil.selectFollowing;
+import static org.apache.uima.fit.util.JCasUtil.selectOverlapping;
 import static org.apache.uima.fit.util.JCasUtil.selectPreceding;
 import static org.apache.uima.fit.util.JCasUtil.selectSingle;
 import static org.apache.uima.fit.util.JCasUtil.selectSingleAt;
 import static org.apache.uima.fit.util.JCasUtil.selectSingleRelative;
 import static org.apache.uima.fit.util.JCasUtil.toText;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -55,12 +59,16 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
+import java.util.stream.Collectors;
 
 import org.apache.uima.UIMAException;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.FeatureStructure;
 import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.fit.ComponentTestBase;
+import org.apache.uima.fit.factory.CasFactory;
+import org.apache.uima.fit.factory.JCasFactory;
 import org.apache.uima.fit.type.AnalyzedText;
 import org.apache.uima.fit.type.Sentence;
 import org.apache.uima.fit.type.Token;
@@ -71,11 +79,11 @@
 import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.apache.uima.util.CasCreationUtils;
+import org.assertj.core.api.AutoCloseableSoftAssertions;
 import org.junit.Test;
 
 /**
  * Test cases for {@link JCasUtil}.
- * 
  */
 public class JCasUtilTest extends ComponentTestBase {
   /**
@@ -139,7 +147,7 @@
       
       // Prepare the index
       long timeIndexed = System.currentTimeMillis();
-      Map<Sentence, Collection<Token>> index = indexCovered(jcas, Sentence.class, Token.class);
+      Map<Sentence, List<Token>> index = indexCovered(jcas, Sentence.class, Token.class);
       timeIndexed = System.currentTimeMillis() - timeIndexed;
       
       // -- The order of entries in the index is NOT defined!
@@ -181,6 +189,261 @@
     }
   }
 
+  @Test 
+  public void thatSelectOverlappingWorks() throws Exception
+  {
+      assertOverlapBehavior(JCasUtil::selectOverlapping);
+  }
+
+  @Test 
+  public void thatSelectOverlappingNaiveWorks() throws Exception
+  {
+      assertOverlapBehavior(JCasUtilTest::selectOverlappingNaive);
+  }
+
+  @Test 
+  public void thatSelectOverlappingNaiveV3Works() throws Exception
+  {
+      assertOverlapBehavior(JCasUtilTest::selectOverlappingNaiveV3);
+  }
+
+  @Test 
+  public void thatSelectOverlappingV3Works() throws Exception
+  {
+      assertOverlapBehavior(JCasUtilTest::selectOverlappingV3);
+  }
+
+  private static void assertOverlapBehavior(TypeByOffsetSelector aSelector) throws Exception
+  {
+      JCas jcas = JCasFactory.createJCas();
+      Token t = new Token(jcas, 10, 20);
+      t.addToIndexes();
+      
+
+      try (AutoCloseableSoftAssertions softly = new AutoCloseableSoftAssertions()) {
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin() - 1, t.getBegin() - 1))
+            .as("Zero-width selection before annotation begin (| ###)")
+            .isEmpty();
+      
+        softly.assertThat(aSelector.select(jcas, Token.class, 0, t.getBegin() - 1))
+            .as("Selection begins and ends before annotation begin ([---] ###)")
+            .isEmpty();
+      
+        softly.assertThat(aSelector.select(jcas, Token.class, 0, t.getBegin()))
+            .as("Selection begins before and ends at annotation begin ([---]###)")
+            .isEmpty();
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin(), t.getBegin()))
+            .as("Zero-width selection at annotation begin (|###)")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, 0, t.getBegin() + 1))
+            .as("Selection begins before and ends within annotation ([--#]##)")
+            .containsExactly(t);
+      
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin() + 1, t.getEnd() - 1))
+            .as("Selection begins and ends within annotation  (#[#]#)")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin() + 1, t.getEnd()))
+            .as("Selection begins after and ends at annotation boundries (#[##])")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin(), t.getEnd()))
+            .as("Selection begins and ends at annotation boundries ([###])")
+            .containsExactly(t);
+      
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin()+1, t.getBegin()+1))
+            .as("Zero-width selection within annotation (#|#)")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getBegin(), t.getEnd() - 1))
+            .as("Selection begins at and ends before annotation boundries ([##]#)")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getEnd() - 1 , Integer.MAX_VALUE))
+            .as("Selection begins before and ends within annotation (##[#--])")
+            .containsExactly(t);
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getEnd(), Integer.MAX_VALUE))
+            .as("Selection begins at annotation end and ends after annotation (###[---])")
+            .isEmpty();
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getEnd(), t.getEnd()))
+            .as("Zero-width selection at annotation end (###|)")
+            .isEmpty();
+
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getEnd() + 1, Integer.MAX_VALUE))
+            .as("Selection begins and ends after annotation (### [---])")
+            .isEmpty();
+      
+        softly.assertThat(aSelector.select(jcas, Token.class, t.getEnd() + 1, t.getEnd() + 1))
+            .as("Zero-width selection after annotation end (### |)")
+            .isEmpty();
+      
+        jcas.reset();
+        Token zero = new Token(jcas, 10, 10);
+        zero.addToIndexes();
+  
+        softly.assertThat(aSelector.select(jcas, Token.class, 20, 30))
+            .as("Zero-width annotation before selection start (# [---])")
+            .isEmpty();
+  
+        softly.assertThat(aSelector.select(jcas, Token.class, 10, 20))
+            .as("Zero-width annotation at selection start (#---])")
+            .containsExactly(zero);
+        
+        softly.assertThat(aSelector.select(jcas, Token.class, 0, 10))
+            .as("Zero-width annotation at selection end ([---#)")
+            .isEmpty();
+  
+        softly.assertThat(aSelector.select(jcas, Token.class, 10, 10))
+            .as("Zero-width annotation matches zero-width selection start/end (#)")
+            .containsExactly(zero);
+        
+        softly.assertThat(aSelector.select(jcas, Token.class, 0, 5))
+            .as("Zero-width annotation after selection end ([---] #)")
+            .isEmpty();
+      }
+  }
+
+  @Test
+  public void thatSelectOverlappingWorksOnRandomData() throws Exception
+  {
+      final int ITERATIONS = 10;
+
+      CAS cas = CasFactory.createCas();
+      
+      for (int i = 0; i < ITERATIONS; i++) {
+          initRandomCas(cas, 3 * i);
+
+          JCas jcas = cas.getJCas();
+          Collection<Sentence> sentences = select(jcas, Sentence.class);
+
+          long timeNaive = 0;
+          long timeNaiveV3 = 0;
+          long timeOptimized = 0;
+          long timeOptimizedV3 = 0;
+
+          for (Sentence s : sentences) {
+              // The naive approach is assumed to be correct
+              long ti = System.currentTimeMillis();
+              List<Token> expected = selectOverlappingNaive(jcas, Token.class, s.getBegin(),
+                      s.getEnd());
+              timeNaive += System.currentTimeMillis() - ti;
+
+              // Record time for the naive V3 approach
+              ti = System.currentTimeMillis();
+              List<Token> actualNaiveV3 = selectOverlappingNaiveV3(jcas, Token.class, s.getBegin(),
+                      s.getEnd());
+              timeNaiveV3 += System.currentTimeMillis() - ti;
+
+              // Record time for the optimized approach
+              ti = System.currentTimeMillis();
+              List<Token> actual = selectOverlapping(jcas, Token.class, s.getBegin(), s.getEnd());
+              timeOptimized += System.currentTimeMillis() - ti;
+
+              // Record time for the optimized v3 approach
+              ti = System.currentTimeMillis();
+              List<Token> actualV3 = selectOverlappingV3(jcas, Token.class, s.getBegin(),
+                      s.getEnd());
+              timeOptimizedV3 += System.currentTimeMillis() - ti;
+
+              assertThat(actual)
+                  .as("Selection           : [" + s.getBegin() + ".." + s.getEnd() + "]")
+                  .containsExactlyElementsOf(expected);
+              assertThat(actualNaiveV3)
+                  .as("Selection (naive V3): [" + s.getBegin() + ".." + s.getEnd() + "]")
+                  .containsExactlyElementsOf(expected);
+              assertThat(actualV3)
+                  .as("Selection (V3)      : [" + s.getBegin() + ".." + s.getEnd() + "]")
+                  .containsExactlyElementsOf(expected);
+          }
+
+          System.out.printf(
+                  "%3d Optimized   : speed up x%3.2f [baseline:%4d current:%4d (diff:%4d)]%n",
+                  i, (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized,
+                  timeNaive - timeOptimized);
+          System.out.printf(
+                  "%3d Naive V3    : speed up x%3.2f [baseline:%4d current:%4d (diff:%4d)]%n",
+                  i, (double) timeNaive / (double) timeNaiveV3, timeNaive, timeNaiveV3,
+                  timeNaive - timeNaiveV3);
+          System.out.printf(
+                  "%3d Optimized V3: speed up x%3.2f [baseline:%4d current:%4d (diff:%4d)]%n",
+                  i, (double) timeNaive / (double) timeOptimizedV3, timeNaive, timeOptimizedV3,
+                  timeNaive - timeOptimizedV3);
+          System.out.println();
+      }
+  }
+  
+  private static boolean naiveOverlappingCondition(AnnotationFS ann, int aSelBegin, int aSelEnd)
+  {
+    int begin = ann.getBegin();
+    int end = ann.getEnd();
+    
+    // Selection exactly matches annotation (even if empty)
+    if (begin == aSelBegin && end == aSelEnd) {
+      return true;
+    }
+    
+    boolean zeroWidthSelection = aSelBegin == aSelEnd;
+    return !(
+      // NOT Zero-width selection at end of annotation
+      (zeroWidthSelection && aSelBegin == end) ||
+      // NOT Zero-width annotation at end of selection
+      (begin == end && begin == aSelEnd)) 
+    && (
+      // Zero-width selection at beginning of annotation
+      (zeroWidthSelection && aSelBegin == begin) ||
+      // Annotation left-overlapping on selection
+      (aSelBegin <= begin && begin < aSelEnd) ||
+      // Annotation right overlapping on selection
+      (aSelBegin < end && end <= aSelEnd) ||
+      // Annotation fully containing selection
+      (begin <= aSelBegin && aSelEnd <= end) ||
+      // Selection fully containing annotation
+      (aSelBegin <= begin && end <= aSelEnd));
+  }
+
+  public static <T extends Annotation> List<T> selectOverlappingNaive(JCas aCas, Class<T> aType,
+          int aSelBegin, int aSelEnd) {
+      return select(aCas, aType).stream()
+              .filter(ann -> naiveOverlappingCondition(ann, aSelBegin, aSelEnd))
+              .collect(Collectors.toList());
+  }
+  
+  public static <T extends Annotation> List<T> selectOverlappingNaiveV3(JCas aCas, Class<T> aType,
+          int aSelBegin, int aSelEnd) {
+      return aCas.select(aType)
+              // Commented out because due to UIMA-6269, some annotations may be missed
+              // .coveredBy(0,  aSelEnd)
+              // .includeAnnotationsWithEndBeyondBounds()
+              .filter(ann -> naiveOverlappingCondition(ann, aSelBegin, aSelEnd))
+              .collect(Collectors.toList());
+  }
+
+  public static <T extends Annotation> List<T> selectOverlappingV3(JCas aCas, Class<T> aType,
+          int aSelBegin, int aSelEnd) {
+
+    return aCas.getAnnotationIndex(aType).select()
+            .filter(ann -> overlaps(ann, aSelBegin, aSelEnd))
+            .collect(toList());
+    
+    // These are alternative implementations, but just as the version above, they are also slow 
+    // compared to the implementation we use in CasUtil.selectOverlapping() right now.
+    // Also, they suffer from UIMA-6269, some annotations may be missed
+//      return aCas.getAnnotationIndex(aType).select()
+//            .coveredBy(0, aSelEnd)
+//            .includeAnnotationsWithEndBeyondBounds()
+//            .filter(ann -> isOverlapping(ann, aSelBegin, aSelEnd))
+//            .collect(Collectors.toList());
+
+//      return aCas.select(aType)
+//              .coveredBy(0,  aSelEnd)
+//              .includeAnnotationsWithEndBeyondBounds()
+//              .filter(ann -> isOverlapping(ann, aSelBegin, aSelEnd))
+//              .collect(Collectors.toList());
+  }
   /**
    * Test what happens if there is actually nothing overlapping with the Token.
    */
@@ -316,7 +579,9 @@
     // print(a1);
     // System.out.println("--- Optimized");
     // print(a2);
-    assertEquals("Container: [" + t.getBegin() + ".." + t.getEnd() + "]", a1, a2);
+    assertThat(a2)
+        .as("Container: [" + t.getBegin() + ".." + t.getEnd() + "]")
+        .containsExactlyElementsOf((Iterable) a1);
   }
 
   @Test
@@ -771,7 +1036,7 @@
     List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
     List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
 
-    Map<Token, Collection<Sentence>> index = indexCovering(jCas, Token.class, Sentence.class);
+    Map<Token, List<Sentence>> index = indexCovering(jCas, Token.class, Sentence.class);
 
     // Check covering annotations are found
     assertEquals(asList(sentences.get(0)), index.get(tokens.get(0)));
@@ -794,7 +1059,7 @@
     // Check if the reference annotation itself is returned
     Token extra = new Token(jCas, tokens.get(3).getBegin(), tokens.get(3).getEnd());
     extra.addToIndexes();
-    Map<Token, Collection<Token>> index2 = indexCovering(jCas, Token.class, Token.class);
+    Map<Token, List<Token>> index2 = indexCovering(jCas, Token.class, Token.class);
     assertEquals(0, index2.get(0).size());
     assertEquals(1, index2.get(extra).size());
     assertEquals(tokens.get(3), index2.get(extra).iterator().next());
@@ -808,7 +1073,7 @@
     List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
     List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
     
-    Map<Sentence, Collection<Token>> index = indexCovered(jCas, Sentence.class, Token.class);
+    Map<Sentence, List<Token>> index = indexCovered(jCas, Sentence.class, Token.class);
     
     // Check covered annotations are found
     assertEquals(tokens.subList(0, 6), index.get(sentences.get(0)));
@@ -817,7 +1082,7 @@
     // Check if the reference annotation itself is returned
     Token extra = new Token(jCas, tokens.get(3).getBegin(), tokens.get(3).getEnd());
     extra.addToIndexes();
-    Map<Token, Collection<Token>> index2 = indexCovered(jCas, Token.class, Token.class);
+    Map<Token, List<Token>> index2 = indexCovered(jCas, Token.class, Token.class);
     assertEquals(0, index2.get(0).size());
     assertEquals(1, index2.get(extra).size());
     assertEquals(tokens.get(3), index2.get(extra).iterator().next());
@@ -885,4 +1150,10 @@
     assertEquals(b.getBegin(), tokenAt.getBegin());
     assertEquals(b.getEnd(), tokenAt.getEnd());
   }
+  
+  @FunctionalInterface
+  private static interface TypeByOffsetSelector {
+    <T extends Annotation> List<T> select(JCas aCas, Class<T> aType,
+            int aBegin, int aEnd);
+  }
 }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java
new file mode 100644
index 0000000..68057de
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java
@@ -0,0 +1,925 @@
+/*
+ * 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.
+
+
+ getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
+ */
+package org.apache.uima.fit.util;
+
+import static java.util.Arrays.asList;
+import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
+import static org.apache.uima.fit.util.JCasUtil.getAnnotationType;
+import static org.apache.uima.fit.util.JCasUtil.getView;
+import static org.apache.uima.fit.util.JCasUtil.indexCovered;
+import static org.apache.uima.fit.util.JCasUtil.indexCovering;
+import static org.apache.uima.fit.util.JCasUtil.select;
+import static org.apache.uima.fit.util.JCasUtil.selectAt;
+import static org.apache.uima.fit.util.JCasUtil.selectCovered;
+import static org.apache.uima.fit.util.JCasUtil.selectSingleAt;
+import static org.apache.uima.fit.util.JCasUtil.toText;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+import org.apache.uima.UIMAException;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.CASRuntimeException;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.fit.ComponentTestBase;
+import org.apache.uima.fit.type.AnalyzedText;
+import org.apache.uima.fit.type.Sentence;
+import org.apache.uima.fit.type.Token;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.EmptyFSList;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.NonEmptyFSList;
+import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.util.CasCreationUtils;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link JCasUtil}.
+ * 
+ */
+public class JCasUtilv3Test extends ComponentTestBase {
+  /**
+   * Test Tokens (Stems + Lemmas) overlapping with each other.
+   */
+  @Test
+  public void testSelectCoveredOverlapping() {
+    add(jCas, 3, 16);
+    add(jCas, 37, 61);
+    add(jCas, 49, 75);
+    add(jCas, 54, 58);
+    add(jCas, 66, 84);
+
+    for (Token t : select(jCas, Token.class)) {
+      // The naive approach is assumed to be correct
+      // uimaFIT: selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
+      List<Sentence> stem1 = jCas.select(Sentence.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+      // uimaFIT: selectCovered(jCas, Sentence.class, t);
+      List<Sentence> stem2 = jCas.select(Sentence.class).coveredBy(t).asList();
+      check(jCas, t, stem1, stem2);
+    }
+  }
+
+  /**
+   * Test what happens if there is actually nothing overlapping with the Token.
+   */
+  @Test
+  public void testSelectCoveredNoOverlap() {
+    new Sentence(jCas, 3, 31).addToIndexes();
+    new Sentence(jCas, 21, 21).addToIndexes();
+    new Sentence(jCas, 24, 44).addToIndexes();
+    new Sentence(jCas, 30, 45).addToIndexes();
+    new Sentence(jCas, 32, 43).addToIndexes();
+    new Sentence(jCas, 47, 61).addToIndexes();
+    new Sentence(jCas, 48, 77).addToIndexes();
+    new Sentence(jCas, 65, 82).addToIndexes();
+    new Sentence(jCas, 68, 80).addToIndexes();
+    new Sentence(jCas, 72, 65).addToIndexes();
+
+    new Token(jCas, 73, 96).addToIndexes();
+
+    for (Token t : select(jCas, Token.class)) {
+      // The naive approach is assumed to be correct
+      // uimaFIT: selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
+      List<Sentence> stem1 = jCas.select(Sentence.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+      // uimaFIT: selectCovered(jCas, Sentence.class, t);
+      List<Sentence> stem2 = jCas.select(Sentence.class).coveredBy(t).asList();
+      check(jCas, t, stem1, stem2);
+    }
+  }
+
+  @Test
+  public void testSelectCoverRandom() throws Exception {
+    final int ITERATIONS = 10;
+
+    for (int i = 0; i < ITERATIONS; i++) {
+      CAS cas = jCas.getCas();
+      initRandomCas(cas, 10 * i);
+
+      JCas jcas = cas.getJCas();
+      Collection<Sentence> sentences = select(jcas, Sentence.class);
+      
+      long timeNaive = 0;
+      long timeOptimized = 0;
+      
+      // Prepare the index
+      long timeIndexed = System.currentTimeMillis();
+      Map<Sentence, List<Token>> index = indexCovered(jcas, Sentence.class, Token.class);
+      timeIndexed = System.currentTimeMillis() - timeIndexed;
+      
+      // -- The order of entries in the index is NOT defined!
+      // Check that order of indexed sentences corresponds to regular CAS-index order
+      // List<Sentence> relevantSentences = new ArrayList<>(sentences);
+      // relevantSentences.retainAll(index.keySet());
+      // assertEquals(relevantSentences, new ArrayList<>(index.keySet()));
+      
+      for (Sentence t : sentences) {
+        long ti = System.currentTimeMillis();
+        // The naive approach is assumed to be correct
+        // uimaFIT: selectCovered(jcas, Token.class, t.getBegin(), t.getEnd());
+        List<Token> expected = jcas.select(Token.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+        timeNaive += System.currentTimeMillis() - ti;
+
+        // Record time for optimized selectCovered
+        ti = System.currentTimeMillis();
+        // uimaFIT: selectCovered(jcas, Token.class, t);
+        List<Token> actual1 = jcas.select(Token.class).coveredBy(t).asList();
+        timeOptimized += System.currentTimeMillis() - ti;
+
+        // Record index lookup time
+        ti = System.currentTimeMillis();
+        Collection<Token> actual2 = index.get(t);
+        timeIndexed += System.currentTimeMillis() - ti;
+
+        check(jcas, t, expected, actual1);
+        check(jcas, t, expected, actual2);
+        
+        // System.out.printf("%n--- OK ---------------%n%n");
+      }
+      System.out.printf(
+              "%3d Optimized: speed up factor %3.2f [naive:%4d optimized:%4d (diff:%4d)]%n", i,
+              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized,
+              timeNaive - timeOptimized);
+      System.out.printf(
+              "%3d Indexed:   speed up factor %3.2f [naive:%4d indexed  :%4d (diff:%4d)]%n%n", i,
+              (double) timeNaive / (double) timeIndexed, timeNaive, timeIndexed,
+              timeNaive - timeIndexed);
+    }
+  }
+
+  /**
+   * Test what happens if there is actually nothing overlapping with the Token.
+   */
+  @Test
+  public void testSelectBetweenInclusion() {
+    Token t1 = new Token(jCas, 45, 57);
+    t1.addToIndexes();
+    Token t2 = new Token(jCas, 52, 52);
+    t2.addToIndexes();
+
+    new Sentence(jCas, 52, 52).addToIndexes();
+
+    // uimaFIT: selectBetween(jCas, Sentence.class, t1, t2);
+    List<Sentence> stem1 = jCas.select(Sentence.class).between(t1, t2).asList();
+    assertTrue(stem1.isEmpty());
+  }
+
+  @Test
+  public void testSelectBetweenRandom() throws Exception {
+    final int ITERATIONS = 10;
+
+    Random rnd = new Random();
+
+    for (int i = 1; i <= ITERATIONS; i++) {
+      CAS cas = jCas.getCas();
+      initRandomCas(cas, 10 * i);
+
+      JCas jcas = cas.getJCas();
+      List<Token> tokens = new ArrayList<Token>(select(jcas, Token.class));
+
+      long timeNaive = 0;
+      long timeOptimized = 0;
+      for (int j = 0; j < ITERATIONS; j++) {
+        Token t1 = tokens.get(rnd.nextInt(tokens.size()));
+        Token t2 = tokens.get(rnd.nextInt(tokens.size()));
+
+        int left = Math.min(t1.getEnd(), t2.getEnd());
+        int right = Math.max(t1.getBegin(), t2.getBegin());
+
+        long ti;
+        List<Sentence> reference;
+        if ((t1.getBegin() < t2.getBegin() && t2.getBegin() < t1.getEnd())
+                || (t1.getBegin() < t2.getEnd() && t2.getEnd() < t1.getEnd())
+                || (t2.getBegin() < t1.getBegin() && t1.getBegin() < t2.getEnd())
+                || (t2.getBegin() < t1.getEnd() && t1.getEnd() < t2.getEnd())) {
+          // If the boundary annotations overlap, the result must be empty
+          ti = System.currentTimeMillis();
+          reference = new ArrayList<Sentence>();
+          timeNaive += System.currentTimeMillis() - ti;
+        } else {
+          ti = System.currentTimeMillis();
+          reference = selectCovered(jcas, Sentence.class, left, right);
+          timeNaive += System.currentTimeMillis() - ti;
+        }
+
+        ti = System.currentTimeMillis();
+        // uimaFIT: selectBetween(Sentence.class, t1, t2);
+        List<Sentence> actual = jcas.select(Sentence.class).between(t1, t2).asList();
+        timeOptimized += System.currentTimeMillis() - ti;
+
+        assertEquals("Naive: Searching between " + t1 + " and " + t2, reference, actual);
+      }
+
+      System.out.format("Speed up factor %.2f [naive:%d optimized:%d diff:%d]\n",
+              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized, timeNaive
+                      - timeOptimized);
+    }
+  }
+
+  /**
+   * Test Tokens (Stems + Lemmas) overlapping with each other.
+   */
+  @Test
+  public void testSelectCoveringOverlapping() {
+    add(jCas, 3, 16);
+    add(jCas, 37, 61);
+    add(jCas, 49, 75);
+    add(jCas, 54, 58);
+    add(jCas, 66, 84);
+
+    // uimaFIT: selectCovering(jCas, Token.class, 36, 52).size()
+    assertEquals(0, jCas.select(Token.class).covering(36, 52).count());
+    // uimaFIT: selectCovering(jCas, Token.class, 37, 52).size()
+    assertEquals(1, jCas.select(Token.class).covering(37, 52).count());
+    // uimaFIT: selectCovering(jCas, Token.class, 49, 52).size()
+    assertEquals(2, jCas.select(Token.class).covering(49, 52).count());
+  }
+
+  private void initRandomCas(CAS cas, int size) {
+    Random rnd = new Random();
+    List<Type> types = new ArrayList<Type>();
+    types.add(cas.getTypeSystem().getType(Token.class.getName()));
+    types.add(cas.getTypeSystem().getType(Sentence.class.getName()));
+
+    // Shuffle the types
+    for (int n = 0; n < 10; n++) {
+      Type t = types.remove(rnd.nextInt(types.size()));
+      types.add(t);
+    }
+
+    // Randomly generate annotations
+    for (int n = 0; n < size; n++) {
+      for (Type t : types) {
+        int begin = rnd.nextInt(100);
+        int end = begin + rnd.nextInt(30);
+        cas.addFsToIndexes(cas.createAnnotation(t, begin, end));
+      }
+    }
+  }
+
+  @SuppressWarnings("unused")
+  private void print(Collection<? extends Annotation> annos) {
+    for (Annotation a : annos) {
+      System.out.println(a.getClass().getSimpleName() + " " + a.getBegin() + " " + a.getEnd());
+    }
+  }
+
+  private Token add(JCas jcas, int begin, int end) {
+    Token t = new Token(jcas, begin, end);
+    t.addToIndexes();
+    new Sentence(jcas, begin, end).addToIndexes();
+    return t;
+  }
+
+  private void check(JCas jcas, Annotation t, Collection<? extends Annotation> a1,
+          Collection<? extends Annotation> a2) {
+    // List<Annotation> annos = new ArrayList<Annotation>();
+    // FSIterator fs = jcas.getAnnotationIndex().iterator();
+    // while (fs.hasNext()) {
+    // annos.add((Annotation) fs.next());
+    // }
+    //
+    // System.out.println("--- Index");
+    // print(annos);
+    // System.out.println("--- Container");
+    // print(Collections.singleton(t));
+    // System.out.println("--- Naive");
+    // print(a1);
+    // System.out.println("--- Optimized");
+    // print(a2);
+    assertEquals("Container: [" + t.getBegin() + ".." + t.getEnd() + "]", a1, a2);
+  }
+
+  @Test
+  public void testIterator() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
+        // uimaFIT: toText(JCasUtil.select(jCas, Token.class))
+        jCas.select(Token.class).map(AnnotationFS::getCoveredText).collect(Collectors.toList()));
+  }
+
+  @Test
+  public void testSelectByIndex() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, -1).getCoveredText()
+    assertEquals("dew?", jCas.select(Token.class).backwards().get(0).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, 3).getCoveredText()
+    assertEquals("dew?", jCas.select(Token.class).get(3).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText()
+    assertEquals("Rot", jCas.select(Token.class).get(0).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, -4).getCoveredText()
+    assertEquals("Rot", jCas.select(Token.class).backwards().get(3).getCoveredText());
+    // uimaFIT: assertNull(JCasUtil.selectByIndex(jCas, Token.class, -5));
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jCas.select(Token.class).backwards().get(4))
+        .withMessage("CAS does not contain any '" + Token.class.getName() + "' instances  shifted by: 4.");
+    // uimaFIT: assertNull(JCasUtil.selectByIndex(jCas, Token.class, 4));
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jCas.select(Token.class).backwards().get(4))
+        .withMessage("CAS does not contain any '" + Token.class.getName() + "' instances  shifted by: 4.");
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Test
+  public void testSelectOnArrays() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    Collection<TOP> allFS = select(jCas, TOP.class);
+    FSArray allFSArray = new FSArray(jCas, allFS.size());
+    int i = 0;
+    for (FeatureStructure fs : allFS) {
+      allFSArray.set(i, fs);
+      i++;
+    }
+
+    // Print what is expected
+    for (FeatureStructure fs : allFS) {
+      System.out.println("Type: " + fs.getType().getName() + "]");
+    }
+    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
+
+    // Document Annotation, one sentence and 4 tokens.
+    assertEquals(6, allFS.size());
+
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(toText(select(jCas, Token.class)), toText(allFSArray.select(Token.class)));
+
+    assertEquals(toText((Iterable) jCas.select(Token.class)),
+            toText((Iterable) allFSArray.select(Token.class)));
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Test
+  public void testSelectOnLists() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    Collection<TOP> allFS = select(jCas, TOP.class);
+
+    // Building a list... OMG!
+    NonEmptyFSList allFSList = new NonEmptyFSList(jCas);
+    NonEmptyFSList head = allFSList;
+    Iterator<TOP> i = allFS.iterator();
+    while (i.hasNext()) {
+      head.setHead(i.next());
+      if (i.hasNext()) {
+        head.setTail(new NonEmptyFSList(jCas));
+        head = (NonEmptyFSList) head.getTail();
+      } else {
+        head.setTail(new EmptyFSList(jCas));
+      }
+    }
+
+    // Print what is expected
+    for (FeatureStructure fs : allFS) {
+      System.out.println("Type: " + fs.getType().getName() + "]");
+    }
+    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
+
+    // Document Annotation, one sentence and 4 tokens.
+    assertEquals(6, allFS.size());
+
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(toText(select(jCas, Token.class)), toText(allFSList.select(Token.class)));
+
+    assertEquals(toText((Iterable) select(jCas, Token.class)),
+            toText((Iterable) select(allFSList, Token.class)));
+  }
+
+  @Test
+  public void testToText() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(asList(text.split(" ")), toText(jCas.select(Token.class)));
+  }
+
+  @Test
+  public void testSelectSingleRelative() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectSingleRelative(jCas, Token.class, token.get(1), -1)
+    Token preceding =  jCas.select(Token.class).startAt(token.get(1)).get(-1);
+    assertEquals(token.get(0).getCoveredText(), preceding.getCoveredText());
+
+    // selectSingleRelative(jCas, Token.class, token.get(1), 1);
+    Token following = jCas.select(Token.class).startAt(token.get(1)).get(1);
+    assertEquals(token.get(2).getCoveredText(), following.getCoveredText());
+  }
+
+  @Test
+  public void testSingleRelativePreceedingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token lastToken = tokens.get(tokens.size()-1);
+    Token preLastToken = tokens.get(tokens.size()-2);
+    // uimaFIT selectSingleRelative(jCas, AnalyzedText.class, lastToken, -1);
+    AnalyzedText a = jCas.select(AnalyzedText.class).startAt(lastToken).shifted(-1).get();
+    assertEquals(preLastToken.getBegin(), a.getBegin());
+    assertEquals(preLastToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testSingleRelativeFollowingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    Token secondToken = tokens.get(1);
+    // uimaFIT: 
+    // AnalyzedText a = selectSingleRelative(jCas, AnalyzedText.class, firstToken, 1);
+    AnalyzedText a = jCas.select(AnalyzedText.class).startAt(firstToken).get(1);
+    assertEquals(secondToken.getBegin(), a.getBegin());
+    assertEquals(secondToken.getEnd(), a.getEnd());
+  }
+  
+  // Actually, in UIMAv3 this does not fail - and it is ok to not fail
+  @Deprecated()
+  @Test
+  public void testSingleRelativeDifferentTypeSamePositionFail() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingleRelative(jCas, AnalyzedText.class, firstToken, 0));
+    
+    assertThat(jCas.select(AnalyzedText.class).startAt(firstToken).shifted(0).get())
+        .isSameAs(jCas.select(AnalyzedText.class).get());
+  }
+
+  @Test
+  public void testSingleRelativeSameTypeSamePositionOk() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    // uimaFIT: selectSingleRelative(jCas, Token.class, firstToken, 0);
+    assertEquals(firstToken, jCas.select(Token.class).startAt(firstToken).shifted(0).get());
+  }
+
+  @Test
+  public void testSelectFollowing() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectFollowing(jCas, Token.class, token.get(1), 1).get(0).getCoveredText())
+    assertEquals(token.get(2).getCoveredText(), jCas.select(Token.class).following(token.get(1))
+            .get().getCoveredText());
+  }
+
+  @Test
+  public void testSelectPreceding() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectPreceding(jCas, Token.class, token.get(1), 1).get(0).getCoveredText());
+    assertEquals(token.get(0).getCoveredText(), jCas.select(Token.class).preceding(token.get(1))
+            .get().getCoveredText());
+  }
+
+  @Test
+  public void testSelectPrecedingWithOverlaps() {
+    String text = "a b c d e";
+    tokenBuilder.buildTokens(jCas, text);
+    new Token(jCas, 2, 7).addToIndexes();
+    
+    Token c = JCasUtil.selectAt(jCas, Token.class, 4, 5).get(0);
+
+    // uimaFIT: selectPreceding(jCas, Token.class, c, 2);
+    List<Token> preceedingTokens = jCas.select(Token.class).preceding(c).limit(2).asList();
+    
+    assertEquals(2, preceedingTokens.size());
+    assertEquals("b", preceedingTokens.get(1).getCoveredText());
+    assertEquals("a", preceedingTokens.get(0).getCoveredText());
+  }
+
+  @Test
+  public void testSelectPrecedingWithOverlaps2() {
+    jCas.setDocumentText("abcde");
+    new Token(jCas, 0, 1).addToIndexes();
+    new Token(jCas, 1, 2).addToIndexes();
+    new Token(jCas, 2, 3).addToIndexes();
+    new Token(jCas, 3, 4).addToIndexes();
+    new Token(jCas, 4, 5).addToIndexes();
+    new Token(jCas, 1, 3).addToIndexes();
+    
+    Token c = JCasUtil.selectAt(jCas, Token.class, 2, 3).get(0);
+
+    // selectPreceding(jCas, Token.class, c, 2);
+    List<Token> preceedingTokens = jCas.select(Token.class).preceding(c).limit(2).asList();
+    
+    assertEquals(2, preceedingTokens.size());
+    assertEquals("b", preceedingTokens.get(1).getCoveredText());
+    assertEquals("a", preceedingTokens.get(0).getCoveredText());
+  }
+
+  @Test
+  public void testPrecedingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token lastToken = tokens.get(tokens.size()-1);
+    Token preLastToken = tokens.get(tokens.size()-2);
+    // selectPreceding(jCas, AnalyzedText.class, lastToken, 1).get(0);
+    AnalyzedText a = jCas.select(AnalyzedText.class).preceding(lastToken).limit(1).get();
+    assertEquals(preLastToken.getBegin(), a.getBegin());
+    assertEquals(preLastToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testFollowingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    Token secondToken = tokens.get(1);
+    // selectFollowing(jCas, AnalyzedText.class, firstToken, 1).get(0);
+    AnalyzedText a = jCas.select(AnalyzedText.class).following(firstToken).get();
+    assertEquals(secondToken.getBegin(), a.getBegin());
+    assertEquals(secondToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingBuiltinTypes() {
+    this.jCas.setDocumentText("A B C");
+    // remove the DocumentAnnotation
+    for (Annotation ann : JCasUtil.select(jCas, Annotation.class)) {
+      ann.removeFromIndexes();
+    }
+    Annotation a = new Annotation(this.jCas, 0, 1);
+    Annotation b = new Annotation(this.jCas, 2, 3);
+    Annotation c = new Annotation(this.jCas, 4, 5);
+    for (Annotation ann : Arrays.asList(a, b, c)) {
+      ann.addToIndexes();
+    }
+
+    // uimaFIT: selectPreceding(this.jCas, Annotation.class, b, 2));
+    assertEquals(Arrays.asList(a), jCas.select(Annotation.class).preceding(b).limit(2).asList());
+    // uimaFIT: Arrays.asList(a, b), selectPreceding(this.jCas, Annotation.class, c, 2));
+    // Produces the wrong order
+    assertEquals(Arrays.asList(a, b), jCas.select(Annotation.class).preceding(c).limit(2).asList());
+    // uimaFIT: Arrays.asList(b, c), selectFollowing(this.jCas, Annotation.class, a, 2));
+    assertEquals(Arrays.asList(b, c), jCas.select(Annotation.class).following(a).limit(2).asList());
+    // uimaFIT: Arrays.asList(c), selectFollowing(this.jCas, Annotation.class, b, 2));
+    assertEquals(Arrays.asList(c), jCas.select(Annotation.class).following(b).limit(2).asList());
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingDifferentTypes() {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token c = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, c, d, e)) {
+      token.addToIndexes();
+    }
+    Sentence sentence = new Sentence(this.jCas, 2, 5);
+    sentence.addToIndexes();
+
+    // uimaFIT: selectPreceding(this.jCas, Token.class, sentence, 1)
+    List<Token> preceding = jCas.select(Token.class).preceding(sentence).limit(1).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+    // uimaFIT: selectPreceding(this.jCas, Token.class, sentence, 2)
+    preceding = jCas.select(Token.class).preceding(sentence).limit(2).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 1);
+    List<Token> following1 = jCas.select(Token.class).following(sentence).limit(1).asList();
+    assertEquals(Arrays.asList("D"), JCasUtil.toText(following1));
+    assertEquals(Arrays.asList(d), following1);
+    
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 2);
+    List<Token> following2 = jCas.select(Token.class).following(sentence).limit(2).asList();
+    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following2));
+    assertEquals(Arrays.asList(d, e), following2);
+    
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 3);
+    List<Token> following3 = jCas.select(Token.class).following(sentence).limit(3).asList();
+    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following3));
+    assertEquals(Arrays.asList(d, e), following3);
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingDifferentTypesMatchingSpansReversePriorities() {
+    this.jCas.setDocumentText("A B C D E");
+    Sentence a = new Sentence(this.jCas, 0, 1);
+    Sentence b = new Sentence(this.jCas, 2, 3);
+    Sentence c = new Sentence(this.jCas, 4, 5);
+    Sentence d = new Sentence(this.jCas, 6, 7);
+    Sentence e = new Sentence(this.jCas, 8, 9);
+    for (Sentence sentence : Arrays.asList(a, b, c, d, e)) {
+      sentence.addToIndexes();
+    }
+    AnalyzedText text = new AnalyzedText(this.jCas, 2, 3);
+    text.addToIndexes();
+
+    // uimaFIT: selectPreceding(this.jCas, Sentence.class, text, 1);
+    List<Sentence> preceding = jCas.select(Sentence.class).preceding(text).limit(1).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+    // uimaFIT: selectPreceding(this.jCas, Sentence.class, text, 2);
+    preceding = jCas.select(Sentence.class).preceding(text).limit(2).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+
+    // uimaFIT: selectFollowing(this.jCas, Sentence.class, text, 1);
+    List<Sentence> following = jCas.select(Sentence.class).following(text).limit(1).asList();
+    assertEquals(Arrays.asList("C"), JCasUtil.toText(following));
+    assertEquals(Arrays.asList(c), following);
+    // uimaFIT: selectFollowing(this.jCas, Sentence.class, text, 2);
+    following = jCas.select(Sentence.class).following(text).limit(2).asList();
+    assertEquals(Arrays.asList("C", "D"), JCasUtil.toText(following));
+    assertEquals(Arrays.asList(c, d), following);
+  }
+
+  @Test
+  public void testExists() throws UIMAException {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    // uimaFIT: exists(jcas, Token.class)
+    assertFalse(jcas.select(Token.class).findAny().isPresent());
+
+    new Token(jcas, 0, 1).addToIndexes();
+
+    // uimaFIT: exists(jcas, Token.class)
+    assertTrue(jcas.select(Token.class).findAny().isPresent());
+  }
+
+  @Test
+  public void testSelectSingle() throws UIMAException {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingle(jcas, Token.class)); 
+    
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jcas.select(Token.class).single()); 
+
+    new Token(jcas, 0, 1).addToIndexes();
+
+    // uimaFIT: selectSingle(jcas, Token.class);
+    jcas.select(Token.class).single();
+
+    new Token(jcas, 1, 2).addToIndexes();
+
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingle(jcas, Token.class))
+    //    .as("selectSingle must fail if there is more than one annotation of the type"); 
+
+    assertThatExceptionOfType(CASRuntimeException.class)
+      .isThrownBy(() -> jcas.select(Token.class).single())
+      .as("selectSingle must fail if there is more than one annotation of the type"); 
+  }
+
+  @Test
+  public void testSelectIsCovered() {
+    String text = "Will you come home today ? \n No , tomorrow !";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectCovered(Token.class, sentences.get(0)).size()
+    assertEquals(6, jCas.select(Token.class).coveredBy(sentences.get(0)).count());
+    // uimaFIT: selectCovered(Token.class, sentences.get(1)).size()
+    assertEquals(4, jCas.select(Token.class).coveredBy(sentences.get(1)).count());
+
+    // uimaFIT: contains(jCas, sentences.get(0), Token.class)
+    assertTrue(jCas.select(Token.class).coveredBy(sentences.get(0)).findAny().isPresent());
+    tokens.get(0).removeFromIndexes();
+    tokens.get(1).removeFromIndexes();
+    tokens.get(2).removeFromIndexes();
+    tokens.get(3).removeFromIndexes();
+    tokens.get(4).removeFromIndexes();
+    tokens.get(5).removeFromIndexes();
+    // uimaFIT: contains(jCas, sentences.get(0), Token.class)
+    assertFalse(jCas.select(Token.class).coveredBy(sentences.get(0)).findAny().isPresent());
+  }
+
+  @Test
+  public void testGetInternalUimaType() {
+    // uimaFIT: getType(jCas, Annotation.class);
+    Type t = jCas.getCasType(Annotation.class);
+    assertNotNull(t);
+  }
+
+  @Test
+  public void testGetView() throws Exception {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    assertNull(getView(jcas, "view1", null));
+    assertNotNull(getView(jcas, "view1", true));
+    assertNotNull(getView(jcas, "view1", null));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testGetNonExistingView() throws Exception {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+    assertNull(getView(jcas, "view1", false));
+  }
+
+  @Test
+  public void testGetType() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // uimaFIT: getType(jCas, Token.class).getName());
+    assertEquals(Token.class.getName(), jCas.getCasType(Token.class).getName());
+    // uimaFIT: getAnnotationType(jCas, Token.class).getName());
+    assertEquals(Token.class.getName(), jCas.getCasType(Token.class).getName());
+    // uimaFIT: getType(jCas, TOP.class).getName());
+    assertEquals("uima.cas.TOP", jCas.getCasType(TOP.class).getName());
+    // uimaFIT: getType(jCas, Annotation.class).getName());
+    assertEquals("uima.tcas.Annotation", jCas.getCasType(Annotation.class).getName());
+    // uimaFIT: getAnnotationType(jCas, Annotation.class).getName());
+    assertEquals("uima.tcas.Annotation", jCas.getCasType(Annotation.class).getName());
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testGetNonAnnotationType() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // There is no alternative in UIMA v3
+    getAnnotationType(jCas, TOP.class);
+  }
+
+  @Test
+  public void testIndexCovering() throws Exception {
+    String text = "Will you come home today ? \n No , tomorrow !";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+
+    Map<Token, List<Sentence>> index = indexCovering(jCas, Token.class, Sentence.class);
+
+    // Check covering annotations are found
+    assertEquals(asList(sentences.get(0)), index.get(tokens.get(0)));
+    assertEquals(asList(sentences.get(1)), index.get(tokens.get(tokens.size() - 1)));
+
+    // Check sentence 0 contains first token
+    assertTrue(index.get(tokens.get(0)).contains(sentences.get(0)));
+
+    // Check sentence 0 does not contain last token.
+    assertFalse(index.get(tokens.get(tokens.size() - 1)).contains(sentences.get(0)));
+
+    // Check the first token is contained in any sentence
+    assertTrue(!index.get(tokens.get(0)).isEmpty());
+    // After removing the annotation the index has to be rebuilt.
+    sentences.get(0).removeFromIndexes();
+    index = indexCovering(jCas, Token.class, Sentence.class);
+    // Check the first token is not contained in any sentence
+    assertFalse(!index.get(tokens.get(0)).isEmpty());
+  }
+  
+  @Test
+  public void testSelectAt() throws Exception {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token bc = new Token(this.jCas, 2, 5);
+    Token c = new Token(this.jCas, 4, 5);
+    Token c1 = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 4, 7);
+    Token cd = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, bc, c, c1, d, cd, e)) {
+      token.addToIndexes();
+    }
+
+    List<Token> tokensAt = selectAt(jCas, Token.class, c.getBegin(), c.getEnd());
+    
+    assertEquals(2, tokensAt.size());
+    assertEquals(c.getBegin(), tokensAt.get(0).getBegin());
+    assertEquals(c.getEnd(), tokensAt.get(0).getEnd());
+    assertEquals(c.getBegin(), tokensAt.get(1).getBegin());
+    assertEquals(c.getEnd(), tokensAt.get(1).getEnd());
+  }
+
+  @Test
+  public void testSelectSingleAt() throws Exception {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token bc = new Token(this.jCas, 2, 5);
+    Token c = new Token(this.jCas, 4, 5);
+    Token c1 = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 4, 7);
+    Token cd = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, bc, c, c1, d, cd, e)) {
+      token.addToIndexes();
+    }
+
+    try {
+      selectSingleAt(jCas, Token.class, c.getBegin(), c.getEnd());
+      fail("Expected exception not thrown");
+    }
+    catch (IllegalArgumentException ex) {
+      // Ignore.
+    }
+
+    try {
+      selectSingleAt(jCas, Token.class, 1, 4);
+      fail("Expected exception not thrown");
+    }
+    catch (IllegalArgumentException ex) {
+      // Ignore.
+    }
+
+    Token tokenAt = selectSingleAt(jCas, Token.class, b.getBegin(), b.getEnd());
+  
+    assertEquals(b.getBegin(), tokenAt.getBegin());
+    assertEquals(b.getEnd(), tokenAt.getEnd());
+  }
+}
diff --git a/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump b/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
index c5e54c3..915b808 100644
--- a/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
+++ b/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
@@ -2,7 +2,7 @@
 
 -------- View _InitialView begin ----------------------------------
 
-DocumentAnnotation
+DocumentAnnotation:10
    sofa: _InitialView
    begin: 0
    end: 89
@@ -11,52 +11,52 @@
 CAS-Text:
 This sentence is not annotated. But this sentences is annotated. And here every token is.
 [But this sentences is annotated. ]
-Sentence
+Sentence:2
    sofa: _InitialView
    begin: 32
    end: 65
 [And here every token is.]
-Sentence
+Sentence:9
    sofa: _InitialView
    begin: 65
    end: 89
 [And]
-Token
+Token:3
    sofa: _InitialView
    begin: 65
    end: 68
    pos: <null>
    stem: <null>
 [here]
-Token
+Token:4
    sofa: _InitialView
    begin: 69
    end: 73
    pos: <null>
    stem: <null>
 [every]
-Token
+Token:5
    sofa: _InitialView
    begin: 74
    end: 79
    pos: <null>
    stem: <null>
 [token]
-Token
+Token:6
    sofa: _InitialView
    begin: 80
    end: 85
    pos: <null>
    stem: <null>
 [is]
-Token
+Token:7
    sofa: _InitialView
    begin: 86
    end: 88
    pos: <null>
    stem: <null>
 [.]
-Token
+Token:8
    sofa: _InitialView
    begin: 88
    end: 89
@@ -64,6 +64,4 @@
    stem: <null>
 -------- View _InitialView end ----------------------------------
 
-======== CAS 0 end ==================================
-
-
+======== CAS 0 end ==================================
\ No newline at end of file
diff --git a/uimafit-core/src/test/resources/data/reference/test.xmi.dump b/uimafit-core/src/test/resources/data/reference/test.xmi.dump
index 6751fba..fa193bf 100644
--- a/uimafit-core/src/test/resources/data/reference/test.xmi.dump
+++ b/uimafit-core/src/test/resources/data/reference/test.xmi.dump
@@ -2,7 +2,7 @@
 
 -------- View _InitialView begin ----------------------------------
 
-DocumentAnnotation
+DocumentAnnotation:2
    sofa: _InitialView
    begin: 0
    end: 42
@@ -11,75 +11,75 @@
 CAS-Text:
 Me and all my friends are non-conformists.
 [Me and all my friends are non-conformists.]
-Sentence
+Sentence:13
    sofa: _InitialView
    begin: 0
    end: 42
 [Me]
-Token
+Token:3
    sofa: _InitialView
    begin: 0
    end: 2
    pos: "M"
    stem: "me"
 [and]
-Token
+Token:4
    sofa: _InitialView
    begin: 3
    end: 6
    pos: "A"
    stem: "and"
 [all]
-Token
+Token:5
    sofa: _InitialView
    begin: 7
    end: 10
    pos: "A"
    stem: "all"
 [my]
-Token
+Token:6
    sofa: _InitialView
    begin: 11
    end: 13
    pos: "M"
    stem: "my"
 [friends]
-Token
+Token:7
    sofa: _InitialView
    begin: 14
    end: 21
    pos: "F"
    stem: "friend"
 [are]
-Token
+Token:8
    sofa: _InitialView
    begin: 22
    end: 25
    pos: "A"
    stem: "are"
 [non]
-Token
+Token:9
    sofa: _InitialView
    begin: 26
    end: 29
    pos: "N"
    stem: "non"
 [-]
-Token
+Token:10
    sofa: _InitialView
    begin: 29
    end: 30
    pos: "-"
    stem: "-"
 [conformists]
-Token
+Token:11
    sofa: _InitialView
    begin: 30
    end: 41
    pos: "C"
    stem: "conformist"
 [.]
-Token
+Token:12
    sofa: _InitialView
    begin: 41
    end: 42
@@ -87,6 +87,4 @@
    stem: "."
 -------- View _InitialView end ----------------------------------
 
-======== CAS 0 end ==================================
-
-
+======== CAS 0 end ==================================
\ No newline at end of file
diff --git a/uimafit-core/src/test/resources/log4j.properties b/uimafit-core/src/test/resources/log4j.properties
deleted file mode 100644
index cd41466..0000000
--- a/uimafit-core/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-log4j.rootLogger=WARN,development
-
-log4j.appender.development=org.apache.log4j.ConsoleAppender
-log4j.appender.development.layout=org.apache.log4j.PatternLayout
-log4j.appender.development.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%C{1}) - %m%n
diff --git a/uimafit-core/src/test/resources/simplelogger.properties b/uimafit-core/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-core/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-cpe/.settings/org.eclipse.core.resources.prefs b/uimafit-cpe/.settings/org.eclipse.core.resources.prefs
index 839d647..29abf99 100644
--- a/uimafit-cpe/.settings/org.eclipse.core.resources.prefs
+++ b/uimafit-cpe/.settings/org.eclipse.core.resources.prefs
@@ -2,4 +2,5 @@
 encoding//src/main/java=UTF-8
 encoding//src/main/resources=UTF-8
 encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
 encoding/<project>=UTF-8
diff --git a/uimafit-cpe/pom.xml b/uimafit-cpe/pom.xml
index 6b81bb1..c94a115 100644
--- a/uimafit-cpe/pom.xml
+++ b/uimafit-cpe/pom.xml
@@ -1,45 +1,51 @@
 <?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
+  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
+  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.
+  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/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.1-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<artifactId>uimafit-cpe</artifactId>
-	<name>Apache UIMA uimaFIT - Collection Processing Engine support</name>
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.1-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-cpe</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-	</dependencies>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.1.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-cpe</artifactId>
+  <name>Apache UIMA uimaFIT - Collection Processing Engine support</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-cpe</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java b/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java
index 056cee2..7cce0b2 100644
--- a/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java
+++ b/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java
@@ -25,7 +25,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.uima.UIMAException;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.cas.CAS;
@@ -34,10 +33,10 @@
 import org.apache.uima.collection.EntityProcessStatus;
 import org.apache.uima.collection.StatusCallbackListener;
 import org.apache.uima.collection.metadata.CpeDescriptorException;
+import org.apache.uima.resource.ResourceInitializationException;
+import org.apache.uima.util.InvalidXMLException;
 import org.xml.sax.SAXException;
 
-/**
- */
 public final class CpePipeline {
   private CpePipeline() {
     // No instances
@@ -57,16 +56,23 @@
    * @throws SAXException
    *           if there was a XML-related problem materializing the component descriptors that are
    *           referenced from the CPE descriptor
+   * @throws InvalidXMLException
+   *           if there was a XML-related problem materializing the component descriptors that are
+   *           referenced from the CPE descriptor
    * @throws IOException
    *           if there was a I/O-related problem materializing the component descriptors that are
    *           referenced from the CPE descriptor
    * @throws CpeDescriptorException
    *           if there was a problem configuring the CPE descriptor
-   * @throws UIMAException
+   * @throws ResourceInitializationException
    *           if there was a problem initializing or running the CPE.
-   */  public static void runPipeline(final CollectionReaderDescription readerDesc,
+   * @throws AnalysisEngineProcessException
+   *           if there was a problem initializing or running the CPE.
+   */
+  public static void runPipeline(final CollectionReaderDescription readerDesc,
           final AnalysisEngineDescription... descs)
-          throws UIMAException, SAXException, CpeDescriptorException, IOException {
+          throws SAXException, CpeDescriptorException, IOException, ResourceInitializationException,
+          InvalidXMLException, AnalysisEngineProcessException {
 
     runPipeline(Math.max(1, getRuntime().availableProcessors() - 1), readerDesc, descs);
   }
@@ -90,12 +96,17 @@
    *           referenced from the CPE descriptor
    * @throws CpeDescriptorException
    *           if there was a problem configuring the CPE descriptor
-   * @throws UIMAException
+   * @throws ResourceInitializationException 
    *           if there was a problem initializing or running the CPE.
+   * @throws InvalidXMLException 
+   *           if there was a problem initializing or running the CPE.
+   * @throws AnalysisEngineProcessException 
+   *           if there was a problem running the CPE.
    */
   public static void runPipeline(final int parallelism,
           final CollectionReaderDescription readerDesc, final AnalysisEngineDescription... descs)
-          throws UIMAException, SAXException, CpeDescriptorException, IOException {
+          throws SAXException, CpeDescriptorException, IOException, ResourceInitializationException,
+          InvalidXMLException, AnalysisEngineProcessException {
     // Create AAE
     final AnalysisEngineDescription aaeDesc = createEngineDescription(descs);
 
diff --git a/uimafit-cpe/src/test/java/org/apache/uima/fit/cpe/ExternalResourceFactoryTest.java b/uimafit-cpe/src/test/java/org/apache/uima/fit/cpe/ExternalResourceFactoryTest.java
index 06826f0..cb08362 100644
--- a/uimafit-cpe/src/test/java/org/apache/uima/fit/cpe/ExternalResourceFactoryTest.java
+++ b/uimafit-cpe/src/test/java/org/apache/uima/fit/cpe/ExternalResourceFactoryTest.java
@@ -21,7 +21,7 @@
 
 import static java.util.Arrays.asList;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -57,7 +57,7 @@
 public class ExternalResourceFactoryTest {
   @Test
   public void testMultiBinding() throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc = createResourceDescription(ResourceWithAssert.class);
 
     // Binding external resource to each Annotator individually
     AnalysisEngineDescription aed1 = createEngineDescription(MultiBindAE.class,
@@ -77,8 +77,8 @@
   @SuppressWarnings("javadoc")
   @Test
   public void testMultiValue() throws Exception {
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(MultiValuedResourceAE.class,
             MultiValuedResourceAE.RES_RESOURCE_ARRAY, asList(extDesc1, extDesc2));
@@ -94,8 +94,8 @@
   public void testMultiValue2() throws Exception {
     MultiValuedResourceAE.resources.clear();
 
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(
             createEngineDescription(MultiValuedResourceAE.class,
@@ -118,8 +118,8 @@
   public void testMultiValue3() throws Exception {
     MultiValuedResourceAE.resources.clear();
 
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
     AnalysisEngineDescription aed = createEngineDescription(
             createEngineDescription(MultiValuedResourceAE.class,
@@ -140,17 +140,17 @@
   @SuppressWarnings("javadoc")
   @Test
   public void testMultiValue4() throws Exception {
-    ExternalResourceDescription extDesc1 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc2 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc1 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc2 = createResourceDescription(ResourceWithAssert.class);
 
-    ExternalResourceDescription extDesc3 = createExternalResourceDescription(ResourceWithAssert.class);
-    ExternalResourceDescription extDesc4 = createExternalResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc3 = createResourceDescription(ResourceWithAssert.class);
+    ExternalResourceDescription extDesc4 = createResourceDescription(ResourceWithAssert.class);
 
-    ExternalResourceDescription mv1 = createExternalResourceDescription(MultiValuedResource.class,
+    ExternalResourceDescription mv1 = createResourceDescription(MultiValuedResource.class,
             MultiValuedResource.RES_RESOURCE_LIST, new ExternalResourceDescription[] { extDesc1,
                 extDesc2 });
 
-    ExternalResourceDescription mv2 = createExternalResourceDescription(MultiValuedResource.class,
+    ExternalResourceDescription mv2 = createResourceDescription(MultiValuedResource.class,
             MultiValuedResource.RES_RESOURCE_LIST, new ExternalResourceDescription[] { extDesc3,
                 extDesc4 });
 
@@ -294,7 +294,7 @@
       List<String> params = new ArrayList<String>(Arrays.asList(aParams));
       params.add(AnnotatedDataResource.PARAM_EXTENSION);
       params.add(extension);
-      ExternalResourceDescription desc = ExternalResourceFactory.createExternalResourceDescription(
+      ExternalResourceDescription desc = ExternalResourceFactory.createNamedResourceDescription(
               null, AnnotatedDataResource.class, params.toArray(new String[params.size()]));
       return (DataResource) UIMAFramework.produceResource(desc.getResourceSpecifier(), null);
     }
diff --git a/uimafit-cpe/src/test/resources/simplelogger.properties b/uimafit-cpe/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-cpe/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-doc/pom.xml b/uimafit-doc/pom.xml
index e044c7a..ce2d03b 100644
--- a/uimafit-doc/pom.xml
+++ b/uimafit-doc/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <artifactId>uimafit-doc</artifactId>
diff --git a/uimafit-doc/src/main/asciidoc/tools.uimafit.externalresources.adoc b/uimafit-doc/src/main/asciidoc/tools.uimafit.externalresources.adoc
index 3edc63a..1621fa0 100644
--- a/uimafit-doc/src/main/asciidoc/tools.uimafit.externalresources.adoc
+++ b/uimafit-doc/src/main/asciidoc/tools.uimafit.externalresources.adoc
@@ -176,7 +176,7 @@
 Because we only use a single description, also only a single instance of the external resource is created and shared between the two engines. 
 [source,java]
 ----
-ExternalResourceDescription extDesc = createExternalResourceDescription(
+ExternalResourceDescription extDesc = createSharedResourceDescription(
   SharedModel.class, new File("somemodel.bin"));
 		
 // Binding external resource to each Annotator individually
diff --git a/uimafit-doc/src/main/asciidoc/tools.uimafit.migration.adoc b/uimafit-doc/src/main/asciidoc/tools.uimafit.migration.adoc
index e4e87cd..c6b11e1 100644
--- a/uimafit-doc/src/main/asciidoc/tools.uimafit.migration.adoc
+++ b/uimafit-doc/src/main/asciidoc/tools.uimafit.migration.adoc
@@ -20,6 +20,91 @@
 
 This section provides helpful information on incompatible changes between versions.
 
+== Version 3.0.x to 3.1.x
+
+.Changes to ExternalResourceFactory
+The renaming of methods in the `ExternalResourceFactory` had unfortunately introduced another name
+clash between unrelated methods. To fix this clash, the following methods have been renamed from 
+`bindResource` to `bindResourceOnce`:
+
+* `void bindResource(ResourceCreationSpecifier aDesc, String aBindTo, ExternalResourceDescription aRes)` 
+  was *removed* and replaced by
+  `void bindResourceOnce(ResourceCreationSpecifier aDesc, String aBindTo, ExternalResourceDescription aRes)`
+* `void bindResource(ExternalResourceDescription aRes, String aBindTo, ExternalResourceDescription aNestedRes)`
+  was deprecated and replaced by
+  `void bindResourceOnce(ExternalResourceDescription aRes, String aBindTo, ExternalResourceDescription aNestedRes)`
+* `void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo, ExternalResourceDescription aRes)`
+  was deprecated and replaced by
+  `void bindResourceOnce(ResourceManagerConfiguration aResMgrCfg, String aBindTo, ExternalResourceDescription aRes)`
+* `void bindResource(ResourceCreationSpecifier aDesc, String aBindTo, String aRes)`
+  was *removed* and replaced by
+  `void bindResourceOnceWithoutNested(ResourceCreationSpecifier aDesc, String aBindTo, String aRes)`
+* `void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo, String aRes)`
+  was deprecated and replaced by
+  `void bindResourceOnceWithoutNested(ResourceManagerConfiguration aResMgrCfg, String aBindTo, String aRes)`
+* `void bindResource(ResourceSpecifier aDesc, String aKey, String aUrl)`
+  was deprecated and replaced by
+  `void bindResourceUsingUrl(ResourceSpecifier aDesc, String aKey, String aUrl)`
+
+== Version 2.x to 3.x
+
+.Legacy support module removed
+The legacy support in uimaFIT 2.x was present allow being compatible with the pre-Apache uimaFIT 
+versions which were based on UIMA 2.x. Since uimaFIT 3.x is not  compatible with UIMA 2.x anyway,
+the legacy module was removed now.
+
+.Using List instead of Collection
+The `CasUtil`, `JCasUtil` and `FSCollectionFactory` classes were adjusted to return results using `List`
+instead of the more general `Collection`. Often, lists are already used internally and then again
+wrapped into new lists in client code. This API change avoids this in the future.
+
+.Throwing specific exceptions instead of UIMAException
+Several uimaFIT methods were throwing the generic `UIMAException`. These have been adjusted to
+declare throwing several of the sub-types of `UIMAException` to be better able to handle specific
+causes of errors in client code.
+
+.CasUtil.selectSingle signature changed
+Signature of `CasUtil.selectSingle` has been changed to return `AnnotationFS`. The original signature
+is available as `selectSingleFS`
+
+.Removal of deprecated methods
+Various methods that were deprecated in uimaFIT 2.4.0 or earlier have been removed in this release.
+For details, please refer to the `api-change-report.html` file included in the release.
+
+.Changes to ExternalResourceFactory
+Most methods in the `ExternalResourceFactory` have seen changes to their names and signature to avoid
+problematic ambiguities as well as to be shorter. In general, the `External` component of the method
+names was either removed or replaced. So most methods called `createExternalResourceDescription`
+are now called `createResourceDescription`. However, some have also been given a more specific name
+and/or a slightly different order of parameters. For example, this method
+
+[source,java]
+----
+public static ExternalResourceDescription createExternalResourceDescription(
+  Class<? extends SharedResourceObject> aInterface, String aUrl, Object... aParams)
+----
+
+was changed to
+
+
+[source,java]
+----
+public static ExternalResourceDescription createSharedResourceDescription(
+  String aUrl, Class< extends SharedResourceObject> aInterface, Object... aParams)
+----
+
+.Changes to logging
+UIMA v3 has is using SLF4J. As a consequence, the `ExtendedLogger` which uimaFIT had returned on
+calls to `getLogger()` has been removed and instead the regular UIMA v3 logger class is returned
+which offers methods quite compatible with what `ExtendedLogger` offered before. However, it is
+recommended that you go through all your logging calls and replace calls which use string
+concatenation to construct the logging message with corresponding calls using placeholders. For
+example, replace `getLogger().error("Cannot access " + filename, exception);` with 
+`getLogger().error("Cannot access {}", filename, exception);`.
+
+.Version requirements
+Depends on UIMA 3.0.2, Spring Framework 4.3.22 and Java 8.
+
 == Version 2.3.0 to 2.4.0
 
 .Version requirements
@@ -118,72 +203,3 @@
 .JCasFactory
 Methods only loading JCas data have been removed from ``JCasFactory``.
 The new methods in `CasIOUtil` can be used instead.
-
-== Legacy support module
-
-The compatibility layer should allow you to migrate to uimaFIT without breaking anything.
-You should then be able to gradually change the codebase to be compatible with uimaFIT .
-As far as my tests go, uimaFIT 1.x and can coexist peacefully on the classpath (and indeed both need to be on the classpath in order to use the legacy support module).
-
-To enable the legacy support, make sure that you have a dependency on uimaFIT 1.x and then just add a dependency on the legacy module:
-
-[source]
-----
-<dependency>
-  <groupId>org.uimafit</groupId>
-  <artifactId>uimafit</artifactId>
-  <version>1.4.0</version>
-</dependency>
-<dependency>
-  <groupId>org.apache.uima</groupId>
-  <artifactId>uimafit-legacy-support</artifactId>
-  <version></version>
-</dependency>
-----
-
-uimaFIT automatically detects the presence of the legacy module and uses it - no additional configuration is necessary.
-
-The following bash script may help to partially automatize the source code migration process.
-Please observe that it does not cover all of the necessary changes!
-
-[NOTE]
-====
-The script recursively changes all files under the current working directory! Make sure you are in the right directory before running it! _Use the script at your own 
-      risk!_
-====
-
-[source,bash]
-----
-#!/bin/sh
-
-############################################
-# MAKE SURE TO BACKUP YOUR FILES FIRST!
-# SCRIPT RECURSIVELY CHANGES ALL JAVA FILES!
-# USE AT YOUR OWN RISK!
-############################################
-
-# Change of package names
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/org.uimafit/org.apache.uima.fit/g'
-
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/org.uimafit.component.xwriter.CASDumpWriter/\
-org.apache.uima.fit.component.CasDumpWriter/g'
-
-# AnalysisEngineFactory
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/createAggregate/createEngine/g'
-
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/createPrimitive/createEngine/g'
-
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/createAnalysisEngine/createEngine/g'
-
-# Readers
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/createDescription/createReaderDescription/g'
-
-find . -name '*.java' -print | 
-xargs perl -p -i -e 's/createCollectionReader/createReader/g'
-----
\ No newline at end of file
diff --git a/uimafit-docbook/pom.xml b/uimafit-docbook/pom.xml
new file mode 100644
index 0000000..fe4ec9b
--- /dev/null
+++ b/uimafit-docbook/pom.xml
@@ -0,0 +1,36 @@
+<?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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.1.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-docbook</artifactId>
+  <name>Apache UIMA uimaFIT - Documentation</name>
+  <packaging>pom</packaging>
+  <properties>
+    <uimaScmProject>${project.artifactId}</uimaScmProject>
+    <bookNameRoot>tools.uimafit.book</bookNameRoot>
+    <maven.deploy.skip>true</maven.deploy.skip>
+  </properties>
+</project>
\ No newline at end of file
diff --git a/uimafit-docbook/src/docbook/tools.uimafit.configurationparameters.xml b/uimafit-docbook/src/docbook/tools.uimafit.configurationparameters.xml
new file mode 100644
index 0000000..11a9040
--- /dev/null
+++ b/uimafit-docbook/src/docbook/tools.uimafit.configurationparameters.xml
@@ -0,0 +1,185 @@
+<!--
+	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.
+-->
+<chapter id="ugr.tools.uimafit.configurationparameters">
+  <title>Configuration Parameters</title>
+  <para>uimaFIT defines the <classname>@ConfigurationParameter</classname> annotation which can be
+    used to annotate the fields of an analysis engine or collection reader. The purpose of this
+    annotation is twofold:<itemizedlist>
+      <listitem>
+        <para>injection of parameters from the UIMA context into fields</para>
+      </listitem>
+      <listitem>
+        <para>declaration of parameter metadata (mandatory, default value, description) which can be
+          used to generate XML descriptors</para>
+      </listitem>
+    </itemizedlist>In a regular UIMA component, parameters need to be manually extracted from the
+    UIMA context, typically requiring a type cast. </para>
+  <programlisting format="linespecific">class MyAnalysisEngine extends CasAnnotator_ImplBase {
+  public static final String PARAM_SOURCE_DIRECTORY = "sourceDirectory";
+  private File sourceDirectory;
+
+  public void initialize(UimaContext context) 
+      throws ResourceInitializationException {
+
+    sourceDirectory = new File((String) context.getConfigParameterValue(
+      PARAM_SOURCE_DIRECTORY));
+  }
+}</programlisting>
+  <para>The component has no way to declare a default value or to declare if a parameter is optional
+    or mandatory. In addition, any documentation needs to be maintained in !JavaDoc and in the XML
+    descriptor for the component.</para>
+  <para>With uimaFIT, all this information can be declared in the component using the
+      <classname>@ConfigurationParameter</classname> annotation.<table frame="all">
+      <title><classname>@ConfigurationParameter</classname> annotation</title>
+      <tgroup cols="3">
+        <colspec colname="c1" colnum="1" colwidth="1.0*"/>
+        <colspec colname="c2" colnum="2" colwidth="1*"/>
+        <colspec colname="c3" colnum="3" colwidth="1.0*"/>
+        <thead>
+          <row>
+            <entry>Parameter</entry>
+            <entry>Description</entry>
+            <entry>Default</entry>
+          </row>
+        </thead>
+        <tbody>
+          <row>
+            <entry>name</entry>
+            <entry>parameter name</entry>
+            <entry>name of annotated field</entry>
+          </row>
+          <row>
+            <entry>description</entry>
+            <entry>description of the parameter</entry>
+            <entry/>
+          </row>
+          <row>
+            <entry>mandatory</entry>
+            <entry>whether a non-null value must be specified </entry>
+            <entry>true</entry>
+          </row>
+          <row>
+            <entry>defaultValue</entry>
+            <entry>the default value if no value is specified</entry>
+            <entry/>
+          </row>
+        </tbody>
+      </tgroup>
+    </table></para>
+  <programlisting>class MyAnalysisEngine 
+    extends org.apache.uima.fit.component.CasAnnotator_ImplBase {
+
+  /**
+   * Directory to read the data from.
+   */
+  public static final String PARAM_SOURCE_DIRECTORY = "sourceDirectory";
+  @ConfigurationParameter(name=PARAM_SOURCE_DIRECTORY, defaultValue=".")
+  private File sourceDirectory;
+}</programlisting>
+  <para>Note, that it is no longer necessary to implement the <methodname>initialize()</methodname>
+    method. uimaFIT takes care of locating the parameter <parameter>sourceDirectory</parameter> in
+    the UIMA context. It recognizes that the <classname>File</classname> class has a
+      <classname>String</classname> constructor and uses that to instantiate a new
+      <classname>File</classname> object from the parameter. A parameter is mandatory unless
+    specified otherwise. If a mandatory parameter is not specified in the context, an exception is
+    thrown.</para>
+  <para>The <parameter>defaultValue</parameter> is used when generating an UIMA component
+    description from the class. It should be pointed out in particular, that uimaFIT does not make
+    use of the default value when injecting parameters into fields. For this reason, it is possible
+    to have a parameter that is mandatory but does have a default value. The default value is used
+    as a parameter value when a component description is generated via the uimaFIT factories unless
+    a parameter is specified in the factory call. If a component description in created manually
+    without specifying a value for a mandatory parameter, uimaFIT will generate an exception.</para>
+  <note>
+    <para>You can use the <emphasis>enhance</emphasis> goal of the uimaFIT Maven plugin to pick up
+      the parameter description from the JavaDoc and post it to the
+        <parameter>description</parameter> field of the
+        <classname>@ConfigurationParameter</classname> annotation. This should be preferred to
+      specifying the description explicitly as part of the annotation.</para>
+  </note>
+  <para>The parameter injection mechanism is implemented in the
+      <classname>ConfigurationParameterInitializer</classname> class. uimaFIT provides several base
+    classes that already come with an <methodname>initialize()</methodname> method using the
+    initializer:</para>
+  <itemizedlist>
+    <listitem>
+      <para><classname>CasAnnotator_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>CasCollectionReader_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>CasConsumer_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>CasFlowController_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>CasMultiplier_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>JCasAnnotator_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>JCasCollectionReader_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>JCasConsumer_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>JCasFlowController_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>JCasMultiplier_ImplBase</classname></para>
+    </listitem>
+    <listitem>
+      <para><classname>Resource_ImplBase</classname></para>
+    </listitem>
+  </itemizedlist>
+  <para>The <classname>ConfigurationParameterInitializer</classname> can also be used with shared
+    resources:</para>
+  <programlisting>class MySharedResourceObject implements SharedResourceObject {
+  public static final String PARAM_VALUE = "Value";
+  @ConfigurationParameter(name = PARAM_VALUE, mandatory = true)
+  private String value;
+
+  public void load(DataResource aData)
+      throws ResourceInitializationException {
+
+    ConfigurationParameterInitializer.initialize(this, aData);
+  }
+}</programlisting>
+  <para>Fields that can be annotated with the <classname>@ConfigurationParameter</classname>
+    annotation are any array or collection types (including if they are only typed via interfaces
+    such as <type>List</type> or <type>Set</type>) of primitive types (<type>int</type>,
+      <type>boolean</type>, <type>float</type>, <type>double</type>). Enum types, as well as, 
+      fields of the types 
+      <classname>Charset</classname>, 
+      <classname>File</classname>, 
+      <classname>Locale</classname>, 
+      <classname>Pattern</classname>,
+      <classname>URI</classname>, and
+      <classname>URL</classname> can also be used. 
+      These can be initialized either using an object value (e.g. <code>StandardChartsets.UTF_8</code>)
+      or a string value (e.g. <code>"UTF-8"</code>).
+      Additionally it is possible to inject any fields of types that define a constructor accepting
+      a single <classname>String</classname>. These must be initialized from a string value.</para>
+  <para>Multi-valued parameters can be initialized from single values without having to wrap these
+      into a container.</para>
+</chapter>
diff --git a/uimafit-docbook/src/docbook/tools.uimafit.externalresources.xml b/uimafit-docbook/src/docbook/tools.uimafit.externalresources.xml
new file mode 100644
index 0000000..0d264e5
--- /dev/null
+++ b/uimafit-docbook/src/docbook/tools.uimafit.externalresources.xml
@@ -0,0 +1,321 @@
+<!--
+	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.
+-->
+<chapter id="ugr.tools.uimafit.externalresources">
+  <title>External Resources</title>
+  <para>An analysis engine often uses some data model. This may be as simple as word frequency
+    counts or as complex as the model of a parser. Often these models can become quite large. If an
+    analysis engine is deployed multiple times in the same pipeline or runs on multiple CPU cores,
+    memory can be saved by using a shared instance of the data model. UIMA supports such a scenario
+    by so-called external resources. The following sections illustrates how external resources can
+    be used with uimaFIT.</para>
+  <para>First create a class for the shared data model. Usually this class would load its data from
+    some URI and then expose it via its methods. An example would be to load word frequency counts
+    and to provide a <methodname>getFrequency()</methodname> method. In our simple example we do not
+    load anything from the provided URI - we just offer a method to get the URI from which data be
+    loaded.</para>
+  <programlisting>// Simple model that only stores the URI it was loaded from. Normally data
+// would be loaded from the URI instead and made accessible through methods
+// in this class. This simple example only allows accessing the URI.
+public static final class SharedModel implements SharedResourceObject {
+  private String uri;
+
+  public void load(DataResource aData) 
+      throws ResourceInitializationException {
+
+    uri = aData.getUri().toString();
+  }
+
+  public String getUri() { return uri; }
+}</programlisting>
+  <section>
+    <title>Resource injection</title>
+    <section>
+      <title>Regular UIMA components</title>
+      <para>When an external resource is used in a regular UIMA component, it is usually fetched
+        from the context, cast and copied to a class member variable.</para>
+      <programlisting>class MyAnalysisEngine extends CasAnnotator_ImplBase {
+  final static String MODEL_KEY = "Model";
+  private SharedModel model;
+
+  public void initialize(UimaContext context) 
+      throws ResourceInitializationException {
+
+    configuredResource = (SharedModel) 
+      getContext().getResourceObject(MODEL_KEY);
+  }
+}</programlisting>
+      <para>uimaFIT can be used to inject external resources into such traditional components using
+        the <methodname>createDependencyAndBind()</methodname> method. To show that this works with
+        any off-the-shelf UIMA component, the following example uses uimaFIT to configure the
+        OpenNLP Tokenizer:</para>
+      <programlisting>// Create descriptor
+AnalysisEngineDescription tokenizer = createEngineDescription(
+  Tokenizer.class,
+  UimaUtil.TOKEN_TYPE_PARAMETER, Token.class.getName(),
+  UimaUtil.SENTENCE_TYPE_PARAMETER, Sentence.class.getName());
+
+// Create the external resource dependency for the model and bind it
+createDependencyAndBind(tokenizer, UimaUtil.MODEL_PARAMETER,
+  TokenizerModelResourceImpl.class,
+  "http://opennlp.sourceforge.net/models-1.5/en-token.bin");</programlisting>
+      <note>
+        <para>We recommend declaring parameter constants in the classes that use them, e.g. here
+        in  <classname>Tokenizer</classname>. This way, the parameters for a class can be found
+        easily. However, OpenNLP declares parameters centrally in <classname>UimaUtil</classname>.
+        Thus, the example above is correct, although unconvential.</para>
+      </note>
+      <note>
+        <para>Note that uimaFIT is unable to perform type-coercion on parameters if a descriptor
+          is created from a class that does not contain <classname>@ConfigurationParameter</classname>
+          annotations, such as the OpenNLP <classname>Tokenizer</classname>. Such a descriptor does
+          not contain any parameter declarations! However, it is
+          still possible to configure such a component using uimaFIT by passing exactly the expected
+          types as parameter values. Thus, we need use the <methodname>getName()</methodname> method 
+          to get the class name as a string, instead of simply passing the class itself. Also, setting
+          multi-valued parameter from a list or single value does not work here. Multi-values parameters
+          must be passed as an array of the required type. Only the default UIMA types are possible:
+          <type>String</type>, <type>boolean</type>, <type>int</type>, and <type>float</type>.</para>
+      </note>
+    </section>
+    <section>
+      <title>uimaFIT-aware components</title>
+      <para>uimaFIT provides the <classname>@ExternalResource</classname> annotation to inject
+        external resources directly into class member variables.</para>
+      <table frame="all">
+        <title><classname>@ExternalResource</classname> annotation</title>
+        <tgroup cols="3">
+          <colspec colname="c1" colnum="1" colwidth="1.0*"/>
+          <colspec colname="c2" colnum="2" colwidth="1.0*"/>
+          <colspec colname="c3" colnum="3" colwidth="1.0*"/>
+          <thead>
+            <row>
+              <entry>Parameter</entry>
+              <entry>Description</entry>
+              <entry>Default</entry>
+            </row>
+          </thead>
+          <tbody>
+            <row>
+              <entry>key</entry>
+              <entry>Resource key</entry>
+              <entry>field name</entry>
+            </row>
+            <row>
+              <entry>api</entry>
+              <entry>Used when the external resource type is different from the field type, e.g.
+                when using an ExternalResourceLocator</entry>
+              <entry>field type</entry>
+            </row>
+            <row>
+              <entry>mandatory</entry>
+              <entry>Whether a value must be specified</entry>
+              <entry>true</entry>
+            </row>
+          </tbody>
+        </tgroup>
+      </table>
+      <programlisting>// Example annotator that uses the SharedModel. In the process() we only
+// test if the model was properly initialized by uimaFIT
+public static class Annotator 
+    extends org.apache.uima.fit.component.JCasAnnotator_ImplBase {
+
+  final static String MODEL_KEY = "Model";
+  @ExternalResource(key = MODEL_KEY)
+  private SharedModel model;
+
+  public void process(JCas aJCas) throws AnalysisEngineProcessException {
+    assertTrue(model.getUri().endsWith("gene_model_v02.bin"));
+    // Prints the instance ID to the console - this proves the same
+    // instance of the SharedModel is used in both Annotator instances.
+    System.out.println(model);
+  }
+}</programlisting>
+      <para>Note, that it is no longer necessary to implement the
+          <methodname>initialize()</methodname> method. uimaFIT takes care of locating the external
+        resource <parameter>Model</parameter> in the UIMA context and assigns it to the field
+          <varname>model</varname>. If a mandatory resource is not present in the context, an
+        exception is thrown.</para>
+      <para>The resource injection mechanism is implemented in the
+          <classname>ExternalResourceInitializer</classname> class. uimaFIT provides several base
+        classes that already come with an <methodname>initialize()</methodname> method using the
+        initializer:</para>
+      <itemizedlist>
+        <listitem>
+          <para><classname>CasAnnotator_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>CasCollectionReader_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>CasConsumer_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>CasFlowController_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>CasMultiplier_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>JCasAnnotator_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>JCasCollectionReader_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>JCasConsumer_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>JCasFlowController_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>JCasMultiplier_ImplBase</classname></para>
+        </listitem>
+        <listitem>
+          <para><classname>Resource_ImplBase</classname></para>
+        </listitem>
+      </itemizedlist>
+      <para>When building a pipeline, external resources can be set of a component just like
+        configuration parameters. External resources and configuration parameters can be mixed and
+        appear in any order when creating a component description.</para>
+      <para>Note that in the following example, we create only one external resource description and
+        use it to configure two different analysis engines. Because we only use a single
+        description, also only a single instance of the external resource is created and shared
+        between the two engines.
+        <programlisting>ExternalResourceDescription extDesc = createSharedResourceDescription(
+  SharedModel.class, new File("somemodel.bin"));
+		
+// Binding external resource to each Annotator individually
+AnalysisEngineDescription aed1 = createEngineDescription(
+  Annotator.class,
+  Annotator.MODEL_KEY, extDesc);
+
+AnalysisEngineDescription aed2 = createEngineDescription(
+  Annotator.class,
+  Annotator.MODEL_KEY, extDesc);
+
+// Check the external resource was injected
+AnalysisEngineDescription aaed = createEngineDescription(aed1, aed2);
+AnalysisEngine ae = createEngine(aaed);
+ae.process(ae.newJCas());</programlisting></para>
+      <para>This example is given as a full JUnit-based example in the the
+          <emphasis>uimaFIT-examples</emphasis> project.</para>
+    </section>
+    <section>
+      <title>Resources extending Resource_ImplBase</title>
+      <para>One kind of resources extend <classname>Resource_ImplBase</classname>. These are the
+        easiest to handle, because uimaFIT's version of <classname>Resource_ImplBase</classname>
+        already implements the necessary logic. Just be sure to call
+          <methodname>super.initialize()</methodname> when overriding
+          <methodname>initialize()</methodname>. Also mind that external resources are not available
+        yet when <methodname>initialize()</methodname> is called. For any initialization logic that
+        requires resources, override and implement
+          <methodname>afterResourcesInitialized()</methodname>. Other than that, injection of
+        external resources works as usual.</para>
+      <programlisting>public static class ChainableResource extends Resource_ImplBase {
+  public final static String PARAM_CHAINED_RESOURCE = "chainedResource";
+  @ExternalResource(key = PARAM_CHAINED_RESOURCE)
+  private ChainableResource chainedResource;
+
+  public void afterResourcesInitialized() {
+    // init logic that requires external resources
+  }
+}</programlisting>
+    </section>
+    <section>
+      <title>Resources implementing SharedResourceObject</title>
+      <para>The other kind of resources implement
+          <interfacename>SharedResourceObject</interfacename>. Since this is an interface, uimaFIT
+        cannot provide the initialization logic, so you have to implement a couple of things in the
+        resource:</para>
+      <itemizedlist>
+        <listitem>
+          <para>implement <interfacename>ExternalResourceAware</interfacename></para>
+        </listitem>
+        <listitem>
+          <para>declare a configuration parameter
+              <constant>ExternalResourceFactory.PARAM_RESOURCE_NAME</constant> and return its value
+            in <methodname>getResourceName()</methodname></para>
+        </listitem>
+        <listitem>
+          <para>invoke <methodname>ConfigurationParameterInitializer.initialize()</methodname> in
+            the <methodname>load()</methodname> method.</para>
+        </listitem>
+      </itemizedlist>
+      <para>Again, mind that external resource not properly initialized until uimaFIT invokes
+          <methodname>afterResourcesInitialized()</methodname>.</para>
+      <programlisting>public class TestSharedResourceObject implements 
+    SharedResourceObject, ExternalResourceAware {
+
+  @ConfigurationParameter(name=ExternalResourceFactory.PARAM_RESOURCE_NAME)
+  private String resourceName;
+
+  public final static String PARAM_CHAINED_RESOURCE = "chainedResource";
+  @ExternalResource(key = PARAM_CHAINED_RESOURCE)
+  private ChainableResource chainedResource;
+
+  public String getResourceName() {
+    return resourceName;
+  }
+
+  public void load(DataResource aData) 
+      throws ResourceInitializationException {
+
+    ConfigurationParameterInitializer.initialize(this, aData);
+    // rest of the init logic that does not require external resources
+  }
+
+  public void afterResourcesInitialized() {
+   // init logic that requires external resources
+  }
+}</programlisting>
+    </section>
+    <section>
+      <title>Note on injecting resources into resources</title>
+      <para>Nested resources are only initialized if they are used in a pipeline which contains at
+        least one component that calls
+          <methodname>ConfigurationParameterInitializer.initialize()</methodname>. Any component
+        extending uimaFIT's component base classes qualifies. If you use nested resources in a
+        pipeline without any uimaFIT-aware components, you can just add uimaFIT's
+          <classname>NoopAnnotator</classname> to the pipeline.</para>
+    </section>
+  </section>
+  <section>
+    <title>Resource locators</title>
+    <para>Normally, in UIMA an external resource needs to implement either
+        <interfacename>SharedResourceObject</interfacename> or
+        <interfacename>Resource</interfacename>. In order to inject arbitrary objects, uimaFIT has
+      the concept of <interfacename>ExternalResourceLocator</interfacename>. When a resource
+      implements this interface, not the resource itself is injected, but the method
+        <methodname>getResource()</methodname> is called on the resource and the result is injected.
+      The following example illustrates how to inject an object from JNDI into a UIMA
+      component:</para>
+    <programlisting>class MyAnalysisEngine2 extends JCasAnnotator_ImplBase {
+  static final String RES_DICTIONARY = "dictionary";
+  @ExternalResource(key = RES_DICTIONARY)
+  Dictionary dictionary;
+}
+
+AnalysisEngineDescription desc = createEngineDescription(
+  MyAnalysisEngine2.class);
+
+bindResource(desc, MyAnalysisEngine2.RES_DICTIONARY, 
+  JndiResourceLocator.class,
+  JndiResourceLocator.PARAM_NAME, "dictionaries/german");</programlisting>
+  </section>
+</chapter>
diff --git a/uimafit-docbook/src/docbook/tools.uimafit.migration.xml b/uimafit-docbook/src/docbook/tools.uimafit.migration.xml
new file mode 100644
index 0000000..8a3091b
--- /dev/null
+++ b/uimafit-docbook/src/docbook/tools.uimafit.migration.xml
@@ -0,0 +1,273 @@
+<!--
+	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.
+-->
+<chapter id="ugr.tools.uimafit.migration">
+  <title>Migration Guide</title>
+  <para>This section provides helpful information on incompatible changes between versions.</para>
+  <section>
+    <title>Version 3.0.x to 3.1.x</title>
+    <formalpara>
+      <title>Changes to ExternalResourceFactory</title>
+      <para>The renaming of methods in the <literal>ExternalResourceFactory</literal> had
+      unfortunately introduced another name clash between unrelated methods. To fix this
+      clash, the following methods have been renamed from <literal>bindResource</literal> to 
+      <literal>bindResourceOnce</literal>:
+        <itemizedlist>
+          <listitem><para>
+            <literal>void bindResource(ResourceCreationSpecifier aDesc, String aBindTo, ExternalResourceDescription aRes)</literal>
+            was <emphasis role="strong">removed</emphasis> and replaced by
+            <literal>void bindResourceOnce(ResourceCreationSpecifier aDesc, String aBindTo, ExternalResourceDescription aRes)</literal>
+          </para></listitem>
+          <listitem><para>
+            <literal>void bindResource(ExternalResourceDescription aRes, String aBindTo, ExternalResourceDescription aNestedRes)</literal>
+            was deprecated and replaced by
+            <literal>void bindResourceOnce(ExternalResourceDescription aRes, String aBindTo, ExternalResourceDescription aNestedRes)</literal>
+          </para></listitem>
+          <listitem><para>
+            <literal>void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo, ExternalResourceDescription aRes)</literal>
+            was deprecated and replaced by
+            <literal>void bindResourceOnce(ResourceManagerConfiguration aResMgrCfg, String aBindTo, ExternalResourceDescription aRes)</literal>
+          </para></listitem>
+          <listitem><para>
+            <literal>void bindResource(ResourceCreationSpecifier aDesc, String aBindTo, String aRes)</literal>
+            was <emphasis role="strong">removed</emphasis> and replaced by
+            <literal>void bindResourceOnceWithoutNested(ResourceCreationSpecifier aDesc, String aBindTo, String aRes)</literal>
+          </para></listitem>
+          <listitem><para>
+            <literal>void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo, String aRes)</literal>
+            was deprecated and replaced by
+            <literal>void bindResourceOnceWithoutNested(ResourceManagerConfiguration aResMgrCfg, String aBindTo, String aRes)</literal>
+          </para></listitem>
+          <listitem><para>
+            <literal>void bindResource(ResourceSpecifier aDesc, String aKey, String aUrl)</literal>
+            was deprecated and replaced by
+            <literal>void bindResourceUsingUrl(ResourceSpecifier aDesc, String aKey, String aUrl)</literal>
+          </para></listitem>
+        </itemizedlist>
+      </para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 2.x to 3.x</title>
+    <formalpara>
+      <title>Legacy support module removed</title>
+      <para>The legacy support in uimaFIT 2.x was present allow being compatible with the
+      pre-Apache uimaFIT versions which were based on UIMA 2.x. Since uimaFIT 3.x is not 
+      compatible with UIMA 2.x anyway, the legacy module was removed now.</para>
+    </formalpara>
+    <formalpara>
+      <title>Using List instead of Collection</title>
+      <para>The <literal>CasUtil</literal>, <literal>JCasUtil</literal> and 
+      <literal>FSCollectionFactory</literal> classes were adjusted to return results
+      using <literal>List</literal> instead of the more general <literal>Collection</literal>. 
+      Often, lists are already used internally and then again wrapped into new lists in client 
+      code. This API change avoids this in the future.</para>
+    </formalpara>
+    <formalpara>
+      <title>Throwing specific exceptions instead of UIMAException</title>
+      <para>Several uimaFIT methods were throwing the generic <literal>UIMAException</literal>. 
+      These have been adjusted to declare throwing several of the sub-types of 
+      <literal>UIMAException</literal> to be better able to handle
+      specific causes of errors in client code.</para>
+    </formalpara>
+    <formalpara>
+      <title>CasUtil.selectSingle signature changed</title>
+      <para>Signature of <literal>CasUtil.selectSingle</literal> has been changed to return
+      <literal>AnnotationFS</literal>. The original signature is available as 
+      <literal>selectSingleFS</literal></para>
+    </formalpara>
+    <formalpara>
+      <title>Removal of deprecated methods</title>
+      <para>Various methods that were deprecated in uimaFIT 2.4.0 or earlier have been removed in
+      this release. For details, please refer to the <literal>api-change-report.html</literal>
+      file included in the release.</para>
+    </formalpara>
+    <formalpara>
+      <title>Changes to ExternalResourceFactory</title>
+      <para>Most methods in the <literal>ExternalResourceFactory</literal> have seen changes to 
+      their names and signature to avoid problematic ambiguities as well as to be shorter. In 
+      general, the <literal>External</literal> component of the method names was either
+      removed or replaced. So most methods called <literal>createExternalResourceDescription</literal>
+      are now called <literal>createResourceDescription</literal>. However, some have also been 
+      given a more specific name and/or a slightly different order of parameters. For example, this
+      method</para>
+      <programlisting>public static ExternalResourceDescription createExternalResourceDescription(
+  Class&lt;? extends SharedResourceObject&gt; aInterface, String aUrl, Object... aParams)</programlisting>
+      <para>was changed to</para>
+      <programlisting>public static ExternalResourceDescription createSharedResourceDescription(
+  String aUrl, Class&lt;? extends SharedResourceObject&gt; aInterface, Object... aParams)</programlisting>
+    </formalpara>
+    <formalpara>
+      <title>Changes to logging</title>
+      <para>UIMA v3 has is using SLF4J. As a consequence, the <literal>ExtendedLogger</literal>
+      which uimaFIT had returned on calls to <literal>getLogger()</literal> has been removed
+      and instead the regular UIMA v3 logger class is returned which offers methods quite compatible
+      with what <literal>ExtendedLogger</literal> offered before. However, it is recommended
+      that you go through all your logging calls and replace calls which use string concatenation
+      to construct the logging message with corresponding calls using placeholders. For example,
+      replace <literal>getLogger().error("Cannot access " + filename, exception);</literal> with
+      <literal>getLogger().error("Cannot access {}", filename, exception);</literal>.</para>
+    </formalpara>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 3.0.2, Spring Framework 4.3.22 and Java 8.</para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 2.3.0 to 2.4.0</title>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 2.10.2, Spring Framework 3.2.16 and Java 7.</para>
+    </formalpara>
+    <formalpara>
+      <para>Mind the updated version requirements. There should be no other potentially problematic
+      changes in this upgrade.</para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 2.2.0 to 2.3.0</title>
+    <formalpara>
+      <title>CasIOUtil deprecated</title>
+      <para>The functionality of the uimaFIT CasIOUtil class has been superseded by the core UIMA
+      class CasIOUtils added in UIMA 2.9.0. The method signatures in the new class are not the
+      same, but provide more functionality. CasIOUtil has been deprecated and documentation has
+      been added which of the CasIOUtils methods should be used instead.</para>
+    </formalpara>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 2.9.1, Spring Framework 3.2.16 and Java 7.</para>
+    </formalpara>
+    <formalpara>
+      <para>Mind the updated version requirements. There should be no other potentially problematic
+      changes in this upgrade.</para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 2.1.0 to 2.2.0</title>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 2.8.1, Spring Framework 3.2.16 and Java 7.</para>
+    </formalpara>
+    <formalpara>
+      <para>Mind the updated version requirements. There should be no other potentially problematic
+      changes in this upgrade.</para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 2.0.0 to 2.1.0</title>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 2.6.0 and Java 6.</para>
+    </formalpara>
+    <formalpara>
+      <title>AnnotationFactory.createAnnotation()</title>
+      <para>No longer throws <literal>UIMAExcption</literal>. If this exception was cought, some
+        IDEs may complain here after upgrading to uimaFIT 2.1.0. </para>
+    </formalpara>
+  </section>
+  <section>
+    <title>Version 1.4.0 to 2.0.0</title>
+    <formalpara>
+      <title>Version requirements</title>
+      <para>Depends on UIMA 2.4.2.</para>
+    </formalpara>
+    <formalpara>
+      <title>Backwards compatibility</title>
+      <para>Compatibility with legacy annotation is provided by the Legacy support module.</para>
+    </formalpara>
+    <formalpara>
+      <title>Change of Maven groupId and artifactId</title>
+      <para>The Maven group ID has changed from <literal>org.uimafit</literal> to
+          <literal>org.apache.uima</literal>.</para>
+    </formalpara>
+    <para>The artifact ID of the main uimaFIT artifact has been changed from
+        <literal>uimafit</literal> to <literal>uimafit-core</literal>.</para>
+    <formalpara>
+      <title>Change of package names</title>
+      <para>The base package has been renamed from <literal>org.uimafit</literal> to
+          <literal>org.apache.uima.fit</literal>. A global search/replace on Java files with for
+        lines starting with <literal>import org.uimafit</literal> and replacing that with
+          <literal>import org.apache.uima.fit</literal> should work.</para>
+    </formalpara>
+    <formalpara>
+      <title>@ConfigurationParameter</title>
+      <para>The default value for the mandatory attribute now is <literal>true</literal>. The
+        default name of configuration parameters is now the name of the annotated field only. The
+        classname is no longer prefixed. The method
+          <code>ConfigurationParameterFactory.createConfigurationParameterName()</code> that was
+        used to generate the prefixed name has been removed.</para>
+    </formalpara>
+    <formalpara>
+      <title>Type detection: META-INF/org.uimafit folder</title>
+      <para>The <literal>META-INF/org.uimafit</literal> was renamed to
+          <literal>META-INF/org.apache.uima.fit</literal>.</para>
+    </formalpara>
+    <formalpara>
+      <title>JCasUtil</title>
+      <para>The deprecated <code>JCasUtil.iterate()</code> methods have been removed.
+          <code>JCasUtil.select()</code> should be used instead.</para>
+    </formalpara>
+    <formalpara>
+      <title>AnalysisEngineFactory</title>
+      <para>All <literal>createAggregateXXX</literal> and <literal>createPrimitiveXXX</literal>
+        methods have been renamed to <literal>createEngineXXX</literal>. The old names are
+        deprecated and will be removed in future versions.</para>
+    </formalpara>
+    <para>All <literal>createAnalysisEngineXXX</literal> methods have been renamed to
+        <literal>createEngineXXX</literal>. The old names are deprecated and will be removed in
+      future versions.</para>
+    <formalpara>
+      <title>CollectionReaderFactory</title>
+      <para>All <literal>createDescriptionXXX</literal> methods have been renamed to
+          <literal>createReaderDescriptionXXX</literal>. The old names are deprecated and will be
+        removed in future versions.</para>
+    </formalpara>
+    <para>All <literal>createCollectionReaderXXX</literal> methods have been renamed to
+        <literal>createReaderXXX</literal>. The old names are deprecated and will be removed in
+      future versions.</para>
+    <formalpara>
+      <title>JCasIterable</title>
+      <para><code>JCasIterable</code> now only accepts reader and engine descriptions (no instances)
+        and no longer implements the <code>Iterator</code> interface. Instead, new
+          <code>JCasIterator</code> has been added, which replaces <code>JCasIterable</code> in that
+        respect.</para>
+    </formalpara>
+    <formalpara>
+      <title>CasDumpWriter</title>
+      <para><literal>org.uimafit.component.xwriter.CASDumpWriter</literal> has been renamed to
+          <literal>org.apache.uima.fit.component.CasDumpWriter</literal>.</para>
+    </formalpara>
+    <formalpara>
+      <title>CpePipeline</title>
+      <para><literal>CpePipeline</literal> has been moved to a separate module with the artifact ID
+          <literal>uimafit-cpe</literal> to reduce the dependencies incurred by the main uimaFIT
+        artifact.</para>
+    </formalpara>
+    <formalpara>
+      <title>XWriter removed</title>
+      <para>The <literal>XWriter</literal> and associated file namers have been removed as they were
+        much more complex then acutally needed. As an alternative, <literal>CasIOUtil</literal> has
+        been introduced providing several convenience methods to read/write JCas/CAS data. </para>
+    </formalpara>
+    <formalpara>
+      <title>JCasFactory</title>
+      <para>Methods only loading JCas data have been removed from <literal>JCasFactory</literal>.
+        The new methods in <literal>CasIOUtil</literal> can be used instead.</para>
+    </formalpara>
+  </section>
+</chapter>
diff --git a/uimafit-examples/NOTICE b/uimafit-examples/NOTICE
index 8de1481..48781c0 100644
--- a/uimafit-examples/NOTICE
+++ b/uimafit-examples/NOTICE
@@ -1,3 +1,6 @@
+Apache UIMA uimaFIT
+Copyright 2013-2019 The Apache Software Foundation
+
 Copyright 2009-2012 Regents of the University of Colorado.
 All rights reserved.
 
diff --git a/uimafit-examples/pom.xml b/uimafit-examples/pom.xml
index 3ff7189..722640e 100644
--- a/uimafit-examples/pom.xml
+++ b/uimafit-examples/pom.xml
@@ -1,139 +1,142 @@
 <?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
+  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
+  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.
+  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">
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.1-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<modelVersion>4.0.0</modelVersion>
-	<artifactId>uimafit-examples</artifactId>
-	<name>Apache UIMA uimaFIT - Examples</name>
-	<description>Factories, Injection, and Testing library for UIMA</description>
-	<url>${uimaWebsiteUrl}</url>
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.1-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<scope>test</scope>
-		</dependency>
-	</dependencies>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
-	<build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.uima</groupId>
-                <artifactId>jcasgen-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>generate</goal>
-                        </goals>
-                        <configuration>
-                            <typeSystemIncludes>
-                                <typeSystemInclude>src/main/resources/org/apache/uima/fit/examples/TypeSystem.xml</typeSystemInclude>
-                            </typeSystemIncludes>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <!--
-                    This plug-in adds the jcasgen generated source code folder as a project
-                    source folder
-                -->
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-test-source</id>
-                        <phase>process-resources</phase>
-                        <goals>
-                            <goal>add-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>${project.build.directory}/generated-sources/jcasgen</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-surefire-plugin</artifactId>
-				<configuration>
-					<excludes>
-						<exclude>org/uimafit/tutorial/AbstractTest.java</exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-		</plugins>
-		<pluginManagement>
-			<plugins>
-				<plugin>
-					<groupId>org.apache.rat</groupId>
-					<artifactId>apache-rat-plugin</artifactId>
-					<executions>
-						<execution>
-							<id>default-cli</id>
-							<configuration>
-								<excludes>
-									<exclude>release.properties</exclude>
-									<exclude>README*</exclude>
-									<exclude>RELEASE_NOTES*</exclude>
-									<exclude>issuesFixed/**</exclude>
-									<!-- These example are unreasonable to bear a license header -->
-									<exclude>src/main/resources/org/apache/uima/fit/examples/pos/sample-gold.txt</exclude>
-									<exclude>src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt</exclude>
-									<!-- These test files are unreasonable to bear a license header -->
-									<exclude>src/test/resources/org/apache/uima/fit/examples/xmi/1.xmi</exclude>									<!-- These configuration files cannot bear a license header -->
-									<!-- These configuration files cannot bear a license header -->
-									<exclude>src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
-								</excludes>
-							</configuration>
-						</execution>
-					</executions>
-				</plugin>
-			</plugins>
-		</pluginManagement>
-	</build>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.1.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>uimafit-examples</artifactId>
+  <name>Apache UIMA uimaFIT - Examples</name>
+  <description>Factories, Injection, and Testing library for UIMA</description>
+  <url>${uimaWebsiteUrl}</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+    </dependency>    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.uima</groupId>
+        <artifactId>jcasgen-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <typeSystemIncludes>
+                <typeSystemInclude>src/main/resources/org/apache/uima/fit/examples/TypeSystem.xml</typeSystemInclude>
+              </typeSystemIncludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <!--
+            This plug-in adds the jcasgen generated source code folder as a project
+            source folder
+        -->
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>add-test-source</id>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-sources/jcasgen</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <exclude>org/uimafit/tutorial/AbstractTest.java</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <executions>
+            <execution>
+              <id>default-cli</id>
+              <configuration>
+                <excludes>
+                  <exclude>release.properties</exclude>
+                  <!-- These example are unreasonable to bear a license header -->
+                  <exclude>src/main/resources/org/apache/uima/fit/examples/pos/sample-gold.txt</exclude>
+                  <exclude>src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt</exclude>
+                  <!-- These test files are unreasonable to bear a license header -->
+                  <exclude>src/test/resources/org/apache/uima/fit/examples/xmi/1.xmi</exclude>
+                  <!-- These configuration files cannot bear a license header -->
+                  <exclude>src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
+                  <!-- Logging configuration files -->
+                  <exclude>src/main/resources/simplelogger.properties</exclude>
+                </excludes>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
 </project>
\ No newline at end of file
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
index 9374f45..3990cee 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 
 import java.io.File;
 
@@ -48,6 +48,7 @@
   public static final class SharedModel implements SharedResourceObject {
     private String uri;
 
+    @Override
     public void load(DataResource aData) throws ResourceInitializationException {
       uri = aData.getUri().toString();
     }
@@ -79,8 +80,8 @@
    * Illustrate how to configure the annotator with the shared model object.
    */
   public static void main(String[] args) throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(SharedModel.class,
-            new File("somemodel.bin"));
+    ExternalResourceDescription extDesc = createSharedResourceDescription(
+            new File("somemodel.bin"), SharedModel.class);
 
     // Binding external resource to each Annotator individually
     AnalysisEngineDescription aed1 = createEngineDescription(Annotator.class, Annotator.RES_MODEL,
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
index d0d0935..c463875 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResource;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceUsingUrl;
 
 import java.io.File;
 
@@ -46,6 +46,7 @@
   public static final class SharedModel implements SharedResourceObject {
     private String uri;
 
+    @Override
     public void load(DataResource aData) throws ResourceInitializationException {
       uri = aData.getUri().toString();
     }
@@ -85,8 +86,8 @@
 
     // Bind external resource to the aggregate
     AnalysisEngineDescription aaed = createEngineDescription(aed1, aed2);
-    bindResource(aaed, Annotator.RES_MODEL, SharedModel.class, new File("somemodel.bin").toURI()
-            .toURL().toString());
+    bindResourceUsingUrl(aaed, Annotator.RES_MODEL, SharedModel.class,
+            new File("somemodel.bin").toURI().toURL().toString());
 
     // Check the external resource was injected
     AnalysisEngine ae = createEngine(aaed);
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
index 604def9..baa30d2 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
@@ -73,9 +73,9 @@
     AnalysisEngineDescription aed = createEngineDescription(
             Annotator2.class,
             Annotator2.RES_MODEL,
-            createExternalResourceDescription(ChainableResource.class,
+            createResourceDescription(ChainableResource.class,
                     ChainableResource.RES_CHAINED_RESOURCE,
-                    createExternalResourceDescription(ChainableResource.class)));
+                    createResourceDescription(ChainableResource.class)));
 
     // Check the external resource was injected
     AnalysisEngine ae = createEngine(aed);
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
index feeb4b3..2c76941 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
@@ -28,7 +28,6 @@
 import org.apache.uima.fit.descriptor.TypeCapability;
 import org.apache.uima.fit.examples.tutorial.type.RoomNumber;
 import org.apache.uima.jcas.JCas;
-import org.apache.uima.util.Level;
 
 /**
  * This class demonstrates annotating member variables with the @ConfigurationParameter annotation.
@@ -74,7 +73,7 @@
         RoomNumber annotation = new RoomNumber(aJCas, matcher.start(), matcher.end());
         annotation.setBuilding(mLocations[i]);
         annotation.addToIndexes();
-        getContext().getLogger().log(Level.FINEST, "Found: " + annotation);
+        getLogger().debug("Found: {}", annotation);
       }
     }
   }
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
index 89a595c..868e20d 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
@@ -19,7 +19,8 @@
 package org.apache.uima.fit.examples.tutorial.ex6;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.util.StringTokenizer;
@@ -74,8 +75,9 @@
     AnalysisEngineDescription aed = createEngineDescription(
             UimaAcronymAnnotator.class,
             UimaAcronymAnnotator.RES_ACRONYM_TABLE,
-            createExternalResourceDescription(StringMapResource_impl.class,
-                    "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt"));
+            createSharedResourceDescription(
+                    "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+                    StringMapResource_impl.class));
     
     aed.toXML(new FileOutputStream(new File(outputDirectory, "UimaAcronymAnnotator.xml")));
   }
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
index e2fa8b4..cb16058 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
@@ -19,7 +19,7 @@
 package org.apache.uima.fit.examples.tutorial.ex6;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 import static org.apache.uima.fit.util.JCasUtil.select;
 
 import java.io.File;
@@ -111,9 +111,9 @@
     File outputDirectory = new File("target/examples/tutorial/ex6/");
     outputDirectory.mkdirs();
 
-    ExternalResourceDescription resource = createExternalResourceDescription(
-            StringMapResource_impl.class,
-            "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt");
+    ExternalResourceDescription resource = createSharedResourceDescription(
+            "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+            StringMapResource_impl.class);
 
     AggregateBuilder builder = new AggregateBuilder();
     builder.add(createEngineDescription(UimaAcronymAnnotator.class,
diff --git a/uimafit-examples/src/main/resources/simplelogger.properties b/uimafit-examples/src/main/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-examples/src/main/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java b/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
index 40cba4f..3faacfc 100644
--- a/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
+++ b/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
@@ -20,7 +20,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -39,9 +39,9 @@
   @Test
   public void test1() throws Exception {
     // This resource is shared between the UimaAcronymAnnotator and UimaMeetingAnnotator
-    ExternalResourceDescription resource = createExternalResourceDescription(
-            StringMapResource_impl.class,
-            "file:src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt");
+    ExternalResourceDescription resource = createSharedResourceDescription(
+            "file:src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+            StringMapResource_impl.class);
 
     AggregateBuilder builder = new AggregateBuilder();
     builder.add(createEngineDescription(UimaAcronymAnnotator.class,
diff --git a/uimafit-junit/pom.xml b/uimafit-junit/pom.xml
index 6ff4d41..dead426 100644
--- a/uimafit-junit/pom.xml
+++ b/uimafit-junit/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.1-SNAPSHOT</version>
+    <version>3.1.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <artifactId>uimafit-junit</artifactId>
@@ -33,7 +33,7 @@
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
diff --git a/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs b/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 225e1bc..0000000
--- a/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,288 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=100
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=4
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
-org.eclipse.jdt.core.formatter.indentation.size=2
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=100
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=2
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/uimafit-legacy-support/.settings/org.eclipse.jdt.ui.prefs b/uimafit-legacy-support/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index adc6b5a..0000000
--- a/uimafit-legacy-support/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-eclipse.preferences.version=1
-formatter_profile=_Apache UIMA Code Conventions
-formatter_settings_version=12
diff --git a/uimafit-legacy-support/NOTICE b/uimafit-legacy-support/NOTICE
deleted file mode 100644
index 6fb06d7..0000000
--- a/uimafit-legacy-support/NOTICE
+++ /dev/null
@@ -1,8 +0,0 @@
-AnnotationLiteral.java
-
-Licensed under the Apache License, Version 2.0.
-File was copied from the javax.enterprise cdi-api version 1.0.
-
-JBoss, Home of Professional Open Source
-Copyright 2008, Red Hat Middleware LLC, and individual contributors
-by the @authors tag.
\ No newline at end of file
diff --git a/uimafit-legacy-support/marker-file-identifying-api-compatibility-check b/uimafit-legacy-support/marker-file-identifying-api-compatibility-check
deleted file mode 100644
index bf19e08..0000000
--- a/uimafit-legacy-support/marker-file-identifying-api-compatibility-check
+++ /dev/null
@@ -1 +0,0 @@
-Marker file to enable the "enforce-compatibility" profile.
diff --git a/uimafit-legacy-support/pom.xml b/uimafit-legacy-support/pom.xml
deleted file mode 100644
index 2070d5b..0000000
--- a/uimafit-legacy-support/pom.xml
+++ /dev/null
@@ -1,144 +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/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.1-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<artifactId>uimafit-legacy-support</artifactId>
-	<name>Apache UIMA uimaFIT - Legacy uimaFIT support</name>
-	<description>Adds support for uimaFIT 1.x annotations.</description>
-	<url>${uimaWebsiteUrl}</url>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.1-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-test</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.uimafit</groupId>
-			<artifactId>uimafit</artifactId>
-			<version>1.4.0</version>
-			<scope>provided</scope>
-		</dependency>
-	</dependencies>
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.uima</groupId>
-				<artifactId>jcasgen-maven-plugin</artifactId>
-				<executions>
-					<execution>
-						<phase>generate-test-resources</phase>
-						<goals>
-							<goal>generate</goal>
-						</goals>
-						<configuration>
-							<typeSystemIncludes>
-								<typeSystemInclude>src/test/resources/org/apache/uima/fit/type/**/*.xml</typeSystemInclude>
-							</typeSystemIncludes>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-			<plugin>
-				<!--
-					This plug-in adds the jcasgen generated source code folder as a project
-					source folder
-				-->
-				<groupId>org.codehaus.mojo</groupId>
-				<artifactId>build-helper-maven-plugin</artifactId>
-				<executions>
-					<execution>
-						<id>add-test-source</id>
-						<phase>process-test-resources</phase>
-						<goals>
-							<goal>add-test-source</goal>
-						</goals>
-						<configuration>
-							<sources>
-								<source>${project.build.directory}/generated-sources/jcasgen</source>
-							</sources>
-						</configuration>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.apache.rat</groupId>
-          <artifactId>apache-rat-plugin</artifactId>
-          <executions>
-            <execution>
-              <id>default-cli</id>
-              <configuration>
-                <excludes combine.children="append">
-                  <!-- These test files are unreasonable to bear a license header -->
-                  <exclude>src/test/resources/log4j.properties</exclude>
-                  <exclude>src/test/resources/data/docs/unix-newlines.txt.bin</exclude>
-                  <exclude>src/test/resources/data/docs/windows-newlines.txt.bin</exclude>
-                  <exclude>src/test/resources/data/docs/bad.xcas</exclude>
-                  <exclude>src/test/resources/data/docs/test.xcas</exclude>
-                  <exclude>src/test/resources/data/docs/test.xmi</exclude>
-                  <exclude>src/test/resources/data/reference/JCasBuilderTest.dump</exclude>
-                  <exclude>src/test/resources/data/reference/test.xmi.dump</exclude>
-                  <exclude>src/test/resources/data/reference/SerializationTestAnnotator.xml</exclude>
-                  <!-- These configuration files cannot bear a license header -->
-                  <exclude>src/test/resources/META-INF/org.uimafit/fsindexes.txt</exclude>
-                  <exclude>src/test/resources/META-INF/org.uimafit/typepriorities.txt</exclude>
-                  <exclude>src/test/resources/META-INF/org.uimafit/types.txt</exclude>
-                </excludes>
-              </configuration>
-            </execution>
-          </executions>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-	</build>
-</project>
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/AnnotationConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/AnnotationConverter.java
deleted file mode 100644
index a1a8218..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/AnnotationConverter.java
+++ /dev/null
@@ -1,44 +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.uima.fit.legacy;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-
-/**
- * Annotation converters for legacy uimaFIT annotations to Apache uimaFIT annotations.
- *
- * @param <L> legacy annotation type.
- * @param <M> modern annotation type.
- */
-public interface AnnotationConverter<L extends Annotation,M extends Annotation> {
-  /**
-   * Convert the given legacy annotation to its modern counterpart.
-   * 
-   * @param aAnnotation a legacy annotation.
-   * @return the modern annotation.
-   */
-  M convert(Class<?> aContext, L aAnnotation);
-
-  M convert(AccessibleObject aContext, L aAnnotation);
-
-  Class<M> getModernType();
-  
-  Class<L> getLegacyType();
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java
deleted file mode 100644
index 97094bc..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/LegacySupportPluginImpl.java
+++ /dev/null
@@ -1,158 +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.uima.fit.legacy;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.uima.fit.internal.LegacySupportPlugin;
-import org.apache.uima.fit.internal.MetaDataType;
-import org.apache.uima.fit.legacy.converter.ConfigurationParameterConverter;
-import org.apache.uima.fit.legacy.converter.ExternalResourceConverter;
-import org.apache.uima.fit.legacy.converter.FsIndexCollectionConverter;
-import org.apache.uima.fit.legacy.converter.FsIndexConverter;
-import org.apache.uima.fit.legacy.converter.FsIndexKeyConverter;
-import org.apache.uima.fit.legacy.converter.NoConversionConverter;
-import org.apache.uima.fit.legacy.converter.OperationalPropertiesConverter;
-import org.apache.uima.fit.legacy.converter.SofaCapabilityConverter;
-import org.apache.uima.fit.legacy.converter.TypeCapabilityConverter;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.uimafit.factory.FsIndexFactory;
-import org.uimafit.factory.TypeSystemDescriptionFactory;
-
-/**
- * Legacy support plug in for the Google Code version of uimaFIT.
- */
-public class LegacySupportPluginImpl implements LegacySupportPlugin {
-  private Map<Class<? extends Annotation>, AnnotationConverter<?,?>> converterRegistry;
-  
-  public LegacySupportPluginImpl() {
-    register(new ConfigurationParameterConverter());
-    register(new ExternalResourceConverter());
-    register(new FsIndexConverter());
-    register(new FsIndexCollectionConverter());
-    register(new FsIndexKeyConverter());
-    register(new OperationalPropertiesConverter());
-    register(new SofaCapabilityConverter());
-    register(new TypeCapabilityConverter());
-  }
-
-  public boolean isAnnotationPresent(AccessibleObject aObject,
-          Class<? extends Annotation> aAnnotationClass) {
-    Class<? extends Annotation> legacyType = getLegacyType(aAnnotationClass);
-    if (legacyType != null) {
-      // UIMA-3853 workaround for IBM Java 8 beta 3
-      return aObject.getAnnotation(legacyType) != null;
-    }
-    else {
-      return false;
-    }
-  }
-
-  public boolean isAnnotationPresent(Class<?> aObject,
-          Class<? extends Annotation> aAnnotationClass) {
-    Class<? extends Annotation> legacyType = getLegacyType(aAnnotationClass);
-    if (legacyType != null) {
-      // UIMA-3853 workaround for IBM Java 8 beta 3
-      return aObject.getAnnotation(legacyType) != null;
-    }
-    else {
-      return false;
-    }
-  }
-
-  public <L extends Annotation, M extends Annotation> M getAnnotation(AccessibleObject aObject,
-          Class<M> aAnnotationClass) {
-    // Get converter
-    AnnotationConverter<L, M> converter = getConverter(aAnnotationClass);
-    // Find legacy annotation
-    L legacyAnnotation = aObject.getAnnotation(converter.getLegacyType());
-    if (legacyAnnotation != null) {
-      // If legacy annotation is present, convert it to a modern annotation
-      return converter.convert(aObject, legacyAnnotation);
-    } else {
-      return null;
-    }
-  }
-
-  public <L extends Annotation, M extends Annotation> M getAnnotation(Class<?> aObject,
-          Class<M> aAnnotationClass) {
-    // Get converter
-    AnnotationConverter<L, M> converter = getConverter(aAnnotationClass);
-    // Find legacy annotation
-    L legacyAnnotation = aObject.getAnnotation(converter.getLegacyType());
-    if (legacyAnnotation != null) {
-      // If legacy annotation is present, convert it to a modern annotation
-      return converter.convert(aObject, legacyAnnotation);
-    } else {
-      return null;
-    }
-  }
-
-  /**
-   * Get a converter for the given modern type.
-   * 
-   * @param aModernType a modern annotation type.
-   * @return a converter. This method never returns {@code null}.
-   */
-  @SuppressWarnings("unchecked")
-  private <L extends Annotation, M extends Annotation> AnnotationConverter<L, M> getConverter(Class<M> aModernType)
-  {
-    AnnotationConverter<?,?> conv = converterRegistry.get(aModernType);
-    if (conv == null) {
-      conv = NoConversionConverter.getInstance();
-    }
-    return (AnnotationConverter<L, M>) conv;
-  }
-
-  private <L extends Annotation, M extends Annotation> Class<L> getLegacyType(Class<M> aModernType)
-  {
-    AnnotationConverter<L, M> converter = getConverter(aModernType);
-    if (converter != null) {
-      return converter.getLegacyType();
-    }
-    else {
-      return null;
-    }
-  }
-
-  /**
-   * Register a new converter.
-   */
-  private void register(AnnotationConverter<?,?> aConverter)
-  {
-    if (converterRegistry == null) {
-      converterRegistry = new HashMap<Class<? extends Annotation>, AnnotationConverter<?,?>>();
-    }
-    converterRegistry.put(aConverter.getModernType(), aConverter);
-  }
-
-  public String[] scanTypeDescriptors(MetaDataType aType) throws ResourceInitializationException {
-    switch (aType) {
-      case FS_INDEX:
-        return FsIndexFactory.scanIndexDescriptors();
-      case TYPE_SYSTEM:
-        return TypeSystemDescriptionFactory.scanTypeDescriptors();
-      default:
-        return new String[0];
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/AnnotationLiteral.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/AnnotationLiteral.java
deleted file mode 100644
index abb53af..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/AnnotationLiteral.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2008, Red Hat Middleware LLC, and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * Licensed 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.uima.fit.legacy.converter;
-
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-
-/**
- * <p>
- * Supports inline instantiation of annotation type instances.
- * </p>
- * 
- * <p>
- * An instance of an annotation type may be obtained by subclassing {@link AnnotationLiteral}.
- * </p>
- * 
- * <pre>
- * public abstract class PayByQualifier extends AnnotationLiteral&lt;PayBy&gt; implements PayBy {
- * }
- * </pre>
- * 
- * <pre>
- * PayBy paybyCheque = new PayByQualifier() {
- *   public PaymentMethod value() {
- *     return CHEQUE;
- *   }
- * };
- * </pre>
- * 
- * @author Pete Muir
- * @author Gavin King
- * 
- * @param <T>
- *          the annotation type
- * 
- * @see <a href="http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html#select(java.lang.annotation.Annotation...)">javax.enterprise.inject.Instance.select(Annotation...)</a>
- * @see <a href="http://docs.oracle.com/javaee/6/api/javax/enterprise/event/Event.html#select(java.lang.annotation.Annotation...)">javax.enterprise.event.Event.select(Annotation...)</a>
- * 
- */
-// 2013-01-20 rec
-// - Included file in this module to remove depenendy on javax.enterprise cdi-api which induced 
-//   additional unnecessary transitive dependencies
-// - Changed to "default" visbility scope because it is only used in this package
-// - Formatted source code according to UIMA code style
-abstract class AnnotationLiteral<T extends Annotation> implements Annotation, Serializable {
-
-  private transient Class<T> annotationType;
-
-  private transient Method[] members;
-
-  protected AnnotationLiteral() {
-  }
-
-  private Method[] getMembers() {
-    if (members == null) {
-      members = annotationType().getDeclaredMethods();
-      if (members.length > 0 && !annotationType().isAssignableFrom(this.getClass())) {
-        throw new RuntimeException(getClass()
-                + " does not implement the annotation type with members "
-                + annotationType().getName());
-      }
-    }
-    return members;
-  }
-
-  private static Class<?> getAnnotationLiteralSubclass(Class<?> clazz) {
-    Class<?> superclass = clazz.getSuperclass();
-    if (superclass.equals(AnnotationLiteral.class)) {
-      return clazz;
-    } else if (superclass.equals(Object.class)) {
-      return null;
-    } else {
-      return (getAnnotationLiteralSubclass(superclass));
-    }
-  }
-
-  @SuppressWarnings("unchecked")
-  private static <T> Class<T> getTypeParameter(Class<?> annotationLiteralSuperclass) {
-    Type type = annotationLiteralSuperclass.getGenericSuperclass();
-    if (type instanceof ParameterizedType) {
-      ParameterizedType parameterizedType = (ParameterizedType) type;
-      if (parameterizedType.getActualTypeArguments().length == 1) {
-        return (Class<T>) parameterizedType.getActualTypeArguments()[0];
-      }
-    }
-    return null;
-  }
-
-  public Class<? extends Annotation> annotationType() {
-    if (annotationType == null) {
-      Class<?> annotationLiteralSubclass = getAnnotationLiteralSubclass(this.getClass());
-      if (annotationLiteralSubclass == null) {
-        throw new RuntimeException(getClass() + "is not a subclass of AnnotationLiteral");
-      }
-      annotationType = getTypeParameter(annotationLiteralSubclass);
-      if (annotationType == null) {
-        throw new RuntimeException(getClass()
-                + " does not specify the type parameter T of AnnotationLiteral<T>");
-      }
-    }
-    return annotationType;
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder string = new StringBuilder();
-    string.append('@').append(annotationType().getName()).append('(');
-    for (int i = 0; i < getMembers().length; i++) {
-      string.append(getMembers()[i].getName()).append('=');
-      Object value = invoke(getMembers()[i], this);
-      if (value instanceof boolean[]) {
-        appendInBraces(string, Arrays.toString((boolean[]) value));
-      } else if (value instanceof byte[]) {
-        appendInBraces(string, Arrays.toString((byte[]) value));
-      } else if (value instanceof short[]) {
-        appendInBraces(string, Arrays.toString((short[]) value));
-      } else if (value instanceof int[]) {
-        appendInBraces(string, Arrays.toString((int[]) value));
-      } else if (value instanceof long[]) {
-        appendInBraces(string, Arrays.toString((long[]) value));
-      } else if (value instanceof float[]) {
-        appendInBraces(string, Arrays.toString((float[]) value));
-      } else if (value instanceof double[]) {
-        appendInBraces(string, Arrays.toString((double[]) value));
-      } else if (value instanceof char[]) {
-        appendInBraces(string, Arrays.toString((char[]) value));
-      } else if (value instanceof String[]) {
-        String[] strings = (String[]) value;
-        String[] quoted = new String[strings.length];
-        for (int j = 0; j < strings.length; j++) {
-          quoted[j] = "\"" + strings[j] + "\"";
-        }
-        appendInBraces(string, Arrays.toString(quoted));
-      } else if (value instanceof Class<?>[]) {
-        Class<?>[] classes = (Class<?>[]) value;
-        String[] names = new String[classes.length];
-        for (int j = 0; j < classes.length; j++) {
-          names[j] = classes[j].getName() + ".class";
-        }
-        appendInBraces(string, Arrays.toString(names));
-      } else if (value instanceof Object[]) {
-        appendInBraces(string, Arrays.toString((Object[]) value));
-      } else if (value instanceof String) {
-        string.append('"').append(value).append('"');
-      } else if (value instanceof Class<?>) {
-        string.append(((Class<?>) value).getName()).append(".class");
-      } else {
-        string.append(value);
-      }
-      if (i < getMembers().length - 1) {
-        string.append(", ");
-      }
-    }
-    return string.append(')').toString();
-  }
-
-  private void appendInBraces(StringBuilder buf, String s) {
-    buf.append('{').append(s.substring(1, s.length() - 1)).append('}');
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (other instanceof Annotation) {
-      Annotation that = (Annotation) other;
-      if (this.annotationType().equals(that.annotationType())) {
-        for (Method member : getMembers()) {
-          Object thisValue = invoke(member, this);
-          Object thatValue = invoke(member, that);
-          if (thisValue instanceof byte[] && thatValue instanceof byte[]) {
-            if (!Arrays.equals((byte[]) thisValue, (byte[]) thatValue))
-              return false;
-          } else if (thisValue instanceof short[] && thatValue instanceof short[]) {
-            if (!Arrays.equals((short[]) thisValue, (short[]) thatValue))
-              return false;
-          } else if (thisValue instanceof int[] && thatValue instanceof int[]) {
-            if (!Arrays.equals((int[]) thisValue, (int[]) thatValue))
-              return false;
-          } else if (thisValue instanceof long[] && thatValue instanceof long[]) {
-            if (!Arrays.equals((long[]) thisValue, (long[]) thatValue))
-              return false;
-          } else if (thisValue instanceof float[] && thatValue instanceof float[]) {
-            if (!Arrays.equals((float[]) thisValue, (float[]) thatValue))
-              return false;
-          } else if (thisValue instanceof double[] && thatValue instanceof double[]) {
-            if (!Arrays.equals((double[]) thisValue, (double[]) thatValue))
-              return false;
-          } else if (thisValue instanceof char[] && thatValue instanceof char[]) {
-            if (!Arrays.equals((char[]) thisValue, (char[]) thatValue))
-              return false;
-          } else if (thisValue instanceof boolean[] && thatValue instanceof boolean[]) {
-            if (!Arrays.equals((boolean[]) thisValue, (boolean[]) thatValue))
-              return false;
-          } else if (thisValue instanceof Object[] && thatValue instanceof Object[]) {
-            if (!Arrays.equals((Object[]) thisValue, (Object[]) thatValue))
-              return false;
-          } else {
-            if (!thisValue.equals(thatValue))
-              return false;
-          }
-        }
-        return true;
-      }
-    }
-    return false;
-  }
-
-  @Override
-  public int hashCode() {
-    int hashCode = 0;
-    for (Method member : getMembers()) {
-      int memberNameHashCode = 127 * member.getName().hashCode();
-      Object value = invoke(member, this);
-      int memberValueHashCode;
-      if (value instanceof boolean[]) {
-        memberValueHashCode = Arrays.hashCode((boolean[]) value);
-      } else if (value instanceof short[]) {
-        memberValueHashCode = Arrays.hashCode((short[]) value);
-      } else if (value instanceof int[]) {
-        memberValueHashCode = Arrays.hashCode((int[]) value);
-      } else if (value instanceof long[]) {
-        memberValueHashCode = Arrays.hashCode((long[]) value);
-      } else if (value instanceof float[]) {
-        memberValueHashCode = Arrays.hashCode((float[]) value);
-      } else if (value instanceof double[]) {
-        memberValueHashCode = Arrays.hashCode((double[]) value);
-      } else if (value instanceof byte[]) {
-        memberValueHashCode = Arrays.hashCode((byte[]) value);
-      } else if (value instanceof char[]) {
-        memberValueHashCode = Arrays.hashCode((char[]) value);
-      } else if (value instanceof Object[]) {
-        memberValueHashCode = Arrays.hashCode((Object[]) value);
-      } else {
-        memberValueHashCode = value.hashCode();
-      }
-      hashCode += memberNameHashCode ^ memberValueHashCode;
-    }
-    return hashCode;
-  }
-
-  private static Object invoke(Method method, Object instance) {
-    try {
-      if (!method.isAccessible())
-        method.setAccessible(true);
-      return method.invoke(instance);
-    } catch (IllegalArgumentException e) {
-      throw new RuntimeException("Error checking value of member method " + method.getName()
-              + " on " + method.getDeclaringClass(), e);
-    } catch (IllegalAccessException e) {
-      throw new RuntimeException("Error checking value of member method " + method.getName()
-              + " on " + method.getDeclaringClass(), e);
-    } catch (InvocationTargetException e) {
-      throw new RuntimeException("Error checking value of member method " + method.getName()
-              + " on " + method.getDeclaringClass(), e);
-    }
-  }
-
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ConfigurationParameterConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ConfigurationParameterConverter.java
deleted file mode 100644
index 324e6e2..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ConfigurationParameterConverter.java
+++ /dev/null
@@ -1,98 +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.uima.fit.legacy.converter;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-
-import org.apache.uima.fit.descriptor.ConfigurationParameter;
-import org.apache.uima.fit.legacy.AnnotationConverter;
-
-public class ConfigurationParameterConverter
-        implements
-        AnnotationConverter<org.uimafit.descriptor.ConfigurationParameter, org.apache.uima.fit.descriptor.ConfigurationParameter> {
-
-  public ConfigurationParameterConverter() {
-    // Nothing to do
-  }
-
-  public ConfigurationParameter convert(AccessibleObject aContext,
-          org.uimafit.descriptor.ConfigurationParameter aAnnotation) {
-    return new ConfigurationParameterSubstitute(aAnnotation, (Field) aContext);
-  } 
-
-  public ConfigurationParameter convert(Class<?> aContext,
-          org.uimafit.descriptor.ConfigurationParameter aAnnotation) {
-    throw new UnsupportedOperationException("Annotation is not permitted on classes");
-  }
-
-  public Class<org.uimafit.descriptor.ConfigurationParameter> getLegacyType() {
-    return org.uimafit.descriptor.ConfigurationParameter.class;
-  }
-  
-  public Class<ConfigurationParameter> getModernType() {
-    return ConfigurationParameter.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class ConfigurationParameterSubstitute extends
-          AnnotationLiteral<ConfigurationParameter> implements ConfigurationParameter {
-
-    private org.uimafit.descriptor.ConfigurationParameter legacyAnnotation;
-    
-    private Field field;
-    
-    public ConfigurationParameterSubstitute(
-            org.uimafit.descriptor.ConfigurationParameter aAnnotation, Field aField) {
-      legacyAnnotation = aAnnotation;
-      field = aField;
-    }
-    
-    /**
-     * Legacy uimaFIT used the class name + field name as default value.
-     */
-    public String name() {
-      if (org.uimafit.descriptor.ConfigurationParameter.USE_FIELD_NAME.equals(legacyAnnotation
-              .name())) {
-        return field.getDeclaringClass().getName() + "." + field.getName();
-
-      } else {
-        return legacyAnnotation.name();
-      }
-    }
-
-    public String description() {
-      return legacyAnnotation.description();
-    }
-
-    public boolean mandatory() {
-      return legacyAnnotation.mandatory();
-    }
-
-    public String[] defaultValue() {
-      String[] values = legacyAnnotation.defaultValue();
-      if (values.length == 1
-              && org.uimafit.descriptor.ConfigurationParameter.NO_DEFAULT_VALUE.equals(values[0])) {
-        return new String[] { ConfigurationParameter.NO_DEFAULT_VALUE };
-      } else {
-        return values;
-      }
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ContextlessAnnotationConverterBase.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ContextlessAnnotationConverterBase.java
deleted file mode 100644
index f41f7e1..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ContextlessAnnotationConverterBase.java
+++ /dev/null
@@ -1,41 +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.uima.fit.legacy.converter;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-
-import org.apache.uima.fit.legacy.AnnotationConverter;
-
-/**
- * Abstract base class for annotation converters that do not require a context.
- */
-public abstract class ContextlessAnnotationConverterBase<L extends Annotation, M extends Annotation>
-        implements AnnotationConverter<L, M> {
-
-  abstract M convert(L aAnnotation);
-  
-  public M convert(AccessibleObject aContext, L aAnnotation) {
-    return convert(aAnnotation);
-  }
-  
-  public M convert(Class<?> aContext, L aAnnotation) {
-    return convert(aAnnotation);
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ExternalResourceConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ExternalResourceConverter.java
deleted file mode 100644
index f9155f0..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/ExternalResourceConverter.java
+++ /dev/null
@@ -1,92 +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.uima.fit.legacy.converter;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Field;
-
-import org.apache.uima.fit.descriptor.ExternalResource;
-import org.apache.uima.fit.legacy.AnnotationConverter;
-import org.apache.uima.resource.Resource;
-
-public class ExternalResourceConverter
-        implements
-        AnnotationConverter<org.uimafit.descriptor.ExternalResource, org.apache.uima.fit.descriptor.ExternalResource> {
-
-  public ExternalResourceConverter() {
-    // Nothing to do
-  }
-
-  public ExternalResource convert(AccessibleObject aContext,
-          org.uimafit.descriptor.ExternalResource aAnnotation) {
-    return new ExternalResourceSubstitute(aAnnotation, (Field) aContext);
-  }
-
-  public ExternalResource convert(Class<?> aContext,
-          org.uimafit.descriptor.ExternalResource aAnnotation) {
-    throw new UnsupportedOperationException("Annotation is not permitted on classes");
-  }
-
-  public Class<org.uimafit.descriptor.ExternalResource> getLegacyType() {
-    return org.uimafit.descriptor.ExternalResource.class;
-  }
-
-  public Class<ExternalResource> getModernType() {
-    return ExternalResource.class;
-  }
-
-  @SuppressWarnings("serial")
-  public class ExternalResourceSubstitute extends AnnotationLiteral<ExternalResource> implements
-          ExternalResource {
-
-    private org.uimafit.descriptor.ExternalResource legacyAnnotation;
-
-    private Field field;
-
-    public ExternalResourceSubstitute(org.uimafit.descriptor.ExternalResource aAnnotation,
-            Field aField) {
-      legacyAnnotation = aAnnotation;
-      field = aField;
-    }
-
-    /**
-     * Legacy uimaFIT used the field class name as default value.
-     */
-    public String key() {
-      if (legacyAnnotation.key().equals("")) {
-        return field.getType().getName();
-      }
-      else {
-        return legacyAnnotation.key();
-      }
-    }
-
-    public Class<? extends Resource> api() {
-      return legacyAnnotation.api();
-    }
-
-    public boolean mandatory() {
-      return legacyAnnotation.mandatory();
-    }
-
-    public String description() {
-      return null;
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexCollectionConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexCollectionConverter.java
deleted file mode 100644
index e7996a1..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexCollectionConverter.java
+++ /dev/null
@@ -1,67 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.FsIndex;
-import org.apache.uima.fit.descriptor.FsIndexCollection;
-
-public class FsIndexCollectionConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.FsIndexCollection, org.apache.uima.fit.descriptor.FsIndexCollection> {
-
-  public FsIndexCollectionConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public FsIndexCollection convert(
-          final org.uimafit.descriptor.FsIndexCollection aAnnotation) {
-    return new FsIndexCollectionSubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.FsIndexCollection> getLegacyType() {
-    return org.uimafit.descriptor.FsIndexCollection.class;
-  }
-  
-  public Class<FsIndexCollection> getModernType() {
-    return FsIndexCollection.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class FsIndexCollectionSubstitute extends
-          AnnotationLiteral<FsIndexCollection> implements FsIndexCollection {
-
-    private org.uimafit.descriptor.FsIndexCollection legacyAnnotation;
-    
-    public FsIndexCollectionSubstitute(org.uimafit.descriptor.FsIndexCollection aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public FsIndex[] fsIndexes() {
-      FsIndex[] result = new FsIndex[legacyAnnotation.fsIndexes().length];
-      FsIndexConverter conv = new FsIndexConverter();
-      int i = 0;
-      for (org.uimafit.descriptor.FsIndex k : legacyAnnotation.fsIndexes()) {
-        result[i] = conv.convert(k);
-        i++;
-      }
-      return result;
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexConverter.java
deleted file mode 100644
index c30c82e..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexConverter.java
+++ /dev/null
@@ -1,92 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.FsIndex;
-import org.apache.uima.fit.descriptor.FsIndexKey;
-import org.apache.uima.jcas.cas.TOP;
-
-public class FsIndexConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.FsIndex, org.apache.uima.fit.descriptor.FsIndex> {
-
-  public FsIndexConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public FsIndex convert(
-          final org.uimafit.descriptor.FsIndex aAnnotation) {
-    return new FsIndexSubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.FsIndex> getLegacyType() {
-    return org.uimafit.descriptor.FsIndex.class;
-  }
-  
-  public Class<FsIndex> getModernType() {
-    return FsIndex.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class FsIndexSubstitute extends
-          AnnotationLiteral<FsIndex> implements FsIndex {
-
-    private org.uimafit.descriptor.FsIndex legacyAnnotation;
-
-    public FsIndexSubstitute(org.uimafit.descriptor.FsIndex aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public String label() {
-      return legacyAnnotation.label();
-    }
-
-    public String typeName() {
-      if (org.uimafit.descriptor.FsIndex.NO_NAME_TYPE_SET.equals(legacyAnnotation.typeName())) {
-        return FsIndex.NO_NAME_TYPE_SET;
-      } else {
-        return legacyAnnotation.typeName();
-      }
-    }
-
-    public Class<? extends TOP> type() {
-      return legacyAnnotation.type();
-    }
-
-    public String kind() {
-      return legacyAnnotation.kind();
-    }
-
-    public FsIndexKey[] keys() {
-      FsIndexKey[] result = new FsIndexKey[legacyAnnotation.keys().length];
-      FsIndexKeyConverter conv = new FsIndexKeyConverter();
-      int i = 0;
-      for (org.uimafit.descriptor.FsIndexKey k : legacyAnnotation.keys()) {
-        result[i] = conv.convert(k);
-        i++;
-      }
-      return result;
-    }
-
-    public boolean typePriorities() {
-      return legacyAnnotation.typePriorities();
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexKeyConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexKeyConverter.java
deleted file mode 100644
index 79697d7..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/FsIndexKeyConverter.java
+++ /dev/null
@@ -1,63 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.FsIndexKey;
-
-public class FsIndexKeyConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.FsIndexKey, org.apache.uima.fit.descriptor.FsIndexKey> {
-
-  public FsIndexKeyConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public FsIndexKey convert(
-          final org.uimafit.descriptor.FsIndexKey aAnnotation) {
-    return new FsIndexKeySubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.FsIndexKey> getLegacyType() {
-    return org.uimafit.descriptor.FsIndexKey.class;
-  }
-  
-  public Class<FsIndexKey> getModernType() {
-    return FsIndexKey.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class FsIndexKeySubstitute extends
-          AnnotationLiteral<FsIndexKey> implements FsIndexKey {
-
-    private org.uimafit.descriptor.FsIndexKey legacyAnnotation;
-    
-    public FsIndexKeySubstitute(org.uimafit.descriptor.FsIndexKey aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public String featureName() {
-      return legacyAnnotation.featureName();
-    }
-
-    public int comparator() {
-      return legacyAnnotation.comparator();
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/NoConversionConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/NoConversionConverter.java
deleted file mode 100644
index 0db00d4..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/NoConversionConverter.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.uima.fit.legacy.converter;
-
-import java.lang.annotation.Annotation;
-
-/**
- * Fallback converter that does not convert anything.
- * 
- * @author Richard Eckart de Castilho
- */
-public class NoConversionConverter extends ContextlessAnnotationConverterBase<Annotation, Annotation> {
-
-  private static NoConversionConverter instance = null;
-  
-  public NoConversionConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public Annotation convert(Annotation aAnnotation) {
-    return null;
-  }
-
-  @SuppressWarnings({ "unchecked", "rawtypes" })
-  public Class<Annotation> getModernType() {
-    return (Class) NoAnnotation.class;
-  }
-
-  @SuppressWarnings({ "unchecked", "rawtypes" })
-  public Class<Annotation> getLegacyType() {
-    return (Class) NoAnnotation.class;
-  }
-  
-  public static NoConversionConverter getInstance() {
-    if (instance == null) {
-      instance = new NoConversionConverter();
-    }
-    return instance;
-  }
-  
-  private @interface NoAnnotation {};
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/OperationalPropertiesConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/OperationalPropertiesConverter.java
deleted file mode 100644
index fc04521..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/OperationalPropertiesConverter.java
+++ /dev/null
@@ -1,67 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.OperationalProperties;
-
-public class OperationalPropertiesConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.OperationalProperties, org.apache.uima.fit.descriptor.OperationalProperties> {
-
-  public OperationalPropertiesConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public OperationalProperties convert(
-          final org.uimafit.descriptor.OperationalProperties aAnnotation) {
-    return new OperationalPropertiesSubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.OperationalProperties> getLegacyType() {
-    return org.uimafit.descriptor.OperationalProperties.class;
-  }
-  
-  public Class<OperationalProperties> getModernType() {
-    return OperationalProperties.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class OperationalPropertiesSubstitute extends
-          AnnotationLiteral<OperationalProperties> implements OperationalProperties {
-
-    private org.uimafit.descriptor.OperationalProperties legacyAnnotation;
-    
-    public OperationalPropertiesSubstitute(org.uimafit.descriptor.OperationalProperties aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public boolean multipleDeploymentAllowed() {
-      return legacyAnnotation.multipleDeploymentAllowed();
-    }
-
-    public boolean modifiesCas() {
-      return legacyAnnotation.modifiesCas();
-    }
-
-    public boolean outputsNewCases() {
-      return legacyAnnotation.outputsNewCases();
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/SofaCapabilityConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/SofaCapabilityConverter.java
deleted file mode 100644
index 616ab6c..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/SofaCapabilityConverter.java
+++ /dev/null
@@ -1,75 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.SofaCapability;
-
-public class SofaCapabilityConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.SofaCapability, org.apache.uima.fit.descriptor.SofaCapability> {
-
-  public SofaCapabilityConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public SofaCapability convert(
-          final org.uimafit.descriptor.SofaCapability aAnnotation) {
-    return new SofaCapabilitySubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.SofaCapability> getLegacyType() {
-    return org.uimafit.descriptor.SofaCapability.class;
-  }
-  
-  public Class<SofaCapability> getModernType() {
-    return SofaCapability.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class SofaCapabilitySubstitute extends
-          AnnotationLiteral<SofaCapability> implements SofaCapability {
-
-    private org.uimafit.descriptor.SofaCapability legacyAnnotation;
-    
-    public SofaCapabilitySubstitute(org.uimafit.descriptor.SofaCapability aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public String[] inputSofas() {
-      String[] values = legacyAnnotation.inputSofas();
-      if (values.length == 1
-              && org.uimafit.descriptor.SofaCapability.NO_DEFAULT_VALUE.equals(values[0])) {
-        return new String[] { SofaCapability.NO_DEFAULT_VALUE };
-      } else {
-        return values;
-      }
-    }
-
-    public String[] outputSofas() {
-      String[] values = legacyAnnotation.outputSofas();
-      if (values.length == 1
-              && org.uimafit.descriptor.SofaCapability.NO_DEFAULT_VALUE.equals(values[0])) {
-        return new String[] { SofaCapability.NO_DEFAULT_VALUE };
-      } else {
-        return values;
-      }
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/TypeCapabilityConverter.java b/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/TypeCapabilityConverter.java
deleted file mode 100644
index 331f746..0000000
--- a/uimafit-legacy-support/src/main/java/org/apache/uima/fit/legacy/converter/TypeCapabilityConverter.java
+++ /dev/null
@@ -1,75 +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.uima.fit.legacy.converter;
-
-import org.apache.uima.fit.descriptor.TypeCapability;
-
-public class TypeCapabilityConverter
-        extends
-        ContextlessAnnotationConverterBase<org.uimafit.descriptor.TypeCapability, org.apache.uima.fit.descriptor.TypeCapability> {
-
-  public TypeCapabilityConverter() {
-    // Nothing to do
-  }
-
-  @Override
-  public TypeCapability convert(
-          final org.uimafit.descriptor.TypeCapability aAnnotation) {
-    return new TypeCapabilitySubstitute(aAnnotation);
-  }
-
-  public Class<org.uimafit.descriptor.TypeCapability> getLegacyType() {
-    return org.uimafit.descriptor.TypeCapability.class;
-  }
-  
-  public Class<TypeCapability> getModernType() {
-    return TypeCapability.class;
-  }
-  
-  @SuppressWarnings("serial")
-  public class TypeCapabilitySubstitute extends
-          AnnotationLiteral<TypeCapability> implements TypeCapability {
-
-    private org.uimafit.descriptor.TypeCapability legacyAnnotation;
-    
-    public TypeCapabilitySubstitute(org.uimafit.descriptor.TypeCapability aAnnotation) {
-      legacyAnnotation = aAnnotation;
-    }
-
-    public String[] inputs() {
-      String[] values = legacyAnnotation.inputs();
-      if (values.length == 1
-              && org.uimafit.descriptor.TypeCapability.NO_DEFAULT_VALUE.equals(values[0])) {
-        return new String[] { TypeCapability.NO_DEFAULT_VALUE };
-      } else {
-        return values;
-      }
-    }
-
-    public String[] outputs() {
-      String[] values = legacyAnnotation.outputs();
-      if (values.length == 1
-              && org.uimafit.descriptor.TypeCapability.NO_DEFAULT_VALUE.equals(values[0])) {
-        return new String[] { TypeCapability.NO_DEFAULT_VALUE };
-      } else {
-        return values;
-      }
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/ComponentTestBase.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/ComponentTestBase.java
deleted file mode 100644
index 8529914..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/ComponentTestBase.java
+++ /dev/null
@@ -1,89 +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.uima.fit;
-
-import org.apache.uima.fit.factory.TypePrioritiesFactory;
-import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
-import org.apache.uima.fit.testing.factory.TokenBuilder;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.metadata.TypePriorities;
-import org.apache.uima.resource.metadata.TypeSystemDescription;
-import org.apache.uima.util.CasCreationUtils;
-import org.junit.Before;
-
-/**
- * 
- * 
- */
-public class ComponentTestBase {
-
-  private static ThreadLocal<JCas> JCAS = new ThreadLocal<JCas>();
-
-  private static ThreadLocal<TypeSystemDescription> TYPE_SYSTEM_DESCRIPTION = new ThreadLocal<TypeSystemDescription>();
-
-  private static ThreadLocal<TypePriorities> TYPE_PRIORITIES = new ThreadLocal<TypePriorities>();
-
-  private static ThreadLocal<TokenBuilder<Token, Sentence>> TOKEN_BUILDER = new ThreadLocal<TokenBuilder<Token, Sentence>>();
-
-  static {
-    try {
-      TYPE_SYSTEM_DESCRIPTION.set(TypeSystemDescriptionFactory.createTypeSystemDescription());
-
-      TypePriorities tp = TypePrioritiesFactory.createTypePriorities(new String[] {
-          "org.apache.uima.fit.type.Sentence", "org.apache.uima.fit.type.AnalyzedText",
-          "org.apache.uima.fit.type.Token" });
-      TYPE_PRIORITIES.set(tp);
-
-      JCas jCas = CasCreationUtils.createCas(TYPE_SYSTEM_DESCRIPTION.get(), tp, null).getJCas();
-      JCAS.set(jCas);
-
-      TokenBuilder<Token, Sentence> tb = new TokenBuilder<Token, Sentence>(Token.class,
-              Sentence.class, "pos", "stem");
-      TOKEN_BUILDER.set(tb);
-    } catch (Exception e) {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-
-  protected JCas jCas;
-
-  protected TypeSystemDescription typeSystemDescription;
-
-  protected TypePriorities typePriorities;
-
-  protected TokenBuilder<Token, Sentence> tokenBuilder;
-
-  /**
-   * we do not want to create a new JCas object every time we run a test because it is expensive
-   * (~100ms on my laptop). Instead, we will have one JCas per thread sitting around that we will
-   * reset everytime a new test is called.
-   */
-  @Before
-  public void setUp() {
-    jCas = JCAS.get();
-    jCas.reset();
-    typeSystemDescription = TYPE_SYSTEM_DESCRIPTION.get();
-    typePriorities = TYPE_PRIORITIES.get();
-    tokenBuilder = TOKEN_BUILDER.get();
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/CasDumpWriterTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/CasDumpWriterTest.java
deleted file mode 100644
index 10ba417..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/CasDumpWriterTest.java
+++ /dev/null
@@ -1,61 +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.uima.fit.component;
-
-import static org.apache.commons.io.FileUtils.readFileToString;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.fit.component.CasDumpWriter;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.util.CasIOUtil;
-import org.apache.uima.jcas.JCas;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-/**
- */
-public class CasDumpWriterTest {
-
-  @Rule
-  public TemporaryFolder folder = new TemporaryFolder();
-
-  @Test
-  public void test() throws Exception {
-    File outputFile = new File(folder.getRoot(), "dump-output.txt");
-
-    AnalysisEngine writer = AnalysisEngineFactory.createEngine(CasDumpWriter.class,
-            CasDumpWriter.PARAM_OUTPUT_FILE, outputFile.getPath());
-    JCas jcas = writer.newJCas();
-    CasIOUtil.readJCas(jcas, new File("src/test/resources/data/docs/test.xmi"));
-    writer.process(jcas);
-    assertTrue(outputFile.exists());
-
-    String reference = readFileToString(
-            new File("src/test/resources/data/reference/test.xmi.dump"), "UTF-8").trim();
-    String actual = readFileToString(outputFile, "UTF-8").trim();
-    actual = actual.replaceAll("\r\n", "\n");
-
-    assertEquals(reference, actual);
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBaseTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBaseTest.java
deleted file mode 100644
index f5df789..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/JCasCollectionReader_ImplBaseTest.java
+++ /dev/null
@@ -1,88 +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.uima.fit.component;
-
-import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.junit.Assert.assertEquals;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.collection.CollectionReader;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.util.CasCreationUtils;
-import org.apache.uima.util.Progress;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-/**
- * Test {@link JCasCollectionReader_ImplBase}
- * 
- */
-public class JCasCollectionReader_ImplBaseTest {
-
-  @Rule
-  public TemporaryFolder folder = new TemporaryFolder();
-
-  /**
-   * Test using a simple reader reading one text file.
-   * 
-   * @throws Exception
-   *           if an error occurs.
-   */
-  @Test
-  public void test() throws Exception {
-    File file = folder.newFile("test.txt");
-    FileUtils.write(file, "Aaa Bbbb Cc Dddd eeee ff .", "UTF-8");
-
-    CollectionReader reader = createReader(SingleTextReader.class,
-            SingleTextReader.PARAM_FILE, file.getPath());
-
-    CAS cas = CasCreationUtils.createCas(reader.getProcessingResourceMetaData());
-    reader.getNext(cas);
-    reader.close();
-
-    assertEquals(FileUtils.readFileToString(file, "UTF-8"), cas.getDocumentText());
-  }
-
-  public static class SingleTextReader extends JCasCollectionReader_ImplBase {
-    public static final String PARAM_FILE = "File";
-
-    @ConfigurationParameter(name = PARAM_FILE, mandatory = true)
-    private File file;
-
-    public boolean hasNext() throws IOException, CollectionException {
-      return file != null;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-
-    @Override
-    public void getNext(JCas jCas) throws IOException, CollectionException {
-      jCas.setDocumentText(FileUtils.readFileToString(file, "UTF-8"));
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewCreatorAnnotatorTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewCreatorAnnotatorTest.java
deleted file mode 100644
index 5104522..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewCreatorAnnotatorTest.java
+++ /dev/null
@@ -1,182 +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.uima.fit.component;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.testing.util.HideOutput;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.JCasUtil;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.junit.Test;
-import org.uimafit.descriptor.SofaCapability;
-
-/**
- * I initially thought that the behavior of mapping the default view to another yet-to-be-created
- * view might be different for sofa aware and sofa unaware components. So the tests are run on using
- * an analysis engine of both kinds.
- * 
- * 
- */
-public class ViewCreatorAnnotatorTest extends ComponentTestBase {
-
-  @Test
-  public void testViewCreatorAnnotator() throws ResourceInitializationException,
-          AnalysisEngineProcessException, CASException {
-    AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(ViewCreatorAnnotator.class,
-            typeSystemDescription, ViewCreatorAnnotator.PARAM_VIEW_NAME, "myView");
-    viewCreator.process(jCas);
-    JCas myView = jCas.getView("myView");
-    assertNotNull(myView);
-    myView.setDocumentText("my view text");
-  }
-
-  /**
-   * This test basically demonstrates that the default view does not need to be initialized because
-   * it is done automatically.
-   */
-  @SuppressWarnings("javadoc")
-  @Test
-  public void testDefaultView() throws ResourceInitializationException,
-          AnalysisEngineProcessException {
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(SofaAwareAnnotator.class,
-            typeSystemDescription);
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
-
-    engine = AnalysisEngineFactory.createEngine(SofaUnawareAnnotator.class,
-            typeSystemDescription);
-    jCas.reset();
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
-  }
-
-  /**
-   * This test demonstrates the bad behavior that occurs when you try to map the default view to
-   * some other view without initializing that other view first. This is the behavior that
-   * SofaInitializerAnnotator addresses.
-   */
-  @SuppressWarnings("javadoc")
-  @Test(expected = AnalysisEngineProcessException.class)
-  public void testOtherViewAware() throws ResourceInitializationException,
-          AnalysisEngineProcessException {
-    AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
-            SofaAwareAnnotator.class, typeSystemDescription);
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
-    HideOutput hider = new HideOutput();
-    engine.process(jCas);
-    hider.restoreOutput();
-  }
-
-  @Test(expected = AnalysisEngineProcessException.class)
-  public void testOtherViewUnaware() throws ResourceInitializationException,
-          AnalysisEngineProcessException {
-    AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
-            SofaUnawareAnnotator.class, typeSystemDescription);
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
-    HideOutput hider = new HideOutput();
-    engine.process(jCas);
-    hider.restoreOutput();
-  }
-
-  /**
-   * This test demonstrates that running the viewCreator is doing the right thing (i.e. initializing
-   * the view "myView")
-   */
-  @SuppressWarnings("javadoc")
-  @Test
-  public void testSofaInitializer() throws ResourceInitializationException,
-          AnalysisEngineProcessException, CASException {
-    AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
-            SofaAwareAnnotator.class, typeSystemDescription);
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
-    AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(ViewCreatorAnnotator.class,
-            typeSystemDescription, ViewCreatorAnnotator.PARAM_VIEW_NAME, "myView");
-    viewCreator.process(jCas);
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
-            .getCoveredText());
-
-    // here I run again with viewCreator running twice to make sure it
-    // does the right thing when the view
-    // has already been created
-    jCas.reset();
-    viewCreator.process(jCas);
-    viewCreator.process(jCas);
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
-            .getCoveredText());
-
-    description = AnalysisEngineFactory.createEngineDescription(SofaUnawareAnnotator.class,
-            typeSystemDescription);
-    engine = AnalysisEngineFactory.createEngine(description, "myView");
-    jCas.reset();
-    viewCreator.process(jCas);
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
-            .getCoveredText());
-
-    jCas.reset();
-    viewCreator.process(jCas);
-    viewCreator.process(jCas);
-    engine.process(jCas);
-    assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
-            .getCoveredText());
-  }
-
-  @SofaCapability(inputSofas = CAS.NAME_DEFAULT_SOFA)
-  public static class SofaAwareAnnotator extends JCasAnnotator_ImplBase {
-
-    @Override
-    public void process(JCas jCas) throws AnalysisEngineProcessException {
-      JCas view;
-      try {
-        view = jCas.getView(CAS.NAME_DEFAULT_SOFA);
-      } catch (CASException e) {
-        throw new AnalysisEngineProcessException(e);
-      }
-
-      view.setDocumentText("some text");
-      Token token = new Token(view, 0, 4);
-      token.addToIndexes();
-    }
-
-  }
-
-  public static class SofaUnawareAnnotator extends JCasAnnotator_ImplBase {
-
-    @Override
-    public void process(JCas jCas) throws AnalysisEngineProcessException {
-      jCas.setDocumentText("some text");
-      Token token = new Token(jCas, 0, 4);
-      token.addToIndexes();
-    }
-
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewTextCopierAnnotatorTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewTextCopierAnnotatorTest.java
deleted file mode 100644
index 1a5f2b0..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewTextCopierAnnotatorTest.java
+++ /dev/null
@@ -1,92 +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.uima.fit.component;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.junit.Test;
-
-/**
- * 
- */
-public class ViewTextCopierAnnotatorTest extends ComponentTestBase {
-
-  @Test
-  public void testViewTextCopier() throws ResourceInitializationException,
-          AnalysisEngineProcessException, CASException {
-
-    String text = "sample text";
-    String sourceViewName = "SourceView";
-    String destinationViewName = "DestinationView";
-
-    jCas.setDocumentText(text);
-    AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(
-            ViewTextCopierAnnotator.class, typeSystemDescription,
-            ViewTextCopierAnnotator.PARAM_SOURCE_VIEW_NAME, CAS.NAME_DEFAULT_SOFA,
-            ViewTextCopierAnnotator.PARAM_DESTINATION_VIEW_NAME, destinationViewName);
-    viewCreator.process(jCas);
-    JCas destinationView = jCas.getView(destinationViewName);
-    assertNotNull(destinationView);
-    assertEquals(text, destinationView.getDocumentText());
-
-    jCas.reset();
-    jCas.setDocumentText(text);
-    jCas.createView(destinationViewName);
-    viewCreator.process(jCas);
-    destinationView = jCas.getView(destinationViewName);
-    assertNotNull(destinationView);
-    assertEquals(text, destinationView.getDocumentText());
-
-    viewCreator = AnalysisEngineFactory.createEngine(ViewTextCopierAnnotator.class,
-            typeSystemDescription, ViewTextCopierAnnotator.PARAM_SOURCE_VIEW_NAME, sourceViewName,
-            ViewTextCopierAnnotator.PARAM_DESTINATION_VIEW_NAME, destinationViewName);
-    jCas.reset();
-    JCas sourceView = jCas.createView(sourceViewName);
-    sourceView.setDocumentText(text);
-    viewCreator.process(jCas);
-    destinationView = jCas.getView(destinationViewName);
-    assertNotNull(destinationView);
-    assertEquals(text, destinationView.getDocumentText());
-    assertNull(jCas.getDocumentText());
-  }
-
-  @Test(expected = AnalysisEngineProcessException.class)
-  public void testExceptions() throws ResourceInitializationException,
-          AnalysisEngineProcessException {
-
-    String sourceViewName = "SourceView";
-    String destinationViewName = "DestinationView";
-
-    AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(
-            ViewTextCopierAnnotator.class, typeSystemDescription,
-            ViewTextCopierAnnotator.PARAM_SOURCE_VIEW_NAME, sourceViewName,
-            ViewTextCopierAnnotator.PARAM_DESTINATION_VIEW_NAME, destinationViewName);
-    viewCreator.process(jCas);
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/initialize/ConfigurationParameterInitializerTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/initialize/ConfigurationParameterInitializerTest.java
deleted file mode 100644
index ee619a1..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/initialize/ConfigurationParameterInitializerTest.java
+++ /dev/null
@@ -1,472 +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.uima.fit.component.initialize;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.awt.Point;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Locale;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.UimaContext;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.factory.testAes.Annotator1;
-import org.apache.uima.fit.factory.testAes.ParameterizedAE;
-import org.apache.uima.fit.factory.testAes.ParameterizedAE.EnumValue;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.metadata.impl.ConfigurationParameterSettings_impl;
-import org.junit.Test;
-import org.uimafit.descriptor.ConfigurationParameter;
-import org.xml.sax.SAXException;
-
-/**
- */
-
-public class ConfigurationParameterInitializerTest extends ComponentTestBase {
-
-  @Test
-  public void testInitialize() throws ResourceInitializationException, SecurityException {
-
-    ResourceInitializationException rie = null;
-    try {
-      AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription);
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(ParameterizedAE.class,
-            typeSystemDescription, ParameterizedAE.PARAM_FLOAT_3, 1.234f,
-            ParameterizedAE.PARAM_FLOAT_6, new Float[] { 1.234f, 0.001f }, "file2", "foo/bar",
-            "files9", new File[] { new File("test/data/file"), new File("test/data/file2") });
-    // Test initializing a multi-valued parameter with a single value
-    // This is supposed to be fixed as part of issue #79
-    // -- REC 2011-05-02
-    // ParameterizedAE.PARAM_STRING_9, "singleelementarray");
-
-    ParameterizedAE component = new ParameterizedAE();
-    component.initialize(engine.getUimaContext());
-    assertEquals("pineapple", component.getString1());
-    assertArrayEquals(new String[] { "coconut", "mango" }, component.getString2());
-    assertEquals(null, component.getString3());
-    assertArrayEquals(new String[] { "apple" }, component.getString4());
-    assertArrayEquals(new String[] { "" }, component.getString5());
-    assertEquals(3, component.getStrings6().size());
-    assertTrue(component.getStrings6().contains("kiwi fruit"));
-    assertTrue(component.getStrings6().contains("grape"));
-    assertTrue(component.getStrings6().contains("pear"));
-    assertNull(component.getStrings7());
-    assertEquals(1, component.getStrings8().size());
-    assertTrue(component.getStrings8().contains("cherry"));
-    // assertTrue(component.getStrings9().contains("singleelementarray"));
-
-    assertFalse(component.isBoolean1());
-
-    NullPointerException npe = null;
-    try {
-      assertFalse(component.isBoolean2());
-    } catch (NullPointerException e) {
-      npe = e;
-    }
-    assertNotNull(npe);
-
-    assertFalse(component.isBoolean2b());
-
-    assertTrue(component.getBoolean3()[0]);
-    assertTrue(component.getBoolean3()[1]);
-    assertFalse(component.getBoolean3()[2]);
-    assertTrue(component.boolean4[0]);
-    assertFalse(component.boolean4[1]);
-    assertTrue(component.boolean4[2]);
-    assertFalse(component.getBoolean5()[0]);
-    assertEquals(4, component.getBooleans6().size());
-    assertTrue(component.getBooleans6().get(0));
-    assertTrue(component.getBooleans6().get(1));
-    assertTrue(component.getBooleans6().get(2));
-    assertFalse(component.getBooleans6().get(3));
-
-    assertEquals(0, component.getInt1());
-    assertEquals(42, component.getInt2());
-    assertEquals(42, component.getInt3()[0]);
-    assertEquals(111, component.getInt3()[1]);
-    assertEquals(Integer.valueOf(2), component.getInt4()[0]);
-    assertEquals(1, component.getInts5().size());
-    assertEquals(2, component.getInts5().get(0).intValue());
-    assertEquals(5, component.getInts6().size());
-    assertEquals(1, component.getInts6().get(0).intValue());
-    assertEquals(2, component.getInts6().get(1).intValue());
-    assertEquals(3, component.getInts6().get(2).intValue());
-    assertEquals(4, component.getInts6().get(3).intValue());
-    assertEquals(5, component.getInts6().get(4).intValue());
-
-    assertEquals(0.0f, component.getFloat1(), 0.001f);
-    assertEquals(3.1415f, component.getFloat2(), 0.001f);
-    assertEquals(1.234f, component.getFloat3(), 0.001f);
-    assertNull(component.getFloat4());
-    assertEquals(0f, component.getFloat5()[0], 0.001f);
-    assertEquals(3.1415f, component.getFloat5()[1], 0.001f);
-    assertEquals(2.7182818f, component.getFloat5()[2], 0.001f);
-    assertEquals(1.234f, component.getFloat6()[0], 0.001f);
-    assertEquals(0.001f, component.getFloat6()[1], 0.001f);
-    assertEquals(1.1111f, component.getFloat7()[0], 0.001f);
-    assertEquals(2.2222f, component.getFloat7()[1], 0.001f);
-    assertEquals(3.3333f, component.getFloat7()[2], 0.001f);
-
-    assertEquals(EnumValue.ENUM_1, component.getEnum1());
-    assertArrayEquals(new EnumValue[] { EnumValue.ENUM_1, EnumValue.ENUM_2 }, component.getEnum2());
-    assertEquals(asList(EnumValue.ENUM_1, EnumValue.ENUM_2), component.getEnum3());
-    assertEquals(new File("test/data/file"), component.getFile1());
-    assertEquals(new File("test/data/file"), component.getFile1b());
-    assertEquals(new File("foo/bar"), component.getFile2());
-    assertNull(component.getFiles3());
-    assertArrayEquals(new File[] { new File("test/data/file") }, component.getFiles4());
-    assertArrayEquals(new File[] { new File("test/data/file"), new File("test/data/file2") },
-            component.getFiles5());
-    assertNull(component.getFiles6());
-    assertEquals(1, component.getFiles7().size());
-    assertEquals(new File("test/data/file"), component.getFiles7().get(0));
-    assertEquals(2, component.getFiles8().size());
-    assertEquals(new File("test/data/file"), component.getFiles8().get(0));
-    assertEquals(new File("test/data/file2"), component.getFiles8().get(1));
-    assertEquals(2, component.getFiles9().size());
-    assertEquals(new File("test/data/file"), component.getFiles9().get(0));
-    assertEquals(new File("test/data/file2"), component.getFiles9().get(1));
-
-    engine = AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription,
-            ParameterizedAE.PARAM_FLOAT_3, 1.234f, ParameterizedAE.PARAM_FLOAT_6, new Float[] {
-                1.234f, 0.001f }, ParameterizedAE.PARAM_STRING_1, "lime",
-            ParameterizedAE.PARAM_STRING_2, new String[] { "banana", "strawberry" },
-            ParameterizedAE.PARAM_STRING_3, "cherry", ParameterizedAE.PARAM_STRING_4, new String[] {
-                "raspberry", "blueberry", "blackberry" }, ParameterizedAE.PARAM_STRING_5,
-            new String[] { "a" }, ParameterizedAE.PARAM_BOOLEAN_1, true,
-            ParameterizedAE.PARAM_BOOLEAN_2, true, ParameterizedAE.PARAM_BOOLEAN_3, new boolean[] {
-                true, true, false }, ParameterizedAE.PARAM_BOOLEAN_4, new Boolean[] { true, false,
-                false }, ParameterizedAE.PARAM_BOOLEAN_5, new Boolean[] { true },
-            ParameterizedAE.PARAM_INT_1, 0, ParameterizedAE.PARAM_INT_2, 24,
-            ParameterizedAE.PARAM_INT_3, new int[] { 5 }, "file1", "foo1/bar1", "file1b",
-            "foo1b/bar1b", "file2", "foo2/bar2", "files3", new String[] {
-                "C:\\Documents and Settings\\Philip\\My Documents\\", "/usr/local/bin" }, "files4",
-            new String[0], "files5", new String[] { "foos/bars" }, "files6", new String[] {
-                "C:\\Documents and Settings\\Philip\\My Documents\\", "/usr/local/bin" }, "files7",
-            new String[0], "files8", new String[] { "foos/bars" }, "files9",
-            Arrays.asList(new File("test/data/file"), new File("test/data/file2")));
-    component = new ParameterizedAE();
-    component.initialize(engine.getUimaContext());
-    assertEquals("lime", component.getString1());
-    assertArrayEquals(new String[] { "banana", "strawberry" }, component.getString2());
-    assertEquals("cherry", component.getString3());
-    assertArrayEquals(new String[] { "raspberry", "blueberry", "blackberry" },
-            component.getString4());
-    assertArrayEquals(new String[] { "a" }, component.getString5());
-    assertTrue(component.isBoolean1());
-    assertTrue(component.isBoolean2());
-    assertTrue(component.getBoolean3()[0]);
-    assertTrue(component.getBoolean3()[1]);
-    assertFalse(component.getBoolean3()[2]);
-    assertTrue(component.boolean4[0]);
-    assertFalse(component.boolean4[1]);
-    assertFalse(component.boolean4[2]);
-    assertTrue(component.getBoolean5()[0]);
-    assertEquals(0, component.getInt1());
-    assertEquals(24, component.getInt2());
-    assertEquals(5, component.getInt3()[0]);
-
-    assertEquals(new File("foo1/bar1"), component.getFile1());
-    assertEquals(new File("foo1b/bar1b"), component.getFile1b());
-    assertEquals(new File("foo2/bar2"), component.getFile2());
-    assertArrayEquals(new File[] { new File("C:\\Documents and Settings\\Philip\\My Documents\\"),
-        new File("/usr/local/bin") }, component.getFiles3());
-    assertEquals(0, component.getFiles4().length);
-    assertArrayEquals(new File[] { new File("foos/bars") }, component.getFiles5());
-    assertEquals(2, component.getFiles6().size());
-    assertEquals(new File("C:\\Documents and Settings\\Philip\\My Documents\\"), component
-            .getFiles6().get(0));
-    assertEquals(new File("/usr/local/bin"), component.getFiles6().get(1));
-    assertEquals(0, component.getFiles7().size());
-    assertEquals(1, component.getFiles8().size());
-    assertEquals(new File("foos/bars"), component.getFiles8().get(0));
-    assertEquals(2, component.getFiles9().size());
-    assertEquals(new File("test/data/file"), component.getFiles9().get(0));
-    assertEquals(new File("test/data/file2"), component.getFiles9().get(1));
-
-    engine = AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription,
-            ParameterizedAE.PARAM_FLOAT_3, 1.234f, ParameterizedAE.PARAM_FLOAT_6, new Float[] {
-                1.234f, 0.001f }, ParameterizedAE.PARAM_BOOLEAN_1, true,
-            ParameterizedAE.PARAM_BOOLEAN_3, new boolean[3], ParameterizedAE.PARAM_FLOAT_5,
-            new float[] { 1.2f, 3.4f }, "file2", "foo2/bar2");
-    component = new ParameterizedAE();
-    component.initialize(engine.getUimaContext());
-    assertFalse(component.getBoolean3()[0]);
-    assertFalse(component.getBoolean3()[1]);
-    assertFalse(component.getBoolean3()[2]);
-    assertEquals(component.getFloat5()[0], 1.2f, 0.001f);
-    assertEquals(component.getFloat5()[1], 3.4f, 0.001f);
-
-    rie = null;
-    try {
-      engine = AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription,
-              ParameterizedAE.PARAM_FLOAT_3, 1.234f, ParameterizedAE.PARAM_FLOAT_6, new Float[] {
-                  1.234f, 0.001f }, ParameterizedAE.PARAM_STRING_1, true);
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-
-  }
-
-  @Test
-  public void testInitialize2() throws ResourceInitializationException {
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(Annotator1.class,
-            typeSystemDescription);
-    assertEquals(1, engine.getAnalysisEngineMetaData().getCapabilities().length);
-  }
-
-  @Test
-  public void testInitialize3() throws FileNotFoundException, IOException, UIMAException {
-    // here we test an optional parameter that is missing from the
-    // configuration to ensure that it is filled in with the default value
-    AnalysisEngine aed = AnalysisEngineFactory
-            .createEngineFromPath("src/test/resources/data/descriptor/DefaultValueAE1.xml");
-    DefaultValueAE1 ae = new DefaultValueAE1();
-    ae.initialize(aed.getUimaContext());
-    assertEquals("green", ae.color);
-
-    // here we test a mandatory parameter that is missing from the
-    // configuration and ensure that an exception is thrown because
-    // no default value is given in the configuration parameter annotation.
-    ResourceInitializationException rie = null;
-    try {
-      aed = AnalysisEngineFactory
-              .createEngineFromPath("src/test/resources/data/descriptor/DefaultValueAE2.xml");
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-  }
-
-  /**
-   * If a parameter value is set to null, that is as good as if it was not set at all. If a default
-   * value is specified, it should be used.
-   */
-  @Test
-  public void testParameterSetToNull() throws Exception {
-    String paramColor = DefaultValueAE1.class.getName() + ".color";
-    AnalysisEngine aed = AnalysisEngineFactory.createEngine(DefaultValueAE1.class, null,
-            paramColor, null);
-    DefaultValueAE1 ae = new DefaultValueAE1();
-    ae.initialize(aed.getUimaContext());
-    assertEquals("green", ae.color);
-  }
-
-  /**
-   * If a parameter value is set to null, that is as good as if it was not set at all. If it is
-   * mandatory, an exception has to be thrown.
-   */
-  @Test(expected = ResourceInitializationException.class)
-  public void testMandatoryParameterSetToNull() throws Exception {
-    String paramColor = DefaultValueAE2.class.getName() + ".color";
-    AnalysisEngine aed = AnalysisEngineFactory.createEngine(DefaultValueAE2.class, null,
-            paramColor, null);
-    DefaultValueAE2 ae = new DefaultValueAE2();
-    ae.initialize(aed.getUimaContext());
-
-  }
-
-  /**
-   * Test that a parameter not supported by UIMA produces an error.
-   */
-  @Test(expected = IllegalArgumentException.class)
-  public void testNonUimaCompatibleParameterValue() throws Exception {
-    String paramColor = DefaultValueAE2.class.getName() + ".color";
-    AnalysisEngine aed = AnalysisEngineFactory.createEngine(DefaultValueAE2.class, null,
-            paramColor, new Point(1, 2));
-    DefaultValueAE2 ae = new DefaultValueAE2();
-    ae.initialize(aed.getUimaContext());
-  }
-
-  /**
-   * Check that an Analysis Engine created from a descriptor declaring optional parameters but not
-   * setting them actually uses the default values declared in the Java annotation
-   */
-  @Test
-  public void testUnsetOptionalParameter() throws Exception {
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            DefaultValueAE1.class, (Object[]) null);
-    // Remove the settings from the descriptor, but leave the declarations.
-    // The settings are already filled with default values by createPrimitiveDescription,
-    // but here we want to simulate loading a descriptor without settings from a file.
-    // The file of course would declare the parameters optional and thus the settings
-    // for the optional parameters would be empty. We expect that a default value from the
-    // annotation is used in this case.
-    aed.getMetaData().setConfigurationParameterSettings(new ConfigurationParameterSettings_impl());
-    AnalysisEngine template = UIMAFramework.produceAnalysisEngine(aed);
-    DefaultValueAE1 ae = new DefaultValueAE1();
-    ae.initialize(template.getUimaContext());
-    assertEquals("green", ae.color);
-  }
-
-  public static class DefaultValueAE1 extends JCasAnnotator_ImplBase {
-    @ConfigurationParameter(defaultValue = "green")
-    private String color;
-
-    @Override
-    public void initialize(UimaContext aContext) throws ResourceInitializationException {
-      super.initialize(aContext);
-    }
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      /* do nothing */
-    }
-
-  }
-
-  public static class DefaultValueAE2 extends JCasAnnotator_ImplBase {
-    @SuppressWarnings("unused")
-    @ConfigurationParameter(mandatory = true)
-    private String color;
-
-    @Override
-    public void initialize(UimaContext aContext) throws ResourceInitializationException {
-      super.initialize(aContext);
-    }
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      /* do nothing */
-    }
-
-  }
-
-  @Test
-  public void testEnumDefaultValue() {
-    try {
-      AnalysisEngine aed = AnalysisEngineFactory.createEngine(DefaultEnumValueAE.class,
-              (Object[]) null);
-      DefaultEnumValueAE ae = new DefaultEnumValueAE();
-      ae.initialize(aed.getUimaContext());
-      assertEquals(Color.GREEN, ae.color);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-  }
-
-  public static enum Color {
-    RED, GREEN, BLUE
-  }
-
-  public static class DefaultEnumValueAE extends JCasAnnotator_ImplBase {
-    @ConfigurationParameter(defaultValue = "GREEN")
-    private Color color;
-
-    @Override
-    public void initialize(UimaContext aContext) throws ResourceInitializationException {
-      super.initialize(aContext);
-    }
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      /* do nothing */
-    }
-  }
-
-  public static class DefaultLocaleValueAE extends JCasAnnotator_ImplBase {
-    @ConfigurationParameter(name = "L1", defaultValue = "US")
-    public Locale locale1;
-
-    @ConfigurationParameter(name = "L2")
-    public Locale locale2;
-
-    @ConfigurationParameter(name = "L3")
-    public Locale locale3;
-
-    @ConfigurationParameter(name = "L4")
-    public Locale locale4;
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      /* do nothing */
-    }
-  }
-
-  @Test
-  public void testLocaleParams() throws Exception {
-    AnalysisEngine aed = AnalysisEngineFactory.createEngine(DefaultLocaleValueAE.class, "L2",
-            "en-CA", "L3", "CANADA_FRENCH", "L4", "zh");
-    DefaultLocaleValueAE ae = new DefaultLocaleValueAE();
-    ae.initialize(aed.getUimaContext());
-    assertEquals(Locale.US, ae.locale1);
-    assertEquals(new Locale("en", "CA"), ae.locale2);
-    assertEquals(Locale.CANADA_FRENCH, ae.locale3);
-    assertEquals(new Locale("zh"), ae.locale4);
-
-    aed = AnalysisEngineFactory.createEngine(DefaultLocaleValueAE.class, "L1",
-            "es-ES-Traditional_WIN", "L2", "CHINA", "L3", "es", "L4", "en-CA");
-    ae = new DefaultLocaleValueAE();
-    ae.initialize(aed.getUimaContext());
-    assertEquals(new Locale("es", "ES", "Traditional_WIN"), ae.locale1);
-    assertEquals(Locale.CHINA, ae.locale2);
-    assertEquals(new Locale("es"), ae.locale3);
-    assertEquals(new Locale("en", "CA"), ae.locale4);
-
-    aed = AnalysisEngineFactory.createEngine(DefaultLocaleValueAE.class, "L1", "", "L2", "",
-            "L3", null);
-    ae = new DefaultLocaleValueAE();
-    ae.initialize(aed.getUimaContext());
-    assertEquals(Locale.getDefault(), ae.locale1);
-    assertEquals(Locale.getDefault(), ae.locale2);
-    assertEquals(null, ae.locale3);
-    assertEquals(null, ae.locale4);
-
-  }
-
-  /**
-   * This main method creates the descriptor files used in testInitialize3. If I weren't lazy I
-   * would figure out how to programmatically remove the configuration parameter corresponding to
-   * 'color'. As it is, however, the parameter must be manually removed (I used the Component
-   * Descriptor Editor to do this.) This point is moot anyways because I am checking in the
-   * generated descriptor files and there is no reason to run this main method in the future.
-   */
-  public static void main(String[] args) throws ResourceInitializationException,
-          FileNotFoundException, SAXException, IOException {
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            DefaultValueAE1.class, (Object[]) null);
-    aed.toXML(new FileOutputStream("src/test/resources/data/descriptor/DefaultValueAE1.xml"));
-    aed = AnalysisEngineFactory.createEngineDescription(DefaultValueAE2.class, (Object[]) null);
-    aed.toXML(new FileOutputStream("src/test/resources/data/descriptor/DefaultValueAE2.xml"));
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXCASFile.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXCASFile.java
deleted file mode 100644
index 5240ede..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXCASFile.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.uima.fit.data;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.impl.XCASSerializer;
-import org.apache.uima.fit.factory.JCasFactory;
-import org.apache.uima.fit.testing.factory.TokenBuilder;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.util.XMLSerializer;
-import org.xml.sax.SAXException;
-
-/**
- */
-
-public class CreateSampleXCASFile {
-
-  public static void main(String[] args) throws UIMAException, SAXException, IOException {
-    TokenBuilder<Token, Sentence> tokenBuilder = new TokenBuilder<Token, Sentence>(Token.class,
-            Sentence.class, "pos", "stem");
-    JCas jCas = JCasFactory.createJCas();
-    // quote from http://www.gutenberg.org/files/20417/20417-h/20417-h.htm
-    String text = "... the more knowledge advances the more it becomes possible to condense it into little books.";
-    tokenBuilder
-            .buildTokens(
-                    jCas,
-                    text,
-                    "... the more knowledge advances the more it becomes possible to condense it into little books . ",
-                    ". T M K A T M I B P T C I I L B .",
-                    "... the more knowledge advance the more it become possible to condense it into little book . ");
-
-    FileOutputStream out = new FileOutputStream("src/test/resources/data/docs/test.xcas");
-    XCASSerializer ser = new XCASSerializer(jCas.getTypeSystem());
-    XMLSerializer xmlSer = new XMLSerializer(out, false);
-    ser.serialize(jCas.getCas(), xmlSer.getContentHandler());
-    out.close();
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXMIFile.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXMIFile.java
deleted file mode 100644
index 79ee0a4..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/data/CreateSampleXMIFile.java
+++ /dev/null
@@ -1,54 +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.uima.fit.data;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.impl.XmiCasSerializer;
-import org.apache.uima.fit.factory.JCasFactory;
-import org.apache.uima.fit.testing.factory.TokenBuilder;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.util.XMLSerializer;
-import org.xml.sax.SAXException;
-
-/**
- */
-
-public class CreateSampleXMIFile {
-
-  public static void main(String[] args) throws UIMAException, SAXException, IOException {
-    TokenBuilder<Token, Sentence> tokenBuilder = new TokenBuilder<Token, Sentence>(Token.class,
-            Sentence.class, "pos", "stem");
-    JCas jCas = JCasFactory.createJCas();
-    String text = "Me and all my friends are non-conformists.";
-    tokenBuilder.buildTokens(jCas, text, "Me and all my friends are non - conformists .",
-            "M A A M F A N - C .", "me and all my friend are non - conformist .");
-
-    FileOutputStream out = new FileOutputStream("src/test/resources/data/docs/test.xmi");
-    XmiCasSerializer ser = new XmiCasSerializer(jCas.getTypeSystem());
-    XMLSerializer xmlSer = new XMLSerializer(out, false);
-    ser.serialize(jCas.getCas(), xmlSer.getContentHandler());
-    out.close();
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/descriptor/TypeCapabilityTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/descriptor/TypeCapabilityTest.java
deleted file mode 100644
index 7f52e8f..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/descriptor/TypeCapabilityTest.java
+++ /dev/null
@@ -1,57 +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.uima.fit.descriptor;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.TypeOrFeature;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.factory.testAes.Annotator4;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.metadata.Capability;
-import org.junit.Test;
-
-/**
- */
-
-public class TypeCapabilityTest extends ComponentTestBase {
-
-  @Test
-  public void testTC() throws ResourceInitializationException {
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            Annotator4.class, typeSystemDescription);
-    Capability[] capabilities = aed.getAnalysisEngineMetaData().getCapabilities();
-    assertEquals(1, capabilities.length);
-    Capability capability = capabilities[0];
-    TypeOrFeature[] inputs = capability.getInputs();
-    assertEquals(1, inputs.length);
-    assertEquals("org.apache.uima.fit.type.Token", inputs[0].getName());
-    assertTrue(inputs[0].isType());
-
-    TypeOrFeature[] outputs = capability.getOutputs();
-    assertEquals(1, outputs.length);
-    assertEquals("org.apache.uima.fit.type.Token:pos", outputs[0].getName());
-    assertFalse(outputs[0].isType());
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateBuilderTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateBuilderTest.java
deleted file mode 100644
index f74b10c..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateBuilderTest.java
+++ /dev/null
@@ -1,209 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.NoOpAnnotator;
-import org.apache.uima.fit.factory.testAes.Annotator1;
-import org.apache.uima.fit.factory.testAes.Annotator2;
-import org.apache.uima.fit.factory.testAes.Annotator3;
-import org.apache.uima.fit.factory.testAes.FlowAE1;
-import org.apache.uima.fit.factory.testAes.FlowAE2;
-import org.apache.uima.fit.factory.testAes.FlowAE3;
-import org.apache.uima.fit.factory.testAes.ReversableTestFlowController;
-import org.apache.uima.fit.factory.testAes.ViewNames;
-import org.apache.uima.fit.pipeline.SimplePipeline;
-import org.apache.uima.fit.util.CasIOUtil;
-import org.apache.uima.fit.util.TypeSystemUtil;
-import org.apache.uima.flow.FlowControllerDescription;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.junit.Test;
-
-/**
- */
-public class AggregateBuilderTest extends ComponentTestBase {
-
-  @Test
-  public void testAggregateBuilder() throws UIMAException, IOException {
-    tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?");
-
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.add(AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription), ViewNames.PARENTHESES_VIEW, "A");
-    builder.add(AnalysisEngineFactory.createEngineDescription(Annotator2.class,
-            typeSystemDescription), ViewNames.SORTED_VIEW, "B", ViewNames.SORTED_PARENTHESES_VIEW,
-            "C", ViewNames.PARENTHESES_VIEW, "A");
-    builder.add(AnalysisEngineFactory.createEngineDescription(Annotator3.class,
-            typeSystemDescription), ViewNames.INITIAL_VIEW, "B");
-    AnalysisEngine aggregateEngine = builder.createAggregate();
-
-    aggregateEngine.process(jCas);
-
-    assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText());
-    assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A")
-            .getDocumentText());
-    assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText());
-    assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C")
-            .getDocumentText());
-    assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW)
-            .getDocumentText());
-
-    CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xmi"));
-    AnalysisEngine ae1 = AnalysisEngineFactory.createEngine(NoOpAnnotator.class,
-            typeSystemDescription);
-
-    SimplePipeline.runPipeline(jCas, ae1, aggregateEngine);
-
-    AnalysisEngineDescription aggregateDescription = builder.createAggregateDescription();
-    builder = new AggregateBuilder();
-    builder.add(aggregateDescription);
-    builder.add(AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription), ViewNames.PARENTHESES_VIEW, "PARENS");
-    aggregateEngine = builder.createAggregate();
-
-    jCas.reset();
-
-    tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?");
-
-    aggregateEngine.process(jCas);
-
-    assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText());
-    assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A")
-            .getDocumentText());
-    assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText());
-    assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C")
-            .getDocumentText());
-    assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW)
-            .getDocumentText());
-    assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("PARENS")
-            .getDocumentText());
-
-  }
-
-  @Test
-  public void testAggregateBuilder2() throws UIMAException {
-    tokenBuilder.buildTokens(jCas, "'Verb' is a noun!?");
-
-    AggregateBuilder builder = new AggregateBuilder();
-    String componentName1 = builder.add(AnalysisEngineFactory.createEngineDescription(
-            Annotator1.class, typeSystemDescription));
-    String componentName2 = builder.add(AnalysisEngineFactory.createEngineDescription(
-            Annotator1.class, typeSystemDescription));
-    String componentName3 = builder.add(AnalysisEngineFactory.createEngineDescription(
-            Annotator1.class, typeSystemDescription));
-
-    assertEquals("org.apache.uima.fit.factory.testAes.Annotator1", componentName1);
-    assertEquals("org.apache.uima.fit.factory.testAes.Annotator1.2", componentName2);
-    assertEquals("org.apache.uima.fit.factory.testAes.Annotator1.3", componentName3);
-
-    builder.addSofaMapping(componentName1, ViewNames.PARENTHESES_VIEW, "A");
-    builder.addSofaMapping(componentName2, ViewNames.PARENTHESES_VIEW, "B");
-    builder.addSofaMapping(componentName3, ViewNames.PARENTHESES_VIEW, "C");
-    AnalysisEngineDescription aggregateEngineDescription = builder.createAggregateDescription();
-
-    AnalysisEngine aggregateEngine = AnalysisEngineFactory
-            .createEngine(aggregateEngineDescription);
-
-    aggregateEngine.process(jCas);
-
-    assertEquals("'Verb' is a noun!?", jCas.getDocumentText());
-    assertEquals("'V(e)rb' (i)s (a) n(ou)n!?", jCas.getView("A").getDocumentText());
-    assertEquals("'V(e)rb' (i)s (a) n(ou)n!?", jCas.getView("B").getDocumentText());
-    assertEquals("'V(e)rb' (i)s (a) n(ou)n!?", jCas.getView("C").getDocumentText());
-
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testOddNumberOfViewNames() throws ResourceInitializationException {
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.add(AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription), ViewNames.PARENTHESES_VIEW);
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testDuplicateComponentNames() throws ResourceInitializationException {
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.add("name", AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription));
-    builder.add("name", AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription));
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testBadSofaMapping() {
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.addSofaMapping("name", ViewNames.PARENTHESES_VIEW, "A");
-  }
-
-  @Test
-  public void testAggregateBuilderWithFlowController() throws UIMAException {
-    tokenBuilder.buildTokens(jCas, "An honest man can never surrender an honest doubt.");
-
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.add(AnalysisEngineFactory.createEngineDescription(FlowAE1.class,
-            typeSystemDescription));
-    builder.add(AnalysisEngineFactory.createEngineDescription(FlowAE2.class,
-            typeSystemDescription));
-    builder.add(AnalysisEngineFactory.createEngineDescription(FlowAE3.class,
-            typeSystemDescription));
-
-    FlowControllerDescription fcd = FlowControllerFactory
-            .createFlowControllerDescription(ReversableTestFlowController.class);
-    builder.setFlowControllerDescription(fcd);
-    AnalysisEngine aggregateEngine = builder.createAggregate();
-    aggregateEngine.process(jCas);
-
-    String text = "An honest man can never surrender an honest doubt.";
-    text = text.replaceAll("[aeiou]+", "($0)"); // this is what FlowAE1 does
-    text = FlowAE2.sort(text);
-    text = FlowAE3.reverse(text);
-
-    assertEquals(text, TypeSystemUtil.getAnalyzedText(jCas));
-    assertEquals("vuutttsssrrrrooonnnnnnnnmhheeeeeeddcbaaaA.)))))))))))))(((((((((((((",
-            TypeSystemUtil.getAnalyzedText(jCas));
-
-    fcd = FlowControllerFactory.createFlowControllerDescription(ReversableTestFlowController.class,
-            ReversableTestFlowController.PARAM_REVERSE_ORDER, true);
-    builder.setFlowControllerDescription(fcd);
-    aggregateEngine = builder.createAggregate();
-
-    jCas.reset();
-    tokenBuilder.buildTokens(jCas, "An honest man can never surrender an honest doubt.");
-    aggregateEngine.process(jCas);
-
-    text = "An honest man can never surrender an honest doubt.";
-    text = FlowAE3.reverse(text);
-    text = FlowAE2.sort(text);
-    text = text.replaceAll("[aeiou]+", "($0)"); // this is what FlowAE1 does
-
-    assertEquals(text, TypeSystemUtil.getAnalyzedText(jCas));
-    assertEquals(".A(aaa)bcdd(eeeeee)hhmnnnnnnnn(ooo)rrrrsssttt(uu)v",
-            TypeSystemUtil.getAnalyzedText(jCas));
-
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateWithReaderTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateWithReaderTest.java
deleted file mode 100644
index f6afd77..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AggregateWithReaderTest.java
+++ /dev/null
@@ -1,198 +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.uima.fit.factory;
-
-import java.io.IOException;
-
-import org.apache.uima.ResourceSpecifierFactory;
-import org.apache.uima.UIMAException;
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.analysis_component.CasAnnotator_ImplBase;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.analysis_engine.CasIterator;
-import org.apache.uima.analysis_engine.metadata.FixedFlow;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.collection.CollectionReaderDescription;
-import org.apache.uima.collection.CollectionReader_ImplBase;
-import org.apache.uima.util.Progress;
-import org.junit.Test;
-
-/**
- */
-public class AggregateWithReaderTest {
-
-  /**
-   * Demo of running a collection reader as part of an aggregate engine. This allows to run a
-   * pipeline an access the output CASes directly - no need to write the data to files.
-   */
-  @Test
-  public void demoAggregateWithReader() throws UIMAException {
-    ResourceSpecifierFactory factory = UIMAFramework.getResourceSpecifierFactory();
-
-    CollectionReaderDescription reader = factory.createCollectionReaderDescription();
-    reader.getMetaData().setName("reader");
-    reader.setImplementationName(SimpleReader.class.getName());
-
-    AnalysisEngineDescription analyzer = factory.createAnalysisEngineDescription();
-    analyzer.getMetaData().setName("analyzer");
-    analyzer.setPrimitive(true);
-    analyzer.setImplementationName(SimpleAnalyzer.class.getName());
-
-    FixedFlow flow = factory.createFixedFlow();
-    flow.setFixedFlow(new String[] { "reader", "analyzer" });
-
-    AnalysisEngineDescription aggregate = factory.createAnalysisEngineDescription();
-    aggregate.getMetaData().setName("aggregate");
-    aggregate.getAnalysisEngineMetaData().setFlowConstraints(flow);
-    aggregate.getAnalysisEngineMetaData().getOperationalProperties().setOutputsNewCASes(true);
-    aggregate.getAnalysisEngineMetaData().getOperationalProperties()
-            .setMultipleDeploymentAllowed(false);
-    aggregate.setPrimitive(false);
-    aggregate.getDelegateAnalysisEngineSpecifiersWithImports().put("reader", reader);
-    aggregate.getDelegateAnalysisEngineSpecifiersWithImports().put("analyzer", analyzer);
-
-    AnalysisEngine pipeline = UIMAFramework.produceAnalysisEngine(aggregate);
-    CasIterator iterator = pipeline.processAndOutputNewCASes(pipeline.newCAS());
-    while (iterator.hasNext()) {
-      CAS cas = iterator.next();
-      System.out.printf("[%s] is [%s]%n", cas.getDocumentText(), cas.getDocumentLanguage());
-    }
-  }
-
-  /**
-   * Demo of disguising a reader as a CAS multiplier. This works because internally, UIMA wraps the
-   * reader in a CollectionReaderAdapter. This nice thing about this is, that in principle it would
-   * be possible to define sofa mappings. However, UIMA-2419 prevents this.
-   */
-  @Test
-  public void demoAggregateWithDisguisedReader() throws UIMAException {
-    ResourceSpecifierFactory factory = UIMAFramework.getResourceSpecifierFactory();
-
-    AnalysisEngineDescription reader = factory.createAnalysisEngineDescription();
-    reader.getMetaData().setName("reader");
-    reader.setPrimitive(true);
-    reader.setImplementationName(SimpleReader.class.getName());
-    reader.getAnalysisEngineMetaData().getOperationalProperties().setOutputsNewCASes(true);
-
-    AnalysisEngineDescription analyzer = factory.createAnalysisEngineDescription();
-    analyzer.getMetaData().setName("analyzer");
-    analyzer.setPrimitive(true);
-    analyzer.setImplementationName(SimpleAnalyzer.class.getName());
-
-    FixedFlow flow = factory.createFixedFlow();
-    flow.setFixedFlow(new String[] { "reader", "analyzer" });
-
-    AnalysisEngineDescription aggregate = factory.createAnalysisEngineDescription();
-    aggregate.getMetaData().setName("aggregate");
-    aggregate.setPrimitive(false);
-    aggregate.getAnalysisEngineMetaData().setFlowConstraints(flow);
-    aggregate.getAnalysisEngineMetaData().getOperationalProperties().setOutputsNewCASes(true);
-    aggregate.getAnalysisEngineMetaData().getOperationalProperties()
-            .setMultipleDeploymentAllowed(false);
-    aggregate.getDelegateAnalysisEngineSpecifiersWithImports().put("reader", reader);
-    aggregate.getDelegateAnalysisEngineSpecifiersWithImports().put("analyzer", analyzer);
-
-    AnalysisEngine pipeline = UIMAFramework.produceAnalysisEngine(aggregate);
-    CasIterator iterator = pipeline.processAndOutputNewCASes(pipeline.newCAS());
-    while (iterator.hasNext()) {
-      CAS cas = iterator.next();
-      System.out.printf("[%s] is [%s]%n", cas.getDocumentText(), cas.getDocumentLanguage());
-    }
-  }
-
-  // @Test
-  // public void testAggregateBuilderWithReaderAndSofaMapping() throws UIMAException {
-  // CollectionReaderDescription reader =
-  // CollectionReaderFactory.createDescription(TestReader.class);
-  //
-  // AnalysisEngineDescription readerAed =
-  // UIMAFramework.getResourceSpecifierFactory().createAnalysisEngineDescription();
-  // readerAed.setAnnotatorImplementationName(reader.getImplementationName());
-  // readerAed.setExternalResourceDependencies(reader.getExternalResourceDependencies());
-  // readerAed.setFrameworkImplementation(reader.getFrameworkImplementation());
-  // readerAed.setImplementationName(reader.getImplementationName());
-  // readerAed.setMetaData(reader.getMetaData());
-  // // readerAed.getAnalysisEngineMetaData().getOperationalProperties().setModifiesCas(true);
-  // // readerAed.getAnalysisEngineMetaData().getOperationalProperties().setOutputsNewCASes(true);
-  // readerAed.setPrimitive(true);
-  // readerAed.setResourceManagerConfiguration(reader.getResourceManagerConfiguration());
-  // readerAed.setSourceUrl(reader.getSourceUrl());
-  //
-  // AggregateBuilder builder = new AggregateBuilder();
-  // builder.add(readerAed,
-  // ViewNames.INITIAL_VIEW, "A");
-  // builder.add(AnalysisEngineFactory.createPrimitiveDescription(Annotator3.class),
-  // ViewNames.INITIAL_VIEW, "A",
-  // ViewNames.REVERSE_VIEW, "B");
-  //
-  // builder.setFlowControllerDescription(createFlowControllerDescription(FixedFlowController.class,
-  // FixedFlowController.PARAM_ACTION_AFTER_CAS_MULTIPLIER, "drop"));
-  //
-  // AnalysisEngineDescription aggregateEngineDesc = builder.createAggregateDescription();
-  // aggregateEngineDesc.getAnalysisEngineMetaData().getOperationalProperties().setOutputsNewCASes(true);
-  //
-  // AnalysisEngine aggregateEngine = createAggregate(aggregateEngineDesc);
-  //
-  // jCas.reset();
-  // JCasIterator ji = aggregateEngine.processAndOutputNewCASes(jCas);
-  // while (ji.hasNext()) {
-  // JCas jc = ji.next();
-  // FSIterator<SofaFS> i = jc.getSofaIterator();
-  // while (i.hasNext()) {
-  // SofaFS s = i.next();
-  // System.out.printf("%s - %s%n", s.getSofaID(), jc.getView(s.getSofaID()).getDocumentText());
-  // }
-  //
-  // assertEquals("Anyone up for a game of Foosball?", jc.getView("A").getDocumentText());
-  // assertEquals("?llabsooF fo emag a rof pu enoynA", jc.getView("B").getDocumentText());
-  // }
-  // }
-
-  public static class SimpleReader extends CollectionReader_ImplBase {
-    private boolean done = false;
-
-    public void getNext(CAS aCAS) throws IOException, CollectionException {
-      aCAS.setDocumentText("Anyone up for a game of Foosball?");
-      done = true;
-    }
-
-    public boolean hasNext() throws IOException, CollectionException {
-      return !done;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-
-    public void close() throws IOException {
-      // Nothing to do
-    }
-  }
-
-  public static class SimpleAnalyzer extends CasAnnotator_ImplBase {
-
-    @Override
-    public void process(CAS aCas) throws AnalysisEngineProcessException {
-      aCas.setDocumentLanguage("en");
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java
deleted file mode 100644
index ed0b559..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryExternalResourceTest.java
+++ /dev/null
@@ -1,404 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-
-import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.fit.component.CasAnnotator_ImplBase;
-import org.apache.uima.fit.component.ExternalResourceAware;
-import org.apache.uima.fit.factory.testRes.TestExternalResource;
-import org.apache.uima.fit.factory.testRes.TestSharedResourceObject;
-import org.apache.uima.resource.CustomResourceSpecifier;
-import org.apache.uima.resource.ExternalResourceDescription;
-import org.apache.uima.resource.ResourceCreationSpecifier;
-import org.apache.uima.resource.metadata.ExternalResourceBinding;
-import org.apache.uima.util.InvalidXMLException;
-import org.apache.uima.util.XMLInputSource;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestName;
-import org.uimafit.descriptor.ConfigurationParameter;
-import org.uimafit.descriptor.ExternalResource;
-import org.xml.sax.SAXException;
-
-/**
- */
-public class AnalysisEngineFactoryExternalResourceTest {
-  /**
-   * Test simple injection.
-   */
-  @Test
-  public void resource_testInjection() throws Exception {
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class,
-            TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
-                    TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE)));
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  /**
-   * Test shared simple injection.
-   */
-  @Test
-  public void resource_testSharedInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestExternalResource.class, TestExternalResource.PARAM_VALUE,
-            TestExternalResource.EXPECTED_VALUE);
-
-    AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    AnalysisEngineDescription aeDesc2 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    dumpResourceConfiguration(aeDesc1);
-    dumpResourceConfiguration(aeDesc2);
-
-    AnalysisEngine ae1 = createEngine(aeDesc1);
-    AnalysisEngine ae2 = createEngine(aeDesc2);
-    ae1.process(ae1.newCAS());
-    ae2.process(ae2.newCAS());
-
-    AnalysisEngine ae3 = createEngine(createEngineDescription(aeDesc1, aeDesc2));
-    ae3.process(ae3.newCAS());
-  }
-
-  /**
-   * Test simple nesting.
-   */
-  @Test
-  public void resource_testSimpleNesting() throws Exception {
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class,
-            TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(
-                    TestExternalResource2.class,
-                    TestExternalResource.PARAM_VALUE,
-                    TestExternalResource.EXPECTED_VALUE,
-                    TestExternalResource2.PARAM_RESOURCE,
-                    createExternalResourceDescription(TestExternalResource.class,
-                            TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE))));
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  /**
-   * Test simple nesting.
-   */
-  @Test
-  public void resource_testSharedSimpleNesting() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestExternalResource2.class,
-            TestExternalResource.PARAM_VALUE,
-            TestExternalResource.EXPECTED_VALUE,
-            TestExternalResource2.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
-                    TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE));
-
-    AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    dumpResourceConfiguration(aeDesc1);
-
-    AnalysisEngineDescription aeDesc2 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    dumpResourceConfiguration(aeDesc1);
-    dumpResourceConfiguration(aeDesc2);
-
-    AnalysisEngine ae1 = createEngine(aeDesc1);
-    AnalysisEngine ae2 = createEngine(aeDesc2);
-    ae1.process(ae1.newCAS());
-    ae2.process(ae2.newCAS());
-
-    AnalysisEngine ae3 = createEngine(createEngineDescription(aeDesc1, aeDesc2));
-    ae3.process(ae3.newCAS());
-  }
-
-  /**
-   * Test deeper nesting level.
-   */
-  @Test
-  public void resource_testDeeperNesting() throws Exception {
-    ExternalResourceDescription resDesc2 = createExternalResourceDescription(
-            TestExternalResource.class, TestExternalResource.PARAM_VALUE,
-            TestExternalResource.EXPECTED_VALUE);
-
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestExternalResource2.class, TestExternalResource2.PARAM_RESOURCE, resDesc2,
-            TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE);
-
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class,
-            TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource2.class,
-                    TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE,
-                    TestExternalResource2.PARAM_RESOURCE, resDesc)));
-
-    dumpResourceConfiguration(aeDesc);
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  /**
-   * Test self-injection
-   */
-  @Test
-  public void resource_testSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestExternalResource2.class, TestExternalResource.PARAM_VALUE,
-            TestExternalResource.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
-
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    dumpResourceConfiguration(aeDesc);
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  /**
-   * Test self-injection
-   */
-  @Test
-  public void resource_testDoubleSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestExternalResource2.class, TestExternalResource.PARAM_VALUE,
-            TestExternalResource.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
-
-    AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    AnalysisEngineDescription aeDesc2 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
-            resDesc));
-
-    dumpResourceConfiguration(aeDesc1);
-    dumpResourceConfiguration(aeDesc2);
-
-    AnalysisEngine ae1 = createEngine(aeDesc1);
-    AnalysisEngine ae2 = createEngine(aeDesc2);
-    ae1.process(ae1.newCAS());
-    ae2.process(ae2.newCAS());
-
-    AnalysisEngine ae3 = createEngine(createEngineDescription(aeDesc1, aeDesc2));
-    ae3.process(ae3.newCAS());
-  }
-
-  /**
-   * Test simple injection.
-   */
-  @Test
-  public void sharedObject_testInjection() throws Exception {
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithSharedResourceObject.class,
-            TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE,
-            createExternalResourceDescription(TestSharedResourceObject.class, "http://dumm.my",
-                    TestSharedResourceObject.PARAM_VALUE, TestSharedResourceObject.EXPECTED_VALUE)));
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  /**
-   * Test shared simple injection.
-   */
-  @Test
-  public void sharedObject_testSharedInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestSharedResourceObject.class, "http://dumm.my", TestSharedResourceObject.PARAM_VALUE,
-            TestSharedResourceObject.EXPECTED_VALUE);
-
-    AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithSharedResourceObject.class,
-            TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE, resDesc));
-
-    AnalysisEngineDescription aeDesc2 = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithSharedResourceObject.class,
-            TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE, resDesc));
-
-    dumpResourceConfiguration(aeDesc1);
-    dumpResourceConfiguration(aeDesc2);
-
-    AnalysisEngine ae1 = createEngine(aeDesc1);
-    AnalysisEngine ae2 = createEngine(aeDesc2);
-    ae1.process(ae1.newCAS());
-    ae2.process(ae2.newCAS());
-
-    AnalysisEngine ae3 = createEngine(createEngineDescription(aeDesc1, aeDesc2));
-    ae3.process(ae3.newCAS());
-  }
-
-  /**
-   * Test self-injection
-   */
-  @Test
-  public void sharedObject_testSelfInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
-            TestSharedResourceObject2.class, "http://dumm.my",
-            TestSharedResourceObject.PARAM_VALUE, TestSharedResourceObject.EXPECTED_VALUE);
-    bindExternalResource(resDesc, TestSharedResourceObject2.PARAM_RESOURCE, resDesc);
-
-    AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
-            TestAnalysisEngineWithSharedResourceObject.class,
-            TestAnalysisEngineWithSharedResourceObject.PARAM_RESOURCE, resDesc));
-
-    dumpResourceConfiguration(aeDesc);
-
-    AnalysisEngine ae = createEngine(aeDesc);
-    ae.process(ae.newCAS());
-  }
-
-  public static class TestExternalResource2 extends TestExternalResource {
-    public final static String PARAM_RESOURCE = "resource2";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestExternalResource resource;
-
-    @Override
-    public void afterResourcesInitialized() {
-      System.out.println(getClass().getSimpleName() + ".afterResourcesInitialized()");
-      // Ensure the External Resource is bound
-      assertNotNull(resource);
-      if (this != resource) {
-        resource.assertConfiguredOk();
-      }
-      assertConfiguredOk();
-    }
-  }
-
-  public static class TestSharedResourceObject2 extends TestSharedResourceObject implements
-          ExternalResourceAware {
-    public final static String PARAM_RESOURCE = "resource2";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestSharedResourceObject resource;
-
-    @ConfigurationParameter(name = ExternalResourceFactory.PARAM_RESOURCE_NAME)
-    private String resourceName;
-
-    public void afterResourcesInitialized() {
-      System.out.println(getClass().getSimpleName() + ".afterResourcesInitialized()");
-      // Ensure the External Resource is bound
-      assertNotNull(resource);
-      if (this != resource) {
-        resource.assertConfiguredOk();
-      }
-      assertConfiguredOk();
-    }
-
-    public String getResourceName() {
-      return resourceName;
-    }
-  }
-
-  public static class TestAnalysisEngineWithResource extends CasAnnotator_ImplBase {
-
-    public final static String PARAM_RESOURCE = "resource";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestExternalResource resource;
-
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      System.out.println(getClass().getSimpleName() + ".process()");
-      assertNotNull(resource);
-      resource.assertConfiguredOk();
-    }
-  }
-
-  public static class TestAnalysisEngineWithSharedResourceObject extends CasAnnotator_ImplBase {
-
-    public final static String PARAM_RESOURCE = "resource";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestSharedResourceObject resource;
-
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      System.out.println(getClass().getSimpleName() + ".process()");
-      assertNotNull(resource);
-      resource.assertConfiguredOk();
-    }
-  }
-
-  AnalysisEngineDescription saveLoad(AnalysisEngineDescription aDesc) throws InvalidXMLException,
-          SAXException, IOException {
-    ByteArrayOutputStream bos = new ByteArrayOutputStream();
-    aDesc.toXML(bos);
-    return UIMAFramework.getXMLParser().parseAnalysisEngineDescription(
-            new XMLInputSource(new ByteArrayInputStream(bos.toByteArray()), null));
-  }
-
-  private void dumpResourceConfiguration(ResourceCreationSpecifier aSpec) {
-    System.out.println("-- begin resource configuration");
-    for (ExternalResourceBinding b : aSpec.getResourceManagerConfiguration()
-            .getExternalResourceBindings()) {
-      System.out.printf("Binding : %s -> %s %n", b.getKey(), b.getResourceName());
-    }
-
-    for (ExternalResourceDescription r : aSpec.getResourceManagerConfiguration()
-            .getExternalResources()) {
-      if (r.getImplementationName() != null) {
-        System.out.printf("Resource: %s -> %s %n", r.getName(), r.getImplementationName());
-      } else {
-        System.out.printf("Resource: %s -> %s %n", r.getName(),
-                ((CustomResourceSpecifier) r.getResourceSpecifier()).getResourceClassName());
-      }
-    }
-    System.out.println("-- end resource configuration");
-  }
-
-  @Rule
-  public TestName name = new TestName();
-
-  @Before
-  public void printSeparator() {
-    System.out.println("\n=== " + name.getMethodName() + " =====================");
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryTest.java
deleted file mode 100644
index ce84155..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnalysisEngineFactoryTest.java
+++ /dev/null
@@ -1,467 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.analysis_component.AnalysisComponent;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.analysis_engine.metadata.SofaMapping;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.FSIterator;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.NoOpAnnotator;
-import org.apache.uima.fit.factory.testAes.Annotator1;
-import org.apache.uima.fit.factory.testAes.Annotator2;
-import org.apache.uima.fit.factory.testAes.Annotator3;
-import org.apache.uima.fit.factory.testAes.Annotator4;
-import org.apache.uima.fit.factory.testAes.ParameterizedAE;
-import org.apache.uima.fit.factory.testAes.ViewNames;
-import org.apache.uima.fit.pipeline.SimplePipeline;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.CasIOUtil;
-import org.apache.uima.fit.util.JCasUtil;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.metadata.Capability;
-import org.apache.uima.resource.metadata.ConfigurationParameter;
-import org.apache.uima.resource.metadata.ConfigurationParameterDeclarations;
-import org.apache.uima.resource.metadata.ConfigurationParameterSettings;
-import org.apache.uima.resource.metadata.TypePriorities;
-import org.apache.uima.resource.metadata.TypePriorityList;
-import org.junit.Test;
-import org.uimafit.descriptor.OperationalProperties;
-
-/**
- */
-
-public class AnalysisEngineFactoryTest extends ComponentTestBase {
-
-  @Test
-  public void testViewAE() throws Exception {
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            Annotator4.class, typeSystemDescription);
-    AnalysisEngine ae = AnalysisEngineFactory.createEngine(aed, "A");
-
-    JCas aView = jCas.createView("A");
-    tokenBuilder.buildTokens(aView, "'Verb' is a noun!?");
-    ae.process(jCas);
-    assertEquals("'Verb' is a noun!?", jCas.getView("A").getDocumentText());
-    assertEquals("NN", JCasUtil.selectByIndex(aView, Token.class, 0).getPos());
-  }
-
-  @Test
-  public void testCreateAnalysisEngineFromPath() throws UIMAException, IOException {
-    AnalysisEngine engine = AnalysisEngineFactory
-            .createEngineFromPath("src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml");
-    assertNotNull(engine);
-  }
-
-  @Test
-  public void testCreateAnalysisEngineWithPrioritizedTypes() throws UIMAException {
-    String[] prioritizedTypeNames = new String[] { "org.apache.uima.fit.type.Token",
-        "org.apache.uima.fit.type.Sentence" };
-    AnalysisEngine engine = AnalysisEngineFactory.createEngine(
-            org.apache.uima.fit.component.NoOpAnnotator.class, typeSystemDescription,
-            prioritizedTypeNames, (Object[]) null);
-
-    typePriorities = engine.getAnalysisEngineMetaData().getTypePriorities();
-    assertEquals(1, typePriorities.getPriorityLists().length);
-    TypePriorityList typePriorityList = typePriorities.getPriorityLists()[0];
-    assertEquals(2, typePriorityList.getTypes().length);
-    assertEquals("org.apache.uima.fit.type.Token", typePriorityList.getTypes()[0]);
-    assertEquals("org.apache.uima.fit.type.Sentence", typePriorityList.getTypes()[1]);
-
-    jCas = engine.newJCas();
-    tokenBuilder.buildTokens(jCas, "word");
-    FSIterator<Annotation> tokensInSentence = jCas.getAnnotationIndex().subiterator(
-            JCasUtil.selectByIndex(jCas, Sentence.class, 0));
-    assertFalse(tokensInSentence.hasNext());
-
-    prioritizedTypeNames = new String[] { "org.apache.uima.fit.type.Sentence",
-        "org.apache.uima.fit.type.Token" };
-    engine = AnalysisEngineFactory.createEngine(
-            org.apache.uima.fit.component.NoOpAnnotator.class, typeSystemDescription,
-            prioritizedTypeNames, (Object[]) null);
-    jCas = engine.newJCas();
-    tokenBuilder.buildTokens(jCas, "word");
-    tokensInSentence = jCas.getAnnotationIndex().subiterator(
-            JCasUtil.selectByIndex(jCas, Sentence.class, 0));
-    assertTrue(tokensInSentence.hasNext());
-
-  }
-
-  @Test
-  public void testAggregate() throws UIMAException {
-    tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?");
-
-    SofaMapping[] sofaMappings = new SofaMapping[] {
-        SofaMappingFactory.createSofaMapping(Annotator1.class, ViewNames.PARENTHESES_VIEW, "A"),
-        SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.SORTED_VIEW, "B"),
-        SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.SORTED_PARENTHESES_VIEW,
-                "C"),
-        SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.PARENTHESES_VIEW, "A"),
-        SofaMappingFactory.createSofaMapping(Annotator3.class, ViewNames.INITIAL_VIEW, "B") };
-
-    List<Class<? extends AnalysisComponent>> primitiveAEClasses = new ArrayList<Class<? extends AnalysisComponent>>();
-    primitiveAEClasses.add(Annotator1.class);
-    primitiveAEClasses.add(Annotator2.class);
-    primitiveAEClasses.add(Annotator3.class);
-
-    AnalysisEngine aggregateEngine = AnalysisEngineFactory.createEngine(primitiveAEClasses,
-            typeSystemDescription, null, sofaMappings);
-
-    aggregateEngine.process(jCas);
-
-    assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText());
-    assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A")
-            .getDocumentText());
-    assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText());
-    assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C")
-            .getDocumentText());
-    assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW)
-            .getDocumentText());
-
-  }
-
-  @Test
-  public void testAggregate2() throws UIMAException, IOException {
-    tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?");
-
-    SofaMapping[] sofaMappings = new SofaMapping[] {
-        SofaMappingFactory.createSofaMapping("ann1", ViewNames.PARENTHESES_VIEW, "A"),
-        SofaMappingFactory.createSofaMapping("ann2", ViewNames.SORTED_VIEW, "B"),
-        SofaMappingFactory.createSofaMapping("ann2", ViewNames.SORTED_PARENTHESES_VIEW, "C"),
-        SofaMappingFactory.createSofaMapping("ann2", ViewNames.PARENTHESES_VIEW, "A"),
-        SofaMappingFactory.createSofaMapping("ann3", ViewNames.INITIAL_VIEW, "B") };
-
-    List<AnalysisEngineDescription> primitiveDescriptors = new ArrayList<AnalysisEngineDescription>();
-    primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator1.class,
-            typeSystemDescription, (TypePriorities) null));
-    primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator2.class,
-            typeSystemDescription, (TypePriorities) null));
-    primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator3.class,
-            typeSystemDescription, (TypePriorities) null));
-
-    List<String> componentNames = Arrays.asList("ann1", "ann2", "ann3");
-
-    AnalysisEngine aggregateEngine = AnalysisEngineFactory.createEngine(primitiveDescriptors,
-            componentNames, null, sofaMappings);
-
-    aggregateEngine.process(jCas);
-
-    assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText());
-    assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A")
-            .getDocumentText());
-    assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText());
-    assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C")
-            .getDocumentText());
-    assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW)
-            .getDocumentText());
-
-    CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xmi"));
-    AnalysisEngine ae1 = AnalysisEngineFactory.createEngine(NoOpAnnotator.class,
-            typeSystemDescription);
-
-    SimplePipeline.runPipeline(jCas, ae1, aggregateEngine);
-
-  }
-
-  @Test
-  public void testReflectPrimitiveDescription() throws ResourceInitializationException {
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            Annotator2.class, typeSystemDescription, typePriorities);
-    Capability[] capabilities = aed.getAnalysisEngineMetaData().getCapabilities();
-    assertEquals(1, capabilities.length);
-    String[] inputSofas = capabilities[0].getInputSofas();
-    assertArrayEquals(new String[] { CAS.NAME_DEFAULT_SOFA, ViewNames.PARENTHESES_VIEW },
-            inputSofas);
-    String[] outputSofas = capabilities[0].getOutputSofas();
-    assertArrayEquals(new String[] { ViewNames.SORTED_VIEW, ViewNames.SORTED_PARENTHESES_VIEW },
-            outputSofas);
-
-    aed = AnalysisEngineFactory.createEngineDescription(ParameterizedAE.class,
-            typeSystemDescription, typePriorities);
-    capabilities = aed.getAnalysisEngineMetaData().getCapabilities();
-    assertEquals(1, capabilities.length);
-    inputSofas = capabilities[0].getInputSofas();
-    assertArrayEquals(new String[] { CAS.NAME_DEFAULT_SOFA }, inputSofas);
-    outputSofas = capabilities[0].getOutputSofas();
-    assertArrayEquals(new String[] {}, outputSofas);
-
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_1,
-            ConfigurationParameter.TYPE_STRING, true, false, "pineapple");
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_2,
-            ConfigurationParameter.TYPE_STRING, false, true, new String[] { "coconut", "mango" });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_3,
-            ConfigurationParameter.TYPE_STRING, false, false, null);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_4,
-            ConfigurationParameter.TYPE_STRING, true, true, new String[] { "apple" });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_5,
-            ConfigurationParameter.TYPE_STRING, false, true, new String[] { "" });
-
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_1,
-            ConfigurationParameter.TYPE_BOOLEAN, true, false, Boolean.FALSE);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_2,
-            ConfigurationParameter.TYPE_BOOLEAN, false, false, null);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_3,
-            ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { true, true, false });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_4,
-            ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { true, false, true });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_5,
-            ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { false });
-
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_1,
-            ConfigurationParameter.TYPE_INTEGER, true, false, 0);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_2,
-            ConfigurationParameter.TYPE_INTEGER, false, false, 42);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_3,
-            ConfigurationParameter.TYPE_INTEGER, false, true, new Integer[] { 42, 111 });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_4,
-            ConfigurationParameter.TYPE_INTEGER, true, true, new Integer[] { 2 });
-
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_1,
-            ConfigurationParameter.TYPE_FLOAT, true, false, 0.0f);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_2,
-            ConfigurationParameter.TYPE_FLOAT, false, false, 3.1415f);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_3,
-            ConfigurationParameter.TYPE_FLOAT, true, false, null);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_4,
-            ConfigurationParameter.TYPE_FLOAT, false, true, null);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_5,
-            ConfigurationParameter.TYPE_FLOAT, false, true,
-            new Float[] { 0.0f, 3.1415f, 2.7182818f });
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_6,
-            ConfigurationParameter.TYPE_FLOAT, true, true, null);
-    testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_7,
-            ConfigurationParameter.TYPE_FLOAT, true, true, new Float[] { 1.1111f, 2.2222f, 3.333f });
-
-    AnalysisEngine ae = AnalysisEngineFactory
-            .createEngine(aed, ParameterizedAE.PARAM_FLOAT_3, 3.1415f,
-                    ParameterizedAE.PARAM_FLOAT_6, new Float[] { 2.71828183f }, "file2", "foo/bar");
-    Object paramValue = ae.getAnalysisEngineMetaData().getConfigurationParameterSettings()
-            .getParameterValue(ParameterizedAE.PARAM_FLOAT_3);
-    assertEquals(paramValue, 3.1415f);
-    paramValue = ae.getAnalysisEngineMetaData().getConfigurationParameterSettings()
-            .getParameterValue(ParameterizedAE.PARAM_FLOAT_6);
-    assertEquals(((Float[]) paramValue)[0].floatValue(), 2.71828183f, 0.00001f);
-
-  }
-
-  private void testConfigurationParameter(AnalysisEngineDescription aed, String parameterName,
-          String parameterType, boolean mandatory, boolean multiValued, Object parameterValue) {
-    ConfigurationParameterDeclarations cpd = aed.getMetaData()
-            .getConfigurationParameterDeclarations();
-    ConfigurationParameter cp = cpd.getConfigurationParameter(null, parameterName);
-    assertNotNull("Parameter [" + parameterName + "] does not exist!", cp);
-    assertEquals("Parameter [" + parameterName + "] has wrong name", parameterName, cp.getName());
-    assertEquals("Parameter [" + parameterName + "] has wrong type", parameterType, cp.getType());
-    assertEquals("Parameter [" + parameterName + "] has wrong mandatory flag", mandatory,
-            cp.isMandatory());
-    assertEquals("Parameter [" + parameterName + "] has wrong multi-value flag", multiValued,
-            cp.isMultiValued());
-    ConfigurationParameterSettings cps = aed.getMetaData().getConfigurationParameterSettings();
-    Object actualValue = cps.getParameterValue(parameterName);
-    if (parameterValue == null) {
-      assertNull(actualValue);
-    } else if (!multiValued) {
-      if (parameterType.equals(ConfigurationParameter.TYPE_FLOAT)) {
-        assertEquals(((Float) parameterValue).floatValue(), ((Float) actualValue).floatValue(),
-                .001f);
-      } else {
-        assertEquals(parameterValue, actualValue);
-      }
-    } else {
-      assertEquals(Array.getLength(parameterValue), Array.getLength(actualValue));
-      for (int i = 0; i < Array.getLength(parameterValue); ++i) {
-        assertEquals(Array.get(parameterValue, i), Array.get(actualValue, i));
-      }
-    }
-
-  }
-
-  @Test
-  public void testPrimitiveDescription() throws ResourceInitializationException {
-
-    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription(
-            NoOpAnnotator.class, typeSystemDescription);
-    assertNotNull(aed);
-    // assertEquals("org.apache.uima.fit.type.TypeSystem",
-    // aed.getAnalysisEngineMetaData().getTypeSystem().getImports()[0].getName());
-  }
-
-  /**
-   * Test that a {@link OperationalProperties} annotation on an ancestor of a analysis engine class
-   * is found and taken into account.
-   */
-  @Test
-  public void testComponentAnnotationOnAncestor() throws Exception {
-    AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription(
-            PristineAnnotatorClass.class, (Object[]) null);
-    assertTrue(
-            "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(),
-            desc1.getAnalysisEngineMetaData().getOperationalProperties()
-                    .isMultipleDeploymentAllowed());
-
-    AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription(
-            UnannotatedAnnotatorClass.class, (Object[]) null);
-    assertFalse(
-            "Multiple deployment should be prohibited on " + desc2.getAnnotatorImplementationName(),
-            desc2.getAnalysisEngineMetaData().getOperationalProperties()
-                    .isMultipleDeploymentAllowed());
-
-    AnalysisEngineDescription desc3 = AnalysisEngineFactory.createEngineDescription(
-            AnnotatedAnnotatorClass.class, (Object[]) null);
-    assertTrue(
-            "Multiple deployment should be allowed  on " + desc3.getAnnotatorImplementationName(),
-            desc3.getAnalysisEngineMetaData().getOperationalProperties()
-                    .isMultipleDeploymentAllowed());
-  }
-
-  /*
-   * This test case illustrates that UIMA throws an exception unless the multipleDeploymentAllowed
-   * flag is properly set to false when mixing multi-deployment and non-multi-deployment AEs.
-   */
-  @Test(expected = ResourceInitializationException.class)
-  public void testAAEMultipleDeploymentPolicyProblem() throws Exception {
-    {
-      AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription(
-              PristineAnnotatorClass.class, (Object[]) null);
-      assertTrue(
-              "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(),
-              desc1.getAnalysisEngineMetaData().getOperationalProperties()
-                      .isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription(
-              UnannotatedAnnotatorClass.class, (Object[]) null);
-      assertFalse(
-              "Multiple deployment should be prohibited on "
-                      + desc2.getAnnotatorImplementationName(), desc2.getAnalysisEngineMetaData()
-                      .getOperationalProperties().isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription aae = AnalysisEngineFactory
-              .createEngineDescription(desc1, desc2);
-      aae.getAnalysisEngineMetaData().getOperationalProperties().setMultipleDeploymentAllowed(true);
-      UIMAFramework.produceAnalysisEngine(aae);
-    }
-  }
-
-  @Test
-  public void testAAEMultipleDeploymentPolicy() throws Exception {
-    {
-      AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription(
-              PristineAnnotatorClass.class, (Object[]) null);
-      assertTrue(
-              "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(),
-              desc1.getAnalysisEngineMetaData().getOperationalProperties()
-                      .isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription(
-              UnannotatedAnnotatorClass.class, (Object[]) null);
-      assertFalse(
-              "Multiple deployment should be prohibited on "
-                      + desc2.getAnnotatorImplementationName(), desc2.getAnalysisEngineMetaData()
-                      .getOperationalProperties().isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription aae = AnalysisEngineFactory
-              .createEngineDescription(desc1, desc2);
-      UIMAFramework.produceAnalysisEngine(aae);
-
-      assertFalse("Multiple deployment should be prohibited on AAE", aae
-              .getAnalysisEngineMetaData().getOperationalProperties().isMultipleDeploymentAllowed());
-    }
-
-    {
-      AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription(
-              PristineAnnotatorClass.class, (Object[]) null);
-      assertTrue(
-              "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(),
-              desc1.getAnalysisEngineMetaData().getOperationalProperties()
-                      .isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription desc3 = AnalysisEngineFactory.createEngineDescription(
-              AnnotatedAnnotatorClass.class, (Object[]) null);
-      assertTrue(
-              "Multiple deployment should be allowed  on " + desc3.getAnnotatorImplementationName(),
-              desc3.getAnalysisEngineMetaData().getOperationalProperties()
-                      .isMultipleDeploymentAllowed());
-
-      AnalysisEngineDescription aae = AnalysisEngineFactory
-              .createEngineDescription(desc1, desc3);
-      UIMAFramework.produceAnalysisEngine(aae);
-
-      assertTrue("Multiple deployment should be prohibited on AAE", aae.getAnalysisEngineMetaData()
-              .getOperationalProperties().isMultipleDeploymentAllowed());
-    }
-  }
-
-  public static class PristineAnnotatorClass extends JCasAnnotator_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      // Dummy
-    }
-  }
-
-  @org.apache.uima.fit.descriptor.OperationalProperties(multipleDeploymentAllowed = false)
-  public static class AncestorClass extends JCasAnnotator_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      // Dummy
-    }
-  }
-
-  public static class UnannotatedAnnotatorClass extends AncestorClass {
-    // Dummy
-  }
-
-  @org.apache.uima.fit.descriptor.OperationalProperties(multipleDeploymentAllowed = true)
-  public static class AnnotatedAnnotatorClass extends UnannotatedAnnotatorClass {
-    // Vessel for the annotation
-  }
-
-  @Test
-  public void testIssue5a() throws ResourceInitializationException {
-    AnalysisEngineFactory.createEngineDescription(ParameterizedAE.class, typeSystemDescription);
-  }
-
-  @Test(expected = ResourceInitializationException.class)
-  public void testIssue5b() throws ResourceInitializationException {
-    AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription);
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnnotationFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnnotationFactoryTest.java
deleted file mode 100644
index e169e59..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/AnnotationFactoryTest.java
+++ /dev/null
@@ -1,45 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.junit.Test;
-
-/**
- */
-
-public class AnnotationFactoryTest extends ComponentTestBase {
-
-  @Test
-  public void testCreateAnnotation() {
-    Token token = AnnotationFactory.createAnnotation(jCas, 0, 10, Token.class);
-    assertEquals(0, token.getBegin());
-    assertEquals(10, token.getEnd());
-
-    Sentence sentence = AnnotationFactory.createAnnotation(jCas, 0, 10, Sentence.class);
-    assertEquals(0, sentence.getBegin());
-    assertEquals(10, sentence.getEnd());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
deleted file mode 100644
index c1a4b03..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
+++ /dev/null
@@ -1,91 +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.
- */
-
-/*
- * 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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.collection.CollectionReader;
-import org.apache.uima.fit.component.CasCollectionReader_ImplBase;
-import org.apache.uima.fit.factory.testRes.TestExternalResource;
-import org.apache.uima.util.Progress;
-import org.junit.Test;
-import org.uimafit.descriptor.ExternalResource;
-
-/**
- */
-public class CollectionReaderFactoryExternalResourceTest {
-  @Test
-  public void testAutoExternalResourceBinding() throws UIMAException, IOException {
-    CollectionReader reader = createReader(
-            TestReader.class,
-            TestReader.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
-                    TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE));
-
-    reader.hasNext();
-  }
-
-  public static class TestReader extends CasCollectionReader_ImplBase {
-    public final static String PARAM_RESOURCE = "resource";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestExternalResource resource;
-
-    public boolean hasNext() throws IOException, CollectionException {
-      assertNotNull(resource);
-      resource.assertConfiguredOk();
-      return false;
-    }
-
-    public void getNext(CAS aCAS) throws IOException, CollectionException {
-      // This is never called
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryTest.java
deleted file mode 100644
index c43133b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryTest.java
+++ /dev/null
@@ -1,127 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.collection.CollectionReader;
-import org.apache.uima.collection.CollectionReader_ImplBase;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.testCrs.SingleFileXReader;
-import org.apache.uima.fit.pipeline.JCasIterator;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.JCasUtil;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.util.Progress;
-import org.junit.Test;
-
-/**
- */
-
-public class CollectionReaderFactoryTest extends ComponentTestBase {
-
-  @Test
-  public void testCreateCollectionReader() throws UIMAException, IOException {
-
-    CollectionReader reader = CollectionReaderFactory.createReader(
-            SingleFileXReader.class, typeSystemDescription, SingleFileXReader.PARAM_FILE_NAME,
-            "src/test/resources/data/docs/test.xmi", SingleFileXReader.PARAM_XML_SCHEME,
-            SingleFileXReader.XMI);
-
-    JCasIterator jCasIterator = new JCasIterator(reader);
-    jCas = jCasIterator.next();
-    assertNotNull(jCas);
-    assertEquals("Me and all my friends are non-conformists.", jCas.getDocumentText());
-    Token token = JCasUtil.selectByIndex(jCas, Token.class, 2);
-    assertEquals("all", token.getCoveredText());
-    assertEquals("A", token.getPos());
-    assertEquals("all", token.getStem());
-
-    reader = CollectionReaderFactory.createReader(
-            "org.apache.uima.fit.factory.testCrs.SingleFileXReader",
-            SingleFileXReader.PARAM_FILE_NAME, "src/test/resources/data/docs/test.xmi",
-            SingleFileXReader.PARAM_XML_SCHEME, SingleFileXReader.XMI);
-
-    jCasIterator = new JCasIterator(reader, typeSystemDescription);
-    jCas = jCasIterator.next();
-    assertNotNull(jCas);
-    assertEquals("Me and all my friends are non-conformists.", jCas.getDocumentText());
-    token = JCasUtil.selectByIndex(jCas, Token.class, 9);
-    assertEquals(".", token.getCoveredText());
-    assertEquals(".", token.getPos());
-    assertEquals(".", token.getStem());
-
-    reader = CollectionReaderFactory.createReaderFromPath(
-            "src/test/resources/org/apache/uima/fit/factory/testCrs/SingleFileXReader.xml",
-            SingleFileXReader.PARAM_FILE_NAME, "src/test/resources/data/docs/test.xmi",
-            SingleFileXReader.PARAM_XML_SCHEME, SingleFileXReader.XMI);
-
-    jCasIterator = new JCasIterator(reader, typeSystemDescription);
-    jCas = jCasIterator.next();
-    assertNotNull(jCas);
-    assertEquals("Me and all my friends are non-conformists.", jCas.getDocumentText());
-    token = JCasUtil.selectByIndex(jCas, Token.class, 4);
-    assertEquals("friends", token.getCoveredText());
-    assertEquals("F", token.getPos());
-    assertEquals("friend", token.getStem());
-
-  }
-
-  @Test
-  public void testExceptions() {
-    ResourceInitializationException rie = null;
-    try {
-      CollectionReaderFactory.createReader(TestCR.class, (Object[]) null);
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-  }
-
-  private class TestCR extends CollectionReader_ImplBase {
-
-    private TestCR() {
-      // do not instantiate
-    }
-
-    public void getNext(CAS acas) throws IOException, CollectionException {
-      // TODO Auto-generated method stub
-    }
-
-    public void close() throws IOException {
-      // TODO Auto-generated method stub
-    }
-
-    public Progress[] getProgress() {
-      // TODO Auto-generated method stub
-      return null;
-    }
-
-    public boolean hasNext() throws IOException, CollectionException {
-      // TODO Auto-generated method stub
-      return false;
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java
deleted file mode 100644
index 67ad3f6..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java
+++ /dev/null
@@ -1,221 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.lang.reflect.Field;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.Test;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-/**
- */
-
-public class ConfigurationParameterFactoryTest {
-
-  public static final String PARAM_DOUBLE_1 = "org.uimafit.factory.ConfigurationParameterFactoryTest.PARAM_STRING_1";
-
-  @ConfigurationParameter(name = PARAM_DOUBLE_1, mandatory = true, defaultValue = "3.1415")
-  private Double double1;
-
-  public static final String PARAM_DOUBLE_2 = "org.uimafit.factory.ConfigurationParameterFactoryTest.PARAM_DOUBLE_2";
-
-  @ConfigurationParameter(name = PARAM_DOUBLE_2, mandatory = true, defaultValue = "3.3333")
-  private Double[] double2;
-
-  private Double[] double3;
-
-  public Double[] getDouble2() {
-    return double2;
-  }
-
-  public void setDouble2(Double[] double2) {
-    this.double2 = double2;
-  }
-
-  public Double[] getDouble3() {
-    return double3;
-  }
-
-  public void setDouble3(Double[] double3) {
-    this.double3 = double3;
-  }
-
-  public Double getDouble1() {
-    return double1;
-  }
-
-  public void setDouble1(Double double1) {
-    this.double1 = double1;
-  }
-
-  @Test
-  public void test1() throws SecurityException, NoSuchFieldException {
-    Float value = (Float) ConfigurationParameterFactory
-            .getDefaultValue(ConfigurationParameterFactoryTest.class.getDeclaredField("double1"));
-    assertEquals(3.1415, value, 1e-4);
-
-    Float[] values = (Float[]) ConfigurationParameterFactory
-            .getDefaultValue(ConfigurationParameterFactoryTest.class.getDeclaredField("double2"));
-    assertEquals(1, values.length);
-    assertEquals(3.3333, values[0], 1e-4);
-
-    IllegalArgumentException iae = null;
-    try {
-      ConfigurationParameterFactory.getDefaultValue(ConfigurationParameterFactoryTest.class
-              .getDeclaredField("double3"));
-    } catch (IllegalArgumentException e) {
-      iae = e;
-    }
-    assertNotNull(iae);
-
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void test2() throws Exception {
-    ConfigurationParameterFactory.createPrimitiveParameter(ConfigurationParameterFactoryTest.class
-            .getDeclaredField("double3"));
-  }
-
-  @ConfigurationParameter
-  public String param1;
-
-  @Test
-  public void testParam1() throws Exception, NoSuchFieldException {
-    Field field1 = ConfigurationParameterFactoryTest.class.getDeclaredField("param1");
-    org.apache.uima.resource.metadata.ConfigurationParameter cp = ConfigurationParameterFactory
-            .createPrimitiveParameter(field1);
-    assertEquals("org.apache.uima.fit.factory.ConfigurationParameterFactoryTest.param1",
-            cp.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_STRING, cp.getType());
-    assertEquals("", cp.getDescription());
-    assertFalse(cp.isMandatory());
-    assertFalse(cp.isMultiValued());
-    assertNull(ConfigurationParameterFactory.getDefaultValue(field1));
-  }
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(name = "my-boolean-param", mandatory = true, description = "my description", defaultValue = {
-      "false", "false", "true" })
-  private boolean[] param2;
-
-  @Test
-  public void testParam2() throws Exception, NoSuchFieldException {
-    Field field2 = ConfigurationParameterFactoryTest.class.getDeclaredField("param2");
-    org.apache.uima.resource.metadata.ConfigurationParameter cp = ConfigurationParameterFactory
-            .createPrimitiveParameter(field2);
-    assertEquals("my-boolean-param", cp.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_BOOLEAN,
-            cp.getType());
-    assertEquals("my description", cp.getDescription());
-    assertTrue(cp.isMandatory());
-    assertTrue(cp.isMultiValued());
-    Boolean[] defaultValue = (Boolean[]) ConfigurationParameterFactory.getDefaultValue(field2);
-    assertFalse(defaultValue[0]);
-    assertFalse(defaultValue[1]);
-    assertTrue(defaultValue[2]);
-  }
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter
-  private Integer param3;
-
-  @Test
-  public void testParam3() throws Exception, NoSuchFieldException {
-    Field field3 = ConfigurationParameterFactoryTest.class.getDeclaredField("param3");
-    org.apache.uima.resource.metadata.ConfigurationParameter cp = ConfigurationParameterFactory
-            .createPrimitiveParameter(field3);
-    assertEquals("org.apache.uima.fit.factory.ConfigurationParameterFactoryTest.param3",
-            cp.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_INTEGER,
-            cp.getType());
-    assertEquals("", cp.getDescription());
-    assertFalse(cp.isMandatory());
-    assertFalse(cp.isMultiValued());
-    assertNull(ConfigurationParameterFactory.getDefaultValue(field3));
-  }
-
-  private static class CPFT {
-    @SuppressWarnings("unused")
-    @ConfigurationParameter(defaultValue = { "a", "b", "c" })
-    private String[] param4;
-  }
-
-  @Test
-  public void testParam4() throws Exception, NoSuchFieldException {
-    Field field4 = CPFT.class.getDeclaredField("param4");
-    org.apache.uima.resource.metadata.ConfigurationParameter cp = ConfigurationParameterFactory
-            .createPrimitiveParameter(field4);
-    assertEquals("org.apache.uima.fit.factory.ConfigurationParameterFactoryTest$CPFT.param4",
-            cp.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_STRING, cp.getType());
-    assertEquals("", cp.getDescription());
-    assertFalse(cp.isMandatory());
-    assertTrue(cp.isMultiValued());
-    assertArrayEquals(new String[] { "a", "b", "c" },
-            (String[]) ConfigurationParameterFactory.getDefaultValue(field4));
-  }
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(defaultValue = { "data/foo", "bar" })
-  private List<File> fileList;
-
-  @Test
-  public void testFileList() throws Exception {
-    Field field = this.getClass().getDeclaredField("fileList");
-    org.apache.uima.resource.metadata.ConfigurationParameter param;
-    param = ConfigurationParameterFactory.createPrimitiveParameter(field);
-    assertEquals(this.getClass().getName() + ".fileList", param.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_STRING,
-            param.getType());
-    assertEquals("", param.getDescription());
-    assertFalse(param.isMandatory());
-    String[] expected = new String[] { "data/foo", "bar" };
-    String[] actual = (String[]) ConfigurationParameterFactory.getDefaultValue(field);
-    assertArrayEquals(expected, actual);
-  }
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(defaultValue = { "5", "5", "4", "3" })
-  private Set<String> stringSet;
-
-  @Test
-  public void testStringSet() throws Exception {
-    Field field = this.getClass().getDeclaredField("stringSet");
-    org.apache.uima.resource.metadata.ConfigurationParameter param;
-    param = ConfigurationParameterFactory.createPrimitiveParameter(field);
-    assertEquals(this.getClass().getName() + ".stringSet", param.getName());
-    assertEquals(org.apache.uima.resource.metadata.ConfigurationParameter.TYPE_STRING,
-            param.getType());
-    assertFalse(param.isMandatory());
-    String[] expected = new String[] { "5", "5", "4", "3" };
-    String[] actual = (String[]) ConfigurationParameterFactory.getDefaultValue(field);
-    assertArrayEquals(expected, actual);
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
deleted file mode 100644
index 0d74593..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
+++ /dev/null
@@ -1,82 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
-import static org.junit.Assert.assertEquals;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.initialize.ExternalResourceInitializer;
-import org.apache.uima.fit.factory.testAes.ParameterizedAE2;
-import org.apache.uima.resource.ExternalResourceDependency;
-import org.junit.Test;
-
-/**
- * Test the {@link ExternalResourceInitializer}.
- * 
- */
-public class ExternalResourceConfiguratorTest extends ComponentTestBase {
-  @Test
-  public void testAnalyze() throws Exception {
-    ExternalResourceDependency[] deps = createExternalResourceDependencies(ParameterizedAE2.class);
-
-    verify(deps);
-  }
-
-  @Test
-  public void testDescriptor() throws Exception {
-    AnalysisEngineDescription desc = createEngineDescription(ParameterizedAE2.class,
-            typeSystemDescription);
-    verify(desc.getExternalResourceDependencies());
-  }
-
-  private void verify(ExternalResourceDependency[] depList) {
-    Map<String, ExternalResourceDependency> deps = new HashMap<String, ExternalResourceDependency>();
-    for (ExternalResourceDependency dep : depList) {
-      deps.put(dep.getKey(), dep);
-    }
-    
-    assertEquals(3, deps.size());
-
-    String key = ParameterizedAE2.DummyResource.class.getName();
-    String api = ParameterizedAE2.DummyResource.class.getName();
-    ExternalResourceDependency d = deps.get(key);
-    assertEquals(key, d.getKey());
-    assertEquals(api, d.getInterfaceName());
-    assertEquals(false, d.isOptional());
-
-    key = ParameterizedAE2.RES_OTHER;
-    d = deps.get(key);
-    assertEquals(key, d.getKey());
-    assertEquals(api, d.getInterfaceName());
-    assertEquals(false, d.isOptional());
-
-    key = ParameterizedAE2.RES_OPTIONAL;
-    d = deps.get(key);
-    assertEquals(key, d.getKey());
-    assertEquals(api, d.getInterfaceName());
-    assertEquals(true, d.isOptional());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
deleted file mode 100644
index 4d9232d..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
+++ /dev/null
@@ -1,411 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResource;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createDependencyAndBind;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
-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 java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.uima.UIMAFramework;
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.Resource_ImplBase;
-import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
-import org.apache.uima.fit.factory.locator.JndiResourceLocator;
-import org.apache.uima.fit.pipeline.SimplePipeline;
-import org.apache.uima.fit.util.SimpleNamedResourceManager;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.DataResource;
-import org.apache.uima.resource.ExternalResourceDescription;
-import org.apache.uima.resource.ParameterizedDataResource;
-import org.apache.uima.resource.ResourceAccessException;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.SharedResourceObject;
-import org.apache.uima.util.CasCreationUtils;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.springframework.mock.jndi.SimpleNamingContextBuilder;
-import org.uimafit.descriptor.ConfigurationParameter;
-import org.uimafit.descriptor.ExternalResource;
-
-/**
- * Test case for {@link ExternalResource} annotations.
- * 
- */
-public class ExternalResourceFactoryTest extends ComponentTestBase {
-  private static final String EX_URI = "http://dum.my";
-
-  private static final String EX_FILE_1 = "src/test/resources/data/docs/test.xcas";
-
-  private static final String EX_FILE_3 = "src/test/resources/data/docs/test.xmi";
-
-  @BeforeClass
-  public static void initJNDI() throws Exception {
-    // Set up JNDI context to test the JndiResourceLocator
-    final SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
-    Properties deDict = new Properties();
-    deDict.setProperty("Hans", "proper noun");
-    builder.bind("dictionaries/german", deDict);
-    builder.activate();
-  }
-
-  @Test
-  public void testScanBind() throws Exception {
-    // Create analysis enginge description
-    AnalysisEngineDescription desc = createEngineDescription(DummyAE.class);
-
-    // Bind external resources
-    bindResources(desc);
-
-    // Test with the default resource manager implementation
-    AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(desc);
-    assertNotNull(ae);
-  }
-
-  @Test
-  public void testDirectInjection() throws Exception {
-    // Create analysis enginge description
-    AnalysisEngineDescription desc = createEngineDescription(DummyAE2.class);
-
-    // Bind external resources for DummyAE
-    bindResources(desc);
-
-    // Bind external resources for DummyAE2 - necessary because autowiring is disabled
-    bindExternalResource(desc, DummyAE2.RES_INJECTED_POJO1, "pojoName1");
-    bindExternalResource(desc, DummyAE2.RES_INJECTED_POJO2, "pojoName2");
-
-    // Create a custom resource manager that allows to inject any Java object as an external
-    // dependency
-    final Map<String, Object> externalContext = new HashMap<String, Object>();
-    externalContext.put("pojoName1", "Just an injected POJO");
-    externalContext.put("pojoName2", new AtomicInteger(5));
-
-    SimpleNamedResourceManager resMgr = new SimpleNamedResourceManager();
-    resMgr.setExternalContext(externalContext);
-    assertFalse(resMgr.isAutoWireEnabled());
-
-    AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(desc, resMgr, null);
-    assertNotNull(ae);
-
-    ae.process(ae.newJCas());
-  }
-
-  @Test
-  public void testDirectInjectionAutowire() throws Exception {
-    // Create analysis engine description
-    AnalysisEngineDescription desc = createEngineDescription(DummyAE2.class);
-
-    // Bind external resources for DummyAE
-    bindResources(desc);
-
-    // Create a custom resource manager that allows to inject any Java object as an external
-    // dependency
-    final Map<String, Object> externalContext = new HashMap<String, Object>();
-    externalContext.put(DummyAE2.RES_INJECTED_POJO1, "Just an injected POJO");
-    externalContext.put(DummyAE2.RES_INJECTED_POJO2, new AtomicInteger(5));
-
-    SimpleNamedResourceManager resMgr = new SimpleNamedResourceManager();
-    resMgr.setExternalContext(externalContext);
-    resMgr.setAutoWireEnabled(true);
-    assertTrue(resMgr.isAutoWireEnabled());
-
-    AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(desc, resMgr, null);
-    assertNotNull(ae);
-
-    ae.process(ae.newJCas());
-  }
-
-  @Test
-  public void testMultiBinding() throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(DummyResource.class);
-
-    // Binding external resource to each Annotator individually
-    AnalysisEngineDescription aed1 = createEngineDescription(MultiBindAE.class,
-            MultiBindAE.RES_KEY, extDesc);
-    AnalysisEngineDescription aed2 = createEngineDescription(MultiBindAE.class,
-            MultiBindAE.RES_KEY, extDesc);
-
-    // Check the external resource was injected
-    AnalysisEngineDescription aaed = createEngineDescription(aed1, aed2);
-    AnalysisEngine ae = createEngine(aaed);
-    ae.process(ae.newJCas());
-
-    MultiBindAE.reset();
-
-    // Check the external resource was injected
-    SimplePipeline.runPipeline(CasCreationUtils.createCas(aaed.getAnalysisEngineMetaData()), aaed);
-  }
-
-  private static void bindResources(AnalysisEngineDescription desc) throws Exception {
-    bindResource(desc, DummyResource.class);
-    bindResource(desc, DummyAE.RES_KEY_1, ConfigurableResource.class,
-            ConfigurableResource.PARAM_VALUE, "1");
-    bindResource(desc, DummyAE.RES_KEY_2, ConfigurableResource.class,
-            ConfigurableResource.PARAM_VALUE, "2");
-    bindResource(desc, DummyAE.RES_KEY_3, ParametrizedResource.class,
-            ParametrizedResource.PARAM_EXTENSION, ".lala");
-    bindResource(desc, DummySharedResourceObject.class, EX_URI,
-            DummySharedResourceObject.PARAM_VALUE, "3");
-    // An undefined URL may be used if the specified file/remote URL does not exist or if
-    // the network is down.
-    bindResource(desc, DummyAE.RES_SOME_URL, new File(EX_FILE_1).toURI().toURL());
-    bindResource(desc, DummyAE.RES_SOME_OTHER_URL, new File(EX_FILE_3).toURI().toURL());
-    bindResource(desc, DummyAE.RES_SOME_FILE, new File(EX_FILE_1));
-    bindResource(desc, DummyAE.RES_JNDI_OBJECT, JndiResourceLocator.class,
-            JndiResourceLocator.PARAM_NAME, "dictionaries/german");
-    createDependencyAndBind(desc, "legacyResource", DummySharedResourceObject.class, EX_URI,
-            DummySharedResourceObject.PARAM_VALUE, "3");
-  }
-
-  public static class DummyAE extends JCasAnnotator_ImplBase {
-    @ExternalResource
-    DummyResource r;
-
-    static final String RES_KEY_1 = "Key1";
-
-    @ExternalResource(key = RES_KEY_1)
-    ConfigurableResource configRes1;
-
-    static final String RES_KEY_2 = "Key2";
-
-    @ExternalResource(key = RES_KEY_2)
-    ConfigurableResource configRes2;
-
-    static final String RES_KEY_3 = "Key3";
-
-    @ExternalResource
-    DummySharedResourceObject sharedObject;
-
-    static final String RES_SOME_URL = "SomeUrl";
-
-    @ExternalResource(key = RES_SOME_URL)
-    DataResource someUrl;
-
-    static final String RES_SOME_OTHER_URL = "SomeOtherUrl";
-
-    @ExternalResource(key = RES_SOME_OTHER_URL)
-    DataResource someOtherUrl;
-
-    static final String RES_SOME_FILE = "SomeFile";
-
-    @ExternalResource(key = RES_SOME_FILE)
-    DataResource someFile;
-
-    static final String RES_JNDI_OBJECT = "JndiObject";
-
-    @ExternalResource(key = RES_JNDI_OBJECT)
-    Properties jndiPropertes;
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      assertNotNull(r);
-
-      assertNotNull(configRes1);
-      assertEquals("1", configRes1.getValue());
-
-      assertNotNull(configRes2);
-      assertEquals("2", configRes2.getValue());
-
-      try {
-        DataResource configuredResource = (DataResource) getContext().getResourceObject(RES_KEY_3,
-                new String[] { ConfigurableDataResource.PARAM_URI, "http://dum.my/conf" });
-        assertNotNull(configuredResource);
-        assertEquals("http://dum.my/conf.lala", configuredResource.getUri().toString());
-      } catch (ResourceAccessException e) {
-        throw new AnalysisEngineProcessException(e);
-      }
-
-      assertNotNull(sharedObject);
-      assertEquals("3", sharedObject.getValue());
-
-      assertNotNull(sharedObject);
-      assertEquals(EX_URI, sharedObject.getUrl().toString());
-
-      assertNotNull(jndiPropertes);
-      assertEquals("proper noun", jndiPropertes.get("Hans"));
-
-      assertNotNull(someUrl);
-      assertEquals(new File(EX_FILE_1).toURI().toString(), someUrl.getUri().toString());
-
-      assertNotNull(someOtherUrl);
-      assertEquals(new File(EX_FILE_3).toURI().toString(), someOtherUrl.getUri().toString());
-
-      assertTrue(someFile.getUrl().toString().startsWith("file:"));
-      assertTrue("URL [" + someFile.getUrl() + "] should end in [" + EX_FILE_1 + "]", someFile
-              .getUrl().toString().endsWith(EX_FILE_1));
-
-      try {
-        assertNotNull(getContext().getResourceObject("legacyResource"));
-      } catch (ResourceAccessException e) {
-        throw new AnalysisEngineProcessException(e);
-      }
-    }
-  }
-
-  public static final class DummyAE2 extends DummyAE {
-    static final String RES_INJECTED_POJO1 = "InjectedPojo1";
-
-    @ExternalResource(key = RES_INJECTED_POJO1)
-    String injectedString;
-
-    static final String RES_INJECTED_POJO2 = "InjectedPojo2";
-
-    @ExternalResource(key = RES_INJECTED_POJO2)
-    Number injectedAtomicInt;
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      super.process(aJCas);
-      assertEquals("Just an injected POJO", injectedString);
-      assertEquals(5, injectedAtomicInt.intValue());
-    }
-  }
-
-  /**
-   * Example annotator that uses the share model object. In the process() we only test if the model
-   * was properly initialized by uimaFIT
-   */
-  public static class MultiBindAE extends org.apache.uima.fit.component.JCasAnnotator_ImplBase {
-    static int prevHashCode = -1;
-
-    static final String RES_KEY = "Res";
-
-    @ExternalResource(key = RES_KEY)
-    DummyResource res;
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      if (prevHashCode == -1) {
-        prevHashCode = res.hashCode();
-      } else {
-        assertEquals(prevHashCode, res.hashCode());
-      }
-
-      System.out.println(getClass().getSimpleName() + ": " + res);
-    }
-
-    public static void reset() {
-      prevHashCode = -1;
-    }
-  }
-
-  public static final class DummyResource extends Resource_ImplBase {
-    // Nothing
-  }
-
-  public static final class ConfigurableResource extends Resource_ImplBase {
-    public static final String PARAM_VALUE = "Value";
-
-    @ConfigurationParameter(name = PARAM_VALUE, mandatory = true)
-    private String value;
-
-    public String getValue() {
-      return value;
-    }
-  }
-
-  public static final class ConfigurableDataResource extends Resource_ImplBase implements
-          DataResource {
-    public static final String PARAM_URI = "Uri";
-
-    @ConfigurationParameter(name = PARAM_URI, mandatory = true)
-    private String uri;
-
-    public static final String PARAM_EXTENSION = "Extension";
-
-    @ConfigurationParameter(name = PARAM_EXTENSION, mandatory = true)
-    private String extension;
-
-    public InputStream getInputStream() throws IOException {
-      return null;
-    }
-
-    public URI getUri() {
-      return URI.create(uri + extension);
-    }
-
-    public URL getUrl() {
-      return null;
-    }
-  }
-
-  public static final class ParametrizedResource extends Resource_ImplBase implements
-          ParameterizedDataResource {
-    public static final String PARAM_EXTENSION = "Extension";
-
-    @ConfigurationParameter(name = PARAM_EXTENSION, mandatory = true)
-    private String extension;
-
-    public DataResource getDataResource(String[] aParams) throws ResourceInitializationException {
-      List<String> params = new ArrayList<String>(Arrays.asList(aParams));
-      params.add(ConfigurableDataResource.PARAM_EXTENSION);
-      params.add(extension);
-      ExternalResourceDescription desc = ExternalResourceFactory.createExternalResourceDescription(
-              null, ConfigurableDataResource.class, params.toArray(new String[params.size()]));
-      return (DataResource) UIMAFramework.produceResource(desc.getResourceSpecifier(), null);
-    }
-  }
-
-  public static final class DummySharedResourceObject implements SharedResourceObject {
-    public static final String PARAM_VALUE = "Value";
-
-    @ConfigurationParameter(name = PARAM_VALUE, mandatory = true)
-    private String value;
-
-    private URI uri;
-
-    public void load(DataResource aData) throws ResourceInitializationException {
-      ConfigurationParameterInitializer.initialize(this, aData);
-      assertEquals(EX_URI, aData.getUri().toString());
-      uri = aData.getUri();
-    }
-
-    public URI getUrl() {
-      return uri;
-    }
-
-    public String getValue() {
-      return value;
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java
deleted file mode 100644
index d4c4e5c..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FlowControllerFactoryExternalResourceTest.java
+++ /dev/null
@@ -1,93 +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.
- */
-
-/*
- * 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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
-import static org.apache.uima.fit.factory.FlowControllerFactory.createFlowControllerDescription;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.fit.component.CasFlowController_ImplBase;
-import org.apache.uima.fit.component.NoOpAnnotator;
-import org.apache.uima.fit.factory.testRes.TestExternalResource;
-import org.apache.uima.flow.CasFlow_ImplBase;
-import org.apache.uima.flow.FinalStep;
-import org.apache.uima.flow.Flow;
-import org.apache.uima.flow.Step;
-import org.junit.Test;
-import org.uimafit.descriptor.ExternalResource;
-
-/**
- */
-public class FlowControllerFactoryExternalResourceTest {
-  @Test
-  public void testAutoExternalResourceBinding() throws Exception {
-    AggregateBuilder builder = new AggregateBuilder();
-    builder.add(AnalysisEngineFactory.createEngineDescription(NoOpAnnotator.class));
-    builder.setFlowControllerDescription(createFlowControllerDescription(
-            TestFlowController.class,
-            TestFlowController.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
-                    TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE)));
-    AnalysisEngine aggregateEngine = builder.createAggregate();
-    aggregateEngine.process(aggregateEngine.newCAS());
-  }
-
-  public static class TestFlowController extends CasFlowController_ImplBase {
-    public final static String PARAM_RESOURCE = "resource";
-
-    @ExternalResource(key = PARAM_RESOURCE)
-    private TestExternalResource resource;
-
-    @Override
-    public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException {
-      assertNotNull(resource);
-      resource.assertConfiguredOk();
-      return new TestFlowObject();
-    }
-  }
-
-  public static class TestFlowObject extends CasFlow_ImplBase {
-    public Step next() throws AnalysisEngineProcessException {
-      return new FinalStep();
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FsIndexFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FsIndexFactoryTest.java
deleted file mode 100644
index 9bb5944..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/FsIndexFactoryTest.java
+++ /dev/null
@@ -1,132 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.apache.uima.fit.factory.FsIndexFactory.createFsIndexCollection;
-import static org.junit.Assert.assertEquals;
-
-import java.io.FileOutputStream;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.FSIndex;
-import org.apache.uima.cas.FeatureStructure;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.metadata.FsIndexDescription;
-import org.apache.uima.resource.metadata.FsIndexKeyDescription;
-import org.junit.Test;
-import org.uimafit.descriptor.FsIndex;
-import org.uimafit.descriptor.FsIndexCollection;
-import org.uimafit.descriptor.FsIndexKey;
-
-/**
- */
-public class FsIndexFactoryTest extends ComponentTestBase {
-  @Test
-  public void testCreateIndexCollection() throws Exception {
-    org.apache.uima.resource.metadata.FsIndexCollection fsIndexCollection = createFsIndexCollection(IndexTestComponent.class);
-
-    assertEquals(2, fsIndexCollection.getFsIndexes().length);
-
-    FsIndexDescription index1 = fsIndexCollection.getFsIndexes()[0];
-    assertEquals("index1", index1.getLabel());
-    assertEquals(Token.class.getName(), index1.getTypeName());
-    assertEquals(FsIndexDescription.KIND_SORTED, index1.getKind());
-
-    FsIndexKeyDescription key11 = index1.getKeys()[0];
-    assertEquals("begin", key11.getFeatureName());
-    assertEquals(FsIndexKeyDescription.REVERSE_STANDARD_COMPARE, key11.getComparator());
-
-    FsIndexKeyDescription key12 = index1.getKeys()[1];
-    assertEquals("end", key12.getFeatureName());
-    assertEquals(FsIndexKeyDescription.STANDARD_COMPARE, key12.getComparator());
-
-    FsIndexDescription index2 = fsIndexCollection.getFsIndexes()[1];
-    assertEquals("index2", index2.getLabel());
-    assertEquals(Sentence.class.getName(), index2.getTypeName());
-    assertEquals(FsIndexDescription.KIND_SET, index2.getKind());
-
-    FsIndexKeyDescription key21 = index2.getKeys()[0];
-    assertEquals("begin", key21.getFeatureName());
-    assertEquals(FsIndexKeyDescription.STANDARD_COMPARE, key21.getComparator());
-
-    fsIndexCollection.toXML(new FileOutputStream("target/dummy.xml"));
-  }
-
-  @Test
-  public void testIndexesWork() throws Exception {
-    // Index should be added the descriptor and thus end up in the CAS generated from the
-    // analysis engine.
-    AnalysisEngine desc = createEngine(IndexTestComponent.class);
-    JCas jcas = desc.newJCas();
-
-    Token token1 = new Token(jcas, 1, 2);
-    token1.addToIndexes();
-
-    // index1 is a sorted index, so when adding a token twice, both remain in the index
-    // Since UIMA 2.7.0, annotations are not added twice to the index by default.
-    Token token2 = new Token(jcas, 3, 4);
-    token2.addToIndexes();
-    token2.addToIndexes();
-
-    Sentence sentence1 = new Sentence(jcas, 1, 2);
-    sentence1.addToIndexes();
-
-    // index2 is a set index, so even when adding a sentence twice, only one remains in the index
-    Sentence sentence2 = new Sentence(jcas, 3, 4);
-    sentence2.addToIndexes();
-    sentence2.addToIndexes();
-
-    FSIndex<FeatureStructure> index1 = jcas.getFSIndexRepository().getIndex("index1");
-    FSIndex<FeatureStructure> index2 = jcas.getFSIndexRepository().getIndex("index2");
-
-    assertEquals(2, index1.size());
-    assertEquals(2, index2.size());
-
-    // AnalysisEngine dumpWriter = createPrimitive(CASDumpWriter.class);
-    // dumpWriter.process(jcas.getCas());
-  }
-
-  @FsIndexCollection(fsIndexes = {
-      @FsIndex(label = "index1", type = Token.class, kind = FsIndex.KIND_SORTED, keys = {
-          @FsIndexKey(featureName = "begin", comparator = FsIndexKey.REVERSE_STANDARD_COMPARE),
-          @FsIndexKey(featureName = "end", comparator = FsIndexKey.STANDARD_COMPARE) }),
-      @FsIndex(label = "index2", type = Sentence.class, kind = FsIndex.KIND_SET, keys = { @FsIndexKey(featureName = "begin", comparator = FsIndexKey.STANDARD_COMPARE) }) })
-  public static class IndexTestComponent extends JCasAnnotator_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      // Nothing to do
-    }
-  }
-
-  @Test
-  public void testAutoDetectIndexes() throws Exception {
-    org.apache.uima.resource.metadata.FsIndexCollection fsIndexCollection = createFsIndexCollection();
-
-    FsIndexDescription index1 = fsIndexCollection.getFsIndexes()[0];
-    assertEquals("Automatically Scanned Index", index1.getLabel());
-    assertEquals(Token.class.getName(), index1.getTypeName());
-    assertEquals(FsIndexDescription.KIND_SORTED, index1.getKind());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasBuilderTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasBuilderTest.java
deleted file mode 100644
index 258b4ce..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasBuilderTest.java
+++ /dev/null
@@ -1,73 +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.uima.fit.factory;
-
-import static org.apache.commons.io.FileUtils.readFileToString;
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.junit.Assert.assertEquals;
-
-import java.io.File;
-
-import org.apache.uima.analysis_engine.AnalysisEngine;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.component.CasDumpWriter;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-/**
- */
-public class JCasBuilderTest extends ComponentTestBase {
-  @Rule
-  public TemporaryFolder folder = new TemporaryFolder();
-
-  @Test
-  public void test() throws Exception {
-    JCasBuilder jb = new JCasBuilder(jCas);
-    jb.add("This sentence is not annotated. ");
-    jb.add("But this sentences is annotated. ", Sentence.class);
-    int begin = jb.getPosition();
-    jb.add("And", Token.class);
-    jb.add(" ");
-    jb.add("here", Token.class);
-    jb.add(" ");
-    jb.add("every", Token.class);
-    jb.add(" ");
-    jb.add("token", Token.class);
-    jb.add(" ");
-    jb.add("is", Token.class);
-    jb.add(".", Token.class);
-    jb.add(begin, Sentence.class);
-    jb.close();
-
-    File outputFile = new File(folder.getRoot(), "dump-output.txt");
-    AnalysisEngine writer = createEngine(CasDumpWriter.class, CasDumpWriter.PARAM_OUTPUT_FILE,
-            outputFile.getPath());
-    writer.process(jb.getJCas());
-
-    String reference = readFileToString(
-            new File("src/test/resources/data/reference/JCasBuilderTest.dump"), "UTF-8").trim();
-    String actual = readFileToString(outputFile, "UTF-8").trim();
-    actual = actual.replaceAll("\r\n", "\n");
-
-    assertEquals(reference, actual);
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasFactoryTest.java
deleted file mode 100644
index 609857d..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/JCasFactoryTest.java
+++ /dev/null
@@ -1,71 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.CasIOUtil;
-import org.apache.uima.fit.util.JCasUtil;
-import org.junit.Test;
-
-/**
- */
-
-public class JCasFactoryTest extends ComponentTestBase {
-
-  @Test
-  public void testXMI() throws IOException {
-    CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xmi"));
-    assertEquals("Me and all my friends are non-conformists.", jCas.getDocumentText());
-  }
-
-  @Test
-  public void testXCAS() throws IOException {
-    CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xcas"));
-    assertEquals(
-            "... the more knowledge advances the more it becomes possible to condense it into little books.",
-            jCas.getDocumentText());
-  }
-
-  @Test
-  public void testFromPath() throws UIMAException {
-    jCas = JCasFactory.createJCasFromPath(
-            "src/test/resources/org/apache/uima/fit/type/AnalyzedText.xml",
-            "src/test/resources/org/apache/uima/fit/type/Sentence.xml",
-            "src/test/resources/org/apache/uima/fit/type/Token.xml");
-    jCas.setDocumentText("For great 20 minute talks, check out TED.com.");
-    AnnotationFactory.createAnnotation(jCas, 0, 3, Token.class);
-    assertEquals("For", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
-  }
-
-  @Test
-  public void testCreate() throws UIMAException {
-    jCas = JCasFactory.createJCas();
-    jCas.setDocumentText("For great 20 minute talks, check out TED.com.");
-    AnnotationFactory.createAnnotation(jCas, 0, 3, Token.class);
-    assertEquals("For", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/LoggingTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/LoggingTest.java
deleted file mode 100644
index afc2226..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/LoggingTest.java
+++ /dev/null
@@ -1,311 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
-import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.ConsoleHandler;
-import java.util.logging.Filter;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.LogRecord;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.AbstractCas;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.fit.component.CasAnnotator_ImplBase;
-import org.apache.uima.fit.component.CasCollectionReader_ImplBase;
-import org.apache.uima.fit.component.CasConsumer_ImplBase;
-import org.apache.uima.fit.component.CasFlowController_ImplBase;
-import org.apache.uima.fit.component.CasMultiplier_ImplBase;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.JCasCollectionReader_ImplBase;
-import org.apache.uima.fit.component.JCasConsumer_ImplBase;
-import org.apache.uima.fit.component.JCasFlowController_ImplBase;
-import org.apache.uima.fit.component.JCasMultiplier_ImplBase;
-import org.apache.uima.fit.component.Resource_ImplBase;
-import org.apache.uima.flow.Flow;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.ResourceSpecifier;
-import org.apache.uima.util.Progress;
-import org.junit.Test;
-
-/**
- */
-public class LoggingTest {
-  @Test
-  public void testLogger() throws Exception {
-    final List<LogRecord> records = new ArrayList<LogRecord>();
-
-    // Tell the logger to log everything
-    ConsoleHandler handler = (ConsoleHandler) LogManager.getLogManager().getLogger("")
-            .getHandlers()[0];
-    java.util.logging.Level oldLevel = handler.getLevel();
-    handler.setLevel(Level.ALL);
-    // Capture the logging output without actually logging it
-    handler.setFilter(new Filter() {
-      public boolean isLoggable(LogRecord record) {
-        records.add(record);
-        return false;
-      }
-    });
-
-    try {
-      JCas jcas = JCasFactory.createJCas();
-      createEngine(LoggingCasConsumerChristmasTree.class).process(jcas.getCas());
-
-      assertEquals(10, records.size());
-      assertEquals(Level.FINER, records.get(0).getLevel());
-      assertEquals(Level.FINER, records.get(1).getLevel());
-      assertEquals(Level.FINE, records.get(2).getLevel());
-      assertEquals(Level.FINE, records.get(3).getLevel());
-      assertEquals(Level.INFO, records.get(4).getLevel());
-      assertEquals(Level.INFO, records.get(5).getLevel());
-      assertEquals(Level.WARNING, records.get(6).getLevel());
-      assertEquals(Level.WARNING, records.get(7).getLevel());
-      assertEquals(Level.SEVERE, records.get(8).getLevel());
-      assertEquals(Level.SEVERE, records.get(9).getLevel());
-    } finally {
-      if (oldLevel != null) {
-        handler.setLevel(oldLevel);
-        handler.setFilter(null);
-      }
-    }
-  }
-
-  @Test
-  public void testAllKindsOfComponents() throws Exception {
-    final List<LogRecord> records = new ArrayList<LogRecord>();
-
-    // Tell the logger to log everything
-    ConsoleHandler handler = (ConsoleHandler) LogManager.getLogManager().getLogger("")
-            .getHandlers()[0];
-    java.util.logging.Level oldLevel = handler.getLevel();
-    handler.setLevel(Level.ALL);
-    handler.setFilter(new Filter() {
-      public boolean isLoggable(LogRecord record) {
-        records.add(record);
-        return true;
-      }
-    });
-
-    try {
-      JCas jcas = JCasFactory.createJCas();
-
-      createReader(LoggingCasCollectionReader.class).hasNext();
-      assertLogDone(records);
-
-      createReader(LoggingJCasCollectionReader.class).hasNext();
-      assertLogDone(records);
-
-      // createFlowControllerDescription(LoggingJCasFlowController.class).
-      // assertLogDone(records);
-
-      createEngine(LoggingCasAnnotator.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasAnnotator.class).process(jcas);
-      assertLogDone(records);
-
-      createEngine(LoggingCasConsumer.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasConsumer.class).process(jcas);
-      assertLogDone(records);
-
-      createEngine(LoggingCasMultiplier.class).process(jcas.getCas());
-      assertLogDone(records);
-
-      createEngine(LoggingJCasMultiplier.class).process(jcas);
-      assertLogDone(records);
-    } finally {
-      if (oldLevel != null) {
-        handler.setLevel(oldLevel);
-        handler.setFilter(null);
-      }
-    }
-  }
-
-  private void assertLogDone(List<LogRecord> records) {
-    assertEquals(1, records.size());
-    assertEquals(Level.INFO, records.get(0).getLevel());
-    records.clear();
-  }
-
-  public static class LoggingCasConsumerChristmasTree extends CasConsumer_ImplBase {
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().setLevel(org.apache.uima.util.Level.ALL);
-      trigger();
-      getLogger().setLevel(org.apache.uima.util.Level.OFF);
-      trigger();
-    }
-
-    private void trigger() {
-      if (getLogger().isTraceEnabled()) {
-        getLogger().trace("Logging: " + getClass().getName());
-        getLogger().trace("Logging: " + getClass().getName(), new IllegalArgumentException());
-      }
-      if (getLogger().isDebugEnabled()) {
-        getLogger().debug("Logging: " + getClass().getName());
-        getLogger().debug("Logging: " + getClass().getName(), new IllegalArgumentException());
-      }
-      if (getLogger().isInfoEnabled()) {
-        getLogger().info("Logging: " + getClass().getName());
-        getLogger().info("Logging: " + getClass().getName(), new IllegalArgumentException());
-      }
-      if (getLogger().isWarnEnabled()) {
-        getLogger().warn("Logging: " + getClass().getName());
-        getLogger().warn("Logging: " + getClass().getName(), new IllegalArgumentException());
-      }
-      if (getLogger().isErrorEnabled()) {
-        getLogger().error("Logging: " + getClass().getName());
-        getLogger().error("Logging: " + getClass().getName(), new IllegalArgumentException());
-      }
-    }
-  }
-
-  public static class LoggingCasMultiplier extends CasMultiplier_ImplBase {
-
-    public boolean hasNext() throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public AbstractCas next() throws AnalysisEngineProcessException {
-      // Never called
-      return null;
-    }
-
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      // Never called
-    }
-  }
-
-  public static class LoggingJCasMultiplier extends JCasMultiplier_ImplBase {
-    public boolean hasNext() throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public AbstractCas next() throws AnalysisEngineProcessException {
-      // Never called
-      return null;
-    }
-
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      // Never called
-    }
-  }
-
-  public static class LoggingJCasCollectionReader extends JCasCollectionReader_ImplBase {
-    public boolean hasNext() throws IOException, CollectionException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-
-    @Override
-    public void getNext(JCas jCas) throws IOException, CollectionException {
-      // Never called
-    }
-  }
-
-  public static class LoggingResource extends Resource_ImplBase {
-    @Override
-    public boolean initialize(ResourceSpecifier aSpecifier, Map<String, Object> aAdditionalParams)
-            throws ResourceInitializationException {
-      boolean ret = super.initialize(aSpecifier, aAdditionalParams);
-      getLogger().info("Logging: " + getClass().getName());
-      return ret;
-    }
-  }
-
-  public static class LoggingCasCollectionReader extends CasCollectionReader_ImplBase {
-    public void getNext(CAS aCAS) throws IOException, CollectionException {
-      // Never called
-    }
-
-    public boolean hasNext() throws IOException, CollectionException {
-      getLogger().info("Logging: " + getClass().getName());
-      return false;
-    }
-
-    public Progress[] getProgress() {
-      return new Progress[0];
-    }
-  }
-
-  public static class LoggingCasAnnotator extends CasAnnotator_ImplBase {
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingCasConsumer extends CasConsumer_ImplBase {
-    @Override
-    public void process(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingJCasAnnotator extends JCasAnnotator_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingJCasConsumer extends JCasConsumer_ImplBase {
-    @Override
-    public void process(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-    }
-  }
-
-  public static class LoggingCasFlowController extends CasFlowController_ImplBase {
-    @Override
-    public Flow computeFlow(CAS aCAS) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return null;
-    }
-  }
-
-  public static class LoggingJCasFlowController extends JCasFlowController_ImplBase {
-    @Override
-    public Flow computeFlow(JCas aJCas) throws AnalysisEngineProcessException {
-      getLogger().info("Logging: " + getClass().getName());
-      return null;
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ResourceCreationSpecifierFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ResourceCreationSpecifierFactoryTest.java
deleted file mode 100644
index 0d27efa..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/ResourceCreationSpecifierFactoryTest.java
+++ /dev/null
@@ -1,56 +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.uima.fit.factory;
-
-import java.awt.Point;
-
-import org.apache.uima.fit.factory.testAes.ParameterizedAE;
-import org.apache.uima.resource.ResourceCreationSpecifier;
-import org.junit.Test;
-
-/**
- */
-
-public class ResourceCreationSpecifierFactoryTest {
-
-  @Test(expected = IllegalArgumentException.class)
-  public void test4() throws Exception {
-    ResourceCreationSpecifierFactory.createResourceCreationSpecifier(
-            "src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml",
-            new String[] { "test" });
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void test3() throws Exception {
-    UimaContextFactory.createUimaContext("test");
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void test2() throws Exception {
-    ResourceCreationSpecifierFactory.createResourceCreationSpecifier(
-            "src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml", new Object[] {
-                "test", new Point(0, 5) });
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void test1() {
-    ResourceCreationSpecifierFactory.setConfigurationParameters((ResourceCreationSpecifier) null,
-            ParameterizedAE.PARAM_BOOLEAN_1);
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/SofaMappingFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/SofaMappingFactoryTest.java
deleted file mode 100644
index 78ff778..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/SofaMappingFactoryTest.java
+++ /dev/null
@@ -1,40 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-
-import org.apache.uima.analysis_engine.metadata.SofaMapping;
-import org.apache.uima.fit.component.NoOpAnnotator;
-import org.junit.Test;
-
-/**
- */
-
-public class SofaMappingFactoryTest {
-
-  @Test
-  public void test() {
-    SofaMapping sofaMapping = SofaMappingFactory.createSofaMapping(NoOpAnnotator.class, "B", "A");
-
-    assertEquals("A", sofaMapping.getAggregateSofaName());
-    assertEquals(NoOpAnnotator.class.getName(), sofaMapping.getComponentKey());
-    assertEquals("B", sofaMapping.getComponentSofaName());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java
deleted file mode 100644
index a4f703e..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypePrioritiesFactoryTest.java
+++ /dev/null
@@ -1,47 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.TypePrioritiesFactory.createTypePriorities;
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
-import static org.junit.Assert.assertEquals;
-
-import org.apache.uima.jcas.tcas.Annotation;
-import org.apache.uima.resource.metadata.TypePriorities;
-import org.apache.uima.util.CasCreationUtils;
-import org.junit.Test;
-
-/**
- * Tests for the {@link TypePrioritiesFactory}.
- * 
- */
-public class TypePrioritiesFactoryTest {
-
-  @Test
-  public void testCreateTypePrioritiesClassOfQArray() throws Exception {
-    TypePriorities prio = createTypePriorities(Annotation.class);
-
-    CasCreationUtils.createCas(createTypeSystemDescription(), prio, null);
-
-    assertEquals(1, prio.getPriorityLists().length);
-    assertEquals(1, prio.getPriorityLists()[0].getTypes().length);
-    assertEquals("uima.tcas.Annotation", prio.getPriorityLists()[0].getTypes()[0]);
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactoryTest.java
deleted file mode 100644
index efe9f03..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/TypeSystemDescriptionFactoryTest.java
+++ /dev/null
@@ -1,48 +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.uima.fit.factory;
-
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
-import static org.junit.Assert.assertNotNull;
-
-import org.apache.uima.fit.type.AnalyzedText;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.resource.metadata.TypeSystemDescription;
-import org.junit.Test;
-
-/**
- */
-public class TypeSystemDescriptionFactoryTest {
-  @Test
-  public void testFromPath() throws Exception {
-    TypeSystemDescriptionFactory.createTypeSystemDescriptionFromPath(
-            "src/test/resources/org/apache/uima/fit/type/AnalyzedText.xml",
-            "src/test/resources/org/apache/uima/fit/type/Sentence.xml",
-            "src/test/resources/org/apache/uima/fit/type/Token.xml").resolveImports();
-  }
-
-  @Test
-  public void testScanning() throws Exception {
-    TypeSystemDescription tsd = createTypeSystemDescription();
-    assertNotNull(tsd.getType(Token.class.getName()));
-    assertNotNull(tsd.getType(Sentence.class.getName()));
-    assertNotNull(tsd.getType(AnalyzedText.class.getName()));
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/UimaContextFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/UimaContextFactoryTest.java
deleted file mode 100644
index 555117b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/UimaContextFactoryTest.java
+++ /dev/null
@@ -1,70 +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.uima.fit.factory;
-
-import static org.junit.Assert.assertEquals;
-
-import org.apache.uima.UimaContext;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.junit.Test;
-
-/**
- */
-
-public class UimaContextFactoryTest {
-
-  @Test
-  public void test() throws ResourceInitializationException {
-    UimaContext context = UimaContextFactory
-            .createUimaContext("myBoolean", true, "myBooleans", new Boolean[] { true, false, true,
-                false }, "myFloat", 1.0f, "myFloats", new Float[] { 2.0f, 2.1f, 3.0f }, "myInt", 1,
-                    "myInts", new Integer[] { 2, 3, 4 }, "myString", "yourString", "myStrings",
-                    new String[] { "yourString1", "yourString2", "yourString3" });
-    assertEquals(true, context.getConfigParameterValue("myBoolean"));
-    Boolean[] myBooleans = (Boolean[]) context.getConfigParameterValue("myBooleans");
-    assertEquals(4, myBooleans.length);
-    assertEquals(true, myBooleans[0]);
-    assertEquals(false, myBooleans[1]);
-    assertEquals(true, myBooleans[2]);
-    assertEquals(false, myBooleans[3]);
-
-    assertEquals(1.0f, context.getConfigParameterValue("myFloat"));
-    Float[] myFloats = (Float[]) context.getConfigParameterValue("myFloats");
-    assertEquals(3, myFloats.length);
-    assertEquals(2.0d, myFloats[0].doubleValue(), 0.001d);
-    assertEquals(2.1d, myFloats[1].doubleValue(), 0.001d);
-    assertEquals(3.0d, myFloats[2].doubleValue(), 0.001d);
-
-    assertEquals(1, context.getConfigParameterValue("myInt"));
-    Integer[] myInts = (Integer[]) context.getConfigParameterValue("myInts");
-    assertEquals(3, myInts.length);
-    assertEquals(2L, myInts[0].longValue());
-    assertEquals(3L, myInts[1].longValue());
-    assertEquals(4L, myInts[2].longValue());
-
-    assertEquals("yourString", context.getConfigParameterValue("myString"));
-    String[] myStrings = (String[]) context.getConfigParameterValue("myStrings");
-    assertEquals(3, myStrings.length);
-    assertEquals("yourString1", myStrings[0]);
-    assertEquals("yourString2", myStrings[1]);
-    assertEquals("yourString3", myStrings[2]);
-
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/initializable/InitializableFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/initializable/InitializableFactoryTest.java
deleted file mode 100644
index 5bd9f75..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/initializable/InitializableFactoryTest.java
+++ /dev/null
@@ -1,123 +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.uima.fit.factory.initializable;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.uimafit.factory.ConfigurationParameterFactory.createConfigurationParameterName;
-
-import org.apache.uima.UimaContext;
-import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
-import org.apache.uima.fit.factory.UimaContextFactory;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.junit.Test;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-/**
- */
-public class InitializableFactoryTest {
-
-  @Test
-  public void testInitializableFactory() throws Exception {
-    UimaContext context = UimaContextFactory.createUimaContext(
-            InitializableClass.PARAM_BOOLEAN_PARAMETER, true);
-    InitializableClass ic = InitializableFactory.create(context, InitializableClass.class);
-    assertTrue(ic.booleanParameter);
-
-    NotInitializableClass nic = InitializableFactory.create(context, NotInitializableClass.class);
-    assertFalse(nic.booleanParameter);
-
-    context = UimaContextFactory.createUimaContext(InitializableFileNamer.PARAM_STRING_PARAMETER,
-            "goodbye");
-  }
-
-  @Test(expected = ResourceInitializationException.class)
-  public void testBadConstructor() throws ResourceInitializationException {
-    UimaContext context = UimaContextFactory.createUimaContext(
-            InitializableClass.PARAM_BOOLEAN_PARAMETER, true);
-    InitializableFactory.create(context, NoDefaultConstructor.class);
-  }
-
-  public static class InitializableClass implements Initializable {
-
-    public static final String PARAM_BOOLEAN_PARAMETER = createConfigurationParameterName(
-            InitializableClass.class, "booleanParameter");
-
-    @ConfigurationParameter
-    public boolean booleanParameter = false;
-
-    public void initialize(UimaContext context) throws ResourceInitializationException {
-      ConfigurationParameterInitializer.initialize(this, context);
-    }
-  }
-
-  public static class NotInitializableClass {
-
-    public static final String PARAM_BOOLEAN_PARAMETER = createConfigurationParameterName(
-            InitializableClass.class, "booleanParameter");
-
-    @ConfigurationParameter
-    public boolean booleanParameter = false;
-
-    public void initialize(UimaContext context) throws ResourceInitializationException {
-      ConfigurationParameterInitializer.initialize(this, context);
-    }
-  }
-
-  public static class InitializableFileNamer implements Initializable {
-
-    public static final String PARAM_STRING_PARAMETER = createConfigurationParameterName(
-            InitializableFileNamer.class, "stringParameter");
-
-    @ConfigurationParameter
-    public String stringParameter = "hello";
-
-    public void initialize(UimaContext context) throws ResourceInitializationException {
-      ConfigurationParameterInitializer.initialize(this, context);
-    }
-
-    public String nameFile(JCas jCas) {
-      return "some_name_for_this_jcas.xmi";
-    }
-  }
-
-  public static class NotInitializableFileNamer {
-
-    public static final String PARAM_STRING_PARAMETER = createConfigurationParameterName(
-            InitializableFileNamer.class, "stringParameter");
-
-    @ConfigurationParameter
-    public String stringParameter = "hello";
-
-    public void initialize(UimaContext context) throws ResourceInitializationException {
-      ConfigurationParameterInitializer.initialize(this, context);
-    }
-
-    public String nameFile(JCas jCas) {
-      return "some_name_for_this_jcas.xmi";
-    }
-  }
-
-  public static class NoDefaultConstructor {
-    public NoDefaultConstructor(String s) {
-      // do nothing
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator1.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator1.java
deleted file mode 100644
index ae4b31b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator1.java
+++ /dev/null
@@ -1,50 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.ViewCreatorAnnotator;
-import org.apache.uima.jcas.JCas;
-import org.uimafit.descriptor.SofaCapability;
-
-/**
- */
-
-@SofaCapability(inputSofas = CAS.NAME_DEFAULT_SOFA, outputSofas = ViewNames.PARENTHESES_VIEW)
-public class Annotator1 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    try {
-      JCas parentheticalView = ViewCreatorAnnotator.createViewSafely(jCas,
-              ViewNames.PARENTHESES_VIEW);
-      jCas = jCas.getView(CAS.NAME_DEFAULT_SOFA);
-      String initialText = jCas.getDocumentText();
-      String parentheticalText = initialText.replaceAll("[aeiou]+", "($0)");
-      parentheticalView.setDocumentText(parentheticalText);
-    } catch (CASException e) {
-      throw new AnalysisEngineProcessException(e);
-    }
-
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator2.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator2.java
deleted file mode 100644
index c5e9a5a..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator2.java
+++ /dev/null
@@ -1,63 +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.uima.fit.factory.testAes;
-
-import java.util.Arrays;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.ViewCreatorAnnotator;
-import org.apache.uima.jcas.JCas;
-import org.uimafit.descriptor.SofaCapability;
-
-/**
- */
-
-@SofaCapability(inputSofas = { CAS.NAME_DEFAULT_SOFA, ViewNames.PARENTHESES_VIEW }, outputSofas = {
-    ViewNames.SORTED_VIEW, ViewNames.SORTED_PARENTHESES_VIEW })
-public class Annotator2 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    try {
-      JCas sortedView = ViewCreatorAnnotator.createViewSafely(jCas, ViewNames.SORTED_VIEW);
-      jCas = jCas.getView(CAS.NAME_DEFAULT_SOFA);
-      String initialText = jCas.getDocumentText();
-      char[] chars = initialText.toCharArray();
-      Arrays.sort(chars);
-      String sortedText = new String(chars).trim();
-      sortedView.setDocumentText(sortedText);
-
-      sortedView = ViewCreatorAnnotator.createViewSafely(jCas, ViewNames.SORTED_PARENTHESES_VIEW);
-      JCas parenthesesView = jCas.getView(ViewNames.PARENTHESES_VIEW);
-      String parenthesesText = parenthesesView.getDocumentText();
-      chars = parenthesesText.toCharArray();
-      Arrays.sort(chars);
-      sortedText = new String(chars).trim();
-      sortedView.setDocumentText(sortedText);
-
-    } catch (CASException e) {
-      throw new AnalysisEngineProcessException(e);
-    }
-
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator3.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator3.java
deleted file mode 100644
index 0ebd16c..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator3.java
+++ /dev/null
@@ -1,57 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.component.ViewCreatorAnnotator;
-import org.apache.uima.jcas.JCas;
-import org.uimafit.descriptor.SofaCapability;
-
-/**
- */
-@SofaCapability(inputSofas = CAS.NAME_DEFAULT_SOFA, outputSofas = ViewNames.REVERSE_VIEW)
-public class Annotator3 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    try {
-      jCas = jCas.getView(CAS.NAME_DEFAULT_SOFA);
-      String text = jCas.getDocumentText();
-      String reverseText = reverse(text);
-      JCas reverseView = ViewCreatorAnnotator.createViewSafely(jCas, ViewNames.REVERSE_VIEW);
-      reverseView.setDocumentText(reverseText);
-    } catch (CASException e) {
-      throw new AnalysisEngineProcessException(e);
-    }
-  }
-
-  private String reverse(String string) {
-    int stringLength = string.length();
-    StringBuffer returnValue = new StringBuffer();
-
-    for (int i = stringLength - 1; i >= 0; i--) {
-      returnValue.append(string.charAt(i));
-    }
-    return returnValue.toString();
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator4.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator4.java
deleted file mode 100644
index 0b3862b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/Annotator4.java
+++ /dev/null
@@ -1,45 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.FSIterator;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.uimafit.descriptor.TypeCapability;
-
-/**
- * 
- * 
- */
-@TypeCapability(inputs = "org.apache.uima.fit.type.Token", outputs = "org.apache.uima.fit.type.Token:pos")
-public class Annotator4 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    FSIterator<Annotation> tokens = jCas.getAnnotationIndex(Token.type).iterator();
-    while (tokens.hasNext()) {
-      Token token = (Token) tokens.next();
-      token.setPos("NN");
-    }
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE1.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE1.java
deleted file mode 100644
index d6649fc..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE1.java
+++ /dev/null
@@ -1,38 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.util.TypeSystemUtil;
-import org.apache.uima.jcas.JCas;
-
-/**
- */
-
-public class FlowAE1 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    String analyzedText = TypeSystemUtil.getAnalyzedText(jCas);
-    String parentheticalText = analyzedText.replaceAll("[aeiou]+", "($0)");
-    TypeSystemUtil.setAnalyzedText(jCas, parentheticalText);
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE2.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE2.java
deleted file mode 100644
index a2914ad..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE2.java
+++ /dev/null
@@ -1,45 +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.uima.fit.factory.testAes;
-
-import java.util.Arrays;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.util.TypeSystemUtil;
-import org.apache.uima.jcas.JCas;
-
-/**
- */
-
-public class FlowAE2 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    String analyzedText = TypeSystemUtil.getAnalyzedText(jCas);
-    String sortedText = sort(analyzedText);
-    TypeSystemUtil.setAnalyzedText(jCas, sortedText);
-  }
-
-  public static String sort(String text) {
-    char[] chars = text.toCharArray();
-    Arrays.sort(chars);
-    return new String(chars).trim();
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE3.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE3.java
deleted file mode 100644
index e8fdb7f..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/FlowAE3.java
+++ /dev/null
@@ -1,48 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.fit.util.TypeSystemUtil;
-import org.apache.uima.jcas.JCas;
-
-/**
- */
-
-public class FlowAE3 extends JCasAnnotator_ImplBase {
-
-  @Override
-  public void process(JCas jCas) throws AnalysisEngineProcessException {
-    String analyzedText = TypeSystemUtil.getAnalyzedText(jCas);
-    String reverseText = reverse(analyzedText);
-    org.apache.uima.fit.util.TypeSystemUtil.setAnalyzedText(jCas, reverseText);
-  }
-
-  public static String reverse(String string) {
-    int stringLength = string.length();
-    StringBuffer returnValue = new StringBuffer();
-
-    for (int i = stringLength - 1; i >= 0; i--) {
-      returnValue.append(string.charAt(i));
-    }
-    return returnValue.toString();
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE.java
deleted file mode 100644
index e7f37b3..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE.java
+++ /dev/null
@@ -1,409 +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.uima.fit.factory.testAes;
-
-import java.io.File;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.jcas.JCas;
-import org.uimafit.descriptor.ConfigurationParameter;
-import org.uimafit.descriptor.SofaCapability;
-
-/**
- */
-
-@SofaCapability(inputSofas = CAS.NAME_DEFAULT_SOFA)
-public class ParameterizedAE extends JCasAnnotator_ImplBase {
-
-  public static final String PARAM_STRING_1 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_1";
-
-  @ConfigurationParameter(name = PARAM_STRING_1, mandatory = true, defaultValue = "pineapple")
-  private String string1;
-
-  public static final String PARAM_STRING_2 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_2";
-
-  @ConfigurationParameter(name = PARAM_STRING_2, mandatory = false, defaultValue = { "coconut",
-      "mango" })
-  private String[] string2;
-
-  public static final String PARAM_STRING_3 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_3";
-
-  @ConfigurationParameter(name = PARAM_STRING_3)
-  private String string3;
-
-  public static final String PARAM_STRING_4 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_4";
-
-  @ConfigurationParameter(name = PARAM_STRING_4, mandatory = true, defaultValue = "apple")
-  private String[] string4;
-
-  public static final String PARAM_STRING_5 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_5";
-
-  @ConfigurationParameter(name = PARAM_STRING_5, mandatory = false, defaultValue = "")
-  private String[] string5;
-
-  @ConfigurationParameter(name = "strings6", defaultValue = { "kiwi fruit", "grape", "pear" })
-  private Set<String> strings6;
-
-  @ConfigurationParameter(name = "strings7")
-  private Set<String> strings7;
-
-  @ConfigurationParameter(name = "strings8", defaultValue = "cherry")
-  private Set<String> strings8;
-
-  public static final String PARAM_STRING_9 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_STRING_)";
-
-  @ConfigurationParameter(name = PARAM_STRING_9)
-  private Set<String> strings9;
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(name = "strings10", mandatory = true, defaultValue = {})
-  private Set<String> strings10;
-
-  public Set<String> getStrings6() {
-    return strings6;
-  }
-
-  public Set<String> getStrings7() {
-    return strings7;
-  }
-
-  public Set<String> getStrings8() {
-    return strings8;
-  }
-
-  public Set<String> getStrings9() {
-    return strings9;
-  }
-
-  public static final String PARAM_BOOLEAN_1 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_BOOLEAN_1";
-
-  @ConfigurationParameter(name = PARAM_BOOLEAN_1, mandatory = true, defaultValue = "false")
-  private boolean boolean1;
-
-  public static final String PARAM_BOOLEAN_2 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_BOOLEAN_2";
-
-  @ConfigurationParameter(name = PARAM_BOOLEAN_2)
-  private Boolean boolean2;
-
-  @ConfigurationParameter
-  private boolean boolean2b;
-
-  public boolean isBoolean2b() {
-    return boolean2b;
-  }
-
-  public static final String PARAM_BOOLEAN_3 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_BOOLEAN_3";
-
-  @ConfigurationParameter(name = PARAM_BOOLEAN_3, mandatory = true, defaultValue = { "true",
-      "true", "false" })
-  private Boolean[] boolean3;
-
-  public static final String PARAM_BOOLEAN_4 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_BOOLEAN_4";
-
-  @ConfigurationParameter(name = PARAM_BOOLEAN_4, mandatory = true, defaultValue = { "true",
-      "false", "true" })
-  public boolean[] boolean4;
-
-  public static final String PARAM_BOOLEAN_5 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_BOOLEAN_5";
-
-  @ConfigurationParameter(name = PARAM_BOOLEAN_5, mandatory = true, defaultValue = "false")
-  private boolean[] boolean5;
-
-  @ConfigurationParameter(name = "booleans6", defaultValue = { "true", "true", "true", "false" })
-  private LinkedList<Boolean> booleans6;
-
-  public LinkedList<Boolean> getBooleans6() {
-    return booleans6;
-  }
-
-  public static final String PARAM_INT_1 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_INT_1";
-
-  @ConfigurationParameter(name = PARAM_INT_1, mandatory = true, defaultValue = "0")
-  private int int1;
-
-  public static final String PARAM_INT_2 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_INT_2";
-
-  @ConfigurationParameter(name = PARAM_INT_2, defaultValue = "42")
-  private int int2;
-
-  public static final String PARAM_INT_3 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_INT_3";
-
-  @ConfigurationParameter(name = PARAM_INT_3, defaultValue = { "42", "111" })
-  private int[] int3;
-
-  public static final String PARAM_INT_4 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_INT_4";
-
-  @ConfigurationParameter(name = PARAM_INT_4, defaultValue = "2", mandatory = true)
-  private Integer[] int4;
-
-  @ConfigurationParameter(name = "ints5", defaultValue = "2")
-  private List<Integer> ints5;
-
-  public List<Integer> getInts5() {
-    return ints5;
-  }
-
-  public List<Integer> getInts6() {
-    return ints6;
-  }
-
-  @ConfigurationParameter(name = "ints6", defaultValue = { "1", "2", "3", "4", "5" })
-  private List<Integer> ints6;
-
-  public static final String PARAM_FLOAT_1 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_1";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_1, mandatory = true, defaultValue = "0.0f")
-  private float float1;
-
-  public static final String PARAM_FLOAT_2 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_2";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_2, mandatory = false, defaultValue = "3.1415f")
-  private float float2;
-
-  public static final String PARAM_FLOAT_3 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_3";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_3, mandatory = true)
-  private float float3;
-
-  public static final String PARAM_FLOAT_4 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_4";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_4, mandatory = false)
-  private float[] float4;
-
-  public static final String PARAM_FLOAT_5 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_5";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_5, mandatory = false, defaultValue = { "0.0f",
-      "3.1415f", "2.7182818f" })
-  private float[] float5;
-
-  public static final String PARAM_FLOAT_6 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_6";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_6, mandatory = true)
-  private Float[] float6;
-
-  public static final String PARAM_FLOAT_7 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_FLOAT_7";
-
-  @ConfigurationParameter(name = PARAM_FLOAT_7, mandatory = true, defaultValue = { "1.1111f",
-      "2.2222f", "3.333f" })
-  private Float[] float7;
-
-  public static enum EnumValue {
-    ENUM_1, ENUM_2
-  }
-
-  public static final String PARAM_ENUM_1 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_ENUM_1";
-
-  @ConfigurationParameter(name = PARAM_ENUM_1, mandatory = true, defaultValue = { "ENUM_1" })
-  private EnumValue enum1;
-
-  public static final String PARAM_ENUM_2 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_ENUM_2";
-
-  @ConfigurationParameter(name = PARAM_ENUM_2, mandatory = true, defaultValue = { "ENUM_1",
-      "ENUM_2" })
-  private EnumValue[] enum2;
-
-  public static final String PARAM_ENUM_3 = "org.uimafit.factory.testAes.ParameterizedAE.PARAM_ENUM_3";
-
-  @ConfigurationParameter(name = PARAM_ENUM_3, mandatory = true, defaultValue = { "ENUM_1",
-      "ENUM_2" })
-  private List<EnumValue> enum3;
-
-  @ConfigurationParameter(name = "file1", mandatory = true, defaultValue = "test/data/file")
-  private File file1;
-
-  @ConfigurationParameter(name = "file1b", mandatory = true, defaultValue = { "test/data/file",
-      "test/data/file2" })
-  private File file1b;
-
-  @ConfigurationParameter(name = "file2", mandatory = true)
-  private File file2;
-
-  @ConfigurationParameter(name = "files3")
-  private File[] files3;
-
-  @ConfigurationParameter(name = "files4", defaultValue = "test/data/file")
-  private File[] files4;
-
-  @ConfigurationParameter(name = "files5", defaultValue = { "test/data/file", "test/data/file2" })
-  private File[] files5;
-
-  @ConfigurationParameter(name = "files6")
-  private List<File> files6;
-
-  @ConfigurationParameter(name = "files7", defaultValue = "test/data/file")
-  private List<File> files7;
-
-  @ConfigurationParameter(name = "files8", defaultValue = { "test/data/file", "test/data/file2" })
-  private List<File> files8;
-
-  @ConfigurationParameter(name = "files9")
-  private List<File> files9;
-
-  public EnumValue getEnum1() {
-    return enum1;
-  }
-
-  public EnumValue[] getEnum2() {
-    return enum2;
-  }
-
-  public List<EnumValue> getEnum3() {
-    return enum3;
-  }
-
-  public File getFile1() {
-    return file1;
-  }
-
-  public File getFile1b() {
-    return file1b;
-  }
-
-  public File getFile2() {
-    return file2;
-  }
-
-  public File[] getFiles3() {
-    return files3;
-  }
-
-  public File[] getFiles4() {
-    return files4;
-  }
-
-  public File[] getFiles5() {
-    return files5;
-  }
-
-  public List<File> getFiles6() {
-    return files6;
-  }
-
-  public List<File> getFiles7() {
-    return files7;
-  }
-
-  public List<File> getFiles8() {
-    return files8;
-  }
-
-  public List<File> getFiles9() {
-    return files9;
-  }
-
-  public float[] getFloat4() {
-    return float4;
-  }
-
-  public float[] getFloat5() {
-    return float5;
-  }
-
-  public Float[] getFloat6() {
-    return float6;
-  }
-
-  public Float[] getFloat7() {
-    return float7;
-  }
-
-  public Integer[] getInt4() {
-    return int4;
-  }
-
-  public float getFloat1() {
-    return float1;
-  }
-
-  public float getFloat2() {
-    return float2;
-  }
-
-  public float getFloat3() {
-    return float3;
-  }
-
-  public int[] getInt3() {
-    return int3;
-  }
-
-  public int getInt2() {
-    return int2;
-  }
-
-  public int getInt1() {
-    return int1;
-  }
-
-  public boolean[] getBoolean5() {
-    return boolean5;
-  }
-
-  public Boolean[] getBoolean3() {
-    return boolean3;
-  }
-
-  public boolean isBoolean2() {
-    return boolean2;
-  }
-
-  public boolean isBoolean1() {
-    return boolean1;
-  }
-
-  @Override
-  public void process(JCas cas) throws AnalysisEngineProcessException {
-    // do nothing
-  }
-
-  public String getString1() {
-    return string1;
-  }
-
-  public String[] getString2() {
-    return string2;
-  }
-
-  public String getString3() {
-    return string3;
-  }
-
-  public String[] getString4() {
-    return string4;
-  }
-
-  public String[] getString5() {
-    return string5;
-  }
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(name = "regex1")
-  private Pattern regex1;
-
-  @SuppressWarnings("unused")
-  @ConfigurationParameter(name = "regex2")
-  private Pattern regex2;
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE2.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE2.java
deleted file mode 100644
index f5ba936..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ParameterizedAE2.java
+++ /dev/null
@@ -1,56 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.resource.Resource_ImplBase;
-import org.uimafit.descriptor.ExternalResource;
-
-/**
- * Parametrized AE for testing {@link ExternalResource} annotations.
- * 
- */
-public class ParameterizedAE2 extends JCasAnnotator_ImplBase {
-  @ExternalResource
-  DummyResource res;
-
-  public static final String RES_OTHER = "other";
-
-  @ExternalResource(key = RES_OTHER)
-  DummyResource res2;
-
-  public static final String RES_OPTIONAL = "optional";
-
-  @ExternalResource(key = RES_OPTIONAL, mandatory = false)
-  DummyResource res3;
-
-  @Override
-  public void process(JCas aJCas) throws AnalysisEngineProcessException {
-    // Nothing to do
-  }
-
-  public static final class DummyResource extends Resource_ImplBase {
-    public String getName() {
-      return DummyResource.class.getName();
-    }
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ReversableTestFlowController.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ReversableTestFlowController.java
deleted file mode 100644
index 25ab1ad..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ReversableTestFlowController.java
+++ /dev/null
@@ -1,88 +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.uima.fit.factory.testAes;
-
-import static org.uimafit.factory.ConfigurationParameterFactory.createConfigurationParameterName;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
-import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData;
-import org.apache.uima.flow.FinalStep;
-import org.apache.uima.flow.Flow;
-import org.apache.uima.flow.FlowControllerContext;
-import org.apache.uima.flow.JCasFlow_ImplBase;
-import org.apache.uima.flow.SimpleStep;
-import org.apache.uima.flow.Step;
-import org.apache.uima.jcas.JCas;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-
-/**
- * 
- * NOTE: this class extends org.uimafit.component.JCasFlowController_ImplBase
- */
-
-public class ReversableTestFlowController extends
-        org.apache.uima.fit.component.JCasFlowController_ImplBase {
-
-  public static final String PARAM_REVERSE_ORDER = createConfigurationParameterName(
-          ReversableTestFlowController.class, "reverseOrder");
-
-  @ConfigurationParameter
-  private boolean reverseOrder = false;
-
-  @Override
-  public Flow computeFlow(JCas jCas) throws AnalysisEngineProcessException {
-    return new ReversableFlow(getContext(), reverseOrder);
-  }
-
-  private static class ReversableFlow extends JCasFlow_ImplBase {
-    private List<String> keys = new ArrayList<String>();
-
-    private int i = 0;
-
-    public ReversableFlow(FlowControllerContext context, boolean reverseOrder) {
-      Iterator<Map.Entry<String, AnalysisEngineMetaData>> iterator = context
-              .getAnalysisEngineMetaDataMap().entrySet().iterator();
-      while (iterator.hasNext()) {
-        Map.Entry<String, AnalysisEngineMetaData> entry = iterator.next();
-        String key = entry.getKey();
-        keys.add(key);
-      }
-      Collections.sort(keys);
-      if (reverseOrder) {
-        Collections.reverse(keys);
-      }
-    }
-
-    public Step next() throws AnalysisEngineProcessException {
-      if (i < keys.size()) {
-        return new SimpleStep(keys.get(i++));
-      }
-
-      return new FinalStep();
-    }
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ViewNames.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ViewNames.java
deleted file mode 100644
index 978329c..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testAes/ViewNames.java
+++ /dev/null
@@ -1,38 +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.uima.fit.factory.testAes;
-
-import org.apache.uima.cas.CAS;
-
-/**
- */
-
-public class ViewNames {
-
-  public static final String INITIAL_VIEW = CAS.NAME_DEFAULT_SOFA;
-
-  public static final String PARENTHESES_VIEW = "ParenthesesView";
-
-  public static final String SORTED_VIEW = "SortedView";
-
-  public static final String SORTED_PARENTHESES_VIEW = "SortedParenthesesView";
-
-  public static final String REVERSE_VIEW = "ReverseView";
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReader.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReader.java
deleted file mode 100644
index 1fc0562..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReader.java
+++ /dev/null
@@ -1,127 +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.uima.fit.factory.testCrs;
-
-import static org.uimafit.factory.ConfigurationParameterFactory.createConfigurationParameterName;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-import org.apache.uima.UimaContext;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.impl.XCASDeserializer;
-import org.apache.uima.cas.impl.XmiCasDeserializer;
-import org.apache.uima.collection.CollectionException;
-import org.apache.uima.fit.component.CasCollectionReader_ImplBase;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.util.Progress;
-import org.apache.uima.util.ProgressImpl;
-import org.uimafit.descriptor.ConfigurationParameter;
-import org.xml.sax.SAXException;
-
-
-/**
- * <br>
- * 
- * This collection reader allows one to read in a single XMI or XCAS file. It's primary purpose is
- * to help out a couple JCasFactory create methods. However, it is also used for this project unit
- * tests as an example collection reader.
- * 
- */
-
-public class SingleFileXReader extends CasCollectionReader_ImplBase {
-
-  public static final String PARAM_FILE_NAME = createConfigurationParameterName(
-          SingleFileXReader.class, "fileName");
-
-  @ConfigurationParameter(mandatory = true, description = "takes the name of a single xmi or xcas file to be processed.")
-  private String fileName;
-
-  public static final String XMI = "XMI";
-
-  public static final String XCAS = "XCAS";
-
-  public static final String PARAM_XML_SCHEME = createConfigurationParameterName(
-          SingleFileXReader.class, "xmlScheme");
-
-  @ConfigurationParameter(mandatory = true, description = "specifies the UIMA XML serialization scheme that should be usedValid values for this parameter are 'XMI' and 'XCAS'. See XmiCasSerializer or XCASSerializer", defaultValue = XMI)
-  private String xmlScheme;
-
-  private boolean useXMI = true;
-
-  private boolean hasNext = true;
-
-  private File file;
-
-  @Override
-  public void initialize(UimaContext context) throws ResourceInitializationException {
-    super.initialize(context);
-
-    file = new File(fileName);
-
-    if (xmlScheme.equals(XMI)) {
-      useXMI = true;
-    } else if (xmlScheme.equals(XCAS)) {
-      useXMI = false;
-    } else {
-      throw new ResourceInitializationException(String.format(
-              "parameter '%1$s' must be either '%2$s' or '%3$s' or left empty.", PARAM_XML_SCHEME,
-              XMI, XCAS), null);
-    }
-
-  }
-
-  public void getNext(CAS cas) throws IOException, CollectionException {
-
-    FileInputStream inputStream = new FileInputStream(file);
-
-    try {
-      if (useXMI) {
-        XmiCasDeserializer.deserialize(inputStream, cas);
-      } else {
-        XCASDeserializer.deserialize(inputStream, cas);
-      }
-    } catch (SAXException e) {
-      throw new CollectionException(e);
-    } finally {
-      inputStream.close();
-    }
-
-    inputStream.close();
-    hasNext = false;
-  }
-
-  @Override
-  public void close() throws IOException {
-    // do nothing
-  }
-
-  public Progress[] getProgress() {
-    if (hasNext) {
-      return new Progress[] { new ProgressImpl(0, 1, Progress.ENTITIES) };
-    }
-    return new Progress[] { new ProgressImpl(1, 1, Progress.ENTITIES) };
-  }
-
-  public boolean hasNext() throws IOException, CollectionException {
-    return hasNext;
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReaderTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReaderTest.java
deleted file mode 100644
index 2338522..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testCrs/SingleFileXReaderTest.java
+++ /dev/null
@@ -1,117 +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.uima.fit.factory.testCrs;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.collection.CollectionReader;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.CollectionReaderFactory;
-import org.apache.uima.fit.pipeline.JCasIterator;
-import org.apache.uima.fit.testing.util.HideOutput;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.util.Progress;
-import org.junit.Test;
-
-/**
- */
-
-public class SingleFileXReaderTest extends ComponentTestBase {
-
-  @Test
-  public void testXReader() throws UIMAException, IOException {
-    ResourceInitializationException rie = null;
-    try {
-      CollectionReaderFactory.createReader(SingleFileXReader.class, null,
-              SingleFileXReader.PARAM_XML_SCHEME, "XML");
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-
-    rie = null;
-    try {
-      CollectionReaderFactory.createReader(SingleFileXReader.class, null,
-              SingleFileXReader.PARAM_XML_SCHEME, "XML", SingleFileXReader.PARAM_FILE_NAME,
-              "myxslt.xml");
-    } catch (ResourceInitializationException e) {
-      rie = e;
-    }
-    assertNotNull(rie);
-
-    CollectionReader cr = CollectionReaderFactory.createReader(SingleFileXReader.class,
-            typeSystemDescription, SingleFileXReader.PARAM_XML_SCHEME, "XCAS",
-            SingleFileXReader.PARAM_FILE_NAME, "src/test/resources/data/docs/test.xcas");
-    Progress[] progress = cr.getProgress();
-    assertEquals(1, progress.length);
-    assertEquals(0, progress[0].getCompleted());
-    assertTrue(cr.hasNext());
-
-    new JCasIterator(cr).next();
-    progress = cr.getProgress();
-    assertEquals(1, progress.length);
-    assertEquals(1, progress[0].getCompleted());
-
-    cr.close();
-
-    cr = CollectionReaderFactory.createReader(SingleFileXReader.class,
-            typeSystemDescription, SingleFileXReader.PARAM_XML_SCHEME, "XCAS",
-            SingleFileXReader.PARAM_FILE_NAME, "test/data/docs/test.xcas");
-    UnsupportedOperationException uoe = null;
-    try {
-      new JCasIterator(cr).remove();
-    } catch (UnsupportedOperationException e) {
-      uoe = e;
-    }
-    assertNotNull(uoe);
-    cr.close();
-
-    HideOutput hideOutput = new HideOutput();
-    cr = CollectionReaderFactory.createReader(SingleFileXReader.class,
-            typeSystemDescription, SingleFileXReader.PARAM_XML_SCHEME, "XCAS",
-            SingleFileXReader.PARAM_FILE_NAME, "test/data/docs/bad.xcas");
-    RuntimeException re = null;
-    try {
-      new JCasIterator(cr).next();
-    } catch (RuntimeException e) {
-      re = e;
-    }
-    assertNotNull(re);
-    hideOutput.restoreOutput();
-
-    cr = CollectionReaderFactory.createReader(SingleFileXReader.class,
-            typeSystemDescription, SingleFileXReader.PARAM_XML_SCHEME, "XMI",
-            SingleFileXReader.PARAM_FILE_NAME, "test/data/docs/dne.xmi");
-    re = null;
-    try {
-      JCasIterator jCases = new JCasIterator(cr);
-      assertTrue(jCases.hasNext());
-      jCases.next();
-    } catch (RuntimeException e) {
-      re = e;
-    }
-    assertNotNull(re);
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestExternalResource.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestExternalResource.java
deleted file mode 100644
index cc416be..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestExternalResource.java
+++ /dev/null
@@ -1,41 +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.uima.fit.factory.testRes;
-
-import static org.junit.Assert.assertEquals;
-
-import org.apache.uima.fit.component.Resource_ImplBase;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-/**
- */
-public class TestExternalResource extends Resource_ImplBase {
-  public static final String EXPECTED_VALUE = "expected value";
-
-  public final static String PARAM_VALUE = "value";
-
-  @ConfigurationParameter(name = PARAM_VALUE)
-  private String value;
-
-  public void assertConfiguredOk() {
-//    System.out.println(getClass().getSimpleName() + ".assertConfiguredOk()");
-    // Ensure normal parameters get passed to External Resource
-    assertEquals(EXPECTED_VALUE, value);
-  }
-}
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestSharedResourceObject.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestSharedResourceObject.java
deleted file mode 100644
index a93fff8..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/factory/testRes/TestSharedResourceObject.java
+++ /dev/null
@@ -1,48 +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.uima.fit.factory.testRes;
-
-import static org.junit.Assert.assertEquals;
-
-import org.apache.uima.fit.component.initialize.ConfigurationParameterInitializer;
-import org.apache.uima.resource.DataResource;
-import org.apache.uima.resource.ResourceInitializationException;
-import org.apache.uima.resource.SharedResourceObject;
-import org.uimafit.descriptor.ConfigurationParameter;
-
-/**
- */
-public class TestSharedResourceObject implements SharedResourceObject {
-  public static final String EXPECTED_VALUE = "expected value";
-
-  public final static String PARAM_VALUE = "value";
-
-  @ConfigurationParameter(name = PARAM_VALUE)
-  private String value;
-
-  public void assertConfiguredOk() {
-//    System.out.println(getClass().getSimpleName() + ".assertConfiguredOk()");
-    // Ensure normal parameters get passed to External Resource
-    assertEquals(EXPECTED_VALUE, value);
-  }
-
-  public void load(DataResource aData) throws ResourceInitializationException {
-    ConfigurationParameterInitializer.initialize(this, aData);
-  }
-}
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/testing/factory/TokenBuilderTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/testing/factory/TokenBuilderTest.java
deleted file mode 100644
index fc5d79b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/testing/factory/TokenBuilderTest.java
+++ /dev/null
@@ -1,242 +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.uima.fit.testing.factory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.FSIndex;
-import org.apache.uima.cas.FSIterator;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.JCasUtil;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.apache.uima.pear.util.FileUtil;
-import org.junit.Test;
-
-/**
- */
-
-public class TokenBuilderTest extends ComponentTestBase {
-
-  @Test
-  public void test1() {
-    String text = "What if we built a rocket ship made of cheese?"
-            + "We could fly it to the moon for repairs.";
-    tokenBuilder
-            .buildTokens(
-                    jCas,
-                    text,
-                    "What if we built a rocket ship made of cheese ? \r\n We could fly it to the moon for repairs .",
-                    "A B C D E F G H I J K L M N O P Q R S T U");
-
-    FSIndex<Annotation> sentenceIndex = jCas.getAnnotationIndex(Sentence.type);
-    assertEquals(2, sentenceIndex.size());
-    FSIterator<Annotation> sentences = sentenceIndex.iterator();
-    Sentence sentence = (Sentence) sentences.next();
-    assertEquals("What if we built a rocket ship made of cheese?", sentence.getCoveredText());
-    sentence = (Sentence) sentences.next();
-    assertEquals("We could fly it to the moon for repairs.", sentence.getCoveredText());
-
-    FSIndex<Annotation> tokenIndex = jCas.getAnnotationIndex(Token.type);
-    assertEquals(21, tokenIndex.size());
-    Token token = JCasUtil.selectByIndex(jCas, Token.class, 0);
-    testToken(token, "What", 0, 4, "A", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 1);
-    testToken(token, "if", 5, 7, "B", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 9);
-    testToken(token, "cheese", 39, 45, "J", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 10);
-    testToken(token, "?", 45, 46, "K", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 11);
-    testToken(token, "We", 46, 48, "L", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 12);
-    testToken(token, "could", 49, 54, "M", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 19);
-    testToken(token, "repairs", 78, 85, "T", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 20);
-    testToken(token, ".", 85, 86, "U", null);
-  }
-
-  @Test
-  public void test2() {
-    String text = "What if we built a rocket ship made of cheese? \n"
-            + "We could fly it to the moon for repairs.";
-    tokenBuilder
-            .buildTokens(
-                    jCas,
-                    text,
-                    "What if we built a rocket ship made of cheese ? \n We could fly it to the moon for repairs .",
-                    "A B C D E F G H I J K L M N O P Q R S T U");
-
-    Token token = JCasUtil.selectByIndex(jCas, Token.class, 10);
-    testToken(token, "?", 45, 46, "K", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 11);
-    testToken(token, "We", 48, 50, "L", null);
-
-    jCas.reset();
-    text = "What if we built a rocket ship made of cheese? \n"
-            + "We could fly it to the moon for repairs.";
-    tokenBuilder
-            .buildTokens(
-                    jCas,
-                    text,
-                    "What if we built a rocket ship made of cheese ?\nWe could fly it to the moon for repairs .",
-                    "A B C D E F G H I J K L M N O P Q R S T U");
-
-    token = JCasUtil.selectByIndex(jCas, Token.class, 10);
-    testToken(token, "?", 45, 46, "K", null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 11);
-    testToken(token, "We", 48, 50, "L", null);
-  }
-
-  @Test
-  public void test3() {
-    String text = "If you like line writer, then you should really check out line rider.";
-    tokenBuilder.buildTokens(jCas, text);
-
-    FSIndex<Annotation> tokenIndex = jCas.getAnnotationIndex(Token.type);
-    assertEquals(13, tokenIndex.size());
-    Token token = JCasUtil.selectByIndex(jCas, Token.class, 0);
-    testToken(token, "If", 0, 2, null, null);
-    token = JCasUtil.selectByIndex(jCas, Token.class, 12);
-    testToken(token, "rider.", 63, 69, null, null);
-    FSIndex<Annotation> sentenceIndex = jCas.getAnnotationIndex(Sentence.type);
-    assertEquals(1, sentenceIndex.size());
-    Sentence sentence = JCasUtil.selectByIndex(jCas, Sentence.class, 0);
-    assertEquals(text, sentence.getCoveredText());
-  }
-
-  private void testToken(Token token, String coveredText, int begin, int end, String partOfSpeech,
-          String stem) {
-    assertEquals(coveredText, token.getCoveredText());
-    assertEquals(begin, token.getBegin());
-    assertEquals(end, token.getEnd());
-    assertEquals(partOfSpeech, token.getPos());
-    assertEquals(stem, token.getStem());
-  }
-
-  @Test
-  public void testSpaceSplit() {
-    String[] splits = " asdf ".split(" ");
-    assertEquals(2, splits.length);
-  }
-
-  @Test
-  public void testBadInput() {
-    String text = "If you like line writer, then you should really check out line rider.";
-    IllegalArgumentException iae = null;
-    try {
-      tokenBuilder.buildTokens(jCas, text,
-              "If you like line rider, then you really don't need line writer");
-    } catch (IllegalArgumentException e) {
-      iae = e;
-    }
-    assertNotNull(iae);
-  }
-
-  @Test
-  public void testStems() {
-    String text = "Me and all my friends are non-conformists.";
-    tokenBuilder.buildTokens(jCas, text, "Me and all my friends are non - conformists .",
-            "M A A M F A N - C .", "me and all my friend are non - conformist .");
-
-    assertEquals("Me and all my friends are non-conformists.", jCas.getDocumentText());
-    Token friendToken = JCasUtil.selectByIndex(jCas, Token.class, 4);
-    assertEquals("friends", friendToken.getCoveredText());
-    assertEquals("F", friendToken.getPos());
-    assertEquals("friend", friendToken.getStem());
-  }
-
-  @Test
-  public void test4() {
-    String text = "a b-c de--fg h,i,j,k";
-    tokenBuilder.buildTokens(jCas, text, "a b - c d e - - f g h , i , j , k");
-
-    FSIterator<Annotation> tokens = jCas.getAnnotationIndex(Token.type).iterator();
-    int tokenCount = 0;
-    while (tokens.hasNext()) {
-      tokenCount++;
-      tokens.next();
-    }
-    assertEquals(17, tokenCount);
-  }
-
-  @Test
-  public void test5() throws Exception {
-    JCas myView = jCas.createView("MyView");
-
-    tokenBuilder.buildTokens(myView, "red and blue cars and tipsy motorcycles");
-
-    Token token = JCasUtil.selectByIndex(myView, Token.class, 6);
-    assertEquals("motorcycles", token.getCoveredText());
-
-  }
-
-  @Test
-  public void testNewlinesFromFile() throws Exception {
-    File unixNewlines = new File("src/test/resources/data/docs/unix-newlines.txt.bin");
-    assertEquals(55, unixNewlines.length());
-    byte[] unixNewlinesBytes = IOUtils.toByteArray(new FileInputStream(unixNewlines));
-    assertEquals('.', unixNewlinesBytes[13]);
-    assertEquals(0x0A, unixNewlinesBytes[14]);
-    assertEquals('s', unixNewlinesBytes[15]);
-    
-    String text = FileUtil.loadTextFile(unixNewlines, "UTF-8");
-    text = text.substring(1); // remove "\uFEFF" character from beginning of text
-    tokenBuilder.buildTokens(jCas, text);
-
-    Collection<Sentence> sentences = JCasUtil.select(jCas, Sentence.class);
-    assertEquals(4, sentences.size());
-    Iterator<Sentence> iterator = sentences.iterator();
-    assertEquals("sentence 1.", iterator.next().getCoveredText());
-    assertEquals("sentence 2.", iterator.next().getCoveredText());
-    assertEquals("sentence 3.", iterator.next().getCoveredText());
-    assertEquals("sentence 4.", iterator.next().getCoveredText());
-
-    jCas.reset();
-    File windowsNewlines = new File("src/test/resources/data/docs/windows-newlines.txt.bin");
-    text = FileUtil.loadTextFile(windowsNewlines, "UTF-8");
-    assertEquals(65, windowsNewlines.length());
-    byte[] windowsNewlinesBytes = IOUtils.toByteArray(new FileInputStream(windowsNewlines));
-    assertEquals('.', windowsNewlinesBytes[13]);
-    assertEquals(0x0D, windowsNewlinesBytes[14]);
-    assertEquals(0x0A, windowsNewlinesBytes[15]);
-    assertEquals('s', windowsNewlinesBytes[16]);
-    text = text.substring(1); // remove "\uFEFF" character from beginning of text
-    tokenBuilder.buildTokens(jCas, text);
-
-    sentences = JCasUtil.select(jCas, Sentence.class);
-    assertEquals(4, sentences.size());
-    iterator = sentences.iterator();
-    assertEquals("sentence 1.", iterator.next().getCoveredText());
-    assertEquals("sentence 2.", iterator.next().getCoveredText());
-    assertEquals("sentence 3.", iterator.next().getCoveredText());
-    assertEquals("sentence 4.", iterator.next().getCoveredText());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/CasUtilTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/CasUtilTest.java
deleted file mode 100644
index 1d854a7..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/CasUtilTest.java
+++ /dev/null
@@ -1,188 +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.uima.fit.util;
-
-import static java.util.Arrays.asList;
-import static org.apache.uima.fit.util.CasUtil.getAnnotationType;
-import static org.apache.uima.fit.util.CasUtil.getType;
-import static org.apache.uima.fit.util.CasUtil.iterator;
-import static org.apache.uima.fit.util.CasUtil.iteratorFS;
-import static org.apache.uima.fit.util.CasUtil.select;
-import static org.apache.uima.fit.util.CasUtil.selectByIndex;
-import static org.apache.uima.fit.util.CasUtil.selectFS;
-import static org.apache.uima.fit.util.CasUtil.toText;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.ArrayFS;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.FeatureStructure;
-import org.apache.uima.cas.Type;
-import org.apache.uima.cas.text.AnnotationFS;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.cas.TOP;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.junit.Test;
-
-/**
- * Test cases for {@link JCasUtil}.
- * 
- */
-public class CasUtilTest extends ComponentTestBase {
-  @Test
-  public void testGetType() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    assertEquals(Token.class.getName(), getType(cas, Token.class.getName()).getName());
-    assertEquals(Token.class.getName(), getType(cas, Token.class).getName());
-    assertEquals(Token.class.getName(), getAnnotationType(cas, Token.class.getName()).getName());
-    assertEquals(Token.class.getName(), getAnnotationType(cas, Token.class).getName());
-    assertEquals("uima.cas.TOP", getType(cas, TOP.class).getName());
-    assertEquals("uima.cas.TOP", getType(cas, TOP.class.getName()).getName());
-    assertEquals("uima.tcas.Annotation", getType(cas, Annotation.class).getName());
-    assertEquals("uima.tcas.Annotation", getType(cas, Annotation.class.getName()).getName());
-    assertEquals("uima.tcas.Annotation", getAnnotationType(cas, Annotation.class).getName());
-    assertEquals("uima.tcas.Annotation", getAnnotationType(cas, Annotation.class.getName())
-            .getName());
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testGetNonExistingType() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    getType(cas, Token.class.getName() + "_dummy");
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testGetNonAnnotationType() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    getAnnotationType(cas, TOP.class);
-  }
-
-  @Test
-  public void testSelectByIndex() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-    Type type = JCasUtil.getType(jCas, Token.class);
-
-    assertEquals("dew?", selectByIndex(cas, type, -1).getCoveredText());
-    assertEquals("dew?", selectByIndex(cas, type, 3).getCoveredText());
-    assertEquals("Rot", selectByIndex(cas, type, 0).getCoveredText());
-    assertEquals("Rot", selectByIndex(cas, type, -4).getCoveredText());
-    assertNull(selectByIndex(cas, type, -5));
-    assertNull(selectByIndex(cas, type, 4));
-  }
-
-  @SuppressWarnings({ "unchecked", "rawtypes" })
-  @Test
-  public void testSelectOnAnnotations() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText(select(cas, getType(cas, Token.class.getName()))));
-
-    assertEquals(
-            asList("Rot", "wood", "cheeses", "dew?"),
-            toText((Collection<AnnotationFS>) (Collection) selectFS(cas,
-                    getType(cas, Token.class.getName()))));
-  }
-
-  @SuppressWarnings({ "rawtypes", "unchecked" })
-  @Test
-  public void testSelectOnArrays() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    Collection<FeatureStructure> allFS = selectFS(cas, getType(cas, TOP.class.getName()));
-    ArrayFS allFSArray = cas.createArrayFS(allFS.size());
-    int i = 0;
-    for (FeatureStructure fs : allFS) {
-      allFSArray.set(i, fs);
-      i++;
-    }
-
-//    // Print what is expected
-//    for (FeatureStructure fs : allFS) {
-//      System.out.println("Type: " + fs.getType().getName() + "]");
-//    }
-//    System.out
-//            .println("Tokens: [" + toText(select(cas, getType(cas, Token.class.getName()))) + "]");
-
-    // Document Annotation, one sentence and 4 tokens.
-    assertEquals(6, allFS.size());
-
-    assertEquals(toText(select(cas, getType(cas, Token.class.getName()))),
-            toText(select(allFSArray, getType(cas, Token.class.getName()))));
-
-    assertEquals(toText((Iterable) selectFS(cas, getType(cas, Token.class.getName()))),
-            toText((Iterable) selectFS(allFSArray, getType(cas, Token.class.getName()))));
-  }
-
-  @SuppressWarnings({ "unchecked", "rawtypes" })
-  @Test
-  public void testIterator() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText(iterator(cas, getType(cas, Token.class))));
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText((Iterator<AnnotationFS>) (Iterator) iteratorFS(cas, getType(cas, Token.class))));
-  }
-
-  @SuppressWarnings({ "unchecked", "rawtypes" })
-  @Test
-  public void testIterate() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    CAS cas = jCas.getCas();
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText(select(cas, getType(cas, Token.class))));
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText((Iterable<AnnotationFS>) (Iterable) selectFS(cas, getType(cas, Token.class))));
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/ContainmentIndexTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/ContainmentIndexTest.java
deleted file mode 100644
index 707123b..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/ContainmentIndexTest.java
+++ /dev/null
@@ -1,69 +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.uima.fit.util;
-
-import static java.util.Arrays.asList;
-import static org.apache.uima.fit.util.JCasUtil.select;
-import static org.apache.uima.fit.util.JCasUtil.selectCovered;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.fit.util.ContainmentIndex.Type;
-import org.junit.Test;
-
-/**
- * Unit test for {@link ContainmentIndex}.
- * 
- */
-public class ContainmentIndexTest extends ComponentTestBase {
-  @Test
-  public void test() throws Exception {
-    String text = "Will you come home today ? \n No , tomorrow !";
-    tokenBuilder.buildTokens(jCas, text);
-
-    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
-    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
-
-    ContainmentIndex<Sentence, Token> idx = ContainmentIndex.create(jCas, Sentence.class,
-            Token.class, Type.BOTH);
-
-    assertEquals(selectCovered(Token.class, sentences.get(0)), idx.containedIn(sentences.get(0)));
-    assertEquals(selectCovered(Token.class, sentences.get(1)), idx.containedIn(sentences.get(1)));
-
-    assertEquals(asList(sentences.get(0)), idx.containing(tokens.get(0)));
-    assertEquals(asList(sentences.get(1)), idx.containing(tokens.get(tokens.size() - 1)));
-
-    assertTrue(idx.isContainedIn(sentences.get(0), tokens.get(0)));
-    assertFalse(idx.isContainedIn(sentences.get(0), tokens.get(tokens.size() - 1)));
-
-    // After removing the annotation the index has to be rebuilt.
-    assertTrue(idx.isContainedInAny(tokens.get(0)));
-    sentences.get(0).removeFromIndexes();
-    idx = ContainmentIndex.create(jCas, Sentence.class, Token.class, Type.BOTH);
-    assertFalse(idx.isContainedInAny(tokens.get(0)));
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/DisableLoggingTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/DisableLoggingTest.java
deleted file mode 100644
index a912b63..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/DisableLoggingTest.java
+++ /dev/null
@@ -1,106 +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.uima.fit.util;
-
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import junit.framework.Assert;
-
-import org.apache.uima.fit.testing.util.DisableLogging;
-import org.junit.Test;
-
-/**
- */
-public class DisableLoggingTest {
-
-  @Test
-  public void test() {
-    // get the top logger and remove all handlers
-    Logger topLogger = Logger.getLogger("");
-    Handler[] handlers = topLogger.getHandlers();
-    for (Handler handler : handlers) {
-      topLogger.removeHandler(handler);
-    }
-
-    // add a single hander that writes to a string buffer
-    final StringBuffer buffer = new StringBuffer();
-    Handler bufferhandler = new Handler() {
-      @Override
-      public void close() throws SecurityException {/* do nothing */
-      }
-
-      @Override
-      public void flush() {/* do nothing */
-      }
-
-      @Override
-      public void publish(LogRecord record) {
-        buffer.append(record.getMessage());
-      }
-    };
-    topLogger.addHandler(bufferhandler);
-
-    // log to the buffer
-    Logger.getLogger("foo").info("Hello!");
-    Assert.assertEquals("Hello!", buffer.toString());
-
-    // disable logging, and make sure nothing is written to the buffer
-    buffer.setLength(0);
-    Level level = DisableLogging.disableLogging();
-    Logger.getLogger("bar").info("Hello!");
-    Assert.assertEquals("", buffer.toString());
-
-    // enable logging, and make sure things are written to the buffer
-    DisableLogging.enableLogging(level);
-    Logger.getLogger("baz").info("Hello!");
-    Assert.assertEquals("Hello!", buffer.toString());
-
-    // try disabling logging with a logger that has its own handler
-    buffer.setLength(0);
-    Logger logger = Logger.getLogger("foo.bar.baz");
-    logger.addHandler(new Handler() {
-      @Override
-      public void close() throws SecurityException {/* do nothing */
-      }
-
-      @Override
-      public void flush() { /* do nothing */
-      }
-
-      @Override
-      public void publish(LogRecord record) {
-        buffer.append("Not disabled!");
-      }
-    });
-    level = DisableLogging.disableLogging();
-    logger.info("Hello!");
-    Assert.assertEquals("", buffer.toString());
-    DisableLogging.enableLogging(level);
-
-    // restore the original handlers
-    topLogger.removeHandler(bufferhandler);
-    for (Handler handler : handlers) {
-      topLogger.addHandler(handler);
-    }
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java
deleted file mode 100644
index 8028ef1..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/FSCollectionFactoryTest.java
+++ /dev/null
@@ -1,211 +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.
-
-
- getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
- */
-package org.apache.uima.fit.util;
-
-import static java.util.Arrays.asList;
-import static org.apache.commons.lang.ArrayUtils.toObject;
-import static org.apache.uima.fit.util.FSCollectionFactory.create;
-import static org.apache.uima.fit.util.FSCollectionFactory.createArrayFS;
-import static org.apache.uima.fit.util.FSCollectionFactory.createBooleanArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createByteArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createDoubleArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFSArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFSList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFloatArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createFloatList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createIntArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createIntegerList;
-import static org.apache.uima.fit.util.FSCollectionFactory.createLongArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createShortArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createStringArray;
-import static org.apache.uima.fit.util.FSCollectionFactory.createStringList;
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.uima.cas.FeatureStructure;
-import org.apache.uima.fit.factory.JCasFactory;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- */
-public class FSCollectionFactoryTest {
-  private JCas jcas;
-
-  private Collection<FeatureStructure> tokenFSs;
-
-  private Collection<Annotation> tokens;
-
-  @Before
-  public void init() throws Exception {
-    jcas = JCasFactory.createJCas();
-
-    tokenFSs = new ArrayList<FeatureStructure>();
-    tokens = new ArrayList<Annotation>();
-
-    Token t1 = new Token(jcas, 0, 1);
-    tokenFSs.add(t1);
-    tokens.add(t1);
-    t1.addToIndexes();
-
-    Token t2 = new Token(jcas, 2, 3);
-    tokenFSs.add(t2);
-    tokens.add(t2);
-    t2.addToIndexes();
-  }
-
-  @Test
-  public void testCreateFSList() {
-    assertEquals(tokens, create(createFSList(jcas, tokens)));
-    assertEquals(tokens, create(createFSList(jcas, tokens), Token.class));
-  }
-
-  @Test
-  public void testCreateFSArray() {
-    assertEquals(tokenFSs, create(createArrayFS(jcas.getCas(), tokenFSs)));
-    assertEquals(
-            tokenFSs,
-            create(createArrayFS(jcas.getCas(),
-                    tokenFSs.toArray(new FeatureStructure[tokenFSs.size()]))));
-    assertEquals(tokens, create(createArrayFS(jcas.getCas(), tokens)));
-    assertEquals(tokens, create(createFSArray(jcas, tokens)));
-    assertEquals(tokens,
-            create(createArrayFS(jcas.getCas(), tokens.toArray(new Annotation[tokens.size()]))));
-    assertEquals(tokens, create(createFSArray(jcas, tokens.toArray(new Annotation[tokens.size()]))));
-    assertEquals(tokens,
-            create(createFSArray(jcas, tokens.toArray(new Annotation[tokens.size()])), Token.class));
-  }
-
-  @Test
-  public void testCreateBooleanArray() {
-    assertEquals(asList(true, false),
-            asList(toObject(createBooleanArray(jcas.getCas(), asList(true, false)).toArray())));
-    assertEquals(asList(true, false),
-            asList(toObject(createBooleanArray(jcas.getCas(), new boolean[] { true, false })
-                    .toArray())));
-    assertEquals(asList(true, false), asList(toObject(createBooleanArray(jcas, asList(true, false))
-            .toArray())));
-    assertEquals(asList(true, false),
-            asList(toObject(createBooleanArray(jcas, new boolean[] { true, false }).toArray())));
-  }
-
-  @Test
-  public void testCreateByteArray() {
-    assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas.getCas(), asList((byte) 0, (byte) 1)).toArray())));
-    assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas.getCas(), new byte[] { 0, 1 }).toArray())));
-    assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas, asList((byte) 0, (byte) 1)).toArray())));
-    assertEquals(asList((byte) 0, (byte) 1),
-            asList(toObject(createByteArray(jcas, new byte[] { 0, 1 }).toArray())));
-  }
-
-  @Test
-  public void testCreateDoubleArray() {
-    assertEquals(asList(0.0, 1.0),
-            asList(toObject(createDoubleArray(jcas.getCas(), asList(0.0, 1.0)).toArray())));
-    assertEquals(asList(0.0, 1.0),
-            asList(toObject(createDoubleArray(jcas.getCas(), new double[] { 0.0, 1.0 }).toArray())));
-    assertEquals(asList(0.0, 1.0), asList(toObject(createDoubleArray(jcas, asList(0.0, 1.0))
-            .toArray())));
-    assertEquals(asList(0.0, 1.0),
-            asList(toObject(createDoubleArray(jcas, new double[] { 0.0, 1.0 }).toArray())));
-  }
-
-  @Test
-  public void testCreateFloatArray() {
-    assertEquals(asList(0.0f, 1.0f),
-            asList(toObject(createFloatArray(jcas.getCas(), asList(0.0f, 1.0f)).toArray())));
-    assertEquals(asList(0.0f, 1.0f),
-            asList(toObject(createFloatArray(jcas.getCas(), new float[] { 0.0f, 1.0f }).toArray())));
-    assertEquals(asList(0.0f, 1.0f), asList(toObject(createFloatArray(jcas, asList(0.0f, 1.0f))
-            .toArray())));
-    assertEquals(asList(0.0f, 1.0f),
-            asList(toObject(createFloatArray(jcas, new float[] { 0.0f, 1.0f }).toArray())));
-  }
-
-  @Test
-  public void testCreateFloatList() {
-    assertEquals(asList(0.0f, 1.0f), create(createFloatList(jcas, asList(0.0f, 1.0f))));
-  }
-
-  @Test
-  public void testCreateIntArray() {
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas.getCas(), asList(0, 1))
-            .toArray())));
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas.getCas(), new int[] { 0, 1 })
-            .toArray())));
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas, asList(0, 1)).toArray())));
-    assertEquals(asList(0, 1), asList(toObject(createIntArray(jcas, new int[] { 0, 1 }).toArray())));
-  }
-
-  @Test
-  public void testCreateIntegerList() {
-    assertEquals(asList(0, 1), create(createIntegerList(jcas, asList(0, 1))));
-  }
-
-  @Test
-  public void testCreateLongArray() {
-    assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas.getCas(), asList(0l, 1l))
-            .toArray())));
-    assertEquals(asList(0l, 1l),
-            asList(toObject(createLongArray(jcas.getCas(), new long[] { 0l, 1l }).toArray())));
-    assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas, asList(0l, 1l)).toArray())));
-    assertEquals(asList(0l, 1l), asList(toObject(createLongArray(jcas, new long[] { 0l, 1l })
-            .toArray())));
-  }
-
-  @Test
-  public void testCreateShortArray() {
-    assertEquals(
-            asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas.getCas(), asList((short) 0, (short) 1)).toArray())));
-    assertEquals(asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas.getCas(), new short[] { 0, 1 }).toArray())));
-    assertEquals(asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas, asList((short) 0, (short) 1)).toArray())));
-    assertEquals(asList((short) 0, (short) 1),
-            asList(toObject(createShortArray(jcas, new short[] { 0, 1 }).toArray())));
-  }
-
-  @Test
-  public void testCreateStringArray() {
-    assertEquals(asList("0", "1"), asList(createStringArray(jcas.getCas(), asList("0", "1"))
-            .toArray()));
-    assertEquals(asList("0", "1"),
-            asList(createStringArray(jcas.getCas(), new String[] { "0", "1" }).toArray()));
-    assertEquals(asList("0", "1"), asList(createStringArray(jcas, asList("0", "1")).toArray()));
-    assertEquals(asList("0", "1"), asList(createStringArray(jcas, new String[] { "0", "1" })
-            .toArray()));
-  }
-
-  @Test
-  public void testCreateStringList() {
-    assertEquals(asList("0", "1"), create(createStringList(jcas, asList("0", "1"))));
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/HideOutputTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/HideOutputTest.java
deleted file mode 100644
index b8101dd..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/HideOutputTest.java
+++ /dev/null
@@ -1,72 +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.uima.fit.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-
-import junit.framework.Assert;
-
-import org.apache.uima.fit.testing.util.HideOutput;
-import org.junit.Test;
-
-/**
- */
-
-public class HideOutputTest {
-
-  @Test
-  public void testHideOutput() throws IOException {
-    // message that will be written to stdout and stderr
-    String className = this.getClass().getName();
-    String message = String.format("If you see this output, %s is failing\n", className);
-
-    // redirect stdout and stderr to streams we can read strings from
-    PrintStream oldOut = System.out;
-    PrintStream oldErr = System.err;
-    ByteArrayOutputStream stringOut = new ByteArrayOutputStream();
-    ByteArrayOutputStream stringErr = new ByteArrayOutputStream();
-    System.setOut(new PrintStream(stringOut));
-    System.setErr(new PrintStream(stringErr));
-    try {
-      // check that nothing is written to stdout or stderr while hidden
-      HideOutput ho = new HideOutput();
-      System.out.print(message);
-      System.err.print(message);
-      Assert.assertEquals("", stringOut.toString());
-      Assert.assertEquals("", stringErr.toString());
-
-      // check that data is again written to stdout and stderr after restoring
-      ho.restoreOutput();
-      System.out.print(message);
-      System.err.print(message);
-      Assert.assertEquals(message, stringOut.toString());
-      Assert.assertEquals(message, stringErr.toString());
-    }
-    // restore stdout and stderr at the end of the test
-    finally {
-      System.setOut(oldOut);
-      System.setErr(oldErr);
-      stringOut.close();
-      stringErr.close();
-    }
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasIterableTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasIterableTest.java
deleted file mode 100644
index c7971e0..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasIterableTest.java
+++ /dev/null
@@ -1,43 +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.uima.fit.util;
-
-/**
- */
-
-import java.util.Iterator;
-
-import org.apache.uima.cas.CASException;
-import org.apache.uima.fit.ComponentTestBase;
-import org.junit.Test;
-
-public class JCasIterableTest extends ComponentTestBase {
-
-  @Test
-  public void testResetViews() throws CASException {
-    jCas.createView("point");
-    Iterator<?> views = jCas.getViewIterator();
-    while (views.hasNext()) {
-      // JCas view = (JCas) views.next();
-      views.next();
-    }
-    jCas.reset();
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
deleted file mode 100644
index 73ce768..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/JCasUtilTest.java
+++ /dev/null
@@ -1,621 +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.
-
-
- getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
- */
-package org.apache.uima.fit.util;
-
-import static java.util.Arrays.asList;
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
-import static org.apache.uima.fit.util.JCasUtil.contains;
-import static org.apache.uima.fit.util.JCasUtil.exists;
-import static org.apache.uima.fit.util.JCasUtil.getAnnotationType;
-import static org.apache.uima.fit.util.JCasUtil.getType;
-import static org.apache.uima.fit.util.JCasUtil.getView;
-import static org.apache.uima.fit.util.JCasUtil.indexCovered;
-import static org.apache.uima.fit.util.JCasUtil.indexCovering;
-import static org.apache.uima.fit.util.JCasUtil.select;
-import static org.apache.uima.fit.util.JCasUtil.selectBetween;
-import static org.apache.uima.fit.util.JCasUtil.selectCovered;
-import static org.apache.uima.fit.util.JCasUtil.selectCovering;
-import static org.apache.uima.fit.util.JCasUtil.selectFollowing;
-import static org.apache.uima.fit.util.JCasUtil.selectPreceding;
-import static org.apache.uima.fit.util.JCasUtil.selectSingle;
-import static org.apache.uima.fit.util.JCasUtil.selectSingleRelative;
-import static org.apache.uima.fit.util.JCasUtil.toText;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.cas.CAS;
-import org.apache.uima.cas.FeatureStructure;
-import org.apache.uima.cas.Type;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.type.AnalyzedText;
-import org.apache.uima.fit.type.Sentence;
-import org.apache.uima.fit.type.Token;
-import org.apache.uima.jcas.JCas;
-import org.apache.uima.jcas.cas.EmptyFSList;
-import org.apache.uima.jcas.cas.FSArray;
-import org.apache.uima.jcas.cas.NonEmptyFSList;
-import org.apache.uima.jcas.cas.TOP;
-import org.apache.uima.jcas.tcas.Annotation;
-import org.apache.uima.util.CasCreationUtils;
-import org.junit.Test;
-
-/**
- * Test cases for {@link JCasUtil}.
- * 
- */
-public class JCasUtilTest extends ComponentTestBase {
-  /**
-   * Test Tokens (Stems + Lemmas) overlapping with each other.
-   */
-  @Test
-  public void testSelectCoveredOverlapping() {
-    add(jCas, 3, 16);
-    add(jCas, 37, 61);
-    add(jCas, 49, 75);
-    add(jCas, 54, 58);
-    add(jCas, 66, 84);
-
-    for (Token t : select(jCas, Token.class)) {
-      // The naive approach is assumed to be correct
-      List<Sentence> stem1 = selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
-      List<Sentence> stem2 = selectCovered(jCas, Sentence.class, t);
-      check(jCas, t, stem1, stem2);
-    }
-  }
-
-  /**
-   * Test what happens if there is actually nothing overlapping with the Token.
-   */
-  @Test
-  public void testSelectCoveredNoOverlap() {
-    new Sentence(jCas, 3, 31).addToIndexes();
-    new Sentence(jCas, 21, 21).addToIndexes();
-    new Sentence(jCas, 24, 44).addToIndexes();
-    new Sentence(jCas, 30, 45).addToIndexes();
-    new Sentence(jCas, 32, 43).addToIndexes();
-    new Sentence(jCas, 47, 61).addToIndexes();
-    new Sentence(jCas, 48, 77).addToIndexes();
-    new Sentence(jCas, 65, 82).addToIndexes();
-    new Sentence(jCas, 68, 80).addToIndexes();
-    new Sentence(jCas, 72, 65).addToIndexes();
-
-    new Token(jCas, 73, 96).addToIndexes();
-
-    for (Token t : select(jCas, Token.class)) {
-      // The naive approach is assumed to be correct
-      List<Sentence> stem1 = selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
-      List<Sentence> stem2 = selectCovered(jCas, Sentence.class, t);
-      check(jCas, t, stem1, stem2);
-    }
-  }
-
-  @Test
-  public void testSelectCoverRandom() throws Exception {
-    final int ITERATIONS = 10;
-
-    for (int i = 0; i < ITERATIONS; i++) {
-      CAS cas = jCas.getCas();
-      initRandomCas(cas, 10 * i);
-
-      JCas jcas = cas.getJCas();
-      long timeNaive = 0;
-      long timeOptimized = 0;
-      for (Token t : select(jcas, Token.class)) {
-        long ti = System.currentTimeMillis();
-        // The naive approach is assumed to be correct
-        List<Sentence> stem1 = selectCovered(jcas, Sentence.class, t.getBegin(), t.getEnd());
-        timeNaive += System.currentTimeMillis() - ti;
-
-        ti = System.currentTimeMillis();
-        List<Sentence> stem2 = selectCovered(jcas, Sentence.class, t);
-        timeOptimized += System.currentTimeMillis() - ti;
-
-        Collection<Sentence> stem3 = indexCovered(jcas, Token.class, Sentence.class).get(t);
-
-        check(jcas, t, stem1, stem2);
-        check(jcas, t, stem1, stem3);
-      }
-//      System.out.format("Speed up factor %.2f [naive:%d optimized:%d diff:%d]\n",
-//              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized, timeNaive
-//                      - timeOptimized);
-    }
-  }
-
-  /**
-   * Test what happens if there is actually nothing overlapping with the Token.
-   */
-  @Test
-  public void testSelectBetweenInclusion() {
-    Token t1 = new Token(jCas, 45, 57);
-    t1.addToIndexes();
-    Token t2 = new Token(jCas, 52, 52);
-    t2.addToIndexes();
-
-    new Sentence(jCas, 52, 52).addToIndexes();
-
-    List<Sentence> stem1 = selectBetween(jCas, Sentence.class, t1, t2);
-    assertTrue(stem1.isEmpty());
-  }
-
-  @Test
-  public void testSelectBetweenRandom() throws Exception {
-    final int ITERATIONS = 10;
-
-    Random rnd = new Random();
-
-    for (int i = 1; i <= ITERATIONS; i++) {
-      CAS cas = jCas.getCas();
-      initRandomCas(cas, 10 * i);
-
-      JCas jcas = cas.getJCas();
-      List<Token> tokens = new ArrayList<Token>(select(jcas, Token.class));
-
-//      long timeNaive = 0;
-//      long timeOptimized = 0;
-      for (int j = 0; j < ITERATIONS; j++) {
-        Token t1 = tokens.get(rnd.nextInt(tokens.size()));
-        Token t2 = tokens.get(rnd.nextInt(tokens.size()));
-
-        int left = Math.min(t1.getEnd(), t2.getEnd());
-        int right = Math.max(t1.getBegin(), t2.getBegin());
-
-//        long ti;
-        List<Sentence> reference;
-        if ((t1.getBegin() < t2.getBegin() && t2.getBegin() < t1.getEnd())
-                || (t1.getBegin() < t2.getEnd() && t2.getEnd() < t1.getEnd())
-                || (t2.getBegin() < t1.getBegin() && t1.getBegin() < t2.getEnd())
-                || (t2.getBegin() < t1.getEnd() && t1.getEnd() < t2.getEnd())) {
-          // If the boundary annotations overlap, the result must be empty
-//          ti = System.currentTimeMillis();
-          reference = new ArrayList<Sentence>();
-//          timeNaive += System.currentTimeMillis() - ti;
-        } else {
-//          ti = System.currentTimeMillis();
-          reference = selectCovered(jcas, Sentence.class, left, right);
-//          timeNaive += System.currentTimeMillis() - ti;
-        }
-
-//        ti = System.currentTimeMillis();
-        List<Sentence> actual = selectBetween(Sentence.class, t1, t2);
-//        timeOptimized += System.currentTimeMillis() - ti;
-
-        assertEquals("Naive: Searching between " + t1 + " and " + t2, reference, actual);
-      }
-
-//      System.out.format("Speed up factor %.2f [naive:%d optimized:%d diff:%d]\n",
-//              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized, timeNaive
-//                      - timeOptimized);
-    }
-  }
-
-  /**
-   * Test Tokens (Stems + Lemmas) overlapping with each other.
-   */
-  @Test
-  public void testSelectCoveringOverlapping() {
-    add(jCas, 3, 16);
-    add(jCas, 37, 61);
-    add(jCas, 49, 75);
-    add(jCas, 54, 58);
-    add(jCas, 66, 84);
-
-    assertEquals(0, selectCovering(jCas, Token.class, 36, 52).size());
-    assertEquals(1, selectCovering(jCas, Token.class, 37, 52).size());
-    assertEquals(2, selectCovering(jCas, Token.class, 49, 52).size());
-  }
-
-  private void initRandomCas(CAS cas, int size) {
-    Random rnd = new Random();
-    List<Type> types = new ArrayList<Type>();
-    types.add(cas.getTypeSystem().getType(Token.class.getName()));
-    types.add(cas.getTypeSystem().getType(Sentence.class.getName()));
-
-    // Shuffle the types
-    for (int n = 0; n < 10; n++) {
-      Type t = types.remove(rnd.nextInt(types.size()));
-      types.add(t);
-    }
-
-    // Randomly generate annotations
-    for (int n = 0; n < size; n++) {
-      for (Type t : types) {
-        int begin = rnd.nextInt(100);
-        int end = begin + rnd.nextInt(30);
-        cas.addFsToIndexes(cas.createAnnotation(t, begin, end));
-      }
-    }
-  }
-
-  @SuppressWarnings("unused")
-  private void print(Collection<? extends Annotation> annos) {
-    for (Annotation a : annos) {
-      System.out.println(a.getClass().getSimpleName() + " " + a.getBegin() + " " + a.getEnd());
-    }
-  }
-
-  private Token add(JCas jcas, int begin, int end) {
-    Token t = new Token(jcas, begin, end);
-    t.addToIndexes();
-    new Sentence(jcas, begin, end).addToIndexes();
-    return t;
-  }
-
-  private void check(JCas jcas, Token t, Collection<? extends Annotation> a1,
-          Collection<? extends Annotation> a2) {
-    // List<Annotation> annos = new ArrayList<Annotation>();
-    // FSIterator fs = jcas.getAnnotationIndex().iterator();
-    // while (fs.hasNext()) {
-    // annos.add((Annotation) fs.next());
-    // }
-    //
-    // System.out.println("--- Index");
-    // print(annos);
-    // System.out.println("--- Container");
-    // print(Collections.singleton(t));
-    // System.out.println("--- Naive");
-    // print(a1);
-    // System.out.println("--- Optimized");
-    // print(a2);
-    assertEquals("Container: [" + t.getBegin() + ".." + t.getEnd() + "]", a1, a2);
-  }
-
-  @Test
-  public void testIterator() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
-            toText(JCasUtil.select(jCas, Token.class)));
-  }
-
-  @Test
-  public void testSelectByIndex() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    assertEquals("dew?", JCasUtil.selectByIndex(jCas, Token.class, -1).getCoveredText());
-    assertEquals("dew?", JCasUtil.selectByIndex(jCas, Token.class, 3).getCoveredText());
-    assertEquals("Rot", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
-    assertEquals("Rot", JCasUtil.selectByIndex(jCas, Token.class, -4).getCoveredText());
-    assertNull(JCasUtil.selectByIndex(jCas, Token.class, -5));
-    assertNull(JCasUtil.selectByIndex(jCas, Token.class, 4));
-  }
-
-  @SuppressWarnings({ "rawtypes", "unchecked" })
-  @Test
-  public void testSelectOnArrays() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    Collection<TOP> allFS = select(jCas, TOP.class);
-    FSArray allFSArray = new FSArray(jCas, allFS.size());
-    int i = 0;
-    for (FeatureStructure fs : allFS) {
-      allFSArray.set(i, fs);
-      i++;
-    }
-
-    // Print what is expected
-//    for (FeatureStructure fs : allFS) {
-//      System.out.println("Type: " + fs.getType().getName() + "]");
-//    }
-//    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
-
-    // Document Annotation, one sentence and 4 tokens.
-    assertEquals(6, allFS.size());
-
-    assertEquals(toText(select(jCas, Token.class)), toText(select(allFSArray, Token.class)));
-
-    assertEquals(toText((Iterable) select(jCas, Token.class)),
-            toText((Iterable) select(allFSArray, Token.class)));
-  }
-
-  @SuppressWarnings({ "rawtypes", "unchecked" })
-  @Test
-  public void testSelectOnLists() throws Exception {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    Collection<TOP> allFS = select(jCas, TOP.class);
-
-    // Building a list... OMG!
-    NonEmptyFSList allFSList = new NonEmptyFSList(jCas);
-    NonEmptyFSList head = allFSList;
-    Iterator<TOP> i = allFS.iterator();
-    while (i.hasNext()) {
-      head.setHead(i.next());
-      if (i.hasNext()) {
-        head.setTail(new NonEmptyFSList(jCas));
-        head = (NonEmptyFSList) head.getTail();
-      } else {
-        head.setTail(new EmptyFSList(jCas));
-      }
-    }
-
-    // Print what is expected
-//    for (FeatureStructure fs : allFS) {
-//      System.out.println("Type: " + fs.getType().getName() + "]");
-//    }
-//    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
-
-    // Document Annotation, one sentence and 4 tokens.
-    assertEquals(6, allFS.size());
-
-    assertEquals(toText(select(jCas, Token.class)), toText(select(allFSList, Token.class)));
-
-    assertEquals(toText((Iterable) select(jCas, Token.class)),
-            toText((Iterable) select(allFSList, Token.class)));
-  }
-
-  @Test
-  public void testToText() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-    assertEquals(asList(text.split(" ")), toText(select(jCas, Token.class)));
-  }
-
-  @Test
-  public void testSelectSingleRelative() {
-    String text = "one two three";
-    tokenBuilder.buildTokens(jCas, text);
-    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
-
-    Token preceding = selectSingleRelative(jCas, Token.class, token.get(1), -1);
-    assertEquals(token.get(0).getCoveredText(), preceding.getCoveredText());
-
-    Token following = selectSingleRelative(jCas, Token.class, token.get(1), 1);
-    assertEquals(token.get(2).getCoveredText(), following.getCoveredText());
-  }
-
-  @Test
-  public void testSelectFollowingPreceding() {
-    String text = "one two three";
-    tokenBuilder.buildTokens(jCas, text);
-    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
-
-    assertEquals(token.get(0).getCoveredText(), selectPreceding(jCas, Token.class, token.get(1), 1)
-            .get(0).getCoveredText());
-    assertEquals(token.get(2).getCoveredText(), selectFollowing(jCas, Token.class, token.get(1), 1)
-            .get(0).getCoveredText());
-  }
-
-  @Test
-  public void testSelectFollowingPrecedingBuiltinTypes() {
-    this.jCas.setDocumentText("A B C");
-    // remove the DocumentAnnotation
-    for (Annotation ann : JCasUtil.select(jCas, Annotation.class)) {
-      ann.removeFromIndexes();
-    }
-    Annotation a = new Annotation(this.jCas, 0, 1);
-    Annotation b = new Annotation(this.jCas, 2, 3);
-    Annotation c = new Annotation(this.jCas, 4, 5);
-    for (Annotation ann : Arrays.asList(a, b, c)) {
-      ann.addToIndexes();
-    }
-
-    assertEquals(Arrays.asList(a), selectPreceding(this.jCas, Annotation.class, b, 2));
-    assertEquals(Arrays.asList(a, b), selectPreceding(this.jCas, Annotation.class, c, 2));
-    assertEquals(Arrays.asList(b, c), selectFollowing(this.jCas, Annotation.class, a, 2));
-    assertEquals(Arrays.asList(c), selectFollowing(this.jCas, Annotation.class, b, 2));
-  }
-
-  @Test
-  public void testSelectFollowingPrecedingDifferentTypes() {
-    this.jCas.setDocumentText("A B C D E");
-    Token a = new Token(this.jCas, 0, 1);
-    Token b = new Token(this.jCas, 2, 3);
-    Token c = new Token(this.jCas, 4, 5);
-    Token d = new Token(this.jCas, 6, 7);
-    Token e = new Token(this.jCas, 8, 9);
-    for (Token token : Arrays.asList(a, b, c, d, e)) {
-      token.addToIndexes();
-    }
-    Sentence sentence = new Sentence(this.jCas, 2, 5);
-    sentence.addToIndexes();
-
-    List<Token> preceding = selectPreceding(this.jCas, Token.class, sentence, 1);
-    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
-    assertEquals(Arrays.asList(a), preceding);
-    preceding = selectPreceding(this.jCas, Token.class, sentence, 2);
-    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
-    assertEquals(Arrays.asList(a), preceding);
-
-    List<Token> following = selectFollowing(this.jCas, Token.class, sentence, 1);
-    assertEquals(Arrays.asList("D"), JCasUtil.toText(following));
-    assertEquals(Arrays.asList(d), following);
-    following = selectFollowing(this.jCas, Token.class, sentence, 2);
-    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following));
-    assertEquals(Arrays.asList(d, e), following);
-    following = selectFollowing(this.jCas, Token.class, sentence, 3);
-    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following));
-    assertEquals(Arrays.asList(d, e), following);
-  }
-
-  @Test
-  public void testSelectFollowingPrecedingDifferentTypesMatchingSpansReversePriorities() {
-    this.jCas.setDocumentText("A B C D E");
-    Sentence a = new Sentence(this.jCas, 0, 1);
-    Sentence b = new Sentence(this.jCas, 2, 3);
-    Sentence c = new Sentence(this.jCas, 4, 5);
-    Sentence d = new Sentence(this.jCas, 6, 7);
-    Sentence e = new Sentence(this.jCas, 8, 9);
-    for (Sentence sentence : Arrays.asList(a, b, c, d, e)) {
-      sentence.addToIndexes();
-    }
-    AnalyzedText text = new AnalyzedText(this.jCas, 2, 3);
-    text.addToIndexes();
-
-    List<Sentence> preceding = selectPreceding(this.jCas, Sentence.class, text, 1);
-    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
-    assertEquals(Arrays.asList(a), preceding);
-    preceding = selectPreceding(this.jCas, Sentence.class, text, 2);
-    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
-    assertEquals(Arrays.asList(a), preceding);
-
-    List<Sentence> following = selectFollowing(this.jCas, Sentence.class, text, 1);
-    assertEquals(Arrays.asList("C"), JCasUtil.toText(following));
-    assertEquals(Arrays.asList(c), following);
-    following = selectFollowing(this.jCas, Sentence.class, text, 2);
-    assertEquals(Arrays.asList("C", "D"), JCasUtil.toText(following));
-    assertEquals(Arrays.asList(c, d), following);
-  }
-
-  @Test
-  public void testExists() throws UIMAException {
-    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
-
-    assertFalse(exists(jcas, Token.class));
-
-    new Token(jcas, 0, 1).addToIndexes();
-
-    assertTrue(exists(jcas, Token.class));
-  }
-
-  @Test
-  public void testSelectSingle() throws UIMAException {
-    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
-
-    try {
-      selectSingle(jcas, Token.class);
-      fail("Found annotation that has not yet been created");
-    } catch (IllegalArgumentException e) {
-      // OK
-    }
-
-    new Token(jcas, 0, 1).addToIndexes();
-
-    selectSingle(jcas, Token.class);
-
-    new Token(jcas, 1, 2).addToIndexes();
-
-    try {
-      selectSingle(jcas, Token.class);
-      fail("selectSingle must fail if there is more than one annotation of the type");
-    } catch (IllegalArgumentException e) {
-      // OK
-    }
-  }
-
-  @Test
-  public void testSelectIsCovered() {
-    String text = "Will you come home today ? \n No , tomorrow !";
-    tokenBuilder.buildTokens(jCas, text);
-
-    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
-    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
-
-    assertEquals(6, selectCovered(Token.class, sentences.get(0)).size());
-    assertEquals(4, selectCovered(Token.class, sentences.get(1)).size());
-
-    assertTrue(contains(jCas, sentences.get(0), Token.class));
-    tokens.get(0).removeFromIndexes();
-    tokens.get(1).removeFromIndexes();
-    tokens.get(2).removeFromIndexes();
-    tokens.get(3).removeFromIndexes();
-    tokens.get(4).removeFromIndexes();
-    tokens.get(5).removeFromIndexes();
-    assertFalse(contains(jCas, sentences.get(0), Token.class));
-  }
-
-  @Test
-  public void testGetInternalUimaType() {
-    Type t = getType(jCas, Annotation.class);
-    assertNotNull(t);
-  }
-
-  @Test
-  public void testGetView() throws Exception {
-    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
-
-    assertNull(getView(jcas, "view1", null));
-    assertNotNull(getView(jcas, "view1", true));
-    assertNotNull(getView(jcas, "view1", null));
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testGetNonExistingView() throws Exception {
-    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
-    assertNull(getView(jcas, "view1", false));
-  }
-
-  @Test
-  public void testGetType() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    assertEquals(Token.class.getName(), getType(jCas, Token.class).getName());
-    assertEquals(Token.class.getName(), getAnnotationType(jCas, Token.class).getName());
-    assertEquals("uima.cas.TOP", getType(jCas, TOP.class).getName());
-    assertEquals("uima.tcas.Annotation", getType(jCas, Annotation.class).getName());
-    assertEquals("uima.tcas.Annotation", getAnnotationType(jCas, Annotation.class).getName());
-  }
-
-  @Test(expected = IllegalArgumentException.class)
-  public void testGetNonAnnotationType() {
-    String text = "Rot wood cheeses dew?";
-    tokenBuilder.buildTokens(jCas, text);
-
-    getAnnotationType(jCas, TOP.class);
-  }
-
-  @Test
-  public void testIndexCovering() throws Exception {
-    String text = "Will you come home today ? \n No , tomorrow !";
-    tokenBuilder.buildTokens(jCas, text);
-
-    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
-    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
-
-    Map<Token, Collection<Sentence>> index = indexCovering(jCas, Token.class, Sentence.class);
-
-    // Check covering annotations are found
-    assertEquals(asList(sentences.get(0)), index.get(tokens.get(0)));
-    assertEquals(asList(sentences.get(1)), index.get(tokens.get(tokens.size() - 1)));
-
-    // Check sentence 0 contains first token
-    assertTrue(index.get(tokens.get(0)).contains(sentences.get(0)));
-
-    // Check sentence 0 does not contain last token.
-    assertFalse(index.get(tokens.get(tokens.size() - 1)).contains(sentences.get(0)));
-
-    // Check the first token is contained in any sentence
-    assertTrue(!index.get(tokens.get(0)).isEmpty());
-    // After removing the annotation the index has to be rebuilt.
-    sentences.get(0).removeFromIndexes();
-    index = indexCovering(jCas, Token.class, Sentence.class);
-    // Check the first token is not contained in any sentence
-    assertFalse(!index.get(tokens.get(0)).isEmpty());
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/LocaleUtilTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/LocaleUtilTest.java
deleted file mode 100644
index 9e993a0..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/LocaleUtilTest.java
+++ /dev/null
@@ -1,64 +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.uima.fit.util;
-
-import static org.apache.uima.fit.util.LocaleUtil.createLocale;
-import static org.apache.uima.fit.util.LocaleUtil.getLocaleConstant;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.util.Locale;
-
-import org.junit.Test;
-
-/**
- * 
- * 
- */
-public class LocaleUtilTest {
-
-  @Test
-  public void testGetLocaleConstant() {
-    assertEquals(Locale.US, getLocaleConstant("US"));
-    assertNull(getLocaleConstant("UN"));
-    assertEquals(Locale.ENGLISH, getLocaleConstant("ENGLISH"));
-    assertEquals(Locale.CHINA, getLocaleConstant("CHINA"));
-    assertNull(getLocaleConstant(""));
-    assertNull(getLocaleConstant(null));
-  }
-
-  @Test
-  public void testCreateLocale() {
-    assertEquals(new Locale("en", "US"), createLocale("en-US"));
-    assertEquals(new Locale("es"), createLocale("es"));
-    assertEquals(new Locale("ko", "KR"), createLocale("ko-KR"));
-    assertEquals(new Locale("es", "ES", "Traditional_WIN"), createLocale("es-ES-Traditional_WIN"));
-    assertEquals(new Locale("en", "US", "Colorado"), createLocale("en-US-Colorado"));
-    assertEquals(new Locale("en", "US", "Colorado-Boulder"), createLocale("en-US-Colorado-Boulder"));
-    assertEquals(new Locale("de", "", "POSIX"), createLocale("de--POSIX"));
-    // The following examples were taken from the javadoc for java.util.Locale.toString()
-    assertEquals(new Locale("en"), createLocale("en"));
-    assertEquals(new Locale("de", "DE"), createLocale("de_DE"));
-    assertEquals(new Locale("", "GB"), createLocale("_GB"));
-    assertEquals(new Locale("en", "US", "WIN"), createLocale("en_US_WIN"));
-    assertEquals(new Locale("de", "", "POSIX"), createLocale("de__POSIX"));
-    assertEquals(new Locale("fr", "", "MAC"), createLocale("fr__MAC"));
-  }
-
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/SimplePipelineTest.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/SimplePipelineTest.java
deleted file mode 100644
index d4e6fc6..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/SimplePipelineTest.java
+++ /dev/null
@@ -1,48 +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.uima.fit.util;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.uima.UIMAException;
-import org.apache.uima.analysis_engine.AnalysisEngineDescription;
-import org.apache.uima.fit.ComponentTestBase;
-import org.apache.uima.fit.factory.AnalysisEngineFactory;
-import org.apache.uima.fit.factory.testAes.Annotator1;
-import org.apache.uima.fit.factory.testAes.Annotator2;
-import org.apache.uima.fit.factory.testAes.Annotator3;
-import org.apache.uima.fit.pipeline.SimplePipeline;
-import org.junit.Test;
-
-public class SimplePipelineTest extends ComponentTestBase {
-
-  @Test
-  public void test1() throws UIMAException, IOException {
-    CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xmi"));
-    AnalysisEngineDescription aed1 = AnalysisEngineFactory.createEngineDescription(
-            Annotator1.class, typeSystemDescription);
-    AnalysisEngineDescription aed2 = AnalysisEngineFactory.createEngineDescription(
-            Annotator2.class, typeSystemDescription);
-    AnalysisEngineDescription aed3 = AnalysisEngineFactory.createEngineDescription(
-            Annotator3.class, typeSystemDescription);
-    SimplePipeline.runPipeline(jCas, aed1, aed2, aed3);
-
-  }
-}
diff --git a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/TypeSystemUtil.java b/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/TypeSystemUtil.java
deleted file mode 100644
index 3449ae2..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/util/TypeSystemUtil.java
+++ /dev/null
@@ -1,46 +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.uima.fit.util;
-
-import org.apache.uima.fit.type.AnalyzedText;
-import org.apache.uima.jcas.JCas;
-
-/**
- */
-
-public class TypeSystemUtil {
-
-  public static String getAnalyzedText(JCas jCas) {
-    return _getAnalyzedText(jCas).getText();
-  }
-
-  public static void setAnalyzedText(JCas jCas, String text) {
-    _getAnalyzedText(jCas).setText(text);
-  }
-
-  private static AnalyzedText _getAnalyzedText(JCas jCas) {
-    AnalyzedText analyzedText = JCasUtil.selectByIndex(jCas, AnalyzedText.class, 0);
-    if (analyzedText == null) {
-      analyzedText = new AnalyzedText(jCas);
-      analyzedText.setText(jCas.getDocumentText());
-      analyzedText.addToIndexes();
-    }
-    return analyzedText;
-  }
-}
diff --git a/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/fsindexes.txt b/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/fsindexes.txt
deleted file mode 100644
index 4505c51..0000000
--- a/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/fsindexes.txt
+++ /dev/null
@@ -1 +0,0 @@
-classpath*:org/apache/uima/fit/index/**/*.xml
diff --git a/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/types.txt b/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/types.txt
deleted file mode 100644
index 1c96dc9..0000000
--- a/uimafit-legacy-support/src/test/resources/META-INF/org.uimafit/types.txt
+++ /dev/null
@@ -1 +0,0 @@
-classpath*:org/apache/uima/fit/type/**/*.xml
diff --git a/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE1.xml b/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE1.xml
deleted file mode 100644
index e9a2319..0000000
--- a/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE1.xml
+++ /dev/null
@@ -1,36 +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.
--->
-<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-  <primitive>true</primitive>
-  <annotatorImplementationName>org.apache.uima.fit.component.initialize.ConfigurationParameterInitializerTest$DefaultValueAE1</annotatorImplementationName>
-  <analysisEngineMetaData>
-    <name/>
-    <configurationParameters/>
-    <configurationParameterSettings/>
-    <typeSystemDescription/>
-    <capabilities/>
-    <operationalProperties>
-      <modifiesCas>true</modifiesCas>
-      <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
-      <outputsNewCASes>false</outputsNewCASes>
-    </operationalProperties>
-  </analysisEngineMetaData>
-</analysisEngineDescription>
diff --git a/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE2.xml b/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE2.xml
deleted file mode 100644
index 6cd6bf3..0000000
--- a/uimafit-legacy-support/src/test/resources/data/descriptor/DefaultValueAE2.xml
+++ /dev/null
@@ -1,36 +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.
--->
-<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-  <primitive>true</primitive>
-  <annotatorImplementationName>org.apache.uima.fit.component.initialize.ConfigurationParameterInitializerTest$DefaultValueAE2</annotatorImplementationName>
-  <analysisEngineMetaData>
-    <name/>
-    <configurationParameters/>
-    <configurationParameterSettings/>
-    <typeSystemDescription/>
-    <capabilities/>
-    <operationalProperties>
-      <modifiesCas>true</modifiesCas>
-      <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
-      <outputsNewCASes>false</outputsNewCASes>
-    </operationalProperties>
-  </analysisEngineMetaData>
-</analysisEngineDescription>
diff --git a/uimafit-legacy-support/src/test/resources/data/descriptor/README b/uimafit-legacy-support/src/test/resources/data/descriptor/README
deleted file mode 100644
index 32e0d48..0000000
--- a/uimafit-legacy-support/src/test/resources/data/descriptor/README
+++ /dev/null
@@ -1,3 +0,0 @@
-These files are used by ConfigurationParameterInitializerTest.  
-For a description on how they were generated see 
-org.apache.uima.fit.component.initialize.ConfigurationParameterInitializerTest.main(String[])
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/resources/data/docs/bad.xcas b/uimafit-legacy-support/src/test/resources/data/docs/bad.xcas
deleted file mode 100644
index 8926467..0000000
--- a/uimafit-legacy-support/src/test/resources/data/docs/bad.xcas
+++ /dev/null
@@ -1 +0,0 @@
-This is not an xcas file though it has an xcas extention.
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/resources/data/docs/test.xcas b/uimafit-legacy-support/src/test/resources/data/docs/test.xcas
deleted file mode 100644
index c23fa4f..0000000
--- a/uimafit-legacy-support/src/test/resources/data/docs/test.xcas
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><CAS version="2"><uima.cas.Sofa _indexed="0" _id="1" sofaNum="1" sofaID="_InitialView" mimeType="text" sofaString="... the more knowledge advances the more it becomes possible to condense it into little books."/><uima.tcas.DocumentAnnotation _indexed="1" _id="8" _ref_sofa="1" begin="0" end="94" language="x-unspecified"/><org.apache.uima.fit.type.Token _indexed="1" _id="13" _ref_sofa="1" begin="0" end="3" pos="." stem="..."/><org.apache.uima.fit.type.Token _indexed="1" _id="19" _ref_sofa="1" begin="4" end="7" pos="T" stem="the"/><org.apache.uima.fit.type.Token _indexed="1" _id="25" _ref_sofa="1" begin="8" end="12" pos="M" stem="more"/><org.apache.uima.fit.type.Token _indexed="1" _id="31" _ref_sofa="1" begin="13" end="22" pos="K" stem="knowledge"/><org.apache.uima.fit.type.Token _indexed="1" _id="37" _ref_sofa="1" begin="23" end="31" pos="A" stem="advance"/><org.apache.uima.fit.type.Token _indexed="1" _id="43" _ref_sofa="1" begin="32" end="35" pos="T" stem="the"/><org.apache.uima.fit.type.Token _indexed="1" _id="49" _ref_sofa="1" begin="36" end="40" pos="M" stem="more"/><org.apache.uima.fit.type.Token _indexed="1" _id="55" _ref_sofa="1" begin="41" end="43" pos="I" stem="it"/><org.apache.uima.fit.type.Token _indexed="1" _id="61" _ref_sofa="1" begin="44" end="51" pos="B" stem="become"/><org.apache.uima.fit.type.Token _indexed="1" _id="67" _ref_sofa="1" begin="52" end="60" pos="P" stem="possible"/><org.apache.uima.fit.type.Token _indexed="1" _id="73" _ref_sofa="1" begin="61" end="63" pos="T" stem="to"/><org.apache.uima.fit.type.Token _indexed="1" _id="79" _ref_sofa="1" begin="64" end="72" pos="C" stem="condense"/><org.apache.uima.fit.type.Token _indexed="1" _id="85" _ref_sofa="1" begin="73" end="75" pos="I" stem="it"/><org.apache.uima.fit.type.Token _indexed="1" _id="91" _ref_sofa="1" begin="76" end="80" pos="I" stem="into"/><org.apache.uima.fit.type.Token _indexed="1" _id="97" _ref_sofa="1" begin="81" end="87" pos="L" stem="little"/><org.apache.uima.fit.type.Token _indexed="1" _id="103" _ref_sofa="1" begin="88" end="93" pos="B" stem="book"/><org.apache.uima.fit.type.Token _indexed="1" _id="109" _ref_sofa="1" begin="93" end="94" pos="." stem="."/><org.apache.uima.fit.type.Sentence _indexed="1" _id="115" _ref_sofa="1" begin="0" end="94"/></CAS>
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/resources/data/docs/test.xmi b/uimafit-legacy-support/src/test/resources/data/docs/test.xmi
deleted file mode 100644
index ba6b50d..0000000
--- a/uimafit-legacy-support/src/test/resources/data/docs/test.xmi
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><xmi:XMI xmlns:cas="http:///uima/cas.ecore" xmlns:xmi="http://www.omg.org/XMI" xmlns:type="http:///org/apache/uima/fit/type.ecore" xmlns:tcas="http:///uima/tcas.ecore" xmi:version="2.0"><cas:NULL xmi:id="0"/><cas:Sofa xmi:id="1" sofaNum="1" sofaID="_InitialView" mimeType="text" sofaString="Me and all my friends are non-conformists."/><tcas:DocumentAnnotation xmi:id="8" sofa="1" begin="0" end="42" language="x-unspecified"/><type:Token xmi:id="13" sofa="1" begin="0" end="2" pos="M" stem="me"/><type:Token xmi:id="19" sofa="1" begin="3" end="6" pos="A" stem="and"/><type:Token xmi:id="25" sofa="1" begin="7" end="10" pos="A" stem="all"/><type:Token xmi:id="31" sofa="1" begin="11" end="13" pos="M" stem="my"/><type:Token xmi:id="37" sofa="1" begin="14" end="21" pos="F" stem="friend"/><type:Token xmi:id="43" sofa="1" begin="22" end="25" pos="A" stem="are"/><type:Token xmi:id="49" sofa="1" begin="26" end="29" pos="N" stem="non"/><type:Token xmi:id="55" sofa="1" begin="29" end="30" pos="-" stem="-"/><type:Token xmi:id="61" sofa="1" begin="30" end="41" pos="C" stem="conformist"/><type:Token xmi:id="67" sofa="1" begin="41" end="42" pos="." stem="."/><type:Sentence xmi:id="73" sofa="1" begin="0" end="42"/><cas:View sofa="1" members="8 13 19 25 31 37 43 49 55 61 67 73"/></xmi:XMI>
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/resources/data/docs/unix-newlines.txt.bin b/uimafit-legacy-support/src/test/resources/data/docs/unix-newlines.txt.bin
deleted file mode 100644
index 2c498da..0000000
--- a/uimafit-legacy-support/src/test/resources/data/docs/unix-newlines.txt.bin
+++ /dev/null
@@ -1,8 +0,0 @@
-﻿sentence 1.
-sentence 2.
-
-
-sentence 3.
-
-sentence 4.
-
diff --git a/uimafit-legacy-support/src/test/resources/data/docs/windows-newlines.txt.bin b/uimafit-legacy-support/src/test/resources/data/docs/windows-newlines.txt.bin
deleted file mode 100644
index a0adb98..0000000
--- a/uimafit-legacy-support/src/test/resources/data/docs/windows-newlines.txt.bin
+++ /dev/null
@@ -1,9 +0,0 @@
-﻿sentence 1.
-sentence 2.
-
-
-sentence 3.
-
-sentence 4.
-
-
diff --git a/uimafit-legacy-support/src/test/resources/data/reference/JCasBuilderTest.dump b/uimafit-legacy-support/src/test/resources/data/reference/JCasBuilderTest.dump
deleted file mode 100644
index c5e54c3..0000000
--- a/uimafit-legacy-support/src/test/resources/data/reference/JCasBuilderTest.dump
+++ /dev/null
@@ -1,69 +0,0 @@
-======== CAS 0 begin ==================================
-
--------- View _InitialView begin ----------------------------------
-
-DocumentAnnotation
-   sofa: _InitialView
-   begin: 0
-   end: 89
-   language: "x-unspecified"
-
-CAS-Text:
-This sentence is not annotated. But this sentences is annotated. And here every token is.
-[But this sentences is annotated. ]
-Sentence
-   sofa: _InitialView
-   begin: 32
-   end: 65
-[And here every token is.]
-Sentence
-   sofa: _InitialView
-   begin: 65
-   end: 89
-[And]
-Token
-   sofa: _InitialView
-   begin: 65
-   end: 68
-   pos: <null>
-   stem: <null>
-[here]
-Token
-   sofa: _InitialView
-   begin: 69
-   end: 73
-   pos: <null>
-   stem: <null>
-[every]
-Token
-   sofa: _InitialView
-   begin: 74
-   end: 79
-   pos: <null>
-   stem: <null>
-[token]
-Token
-   sofa: _InitialView
-   begin: 80
-   end: 85
-   pos: <null>
-   stem: <null>
-[is]
-Token
-   sofa: _InitialView
-   begin: 86
-   end: 88
-   pos: <null>
-   stem: <null>
-[.]
-Token
-   sofa: _InitialView
-   begin: 88
-   end: 89
-   pos: <null>
-   stem: <null>
--------- View _InitialView end ----------------------------------
-
-======== CAS 0 end ==================================
-
-
diff --git a/uimafit-legacy-support/src/test/resources/data/reference/test.xmi.dump b/uimafit-legacy-support/src/test/resources/data/reference/test.xmi.dump
deleted file mode 100644
index 6751fba..0000000
--- a/uimafit-legacy-support/src/test/resources/data/reference/test.xmi.dump
+++ /dev/null
@@ -1,92 +0,0 @@
-======== CAS 0 begin ==================================
-
--------- View _InitialView begin ----------------------------------
-
-DocumentAnnotation
-   sofa: _InitialView
-   begin: 0
-   end: 42
-   language: "x-unspecified"
-
-CAS-Text:
-Me and all my friends are non-conformists.
-[Me and all my friends are non-conformists.]
-Sentence
-   sofa: _InitialView
-   begin: 0
-   end: 42
-[Me]
-Token
-   sofa: _InitialView
-   begin: 0
-   end: 2
-   pos: "M"
-   stem: "me"
-[and]
-Token
-   sofa: _InitialView
-   begin: 3
-   end: 6
-   pos: "A"
-   stem: "and"
-[all]
-Token
-   sofa: _InitialView
-   begin: 7
-   end: 10
-   pos: "A"
-   stem: "all"
-[my]
-Token
-   sofa: _InitialView
-   begin: 11
-   end: 13
-   pos: "M"
-   stem: "my"
-[friends]
-Token
-   sofa: _InitialView
-   begin: 14
-   end: 21
-   pos: "F"
-   stem: "friend"
-[are]
-Token
-   sofa: _InitialView
-   begin: 22
-   end: 25
-   pos: "A"
-   stem: "are"
-[non]
-Token
-   sofa: _InitialView
-   begin: 26
-   end: 29
-   pos: "N"
-   stem: "non"
-[-]
-Token
-   sofa: _InitialView
-   begin: 29
-   end: 30
-   pos: "-"
-   stem: "-"
-[conformists]
-Token
-   sofa: _InitialView
-   begin: 30
-   end: 41
-   pos: "C"
-   stem: "conformist"
-[.]
-Token
-   sofa: _InitialView
-   begin: 41
-   end: 42
-   pos: "."
-   stem: "."
--------- View _InitialView end ----------------------------------
-
-======== CAS 0 end ==================================
-
-
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml
deleted file mode 100644
index be1c568..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/component/NoOpAnnotator.xml
+++ /dev/null
@@ -1,48 +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.
--->
-<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-  <primitive>true</primitive>
-  <annotatorImplementationName>org.apache.uima.fit.component.NoOpAnnotator</annotatorImplementationName>
-  <analysisEngineMetaData>
-    <name>NoOpAnnotator</name>
-    <description></description>
-    <version>1.0</version>
-    <vendor/>
-    <configurationParameters/>
-    <configurationParameterSettings/>
-    <typeSystemDescription/>
-    <typePriorities/>
-    <fsIndexCollection/>
-    <capabilities>
-      <capability>
-        <inputs/>
-        <outputs/>
-        <languagesSupported/>
-      </capability>
-    </capabilities>
-    <operationalProperties>
-      <modifiesCas>true</modifiesCas>
-      <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
-      <outputsNewCASes>false</outputsNewCASes>
-    </operationalProperties>
-  </analysisEngineMetaData>
-  <resourceManagerConfiguration/>
-</analysisEngineDescription>
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/factory/testCrs/SingleFileXReader.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/factory/testCrs/SingleFileXReader.xml
deleted file mode 100644
index 775961a..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/factory/testCrs/SingleFileXReader.xml
+++ /dev/null
@@ -1,60 +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.
--->
-<collectionReaderDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
-  <implementationName>org.apache.uima.fit.factory.testCrs.SingleFileXReader</implementationName>
-  <processingResourceMetaData>
-    <name>SingleFileXReader</name>
-    <description></description>
-    <version>1.0</version>
-    <vendor/>
-    <configurationParameters>
-      <configurationParameter>
-        <name>org.apache.uima.fit.factory.testCrs.SingleFileXReader.fileName</name>
-        <type>String</type>
-        <multiValued>false</multiValued>
-        <mandatory>true</mandatory>
-      </configurationParameter>
-      <configurationParameter>
-        <name>org.apache.uima.fit.factory.testCrs.SingleFileXReader.xmlScheme</name>
-        <type>String</type>
-        <multiValued>false</multiValued>
-        <mandatory>false</mandatory>
-      </configurationParameter>
-    </configurationParameters>
-    <configurationParameterSettings/>
-    <typeSystemDescription/>
-    <typePriorities/>
-    <fsIndexCollection/>
-    <capabilities>
-      <capability>
-        <inputs/>
-        <outputs/>
-        <languagesSupported/>
-      </capability>
-    </capabilities>
-    <operationalProperties>
-      <modifiesCas>true</modifiesCas>
-      <multipleDeploymentAllowed>false</multipleDeploymentAllowed>
-      <outputsNewCASes>true</outputsNewCASes>
-    </operationalProperties>
-  </processingResourceMetaData>
-  <resourceManagerConfiguration/>
-</collectionReaderDescription>
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/index/AutoImportableIndex.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/index/AutoImportableIndex.xml
deleted file mode 100644
index 730e11c..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/index/AutoImportableIndex.xml
+++ /dev/null
@@ -1,38 +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.
--->
-<fsIndexCollection xmlns="http://uima.apache.org/resourceSpecifier">
-    <fsIndexes>
-        <fsIndexDescription>
-            <label>Automatically Scanned Index</label>
-            <typeName>org.apache.uima.fit.type.Token</typeName>
-            <kind>sorted</kind>
-            <keys>
-                <fsIndexKey>
-                    <featureName>begin</featureName>
-                    <comparator>reverse</comparator>
-                </fsIndexKey>
-                <fsIndexKey>
-                    <featureName>end</featureName>
-                    <comparator>standard</comparator>
-                </fsIndexKey>
-            </keys>
-        </fsIndexDescription>
-    </fsIndexes>
-</fsIndexCollection>
\ No newline at end of file
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/AnalyzedText.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/AnalyzedText.xml
deleted file mode 100644
index 6769443..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/AnalyzedText.xml
+++ /dev/null
@@ -1,39 +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.
--->
-<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <name>AnalyzedText</name>
-  <description/>
-  <version>1.0</version>
-  <vendor/>
-  <types>
-    <typeDescription>
-      <name>org.apache.uima.fit.type.AnalyzedText</name>
-      <description/>
-      <supertypeName>uima.tcas.Annotation</supertypeName>
-      <features>
-        <featureDescription>
-          <name>text</name>
-          <description/>
-          <rangeTypeName>uima.cas.String</rangeTypeName>
-        </featureDescription>
-      </features>
-    </typeDescription>
-  </types>
-</typeSystemDescription>
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Sentence.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Sentence.xml
deleted file mode 100644
index a69681d..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Sentence.xml
+++ /dev/null
@@ -1,32 +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.
--->
-<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <name>Sentence</name>
-  <description></description>
-  <version>1.0</version>
-  <vendor/>
-  <types>
-    <typeDescription>
-      <name>org.apache.uima.fit.type.Sentence</name>
-      <description/>
-      <supertypeName>uima.tcas.Annotation</supertypeName>
-    </typeDescription>
-  </types>
-</typeSystemDescription>
diff --git a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Token.xml b/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Token.xml
deleted file mode 100644
index 629ae03..0000000
--- a/uimafit-legacy-support/src/test/resources/org/apache/uima/fit/type/Token.xml
+++ /dev/null
@@ -1,44 +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.
--->
-<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-  <name>Token</name>
-  <description></description>
-  <version>1.0</version>
-  <vendor/>
-  <types>
-    <typeDescription>
-      <name>org.apache.uima.fit.type.Token</name>
-      <description/>
-      <supertypeName>uima.tcas.Annotation</supertypeName>
-      <features>
-        <featureDescription>
-          <name>pos</name>
-          <description/>
-          <rangeTypeName>uima.cas.String</rangeTypeName>
-        </featureDescription>
-        <featureDescription>
-          <name>stem</name>
-          <description/>
-          <rangeTypeName>uima.cas.String</rangeTypeName>
-        </featureDescription>
-      </features>
-    </typeDescription>
-  </types>
-</typeSystemDescription>
diff --git a/uimafit-maven-plugin/pom.xml b/uimafit-maven-plugin/pom.xml
index 6df6706..71f66ec 100644
--- a/uimafit-maven-plugin/pom.xml
+++ b/uimafit-maven-plugin/pom.xml
@@ -1,172 +1,174 @@
 <?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
+  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
+  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.
+  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/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.1-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<artifactId>uimafit-maven-plugin</artifactId>
-	<name>Apache UIMA uimaFIT - Maven Plugin</name>
-	<packaging>maven-plugin</packaging>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.1.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-maven-plugin</artifactId>
+  <name>Apache UIMA uimaFIT - Maven Plugin</name>
+  <packaging>maven-plugin</packaging>
+  <url>${uimaWebsiteUrl}</url>
+  <inceptionYear>2012</inceptionYear>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.1-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.javassist</groupId>
-			<artifactId>javassist</artifactId>
-			<version>3.19.0-GA</version>
-		</dependency>
+  <dependencies>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <version>3.19.0-GA</version>
+    </dependency>
 
-		<!-- Dependencies on the Maven Plugin API and friends -->
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-plugin-api</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-core</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-artifact</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-model</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven.plugin-tools</groupId>
-			<artifactId>maven-plugin-annotations</artifactId>
-			<version>3.2</version>
-			<scope>provided</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.codehaus.plexus</groupId>
-			<artifactId>plexus-utils</artifactId>
-			<version>2.0.4</version>
-		</dependency>
-		<dependency>
-			<groupId>org.sonatype.plexus</groupId>
-			<artifactId>plexus-build-api</artifactId>
-			<version>0.0.7</version>
-		</dependency>
+    <!-- Dependencies on the Maven Plugin API and friends -->
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>2.0.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.sonatype.plexus</groupId>
+      <artifactId>plexus-build-api</artifactId>
+      <version>0.0.7</version>
+    </dependency>
 
-		<!-- Dependencies for accessing JavaDoc -->
-		<dependency>
-			<groupId>com.thoughtworks.qdox</groupId>
-			<artifactId>qdox</artifactId>
-			<version>1.12.1</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<version>11.0.1</version>
-		</dependency>
-	</dependencies>
+    <!-- Dependencies for accessing JavaDoc -->
+    <dependency>
+      <groupId>com.thoughtworks.qdox</groupId>
+      <artifactId>qdox</artifactId>
+      <version>1.12.1</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>11.0.1</version>
+    </dependency>
+  </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-invoker-plugin</artifactId>
-				<configuration>
-					<debug>true</debug>
-					<projectsDirectory>src/it</projectsDirectory>
-					<cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
-					<pomIncludes>
-						<pomInclude>*/pom.xml</pomInclude>
-					</pomIncludes>
-					<postBuildHookScript>verify</postBuildHookScript>
-					<localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-					<settingsFile>src/it/settings.xml</settingsFile>
-					<goals>
-						<goal>clean</goal>
-						<goal>test-compile</goal>
-					</goals>
-				</configuration>
-				<executions>
-					<execution>
-						<id>integration-test</id>
-						<goals>
-							<goal>install</goal>
-							<goal>run</goal>
-						</goals>
-					</execution>
-				</executions>
-				<dependencies>
-					<dependency>
-						<groupId>commons-io</groupId>
-						<artifactId>commons-io</artifactId>
-						<version>2.2</version>
-					</dependency>
-					<dependency>
-						<groupId>xmlunit</groupId>
-						<artifactId>xmlunit</artifactId>
-						<version>1.4</version>
-					</dependency>
-				</dependencies>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<!-- Exclude generated help mojo -->
-					<sourceFileExcludes>
-						<sourceFileExclude>**/org/apache/uima/fit/maven/HelpMojo.java</sourceFileExclude>
-					</sourceFileExcludes>
-				</configuration>
-			</plugin>
-		</plugins>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-invoker-plugin</artifactId>
+        <configuration>
+          <debug>true</debug>
+          <projectsDirectory>src/it</projectsDirectory>
+          <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
+          <pomIncludes>
+            <pomInclude>*/pom.xml</pomInclude>
+          </pomIncludes>
+          <postBuildHookScript>verify</postBuildHookScript>
+          <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
+          <settingsFile>src/it/settings.xml</settingsFile>
+          <goals>
+            <goal>clean</goal>
+            <goal>test-compile</goal>
+          </goals>
+        </configuration>
+        <executions>
+          <execution>
+            <id>integration-test</id>
+            <goals>
+              <goal>install</goal>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+        <dependencies>
+          <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.2</version>
+          </dependency>
+          <dependency>
+            <groupId>xmlunit</groupId>
+            <artifactId>xmlunit</artifactId>
+            <version>1.4</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <!-- Exclude generated help mojo -->
+          <sourceFileExcludes>
+            <sourceFileExclude>**/org/apache/uima/fit/maven/HelpMojo.java</sourceFileExclude>
+          </sourceFileExcludes>
+        </configuration>
+      </plugin>
+    </plugins>
     <pluginManagement>
       <plugins>
         <plugin>
@@ -178,7 +180,7 @@
               <configuration>
                 <excludes combine.children="append">
                   <!-- These configuration files cannot bear a license header -->
-                  <exclude>**/META-INF/org.apache.uima.fit/types.txt</exclude>
+                  <exclude>src/it/with-typesystem-in-descriptors/src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
                 </excludes>
               </configuration>
             </execution>
@@ -186,7 +188,5 @@
         </plugin>
       </plugins>
     </pluginManagement>
-	</build>
-	<url>${uimaWebsiteUrl}</url>
-	<inceptionYear>2012</inceptionYear>
+  </build>
 </project>
\ No newline at end of file
diff --git a/uimafit-maven-plugin/src/it/default/pom.xml b/uimafit-maven-plugin/src/it/default/pom.xml
index fd396ac..facdc1d 100644
--- a/uimafit-maven-plugin/src/it/default/pom.xml
+++ b/uimafit-maven-plugin/src/it/default/pom.xml
@@ -1,68 +1,68 @@
 <?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.
+  ~ 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>
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
 
-	<groupId>org.apache.uima.fit.maven.it</groupId>
-	<artifactId>default</artifactId>
-	<version>1.0-SNAPSHOT</version>
+  <groupId>org.apache.uima.fit.maven.it</groupId>
+  <artifactId>default</artifactId>
+  <version>1.0-SNAPSHOT</version>
 
-	<name>Test for default configuration</name>
+  <name>Test for default configuration</name>
 
-	<properties>
+  <properties>
     <maven.compiler.source>1.7</maven.compiler.source>
     <maven.compiler.target>1.7</maven.compiler.target>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>@pom.version@</version>
-		</dependency>
-	</dependencies>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>@pom.version@</version>
+    </dependency>
+  </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.uima</groupId>
-				<artifactId>uimafit-maven-plugin</artifactId>
-				<version>@pom.version@</version>
-				<configuration>
-					<componentVendor>Apache UIMA</componentVendor>
-					<componentCopyright>Copyright by the respective authors.</componentCopyright>
-				</configuration>
-				<executions>
-					<execution>
-						<id>default</id>
-						<phase>process-classes</phase>
-						<goals>
-							<goal>enhance</goal>
-							<goal>generate</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.uima</groupId>
+        <artifactId>uimafit-maven-plugin</artifactId>
+        <version>@pom.version@</version>
+        <configuration>
+          <componentVendor>Apache UIMA</componentVendor>
+          <componentCopyright>Copyright by the respective authors.</componentCopyright>
+        </configuration>
+        <executions>
+          <execution>
+            <id>default</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>enhance</goal>
+              <goal>generate</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
index 8a4acaa..cf6cb54 100644
--- a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
+++ b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
@@ -47,8 +47,8 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.LineIterator;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -174,6 +174,7 @@
    */
   private static final String MARK_NO_MISSING_META_DATA = "No missing meta data was found.";
 
+  @Override
   public void execute() throws MojoExecutionException, MojoFailureException {
     // Get the compiled classes from this project
     String[] files = FileUtils.getFilesFromExtension(project.getBuild().getOutputDirectory(),
@@ -458,7 +459,7 @@
       else if (ExternalResourceFactory.isExternalResourceField(field)) {
         type = "external resource";
         // Extract resource key from the uimaFIT annotation
-        pname = ExternalResourceFactory.createExternalResourceDependency(field).getKey();
+        pname = ExternalResourceFactory.createResourceDependency(field).getKey();
         // Extract JavaDoc for this resource from the source file
         pdesc = Util.getParameterDocumentation(aAST, field.getName(), 
                 resourceNameFields.get(pname));
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
index 2e85b4b..a1aa5c4 100644
--- a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
+++ b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
@@ -25,7 +25,7 @@
 import java.lang.reflect.Modifier;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
index 195817c..db85bf6 100644
--- a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
+++ b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
@@ -27,7 +27,7 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.MojoExecutionException;
diff --git a/uimafit-parent/pom.xml b/uimafit-parent/pom.xml
index 77acf0f..0dc5850 100644
--- a/uimafit-parent/pom.xml
+++ b/uimafit-parent/pom.xml
@@ -26,30 +26,25 @@
     <version>13</version>
   </parent>
   <artifactId>uimafit-parent</artifactId>
-  <version>2.5.1-SNAPSHOT</version>
+  <version>3.1.1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>Apache UIMA uimaFIT - Parent</name>
   <url>${uimaWebsiteUrl}</url>
   <inceptionYear>2012</inceptionYear>
   <properties>
     <spring.version>4.3.26.RELEASE</spring.version>
-    <uima.version>2.10.4</uima.version>
+    <uima.version>3.1.1</uima.version>
+    <slf4j.version>1.7.26</slf4j.version>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
-    <!-- 
-     BACKWARD_COMPATIBLE_IMPLEMENTER - patch version (=.=.+)
-     BACKWARD_COMPATIBLE_USER        - minor version (=.+.0)
-     NON_BACKWARD_COMPATIBLE         - major version (+.0.0)
-    -->
-    <compat.level>BACKWARD_COMPATIBLE_USER</compat.level>
-    <api_check_oldVersion>2.4.0</api_check_oldVersion>
+    <api_check_oldVersion>3.0.0</api_check_oldVersion>
     
     <japicmp.postAnalysisScript>${project.basedir}/../uimafit-parent/src/main/groovy/api-report.groovy</japicmp.postAnalysisScript>
   </properties>
-  <!--
-    - Only required while uimaFIT depends on unreleased versions of UIMA.
-    -->
   <repositories>
+    <!--
+      - For UIMA/uimaFIT SNAPSHOTs
+    -->
     <repository>
       <id>apache.snapshots</id>
       <name>Apache Snapshot Repository</name>
@@ -94,6 +89,11 @@
         <version>4.12</version>
       </dependency>
       <dependency>
+        <groupId>xmlunit</groupId>
+        <artifactId>xmlunit</artifactId>
+        <version>1.6</version>
+      </dependency>
+      <dependency>
         <groupId>org.assertj</groupId>
         <artifactId>assertj-core</artifactId>
         <version>3.15.0</version>
@@ -104,22 +104,26 @@
         <version>3.2.4</version>
       </dependency>
       <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.6</version>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>3.8.1</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.2</version>
-        <!-- 2.2 is the last Java 5 compatible version -->
+        <version>2.6</version>
       </dependency>
       <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging-api</artifactId>
-        <version>1.1</version>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-api</artifactId>
+        <version>${slf4j.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-simple</artifactId>
+        <version>${slf4j.version}</version>
+      </dependency>    
+      <dependency>
         <groupId>org.apache.uima</groupId>
         <artifactId>uimaj-core</artifactId>
         <version>${uima.version}</version>
@@ -135,11 +139,6 @@
         <version>${uima.version}</version>
       </dependency>
       <dependency>
-        <groupId>org.jdom</groupId>
-        <artifactId>jdom</artifactId>
-        <version>1.1.3</version>
-      </dependency>
-      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>${spring.version}</version>
@@ -195,8 +194,12 @@
         </executions>
         <configuration>
           <failOnWarning>true</failOnWarning>
-          <ignoredDependencies>
+          <ignoredDependencies combine.children="append">
+            <!-- 
+              - Logging is used via reflection and cannot be detected by Maven
+            -->
             <ignoredDependency>junit:junit</ignoredDependency>
+            <ignoredDependency>org.slf4j:slf4j-simple</ignoredDependency>
           </ignoredDependencies>
         </configuration>
       </plugin>
@@ -289,6 +292,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
+          <version>3.8.0</version>
           <configuration>
             <source>${maven.compiler.source}</source>
             <target>${maven.compiler.target}</target>
@@ -298,6 +302,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
+          <version>3.1.0</version>
           <executions>
             <execution>
               <id>attach-javadocs</id>
@@ -420,46 +425,14 @@
             <artifactId>japicmp-maven-plugin</artifactId>
             <version>0.14.3</version>
             <configuration>
-              <parameter combine.children="append">
-                <breakBuildBasedOnSemanticVersioning>true</breakBuildBasedOnSemanticVersioning>
-                <reportOnlyFilename>true</reportOnlyFilename>
-                <postAnalysisScript>${project.basedir}/../uimafit-parent/src/main/groovy/api-report.groovy</postAnalysisScript>
+              <parameter>
+                <onlyModified>true</onlyModified>
+                <!-- filter out classes with impl in their package or class name -->
+                <postAnalysisScript>${japicmp.postAnalysisScript}</postAnalysisScript>
               </parameter>
             </configuration>
           </plugin>
         </plugins>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <artifactId>maven-enforcer-plugin</artifactId>
-              <dependencies>
-                <dependency>
-                  <groupId>org.semver</groupId>
-                  <artifactId>enforcer-rule</artifactId>
-                  <version>0.9.33</version>
-                </dependency>
-              </dependencies>
-              <executions>
-                <execution>
-                  <id>enforce-compatibility</id>
-                  <phase>verify</phase>
-                  <goals>
-                    <goal>enforce</goal>
-                  </goals>
-                  <configuration>
-                    <rules>
-                      <requireBackwardCompatibility implementation="org.semver.enforcer.RequireBackwardCompatibility">
-                        <previousVersion>${api_check_oldVersion}</previousVersion>
-                        <dumpDetails>true</dumpDetails>
-                        <compatibilityType>${compat.level}</compatibilityType>
-                      </requireBackwardCompatibility>
-                    </rules>
-                  </configuration>
-                </execution>
-              </executions>
-            </plugin>
-          </plugins>
-        </pluginManagement>
       </build>
     </profile>
   </profiles>
diff --git a/uimafit-spring/NOTICE b/uimafit-spring/NOTICE
index 8de1481..48781c0 100644
--- a/uimafit-spring/NOTICE
+++ b/uimafit-spring/NOTICE
@@ -1,3 +1,6 @@
+Apache UIMA uimaFIT
+Copyright 2013-2019 The Apache Software Foundation
+
 Copyright 2009-2012 Regents of the University of Colorado.
 All rights reserved.
 
diff --git a/uimafit-spring/pom.xml b/uimafit-spring/pom.xml
index 8018943..225adfd 100644
--- a/uimafit-spring/pom.xml
+++ b/uimafit-spring/pom.xml
@@ -1,59 +1,64 @@
 <?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
+  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
+  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.
+  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/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<artifactId>uimafit-spring</artifactId>
-	<packaging>jar</packaging>
-	<name>Apache UIMA uimaFIT - Spring integration</name>
-	<description>Factories, Injection, and Testing library for UIMA</description>
-	<url>${uimaWebsiteUrl}</url>
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.1-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<dependencies>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-beans</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-context</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.1-SNAPSHOT</version>
-		</dependency>
-	</dependencies>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
-</project>
\ No newline at end of file
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>uimafit-spring</artifactId>
+  <packaging>jar</packaging>
+  <name>Apache UIMA uimaFIT - Spring integration</name>
+  <description>Factories, Injection, and Testing library for UIMA</description>
+  <url>${uimaWebsiteUrl}</url>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.1.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+  </dependencies>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+</project>
diff --git a/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java b/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java
index 24ceb96..aa7c683 100644
--- a/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java
+++ b/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java
@@ -20,7 +20,7 @@
 package org.apache.uima.fit.spring;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindExternalResource;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceOnceWithoutNested;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.uima.UIMAFramework;
@@ -57,7 +57,7 @@
 
     // Create component description
     AnalysisEngineDescription desc = createEngineDescription(MyAnalysisEngine.class);
-    bindExternalResource(desc, "injectedBean", "springBean");
+    bindResourceOnceWithoutNested(desc, "injectedBean", "springBean");
 
     // Instantiate component
     AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(desc, resMgr, null);
diff --git a/uimafit-spring/src/test/resources/simplelogger.properties b/uimafit-spring/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-spring/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
