Merge branch 'main' into UIMA-6307-Centralize-Jenkins-pipelines

* main: (150 commits)
  [UIMA-6301] Rename "master" branches to "main"
  [UIMA-6254] Move API report post-analysis script into the build resources
  [UIMA-6254] Move API report post-analysis script into the build resources
  [UIMA-6291] Improve uimaFIT benchmarking module
  [UIMA-6291] Improve uimaFIT benchmarking module - Changed new timer names to include the postfix time, so that it is more clear that it is a time value.
  [UIMA-6291] Improve uimaFIT benchmarking module - Added select and selectAt benchmarks using getAnnotationIndex approach.
  [UIMA-6291] Improve uimaFIT benchmarking module - Added more selectCovered benchmarks with s.getBegin() and s.getEnd().
  [UIMA-6291] Improve uimaFIT benchmarking module - Added support for nanoseconds CPU time support in Benchmark and changed SelectBenchmark to use user time.
  [UIMA-6291] Improve uimaFIT benchmarking module
  [UIMA-6291] Improve uimaFIT benchmarking module
  [UIMA-6270] Add selectOverlapping to (J)CasUtil
  [UIMA-6270] Add selectOverlapping to (J)CasUtil
  [UIMA-6292] selectCovering is slow
  [UIMA-6270] Add selectOverlapping to (J)CasUtil
  [UIMA-6291] Improve uimaFIT benchmarking module
  [UIMA-6291] Improve uimaFIT benchmarking module
  [UIMA-6275] InitializableFactory is not smart enough to find a suitable classloader
  No issue: ASF Jenkins Windows nodes seem to have trouble ('nohup' not found) - excluding Windows build nodes for the moment.
  [UIMA-6270] Add selectOverlapping to (J)CasUtil
  [UIMA-6270] Add selectOverlapping to (J)CasUtil
  ...

% Conflicts:
%	Jenkinsfile
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/Jenkinsfile b/Jenkinsfile
index 7cf3a82..1525edd 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -17,6 +17,32 @@
   
 @Library('uima-build-jenkins-shared-library') _
 
+<<<<<<< HEAD
 defaultPipeline {
   extraMavenArguments = '-Pjacoco,spotbugs,pmd'
+=======
+        withMaven() {
+          sh script: 'mvn ' +
+            params.extraMavenArguments +
+            ' -U -Dmaven.test.failure.ignore=true clean verify'
+        }
+      }
+    }
+    
+    // Perform a SNAPSHOT build of a main branch. This stage is typically executed after a
+    // merge request has been merged. On success, it deploys the generated artifacts to the
+    // Maven repository server.
+    stage("SNAPSHOT build") {
+      when { branch pattern: "main|main-v2", comparator: "REGEXP" }
+      
+      steps {
+        withMaven() {
+          sh script: 'mvn ' +
+            params.extraMavenArguments +
+            ' -U -Dmaven.test.failure.ignore=true clean deploy'
+        }
+      }
+    }
+  }
+>>>>>>> main
 }
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..6275e24 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,12 +49,13 @@
       <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>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
   <licenses>
@@ -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/Batch.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Batch.java
index a4fd351..51d2427 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Batch.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Batch.java
@@ -21,50 +21,33 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
-
 public class Batch {
-    private List<Measurement> measurements = new ArrayList<>();
-    
-    private final int magnitude;
-    
-    public Batch(int aMagnitude) {
-      magnitude = aMagnitude;
-    }
-    
-    public int getMagnitude() {
-      return magnitude;
-    }
-    
-    public void addMeasurement(Measurement aMeasurement) {
-      measurements.add(aMeasurement);
-    }
-    
-    public List<Measurement> getMeasurements() {
-      return measurements;
-    }
-    
-    @Override
-    public String toString()
-    {
-      DescriptiveStatistics stats = new DescriptiveStatistics();
-      
-      StringBuilder sb = new StringBuilder();
-      sb.append("[").append(String.format("%7d/%7d", magnitude, measurements.size())).append(": ");
-      int failures = 0;
-      for (Measurement m : measurements) {
-        if (m.failed()) {
-          failures++;
-        }
-        else {
-          stats.addValue(m.getDuration());
-        }
-      }
-      sb.append(String.format("min: %4.0f ", stats.getMin()));
-      sb.append(String.format("max: %4.0f ", stats.getMax()));
-      sb.append(String.format("median: %4.0f ", stats.getPercentile(50)));
-      sb.append(String.format("fail: %4d ", failures));
-      sb.append("]");
-      return sb.toString();
-    }
-  }
\ No newline at end of file
+  private List<Measurement> measurements = new ArrayList<>();
+
+  private final int magnitude;
+  private boolean timeLimitExceeded;
+
+  public Batch(int aMagnitude) {
+    magnitude = aMagnitude;
+  }
+
+  public int getMagnitude() {
+    return magnitude;
+  }
+
+  public void addMeasurement(Measurement aMeasurement) {
+    measurements.add(aMeasurement);
+  }
+
+  public List<Measurement> getMeasurements() {
+    return measurements;
+  }
+  
+  public void setTimeLimitExceeded(boolean aTimeLimitExceeded) {
+    timeLimitExceeded = aTimeLimitExceeded;
+  }
+  
+  public boolean isTimeLimitExceeded() {
+    return timeLimitExceeded;
+  }
+}
\ No newline at end of file
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..df49c62 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
@@ -18,132 +18,287 @@
  */
 package org.apache.uima.fit.benchmark;
 
+import static java.util.Comparator.comparing;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadMXBean;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.DoubleFunction;
 import java.util.function.IntConsumer;
 import java.util.function.IntFunction;
 import java.util.function.LongSupplier;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 
 public class Benchmark {
-    private IntConsumer initializer = t -> {};
-    private RunnableWithExceptions subject;
+
+  private final static String CPU_TIME_NOT_SUPPORTED_MSG = "CPU time not support by current thread.";
+
+  private IntConsumer initializer = t -> {
+  };
+  private RunnableWithExceptions subject;
+
+  private final String name;
+
+  private boolean verbose = true;
+
+  private int baseRepeat = 20;
+  private int repeatIncrementTimes;
+
+  private int baseMagnitude = 1;
+  private int incrementTimes;
+  private IntFunction<Integer> magnitudeIncrement = t -> t;
+  private LongSupplier timer = () -> System.currentTimeMillis();
+  private DoubleFunction<Double> toMs = n -> n;
+  private long timeLimitMs = 5 * 1000;
+  
+  private boolean ignore = false;
+
+  private List<Batch> batches = new ArrayList<>();
+  private DescriptiveStatistics stats = null;
+
+  public Benchmark(String aName) {
+    name = aName;
+  }
+
+  public Benchmark(Benchmark aTemplate) {
+    this(aTemplate.getName());
+    applyTemplate(aTemplate);
+  }
+
+  public Benchmark(String aName, Benchmark aTemplate) {
+    this(aName);
+    applyTemplate(aTemplate);
+  }
+  
+  public Benchmark ignore(boolean aIgnore) {
+    ignore = aIgnore;
+    return this;
+  }
+  
+  public boolean isIgnored() {
+    return ignore;
+  }
+
+  public Benchmark limit(long aLimit)
+  {
+    timeLimitMs = aLimit;
+    return this;
+  }
+  
+  public long getTimeLimitMs() {
+    return timeLimitMs;
+  }
+
+  public void applyTemplate(Benchmark aTemplate)
+  {
+    initializer = aTemplate.initializer;
+
+    baseRepeat = aTemplate.baseRepeat;
+    repeatIncrementTimes = aTemplate.repeatIncrementTimes;
+
+    baseMagnitude = aTemplate.baseMagnitude;
+    incrementTimes = aTemplate.incrementTimes;
+    magnitudeIncrement = aTemplate.magnitudeIncrement;
+    timer = aTemplate.timer;
+    toMs = aTemplate.toMs;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public Benchmark timer(LongSupplier aTimer, DoubleFunction<Double> aToMs) {
+    timer = aTimer;
+    toMs = aToMs;
+    return this;
+  }
+
+  public Benchmark repeat(int aRepeat) {
+    baseRepeat = aRepeat;
+    return this;
+  }
+
+  public Benchmark magnitude(int aMagnitude) {
+    baseMagnitude = aMagnitude;
+    return this;
+  }
+
+  public Benchmark magnitudeIncrement(IntFunction<Integer> aIncrement) {
+    magnitudeIncrement = aIncrement;
+    return this;
+  }
+
+  public Benchmark incrementTimes(int aTimes) {
+    incrementTimes = aTimes;
+    return this;
+  }
+
+  public Benchmark initialize(IntConsumer aPieceOfCode) {
+    initializer = aPieceOfCode;
+    return this;
+  }
+
+  public Benchmark measure(RunnableWithExceptions aPieceOfCode) {
+    subject = aPieceOfCode;
+    return this;
+  }
+
+  private Batch runBatch(int aMagnitude) {
+    Batch batch = new Batch(aMagnitude);
+
+    initializer.accept(aMagnitude);
     
-    private String name;
-    private int baseRepeat = 20;
-    private int repeatIncrementTimes;
-    
-    private int baseMagnitude = 1;
-    private int incrementTimes;
-    private IntFunction<Integer> magnitudeIncrement = t -> t;
-    private LongSupplier timer = () -> System.currentTimeMillis();
-    
-    private List<Batch> batches = new ArrayList<>();
-
-    public Benchmark(String aName, Benchmark aTemplate) {
-      name = aName;
-      
-      initializer = aTemplate.initializer;
-      subject = aTemplate.subject;
-      
-      baseRepeat = aTemplate.baseRepeat;
-      repeatIncrementTimes = aTemplate.repeatIncrementTimes;
-      
-      baseMagnitude = aTemplate.baseMagnitude;
-      incrementTimes = aTemplate.incrementTimes;
-      magnitudeIncrement = aTemplate.magnitudeIncrement;
-      timer = aTemplate.timer;
-    }
-
-    public Benchmark(String aName) {
-      name = aName;
-    }
-
-    public Benchmark timer(LongSupplier aTimer)
-    {
-      timer = aTimer;
-      return this;
-    }
-
-    public Benchmark repeat(int aRepeat)
-    {
-      baseRepeat = aRepeat;
-      return this;
-    }
-
-    public Benchmark magnitude(int aMagnitude)
-    {
-      baseMagnitude = aMagnitude;
-      return this;
-    }
-
-    public Benchmark magnitudeIncrement(IntFunction<Integer> aIncrement)
-    {
-      magnitudeIncrement = aIncrement;
-      return this;
-    }
-
-    public Benchmark incrementTimes(int aTimes)
-    {
-      incrementTimes = aTimes;
-      return this;
-    }
-
-    public Benchmark initialize(IntConsumer aPieceOfCode)
-    {
-      initializer = aPieceOfCode;
-      return this;
-    }
-    
-    public Benchmark measure(RunnableWithExceptions aPieceOfCode)
-    {
-      subject = aPieceOfCode;
-      return this;
-    }
-    
-    private Batch runBatch(int aMagnitude)
-    {
-      Batch batch = new Batch(aMagnitude);
-      
-      initializer.accept(aMagnitude);
-      for (int i = 0; i < baseRepeat; i++) {
+    long initTime = System.currentTimeMillis();
+    for (int i = 0; i < baseRepeat; i++) {
+      long startTime = timer.getAsLong();
+      try {
+        subject.run();
+        batch.addMeasurement(new Measurement(i, timer.getAsLong() - startTime));
         
-        long startTime = timer.getAsLong();
-        try {
-          subject.run();
-          batch.addMeasurement(new Measurement(i, timer.getAsLong() - startTime));
+        if (System.currentTimeMillis() > initTime + getTimeLimitMs()) {
+          batch.setTimeLimitExceeded(true);
+          break;
         }
-        catch (Exception e) {
-          batch.addMeasurement(new Measurement(i, timer.getAsLong() - startTime, e));
-        }
+      } catch (Exception e) {
+        batch.addMeasurement(new Measurement(i, timer.getAsLong() - startTime, e));
       }
-      
-      return batch;
     }
+
+    return batch;
+  }
+
+  public void run() {
+    stats = null;
     
-    public void run()
-    {
+    if (verbose) {
       System.out.printf("%n%s%n", StringUtils.repeat("=", name.length()));
       System.out.printf("%s%n", name);
       System.out.printf("%s%n", StringUtils.repeat("=", name.length()));
-      
-      int magnitude = baseMagnitude;
-      int n = 0;
-      
-      System.out.print("Running benchmark... ");
-      do {
-        if (magnitude > 0) {
-          System.out.printf("%d ", magnitude);
-        }
-        batches.add(runBatch(magnitude));
-        magnitude = magnitudeIncrement.apply(magnitude);
-        n++;
-      } while (n < incrementTimes);
-      System.out.printf("%n%n");
-      
+    }
+    else {
+      System.out.printf("%s: ", name);
+    }
+
+    System.out.print("Running benchmark... ");
+
+    int magnitude = baseMagnitude;
+    int n = 0;
+    do {
+      if (magnitude > 0) {
+        System.out.printf("%d ", magnitude);
+      }
+      Batch results = runBatch(magnitude);
+      if (!ignore) {
+          batches.add(results);
+      }
+      magnitude = magnitudeIncrement.apply(magnitude);
+      n++;
+    } while (n < incrementTimes);
+    System.out.printf("%n");
+
+    if (verbose) {
       for (Batch b : batches) {
-        System.out.printf("%s%n", b);
+        System.out.printf("%s%n", batchToString(b));
       }
     }
-  }
\ No newline at end of file
+  }
+
+  public List<Batch> getBatches() {
+    return batches;
+  }
+
+  public long getMaxDuration() {
+    return (long) getStats().getMax();
+  }
+
+  public long getCumulativeDuration() {
+    return (long) getStats().getSum();
+  }
+
+  public long getAverageDuration() {
+    return (long) getStats().getMean();
+  }
+
+  public Measurement getSlowestMeasurement() {
+    return getBatches().stream()
+        .flatMap(b -> b.getMeasurements().stream())
+        .max(comparing(Measurement::getDuration))
+        .get();
+  }
+  
+  public DescriptiveStatistics getStats()
+  {
+    if (stats == null) {
+      stats = new DescriptiveStatistics();
+      getBatches().stream()
+          .flatMap(b -> b.getMeasurements().stream())
+          .mapToLong(Measurement::getDuration)
+          .forEach(stats::addValue);
+    }
+    return stats;
+  }
+  
+  public double toMs(double duration) 
+  {
+    return toMs.apply(duration);
+  }
+  
+  public String batchToString(Batch aBatch)
+  {
+    DescriptiveStatistics batchStats = new DescriptiveStatistics();
+    
+    StringBuilder sb = new StringBuilder();
+    sb.append("[").append(String.format("%7d/%7d | ", aBatch.getMagnitude(), 
+        aBatch.getMeasurements().size()));
+    int failures = 0;
+    for (Measurement m : aBatch.getMeasurements()) {
+      if (m.failed()) {
+        failures++;
+      }
+      else {
+        batchStats.addValue(m.getDuration());
+      }
+    }
+    sb.append(String.format("min: %10.3f | ", toMs.apply(batchStats.getMin())));
+    sb.append(String.format("max: %10.3f | ", toMs.apply(batchStats.getMax())));
+    sb.append(String.format("median: %10.3f | ", toMs.apply(batchStats.getPercentile(50))));
+    sb.append(String.format("cumulative: %10.3f | ", toMs.apply(batchStats.getSum())));
+    sb.append(String.format("fail: %4d", failures));
+    if (aBatch.isTimeLimitExceeded()) {
+      sb.append(" | time limit exceeded");
+    }
+    sb.append("]");
+    return sb.toString();
+  }
+
+  /** Get CPU time in nanoseconds. */
+  public static long cpuTime() {
+    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
+    if(bean.isCurrentThreadCpuTimeSupported( )) {
+      return bean.getCurrentThreadCpuTime();
+    }
+    throw new UnsupportedOperationException(CPU_TIME_NOT_SUPPORTED_MSG);
+  }
+
+  /** Get user time in nanoseconds. */
+  public static long userTime() {
+    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
+    if(bean.isCurrentThreadCpuTimeSupported( )) {
+      return bean.getCurrentThreadUserTime();
+    }
+    throw new UnsupportedOperationException(CPU_TIME_NOT_SUPPORTED_MSG);
+  }
+
+  /** Get static system time in nanoseconds. */
+  public static long system() {
+    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
+    if(bean.isCurrentThreadCpuTimeSupported( )) {
+      return bean.getCurrentThreadCpuTime( ) - bean.getCurrentThreadUserTime( );
+    }
+    throw new UnsupportedOperationException(CPU_TIME_NOT_SUPPORTED_MSG);
+  }
+
+}
\ No newline at end of file
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/BenchmarkGroup.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/BenchmarkGroup.java
new file mode 100644
index 0000000..a6f0e05
--- /dev/null
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/BenchmarkGroup.java
@@ -0,0 +1,76 @@
+/*
+ * 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.benchmark;
+
+import static java.lang.Math.round;
+import static java.util.Comparator.comparing;
+import static org.apache.commons.lang3.time.DurationFormatUtils.formatDurationWords;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BenchmarkGroup {
+  private final String name;
+  private final Benchmark template;
+  private final List<Benchmark> benchmarks = new ArrayList<>();
+
+  public BenchmarkGroup(String aName, Benchmark aTemplate) {
+    name = aName;
+    template = aTemplate;
+  }
+
+  public BenchmarkGroup addIgnoringTemplate(Benchmark aBenchmark) {
+    benchmarks.add(aBenchmark);
+    return this;
+  }
+
+  public BenchmarkGroup add(Benchmark aBenchmark) {
+    if (template != null) {
+      aBenchmark.applyTemplate(template);
+    }
+    benchmarks.add(aBenchmark);
+    return this;
+  }
+
+  public void runAll() {
+    System.out.printf(">>>>>>>>>>>>>>>>>>%n");
+    System.out.printf("GROUP: %s", name);
+    if (template != null) {
+      System.out.printf(" (%s)", template.getName());
+    }
+    System.out.printf("%n");
+
+    for (Benchmark benchmark : benchmarks) {
+      benchmark.run();
+    }
+
+    System.out.printf("%n%nSorted by execution time:%n");
+    benchmarks.stream()
+        .filter(b -> !b.isIgnored())
+        .sorted(comparing(Benchmark::getAverageDuration))
+        .forEach(benchmark -> {
+          System.out.printf("AVG: %.3fms (%10s total) -- %s%n", 
+              benchmark.toMs(benchmark.getAverageDuration()),
+              formatDurationWords(round(benchmark.toMs(benchmark.getCumulativeDuration())), true, true), 
+              benchmark.getName());
+        });
+
+    System.out.printf(">>>>>>>>>>>>>>>>>>%n%n");
+  }
+}
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CachingRandomJCasProvider.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CachingRandomJCasProvider.java
new file mode 100644
index 0000000..5edea66
--- /dev/null
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CachingRandomJCasProvider.java
@@ -0,0 +1,57 @@
+/*
+ * 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.benchmark;
+
+import static org.apache.uima.fit.benchmark.CasInitializationUtils.initRandomCas;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.uima.cas.CASException;
+import org.apache.uima.fit.factory.JCasFactory;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.ResourceInitializationException;
+
+public class CachingRandomJCasProvider {
+  private static final long RANDOM_SEED = 12345l;
+
+  private final Map<Integer, JCas> cache = new HashMap<>();
+
+  private JCas preparedJCas;
+
+  public void prepare(int size) {
+    JCas cachedJCas = cache.get(size);
+
+    if (cachedJCas == null) {
+      try {
+        cachedJCas = JCasFactory.createJCas();
+      } catch (ResourceInitializationException | CASException e) {
+        throw new RuntimeException(e);
+      }
+
+      initRandomCas(cachedJCas.getCas(), 10, size, 30, 1000, RANDOM_SEED);
+      cache.put(size, cachedJCas);
+    }
+
+    preparedJCas = cachedJCas;
+  }
+
+  public JCas get() {
+    return preparedJCas;
+  }
+}
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CasInitializationUtils.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CasInitializationUtils.java
index e9e53c2..ed595bf 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CasInitializationUtils.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/CasInitializationUtils.java
@@ -30,32 +30,30 @@
 
 public final class CasInitializationUtils
 {
-    private static final long RANDOM_SEED = 12345l;
-
     private CasInitializationUtils()
     {
         // No instances
     }
 
-    public static void initRandomCas(CAS cas, int size)
-    {
+    public static void initRandomCas(CAS cas, int typeCount, int annotationCount, int maxAnnotationLength,
+        int approxDocLength, long seed) {
         cas.reset();
-        Random rnd = new Random(RANDOM_SEED);
+        Random rnd = new Random(seed);
         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++) {
+        for (int n = 0; n < typeCount; n++) {
             Type t = types.remove(rnd.nextInt(types.size()));
             types.add(t);
         }
 
         // Randomly generate annotations
-        for (int n = 0; n < size; n++) {
+        for (int n = 0; n < annotationCount; n++) {
             for (Type t : types) {
-                int begin = rnd.nextInt(100);
-                int end = begin + rnd.nextInt(30);
+                int begin = rnd.nextInt(approxDocLength);
+                int end = begin + rnd.nextInt(maxAnnotationLength);
                 cas.addFsToIndexes(cas.createAnnotation(t, begin, end));
             }
         }
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
deleted file mode 100644
index 673491b..0000000
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
+++ /dev/null
@@ -1,146 +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.benchmark;
-
-import static org.apache.uima.fit.benchmark.CasInitializationUtils.initRandomCas;
-import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
-import static org.apache.uima.fit.util.CasUtil.getType;
-import static org.apache.uima.fit.util.CasUtil.indexCovered;
-import static org.apache.uima.fit.util.CasUtil.indexCovering;
-import static org.apache.uima.fit.util.CasUtil.select;
-import static org.apache.uima.fit.util.CasUtil.selectAll;
-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 org.apache.uima.cas.CAS;
-import org.apache.uima.cas.Type;
-import org.apache.uima.util.CasCreationUtils;
-import org.junit.Before;
-import org.junit.Test;
-
-public class CasUtilBenchmark {
-  private CAS cas;
-  
-  private static final String TYPE_NAME_TOKEN = "org.apache.uima.fit.type.Token";
-  private static final String TYPE_NAME_SENTENCE = "org.apache.uima.fit.type.Sentence";
-  
-  @Before
-  public void setup() throws Exception {
-    if (cas == null) {
-      cas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null);
-    }
-    else {
-      cas.reset();
-    }
-  }
-
-  @Test
-  public void benchmarkSelect() {
-    Benchmark template = new Benchmark("TEMPLATE")
-      .initialize(n -> initRandomCas(cas, n))
-      .magnitude(10)
-      .magnitudeIncrement(count -> count * 10)
-      .incrementTimes(5);
-    
-    new Benchmark("CAS select Token", template)
-      .measure(() -> select(cas, 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 Sentence", template)
-      .measure(() -> select(cas, getType(cas, TYPE_NAME_SENTENCE)))
-      .run();
-
-    new Benchmark("CAS select Sentence and iterate", template)
-      .measure(() -> select(cas, getType(cas, TYPE_NAME_SENTENCE)).forEach(v -> {}))
-      .run();
-    
-    new Benchmark("CAS select TOP", template)
-      .measure(() -> selectFS(cas, getType(cas, CAS.TYPE_NAME_TOP)))
-      .run();
-
-    new Benchmark("CAS select TOP and iterate", template)
-      .measure(() -> selectFS(cas, getType(cas, CAS.TYPE_NAME_TOP)).forEach(v -> {}))
-      .run();
-
-    new Benchmark("CAS select ALL", template)
-      .measure(() -> selectAll(cas))
-      .run();
-    
-    new Benchmark("CAS select ALL and iterate", template)
-      .measure(() -> selectAll(cas).forEach(v -> {}))
-      .run();
-  }
-  
-  @Test
-  public void benchmarkSelectCovered() {
-    Benchmark template = new Benchmark("TEMPLATE")
-        .initialize(n -> initRandomCas(cas, n))
-        .magnitude(10)
-        .magnitudeIncrement(count -> count * 10)
-        .incrementTimes(4);
-    
-    new Benchmark("CAS selectCovered", template)
-      .measure(() -> {
-        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
-        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
-        select(cas, sentenceType).forEach(s -> selectCovered(tokenType, 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 -> {})))
-      .run();
-  }
-  
-  @Test
-  public void benchmarkSelectCovering() {
-    Benchmark template = new Benchmark("TEMPLATE")
-      .initialize(n -> initRandomCas(cas, n))
-      .magnitude(10)
-      .magnitudeIncrement(count -> count * 10)
-      .incrementTimes(3);
-    
-    new Benchmark("CAS selectCovering", template)
-      .measure(() -> {
-        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
-        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
-        select(cas, tokenType).forEach(t -> selectCovering(sentenceType, t));
-      })
-      .run();
-
-    new Benchmark("CAS selectCovering", template)
-      .measure(() -> {
-        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
-        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
-        select(cas, tokenType).forEach(s -> selectCovering(sentenceType, 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 -> {})))
-      .run();
-  }
-}
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/FSUtilBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/FSUtilBenchmark.java
index 536e234..4162160 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/FSUtilBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/FSUtilBenchmark.java
@@ -40,7 +40,7 @@
 	@Test
   public void benchmarkSetFeature() {
     Benchmark template = new Benchmark("TEMPLATE")
-      .timer(System::nanoTime)
+      .timer(System::nanoTime, t -> t / 1000)
       .repeat(1_000_000);
 
     new Benchmark("set feature string JCas", template)
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasFactoryBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasFactoryBenchmark.java
index 3ca8157..938c7d1 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasFactoryBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasFactoryBenchmark.java
@@ -29,7 +29,6 @@
   @Test
   public void benchmarkCreateTypeSystemDescription() throws Exception {
     Benchmark template = new Benchmark("TEMPLATE")
-      .timer(System::currentTimeMillis)
       .repeat(1000);
     
     new Benchmark("createTypeSystemDescription", template)
@@ -40,7 +39,6 @@
   @Test
   public void benchmarkCreateJCas() throws Exception {
     Benchmark template = new Benchmark("TEMPLATE")
-      .timer(System::currentTimeMillis)
       .repeat(1000);
     
     TypeSystemDescription tsd = createTypeSystemDescription();
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
deleted file mode 100644
index 591dfb8..0000000
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
+++ /dev/null
@@ -1,124 +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.benchmark;
-
-import static org.apache.uima.fit.benchmark.CasInitializationUtils.initRandomCas;
-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.selectAll;
-import static org.apache.uima.fit.util.JCasUtil.selectCovered;
-import static org.apache.uima.fit.util.JCasUtil.selectCovering;
-
-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.jcas.JCas;
-import org.apache.uima.jcas.cas.TOP;
-import org.junit.Before;
-import org.junit.Test;
-
-public class JCasUtilBenchmark {
-  private JCas jcas;
-  
-  @Before
-  public void setup() throws Exception {
-    if (jcas == null) {
-      jcas = JCasFactory.createJCas();
-    }
-    else {
-      jcas.reset();
-    }
-  }
-
-  @Test
-  public void benchmarkSelect() {
-    Benchmark template = new Benchmark("TEMPLATE")
-      .initialize(n -> initRandomCas(jcas.getCas(), n))
-      .magnitude(10)
-      .magnitudeIncrement(count -> count * 10)
-      .incrementTimes(5);
-    
-    new Benchmark("JCas select Token", template)
-      .measure(() -> select(jcas, Token.class))
-      .run();
-
-    new Benchmark("JCas select Token and iterate", template)
-      .measure(() -> select(jcas, Token.class).forEach(v -> {}))
-      .run();
-
-    new Benchmark("JCas select Sentence", template)
-      .measure(() -> select(jcas, Sentence.class))
-      .run();
-
-    new Benchmark("JCas select Sentence and iterate", template)
-      .measure(() -> select(jcas, Sentence.class).forEach(v -> {}))
-      .run();
-    
-    new Benchmark("JCas select TOP", template)
-      .measure(() -> select(jcas, TOP.class))
-      .run();
-
-    new Benchmark("JCas select TOP and iterate", template)
-      .measure(() -> select(jcas, TOP.class).forEach(v -> {}))
-      .run();
-    
-    new Benchmark("JCas select ALL", template)
-      .measure(() -> selectAll(jcas))
-      .run();
-    
-    new Benchmark("JCas select ALL and iterate", template)
-      .measure(() -> selectAll(jcas).forEach(v -> {}))
-      .run();
-  }
-  
-  @Test
-  public void benchmarkSelectCovered() {
-    Benchmark template = new Benchmark("TEMPLATE")
-      .initialize(n -> initRandomCas(jcas.getCas(), n))
-      .magnitude(10)
-      .magnitudeIncrement(count -> count * 10)
-      .incrementTimes(4);
-    
-    new Benchmark("JCas selectCovered", template)
-      .measure(() -> select(jcas, Sentence.class).forEach(s -> selectCovered(Token.class, s)))
-      .run();
-
-    new Benchmark("JCas indexCovered", template)
-      .measure(() -> indexCovered(jcas, Sentence.class, Token.class).forEach((s, l) -> l.forEach(t -> {})))
-      .run();
-  }
-  
-  @Test
-  public void benchmarkSelectCovering() {
-    Benchmark template = new Benchmark("TEMPLATE")
-      .initialize(n -> initRandomCas(jcas.getCas(), n))
-      .magnitude(10)
-      .magnitudeIncrement(count -> count * 10)
-      .incrementTimes(3);
-    
-    new Benchmark("JCas selectCovering", template)
-      .measure(() -> select(jcas, Token.class).forEach(t -> selectCovering(Sentence.class, t)))
-      .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/java/org/apache/uima/fit/benchmark/SelectBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/SelectBenchmark.java
new file mode 100644
index 0000000..4e23194
--- /dev/null
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/SelectBenchmark.java
@@ -0,0 +1,276 @@
+/*
+ * 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.benchmark;
+
+import static org.apache.uima.cas.text.AnnotationPredicates.colocated;
+import static org.apache.uima.cas.text.AnnotationPredicates.coveredBy;
+import static org.apache.uima.cas.text.AnnotationPredicates.covering;
+import static org.apache.uima.cas.text.AnnotationPredicates.overlapping;
+import static org.apache.uima.fit.util.CasUtil.getType;
+import static org.apache.uima.fit.util.CasUtil.select;
+import static org.apache.uima.fit.util.JCasUtil.select;
+import static org.apache.uima.fit.util.JCasUtil.selectCovered;
+import static org.apache.uima.fit.util.JCasUtil.selectOverlapping;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.fit.type.Sentence;
+import org.apache.uima.fit.type.Token;
+import org.apache.uima.fit.util.CasUtil;
+import org.apache.uima.fit.util.JCasUtil;
+import org.apache.uima.jcas.cas.TOP;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SelectBenchmark {
+  private static final String TYPE_NAME_TOKEN = "org.apache.uima.fit.type.Token";
+  private static final String TYPE_NAME_SENTENCE = "org.apache.uima.fit.type.Sentence";
+  
+  private Benchmark templateForFastOperations;
+  private Benchmark templateForNormalOperations;
+  private Benchmark warmupTask;
+  private CachingRandomJCasProvider casProvider;
+  
+  @Before
+  public void setup() {
+    casProvider = new CachingRandomJCasProvider();
+    warmupTask = new Benchmark("WARM-UP")
+        .initialize(casProvider::prepare)
+        .repeat(100)
+        .magnitude(10)
+        .magnitudeIncrement(count -> count * 10)
+        .incrementTimes(5)
+        .ignore(true)
+        .measure(() -> casProvider.get().select().forEach(t -> {}));
+    templateForFastOperations = new Benchmark("FAST TEMPLATE")
+        .initialize(casProvider::prepare)
+        .timer(Benchmark::userTime, t -> t / 1_000_000)
+        .repeat(1_000)
+        .magnitude(10)
+        .magnitudeIncrement(count -> count * 10)
+        .incrementTimes(5);
+    templateForNormalOperations = new Benchmark("NORMAL TEMPLATE")
+        .initialize(casProvider::prepare)
+        .timer(Benchmark::userTime, t -> t / 1_000_000)
+        .repeat(10_000)
+        .magnitude(10)
+        .magnitudeIncrement(count -> count * 10)
+        .incrementTimes(4);
+  }
+
+  
+  @Test
+  public void benchmarkSelect() {
+    new BenchmarkGroup("select", templateForFastOperations)
+        .addIgnoringTemplate(warmupTask)
+        .add(new Benchmark("JCasUtil.selectAll(JCAS).forEach(x -> {})")
+            .measure(() -> JCasUtil.selectAll(casProvider.get()).forEach(x -> {})))
+        .add(new Benchmark("JCAS.select().forEach(x -> {})")
+            .measure(() -> casProvider.get().select().forEach(x -> {})))
+        .add(new Benchmark("JCasUtil.select(JCAS, TOP.class).forEach(x -> {})")
+            .measure(() -> JCasUtil.select(casProvider.get(), TOP.class).forEach(x -> {})))
+        .add(new Benchmark("JCAS.select(TOP.class).forEach(x -> {})")
+            .measure(() -> casProvider.get().select(TOP.class).forEach(x -> {})))
+        .add(new Benchmark("JCasUtil.select(JCAS, Token.class).forEach(x -> {})")
+            .measure(() -> JCasUtil.select(casProvider.get(), Token.class).forEach(x -> {})))
+        .add(new Benchmark("JCAS.select(Token.class).forEach(x -> {})")
+            .measure(() -> casProvider.get().select(Token.class).forEach(x -> {})))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().forEach(x -> {})")
+            .measure(() -> casProvider.get().getAnnotationIndex(Token.class).select().forEach(x -> {})))
+        .runAll();
+  }
+
+  @Test
+  public void benchmarkSelectOverlapping() {
+    new BenchmarkGroup("select overlapping", templateForNormalOperations)
+        .addIgnoringTemplate(warmupTask)
+        .add(new Benchmark("selectOverlapping(JCAS, Token.class, s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    selectOverlapping(Token.class, s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("CAS.select(Token.class).filter(t -> overlapping(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class)
+                        .filter(t -> overlapping(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).stream().filter(t -> overlapping(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).stream()
+                        .filter(t -> overlapping(t, s))
+                        .forEach(t -> {}));
+            }))
+        .runAll();
+  }
+  
+  @Test
+  public void benchmarkSelectCoveredBy() {
+    new BenchmarkGroup("select covered by", templateForNormalOperations)
+        .addIgnoringTemplate(warmupTask)
+        .add(new Benchmark("selectCovered(Token.class, s).forEach(t -> {})")
+            .measure(() -> {
+              select(casProvider.get(), Sentence.class).forEach(s -> 
+                    selectCovered(Token.class, s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).coveredBy(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class).coveredBy(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().coveredBy(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).select().coveredBy(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).filter(t -> coveredBy(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class)
+                        .filter(t -> coveredBy(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).stream().filter(t -> coveredBy(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).stream()
+                        .filter(t -> coveredBy(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).coveredBy(s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s ->
+                        casProvider.get().select(Token.class).coveredBy(s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().coveredBy(s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s ->
+                        casProvider.get().getAnnotationIndex(Token.class).select().coveredBy(s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .add(new Benchmark("selectCovered(JCAS, Token.class, s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s ->
+                        selectCovered(casProvider.get(), Token.class, s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .runAll();
+  }
+  
+  @Test
+  public void benchmarkSelectCovering() {
+    new BenchmarkGroup("select covering", templateForNormalOperations)
+        .addIgnoringTemplate(warmupTask)
+        .add(new Benchmark("JCasUtil.selectCovering(Token.class, s).forEach(t -> {})")
+            .measure(() -> {
+              select(casProvider.get(), Sentence.class).forEach(s -> 
+                    JCasUtil.selectCovering(Token.class, s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("CasUtil.selectCovering(tokenType, s).forEach(t -> {})")
+            .measure(() -> {
+                CAS cas = casProvider.get().getCas();
+                select(cas, getType(cas, TYPE_NAME_SENTENCE)).forEach(s -> 
+                    CasUtil.selectCovering(getType(cas, TYPE_NAME_TOKEN), s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).covering(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class).covering(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("CAS.getAnnotationIndex(getType(cas, TYPE_NAME_TOKEN)).select().covering(s).forEach(t -> {})")
+            .measure(() -> {
+                CAS cas = casProvider.get().getCas();
+                select(cas, getType(cas, TYPE_NAME_SENTENCE)).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(getType(cas, TYPE_NAME_TOKEN)).select().covering(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().covering(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).select().covering(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).filter(t -> covering(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class)
+                        .filter(t -> covering(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("CAS.getAnnotationIndex(getType(cas, TYPE_NAME_TOKEN)).stream().filter(t -> covering(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                CAS cas = casProvider.get().getCas();
+                select(cas, getType(cas, TYPE_NAME_SENTENCE)).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(getType(cas, TYPE_NAME_TOKEN)).stream()
+                        .filter(t -> covering(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).stream().filter(t -> covering(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).stream()
+                        .filter(t -> covering(t, s))
+                        .forEach(t -> {}));
+            }))
+        .runAll();  
+  }
+  
+  @Test
+  public void benchmarkSelectAt() {
+    new BenchmarkGroup("select at", templateForNormalOperations)
+        .addIgnoringTemplate(warmupTask)
+        .add(new Benchmark("JCasUtil.selectAt(CAS, Token.class, s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+              select(casProvider.get(), Sentence.class).forEach(s -> 
+                    JCasUtil.selectAt(casProvider.get(), Token.class, s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).at(s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class).at(s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).at(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class).at(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.select(Token.class).filter(t -> colocated(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().select(Token.class)
+                        .filter(t -> colocated(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).stream().filter(t -> colocated(t, s)).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s -> 
+                    casProvider.get().getAnnotationIndex(Token.class).stream()
+                        .filter(t -> colocated(t, s))
+                        .forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().at(s).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s ->
+                        casProvider.get().getAnnotationIndex(Token.class).select().at(s).forEach(t -> {}));
+            }))
+        .add(new Benchmark("JCAS.getAnnotationIndex(Token.class).select().at(s.getBegin(), s.getEnd()).forEach(t -> {})")
+            .measure(() -> {
+                select(casProvider.get(), Sentence.class).forEach(s ->
+                        casProvider.get().getAnnotationIndex(Token.class).select().at(s.getBegin(), s.getEnd()).forEach(t -> {}));
+            }))
+        .runAll();
+  }
+}
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 6f11dc6..cf9a65d 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>
@@ -76,6 +76,11 @@
       <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>
@@ -85,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>
@@ -171,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/CasUtil.java b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
index c8f72b7..50b0dfc 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;
@@ -73,7 +73,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();
@@ -154,10 +156,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;
   }
 
@@ -172,9 +171,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;
   }
 
@@ -188,7 +185,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);
   }
 
@@ -203,12 +200,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);
   }
 
   /**
@@ -232,9 +227,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);
   }
 
   /**
@@ -261,10 +259,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();
   }
   
   /**
@@ -755,14 +751,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 {
@@ -772,9 +768,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);
@@ -805,14 +801,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 {
@@ -871,9 +867,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,6 +900,82 @@
   }
 
   /**
+   * 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 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(Type aType,
+          AnnotationFS aBoundaryAnnotation) {
+    return selectOverlapping(aBoundaryAnnotation.getCAS(), aType, aBoundaryAnnotation.getBegin(),
+            aBoundaryAnnotation.getEnd());
+  }  
+  
+  /**
+   * 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.
    * 
@@ -918,9 +990,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;
@@ -943,7 +1014,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.
@@ -952,7 +1023,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()) {
@@ -1009,9 +1106,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();
@@ -1095,11 +1190,9 @@
    */
   public static List<AnnotationFS> selectPreceding(CAS cas, Type type, AnnotationFS anchor,
           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    
@@ -1163,9 +1256,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    
@@ -1189,7 +1280,7 @@
 
     // add annotations from the iterator into the result list
     int refEnd = annotation.getEnd();
-    List<AnnotationFS> followingAnnotations = new LinkedList<AnnotationFS>();
+    List<AnnotationFS> followingAnnotations = new ArrayList<AnnotationFS>();
     for (int i = 0; i < count && itr.isValid(); i++, itr.moveToNext()) {
       AnnotationFS fs = itr.get();
       int begin = fs.getBegin();
@@ -1303,4 +1394,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..2c1cf32 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,69 @@
    * @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 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(Class<T> aType,
+          AnnotationFS aBoundaryAnnotation) {
+    return cast(CasUtil.selectOverlapping(getType(aBoundaryAnnotation.getJCas(), aType),
+            aBoundaryAnnotation));
+  }
+  
+  /**
+   * 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 +652,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/CasUtilTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/CasUtilTest.java
index 769502e..7ccf685 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/util/CasUtilTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/CasUtilTest.java
@@ -18,24 +18,47 @@
  */
 package org.apache.uima.fit.util;
 
+import static java.lang.Integer.MAX_VALUE;
 import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.toList;
+import static org.apache.uima.cas.text.AnnotationPredicates.colocated;
+import static org.apache.uima.cas.text.AnnotationPredicates.coveredBy;
+import static org.apache.uima.cas.text.AnnotationPredicates.covering;
+import static org.apache.uima.cas.text.AnnotationPredicates.following;
+import static org.apache.uima.cas.text.AnnotationPredicates.preceding;
 import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
+import static org.apache.uima.fit.util.CasUtil.exists;
 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.selectAt;
 import static org.apache.uima.fit.util.CasUtil.selectByIndex;
+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.selectFollowing;
+import static org.apache.uima.fit.util.CasUtil.selectPreceding;
 import static org.apache.uima.fit.util.CasUtil.toText;
-import static org.apache.uima.fit.util.CasUtil.exists;
+import static org.apache.uima.fit.util.SelectionAssert.NON_ZERO_WIDTH_TEST_CASES;
+import static org.apache.uima.fit.util.SelectionAssert.ZERO_WIDTH_TEST_CASES;
+import static org.apache.uima.fit.util.SelectionAssert.assertSelection;
+import static org.apache.uima.fit.util.SelectionAssert.assertSelectionIsEqualOnRandomData;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COLOCATED;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COVERED_BY;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COVERING;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.FOLLOWING;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.PRECEDING;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.uima.UIMAException;
 import org.apache.uima.cas.ArrayFS;
@@ -45,6 +68,7 @@
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.fit.ComponentTestBase;
 import org.apache.uima.fit.type.Token;
+import org.apache.uima.fit.util.SelectionAssert.TestCase;
 import org.apache.uima.jcas.cas.TOP;
 import org.apache.uima.jcas.tcas.Annotation;
 import org.apache.uima.util.CasCreationUtils;
@@ -55,6 +79,9 @@
  * 
  */
 public class CasUtilTest extends ComponentTestBase {
+  private List<TestCase> defaultPredicatesTestCases = union(NON_ZERO_WIDTH_TEST_CASES,
+          ZERO_WIDTH_TEST_CASES);
+  
   @Test
   public void testGetType() {
     String text = "Rot wood cheeses dew?";
@@ -205,4 +232,111 @@
 
     assertTrue(exists(cas, tokenType));
   }
+  
+  @Test
+  public void thatSelectFollowingBehaviorAlignsWithPrecedingPredicate() throws Exception {
+    // In order to find annotations that X is preceding, we select the following annotations
+    assertSelection(
+        PRECEDING,
+        (cas, type, x, y) -> selectFollowing(cas, type, x, MAX_VALUE).contains(y),
+        defaultPredicatesTestCases);
+  }
+  
+  @Test
+  public void thatSelectPrecedingBehaviorAlignsWithPrecedingPredicateOnRandomData() throws Exception
+  {
+    assertSelectionIsEqualOnRandomData(
+        (cas, type, context) -> cas.getAnnotationIndex(type).select()
+            .filter(candidate -> preceding(candidate, context))
+            .collect(toList()),
+        (cas, type, context) -> selectPreceding(cas, type, context, MAX_VALUE));
+  }
+
+  @Test
+  public void thatSelectPrecedingBehaviorAlignsWithFollowingPredicate() throws Exception {
+    // In order to find annotations that X is following, we select the preceding annotations
+    assertSelection(
+        FOLLOWING,
+        (cas, type, x, y) -> selectPreceding(cas, type, x, MAX_VALUE).contains(y),
+        defaultPredicatesTestCases);
+  }
+  
+  @Test
+  public void thatSelectFollowingBehaviorAlignsWithFollowingPredicateOnRandomData() throws Exception
+  {
+    assertSelectionIsEqualOnRandomData(
+        (cas, type, context) -> cas.getAnnotationIndex(type).select()
+            .filter(candidate -> following(candidate, context))
+            .collect(toList()),
+        (cas, type, context) -> selectFollowing(cas, type, context, MAX_VALUE));
+  }
+
+  @Test
+  public void thatSelectCoveringBehaviorAlignsWithCoveredByPredicate() throws Exception {
+    // X covered by Y means that Y is covering X, so we need to select the covering annotations
+    // below.
+    assertSelection(
+        COVERED_BY,
+        (cas, type, x, y) -> selectCovering(cas, type, x).contains(y),
+        defaultPredicatesTestCases);
+  }
+  
+  @Test
+  public void thatSelectCoveredBehaviorAlignsWithCoveredByPredicateOnRandomData() throws Exception
+  {
+    assertSelectionIsEqualOnRandomData(
+        (cas, type, context) -> cas.getAnnotationIndex(type).select()
+            .filter(candidate -> coveredBy(candidate, context))
+            .collect(toList()),
+        (cas, type, context) -> selectCovered(cas, type, context));
+  }
+
+  @Test
+  public void thatSelectCoveredBehaviorAlignsWithCoveringPredicate() throws Exception {
+    // X covering Y means that Y is covered by Y, so we need to select the covered by annotations
+    // below.
+    assertSelection(
+        COVERING,
+        (cas, type, x, y) -> selectCovered(cas, type, x).contains(y),
+        defaultPredicatesTestCases);
+  }
+
+  @Test
+  public void thatSelectFsBehaviorAlignsWithCoveringPredicateOnRandomData() throws Exception
+  {
+    assertSelectionIsEqualOnRandomData(
+        (cas, type, context) -> cas.getAnnotationIndex(type).select()
+            .filter(candidate -> covering(candidate, context))
+            .collect(toList()),
+        (cas, type, context) -> selectCovering(cas, type, context));
+  }
+  
+  @Test
+  public void thatSelectAtBehaviorAlignsWithColocatedPredicate() throws Exception {
+    // X covering Y means that Y is covered by Y, so we need to select the covered by annotations
+    // below.
+    assertSelection(
+        COLOCATED,
+        (cas, type, x, y) -> selectAt(cas, type, x.getBegin(), x.getEnd()).contains(y),
+        defaultPredicatesTestCases);
+  }  
+
+  @Test
+  public void thatSelectAtBehaviorAlignsWithColocatedPredicateOnRandomData() throws Exception
+  {
+    assertSelectionIsEqualOnRandomData(
+        (cas, type, context) -> cas.getAnnotationIndex(type).select()
+            .filter(candidate -> colocated(candidate, context))
+            .collect(toList()),
+        (cas, type, context) -> selectAt(cas, type, context.getBegin(), context.getEnd()));
+  }
+  
+  @SafeVarargs
+  public static <T> List<T> union(List<T>... aLists) {
+      List<T> all = new ArrayList<>();
+      for (List<T> list : aLists) {
+        all.addAll(list);
+      }
+      return all;
+  }
 }
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 7094af4..5acf940 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,9 +15,9 @@
  * 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;
 
@@ -37,6 +37,7 @@
 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;
@@ -57,12 +58,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;
@@ -73,13 +78,14 @@
 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 {
+  
   /**
    * Test Tokens (Stems + Lemmas) overlapping with each other.
    */
@@ -141,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!
@@ -183,6 +189,188 @@
     }
   }
 
+  @Test 
+  public void thatSelectOverlappingWorks() throws Exception
+  {
+      assertOverlapBehavior(JCasUtil::selectOverlapping);
+  }
+
+  @Test 
+  public void thatSelectOverlappingNaiveWorks() throws Exception
+  {
+      assertOverlapBehavior(JCasUtilTest::selectOverlappingNaive);
+  }
+
+  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 timeOptimized = 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 optimized approach
+              ti = System.currentTimeMillis();
+              List<Token> actual = selectOverlapping(jcas, Token.class, s.getBegin(), s.getEnd());
+              timeOptimized += System.currentTimeMillis() - ti;
+
+              assertThat(actual)
+                  .as("Selection           : [" + 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.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());
+  }
+  
   /**
    * Test what happens if there is actually nothing overlapping with the Token.
    */
@@ -318,7 +506,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
@@ -815,7 +1005,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)));
@@ -838,7 +1028,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());
@@ -852,7 +1042,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)));
@@ -861,7 +1051,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());
@@ -929,4 +1119,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/java/org/apache/uima/fit/util/SelectionAssert.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/SelectionAssert.java
new file mode 100644
index 0000000..2bf7b0e
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/SelectionAssert.java
@@ -0,0 +1,292 @@
+/*
+ * 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.SelectionAssert.RelativePosition.BEGINNING_WITH;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COLOCATED;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COVERED_BY;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.COVERING;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.ENDING_WITH;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.FOLLOWING;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.OVERLAPPING;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.OVERLAPPING_AT_BEGIN;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.OVERLAPPING_AT_END;
+import static org.apache.uima.fit.util.SelectionAssert.RelativePosition.PRECEDING;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.Function;
+
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.util.CasCreationUtils;
+import org.assertj.core.api.AutoCloseableSoftAssertions;
+
+public class SelectionAssert {
+  public static enum RelativePosition {
+    COLOCATED,
+    OVERLAPPING,
+    OVERLAPPING_AT_BEGIN,
+    OVERLAPPING_AT_END,
+    COVERING,
+    COVERED_BY,
+    PRECEDING,
+    FOLLOWING,
+    BEGINNING_WITH,
+    ENDING_WITH
+  }
+  
+  // Used as fixed references for the annotation relation cases.
+  private static final int BEGIN = 10;
+  private static final int END = 20;
+  private static final int Z_POS = 10;
+
+  public static final List<TestCase> NON_ZERO_WIDTH_TEST_CASES = asList(
+      new TestCase("1) Y begins and ends after X (### [---])", 
+          p -> p.apply(BEGIN, END, END + 1, MAX_VALUE),
+          asList(PRECEDING)),
+      new TestCase("2) Y begins at X's end and ends after X (###[---])", 
+          p -> p.apply(BEGIN, END, END, MAX_VALUE),
+          asList(PRECEDING)),
+      new TestCase("3) Y begins within and ends after X (##[#--])", 
+          p -> p.apply(BEGIN, END, END - 1 , MAX_VALUE),
+          asList(OVERLAPPING, OVERLAPPING_AT_BEGIN)),
+      new TestCase("4) Y begins and ends at X's boundries ([###])", 
+          p -> p.apply(BEGIN, END, BEGIN, END),
+          asList(OVERLAPPING, COLOCATED, COVERED_BY, COVERING, BEGINNING_WITH, ENDING_WITH)),
+      new TestCase("5) Y begins and ends within X (#[#]#)", 
+          p -> p.apply(BEGIN, END, BEGIN + 1, END - 1),
+          asList(OVERLAPPING, COVERING)),
+      new TestCase("6) Y begins at and ends before X's boundries ([##]#)", 
+          p -> p.apply(BEGIN, END, BEGIN, END - 1),
+          asList(OVERLAPPING, COVERING, BEGINNING_WITH)),
+      new TestCase("7) Y begins after and ends at X's boundries (#[##])", 
+          p -> p.apply(BEGIN, END, BEGIN + 1, END),
+          asList(OVERLAPPING, COVERING, ENDING_WITH)),
+      new TestCase("8) Y begins before and ends after X's boundries ([-###-])", 
+          p -> p.apply(BEGIN, END, BEGIN - 1, END + 1),
+          asList(OVERLAPPING, COVERED_BY)),
+      new TestCase("9) X starts where Y begins and ends within Y ([##-])", 
+          p -> p.apply(BEGIN, END, BEGIN, END + 1),
+          asList(OVERLAPPING, COVERED_BY, BEGINNING_WITH)),
+      new TestCase("10) X starts within Y and ends where Y ends ([-##])", 
+          p -> p.apply(BEGIN, END, BEGIN - 1, END),
+          asList(OVERLAPPING, COVERED_BY, ENDING_WITH)),
+      new TestCase("11) Y begins before and ends within X ([--#]##)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN + 1),
+          asList(OVERLAPPING, OVERLAPPING_AT_END)),
+      new TestCase("12) Y begins before and ends where X begins ([---]###)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN),
+          asList(FOLLOWING)),
+      new TestCase("13) Y begins and ends before X begins ([---] ###)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN - 1),
+          asList(FOLLOWING)));
+
+  public static final List<TestCase> ZERO_WIDTH_TEST_CASES = asList(
+      new TestCase("Z1) Zero-width X before Y start (# [---])", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS + 10, Z_POS + 20),
+          asList(PRECEDING)),
+      new TestCase("Z2) Zero-width Y after X's end (### |)", 
+          p -> p.apply(BEGIN, END, END + 1, END + 1),
+          asList(PRECEDING)),
+      new TestCase("Z3) Zero-width X at Y's start (#---])", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS, Z_POS + 10),
+          asList(OVERLAPPING, COVERED_BY, BEGINNING_WITH)),
+      new TestCase("Z4) Zero-width X at Y's end ([---#)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS-10, Z_POS),
+          asList(OVERLAPPING, COVERED_BY, ENDING_WITH)),
+      new TestCase("Z5) Zero-width Y where X begins (|###)", 
+          p -> p.apply(BEGIN, END, BEGIN, BEGIN),
+          asList(OVERLAPPING, COVERING, BEGINNING_WITH)),
+      new TestCase("Z6) Zero-width Y within X (#|#)", 
+          p -> p.apply(BEGIN, END, BEGIN + 1, BEGIN + 1),
+          asList(OVERLAPPING, COVERING)),
+      new TestCase("Z7) Zero-width Y at X's end (###|)", 
+          p -> p.apply(BEGIN, END, END, END),
+          asList(OVERLAPPING, COVERING, ENDING_WITH)),
+      new TestCase("Z8) Zero-width X with Y (-|-)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS - 5, Z_POS + 5),
+          asList(OVERLAPPING, COVERED_BY)),
+      new TestCase("Z9) Zero-width X after Y's end ([---] #)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS - 10, Z_POS - 5),
+          asList(FOLLOWING)),
+      new TestCase("Z10) Zero-width Y before X begins (| ###)", 
+          p -> p.apply(BEGIN, END, BEGIN - 1, BEGIN - 1),
+          asList(FOLLOWING)),
+      new TestCase("Z11) Zero-width X matches zero-width Y start/end (#)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS, Z_POS),
+          asList(OVERLAPPING, COVERED_BY, COVERING, COLOCATED, BEGINNING_WITH, ENDING_WITH)));
+  
+  public static void assertSelection(RelativePosition aCondition, RelativeAnnotationPredicate aPredicate, 
+      List<TestCase> aTestCases)
+      throws Exception {
+    CAS cas = CasCreationUtils.createCas();
+    Type type = cas.getAnnotationType();
+
+    try (AutoCloseableSoftAssertions softly = new AutoCloseableSoftAssertions()) {
+      for (TestCase testCase : aTestCases) {
+        cas.reset();
+
+        // Create annotations
+        Annotation x = (Annotation) cas.createAnnotation(type, 0, 0);
+        Annotation y = (Annotation) cas.createAnnotation(type, 0, 0);
+
+        // Position the annotations according to the test data
+        testCase.getTest().apply((beginA, endA, beginB, endB) -> {
+          x.setBegin(beginA);
+          x.setEnd(endA);
+          y.setBegin(beginB);
+          y.setEnd(endB);
+          cas.addFsToIndexes(x);
+          cas.addFsToIndexes(y);
+          return true;
+        });
+
+        softly.assertThat(aPredicate.apply(cas, type, x, y)).as(testCase.getDescription())
+            .isEqualTo(testCase.getValidPositions().contains(aCondition));
+      }
+    }
+  }
+
+  public static void assertSelectionIsEqualOnRandomData(TypeByContextSelector aExpected, TypeByContextSelector aActual)
+      throws Exception {
+    final int ITERATIONS = 30;
+    final int TYPES = 5;
+
+    TypeSystemDescription tsd = UIMAFramework.getResourceSpecifierFactory().createTypeSystemDescription();
+    
+    Map<String, Type> types = new LinkedHashMap<>();
+    for (int i = 0; i < TYPES; i++) {
+      String typeName = "test.Type" + (i + 1);
+      tsd.addType(typeName, "", CAS.TYPE_NAME_ANNOTATION);
+      types.put(typeName, null);
+    }
+    
+    CAS randomCas = CasCreationUtils.createCas(tsd, null, null, null);
+
+    for (String typeName : types.keySet()) {
+      types.put(typeName, randomCas.getTypeSystem().getType(typeName));
+    }
+    
+    System.out.print("Iteration: ");
+    try {
+      Iterator<Type> ti = types.values().iterator();
+      Type type1 = ti.next();
+      Type type2 = ti.next();
+      
+      for (int i = 0; i < ITERATIONS; i++) {
+        if (i % 10 == 0) {
+          System.out.print(i);
+        }
+        else {
+          System.out.print(".");
+        }
+  
+        initRandomCas(randomCas, 3 * i, 0, types.values().toArray(new Type[types.size()]));
+  
+        for (Annotation context : randomCas.<Annotation>select(type1)) {
+          List<AnnotationFS> expected = aExpected.select(randomCas, type2, context);
+          List<AnnotationFS> actual = aActual.select(randomCas, type2, context);
+  
+          assertThat(actual)
+              .as("Selected [%s] with context [%s]@[%d..%d]", type2.getShortName(), 
+                  type1.getShortName(), context.getBegin(), context.getEnd())
+              .containsExactlyElementsOf(expected);
+        }
+      }
+      System.out.print(ITERATIONS);
+    }
+    finally {
+      System.out.println();
+    }
+  }
+
+  private static void initRandomCas(CAS aCas, int aSize, int aMinimumWidth, Type... aTypes) {
+    Random rnd = new Random();
+
+    List<Type> types = new ArrayList<>(asList(aTypes));
+
+    // 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 < aSize; n++) {
+      for (Type t : types) {
+        int begin = rnd.nextInt(100);
+        int end = begin + rnd.nextInt(30) + aMinimumWidth;
+        aCas.addFsToIndexes(aCas.createAnnotation(t, begin, end));
+      }
+    }
+  }
+
+  @FunctionalInterface
+  public static interface RelativeAnnotationPredicate {
+    boolean apply(CAS cas, Type type, Annotation x, Annotation y);
+  }
+
+  @FunctionalInterface
+  public static interface TypeByContextSelector {
+    List<AnnotationFS> select(CAS aCas, Type aType, Annotation aContext);
+  }
+  
+  @FunctionalInterface
+  public static interface RelativePositionPredicate {
+    boolean apply(int beginA, int endA, int beginB, int endB);
+  }
+
+  public static class TestCase {
+    private final String description;
+
+    private final Function<RelativePositionPredicate, Boolean> predicate;
+    
+    private final List<RelativePosition> validPositions;
+
+    public TestCase(String aDescription, Function<RelativePositionPredicate, Boolean> aPredicate, List<RelativePosition> aValidPositions) {
+      description = aDescription;
+      predicate = aPredicate;
+      validPositions = aValidPositions;
+    }
+
+    public String getDescription() {
+      return description;
+    }
+
+    public Function<RelativePositionPredicate, Boolean> getTest() {
+      return predicate;
+    }
+    
+    public List<RelativePosition> getValidPositions() {
+      return validPositions;
+    }
+  }
+}
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 07e7bb6..314d98b 100644
--- a/uimafit-maven-plugin/pom.xml
+++ b/uimafit-maven-plugin/pom.xml
@@ -22,12 +22,14 @@
   <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-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>
@@ -46,8 +48,8 @@
       <artifactId>commons-io</artifactId>
     </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>
@@ -56,7 +58,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.javassist</groupId>
@@ -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>
@@ -187,6 +189,4 @@
       </plugins>
     </pluginManagement>
   </build>
-  <url>${uimaWebsiteUrl}</url>
-  <inceptionYear>2012</inceptionYear>
 </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 eb8dcfa..b4e3a29 100644
--- a/uimafit-parent/pom.xml
+++ b/uimafit-parent/pom.xml
@@ -23,33 +23,26 @@
     <groupId>org.apache.uima</groupId>
     <artifactId>parent-pom</artifactId>
     <relativePath />
-    <version>13</version>
+    <version>14-SNAPSHOT</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.2-SNAPSHOT</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>
-    
-    <japicmp.postAnalysisScript>${project.basedir}/../uimafit-parent/src/main/groovy/api-report.groovy</japicmp.postAnalysisScript>
+    <api_check_oldVersion>3.0.0</api_check_oldVersion>
   </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 +87,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>
@@ -109,22 +107,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>
@@ -140,11 +142,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>
@@ -200,8 +197,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>
@@ -297,6 +298,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>
@@ -306,6 +308,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
+          <version>3.1.0</version>
           <executions>
             <execution>
               <id>attach-javadocs</id>
@@ -411,64 +414,4 @@
       </plugins>
     </pluginManagement>
   </build>
-  
-  <profiles>
-    <profile>
-      <id>enforce-compatibility</id>
-      <activation>
-        <file>
-          <exists>marker-file-identifying-api-compatibility-check</exists>
-        </file>
-      </activation>
-      <build>
-        <plugins>
-          <!-- https://siom79.github.io/japicmp/MavenPlugin.html -->
-          <plugin>
-            <groupId>com.github.siom79.japicmp</groupId>
-            <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>
-            </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>
 </project>
\ No newline at end of file
diff --git a/uimafit-parent/src/main/groovy/api-report.groovy b/uimafit-parent/src/main/groovy/api-report.groovy
deleted file mode 100644
index 8809e6c..0000000
--- a/uimafit-parent/src/main/groovy/api-report.groovy
+++ /dev/null
@@ -1,27 +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.

- */

-  def it = jApiClasses.iterator()

-  while (it.hasNext()) {

-    def jApiClass = it.next()

-    def fqn = jApiClass.getFullyQualifiedName()

-    if (fqn.contains("impl")) {

-      it.remove()

-    }

-  }  

-  return jApiClasses
\ No newline at end of file
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