diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 98ba25a..add194b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -13,8 +13,7 @@
 
 ## Preparing a Pull Request (PR)
 
-In order to contribute to the uimaFIT project, you need to create a **pull request**. This section
-briefly guides you through the best way of doing this:
+In order to contribute to the uimaFIT project, you need to create a **pull request**. This section briefly guides you through the best way of doing this:
 
 * Before creating a pull request, create an issue in the issue tracker of the project to which
   you wish to contribute
diff --git a/README b/README
index 59e67fb..ed5b172 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 
-      Apache uimaFIT (TM) v2.5.0
+      Apache uimaFIT (TM) v3.1.0
       --------------------------
 
 
@@ -37,37 +37,36 @@
      SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
 
 
-What's New in 2.5.0
+What's New in 3.1.0
 -------------------
 
-uimaFIT 2.5.0 is a minor feature and bugfix release. On supported platforms, it should should serve
-as a drop-in replacement for previous uimaFIT 2.x versions.
+uimaFIT 3.1.0 is a minor feature and bugfix release. On supported platforms, it serves mostly as 
+a drop-in replacement for previous uimaFIT 3.x versions. However, due to a clash in method
+signatures, you may notice incompatible changes in the methods provided ExternalResourceFactory.
+For details, please refer to the migration section in the documentation.
 
-Notable changes include:
+Notable changes in this release include:
 
  * Added support for PEARs in AnalysisEngineFactory
- * Added support for destroying auto-created resource managers if feasible
- * Added CasFactory
- * Added CasUtil.exists(...) method
- * Added support for Charset-typed parameters in components
  * Added ExternalResourceFactory.createResource(...) methods for instantiating resources
+ * Added support for Charset-typed parameters in components
  * Added ability to set number of threads in CpePipeline.runPipeline(...)
- * Fixed FSUtil.getFeature(...) failing when called with Object.class on multi-valued features
  * Fixed issue with non-XML 1.0 characters in parameter values when running CPEs
  * Fixed JCasIterable.iterator() destroying the ResourceManager before it is even used
- * Fixed CollectionReaderFactory.createReaderDescription(...) not discovering type prios and indexes
  * Fixed issue causing component parameters to be used when initializing resources
- * Upgraded to UIMA 2.10.4
+ * Fixed CollectionReaderFactory.createReaderDescription(...) not discovering type prios and indexes
+ * Fixed clashing method signatures of ExternalResourceFactory.bindResource(...)
+ * Upgraded to UIMA 3.1.1
  * Upgraded to Spring 4.3.26
-
+ 
 A full list of issues addressed in this release can be found on the Apache issue tracker:
 
-  https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310570&version=12339544
+  https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310570&version=12343882
 
 Supported Platforms
 -------------------
 
-uimaFIT requires Java 1.8 or higher, UIMA 2.10.4 or higher, and the Spring Framework 4.3.26 or higher.
+uimaFIT requires Java 1.8 or higher, UIMA 3.1.1 or higher, and the Spring Framework 4.3.26 or higher.
 
 
 Availability
@@ -84,7 +83,7 @@
   <dependency>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-core</artifactId>
-    <version>2.5.0</version>
+    <version>3.1.0</version>
   </dependency>
 
 
@@ -98,11 +97,6 @@
 uimafit-junit          - convenience code facilitating the implementation of UIMA/uimaFIT tests
                          in JUnit tests
 uimafit-assertj        - adds assertions for UIMA/uimaFIT types via the AssertJ framework
-uimafit-legacy-support - allows uimaFIT 2.x.0 to use uimaFIT 1.4.x meta data like Java annotations
-                         and META-INF/org.uimafit/types.txt files. Pipelines mixing uimaFIT 1.4.x
-                         and 2.x components MUST be created using the 2.x factories, because the
-                         1.4.x factories will NOT understand how to handle uimaFIT 2.x components
-                         or auto-configuration.
 uimafit-spring         - an experimental module serving as a proof-of-concept for the integration of
                          UIMA with the Spring Framework. It is currently not considered finished and
                          uses invasive reflection in order to patch the UIMA framework such that it
diff --git a/api-change-report.html b/api-change-report.html
index f4a27fd..406fe0c 100644
--- a/api-change-report.html
+++ b/api-change-report.html
@@ -1,4 +1,4 @@
-	<!--
+<!--
     ***************************************************************
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
@@ -17,20 +17,19 @@
     * specific language governing permissions and limitations
     * under the License.
     ***************************************************************
-   -->
+-->
 <html>
 <head>
-  <title>API Change Report - Apache uimaFIT</title>
+  <title>API Change Report - Apache UIMA uimaFIT</title>
 </head>
 <body>
-<h1>Apache uimaFIT API Change Report</h1>
+<h1>Apache UIMA (Unstructured Information Management Architecture) uimaFIT API Change Report</h1>
 
 <h2>Contents</h2>
 <p>
 <a href="#description">What is an API change report?</a><br/>
 <a target="_blank" href="uimafit-core/api-change-report/japicmp.html">API Changes: uimafit-core</a><br/>
 <a target="_blank" href="uimafit-cpe/api-change-report/japicmp.html">API Changes: uimafit-cpe</a><br/>
-<a target="_blank" href="uimafit-legacy-support/api-change-report/japicmp.html">API Changes: uimafit-legacy-support</a><br/>
 <a target="_blank" href="uimafit-spring/api-change-report/japicmp.html">API Changes: uimafit-spring</a><br/>
 <a href-"#running-more-reports">Running your own custom reports</a>
 </p>  
@@ -38,7 +37,7 @@
 <h2><a id="description">What is an API change report?</a></h2>
 
      <p>
-  			Four of the uimaFIT modules track API changes from version to version.
+  			Three of the modules in uimaFIT track API changes from version to version.
   			The changes between this current version and the last previously released version are
   			reported below.  Each report includes a summary of Classes that were changed, together with
   			a flag indicating if the change was a source or binary incompatible change.
@@ -46,7 +45,7 @@
   	 </p>
   	 
   	 <p>
-  	   Follow the links above to get the report for each of the four modules.		
+  	   Follow the links above to get the report for each of the 3 modules.		
   	 </p>
   	 
  
diff --git a/pom.xml b/pom.xml
index d098714..2da830c 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.2.0-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.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-cpe</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-junit</artifactId>
-      <version>2.5.1-SNAPSHOT</version>
+      <version>3.2.0-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.2.0-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 f9529d8..97f7bf0 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.30.RELEASE SUBCOMPONENTS:
 
diff --git a/src/main/dist-bin/NOTICE b/src/main/dist-bin/NOTICE
index 55cf795..f2ce7ae 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..01db881 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.2.0-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.2.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
diff --git a/uimafit-benchmark/pom.xml b/uimafit-benchmark/pom.xml
index 622a471..56a2ea3 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.2.0-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.2.0-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..a4553fc 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.2.0-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..af9a86f 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;
@@ -43,6 +42,7 @@
 import org.apache.uima.resource.metadata.NameValuePair;
 import org.apache.uima.resource.metadata.ResourceMetaData;
 import org.apache.uima.resource.metadata.impl.ConfigurationParameter_impl;
+import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
 import org.springframework.beans.SimpleTypeConverter;
 import org.springframework.beans.TypeMismatchException;
 
@@ -383,7 +383,7 @@
       Object value = configurationData[i * 2 + 1];
 
       if (value == null
-              || ExternalResourceFactory.getExternalResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
+              || ExternalResourceFactory.getResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
         continue;
       }
 
@@ -549,8 +549,23 @@
         settings.put(p.getName(), p.getValue());
       }
     } else if (spec instanceof PearSpecifier) {
-      for (Parameter p : ((PearSpecifier) spec).getParameters()) {
-        settings.put(p.getName(), p.getValue());
+      PearSpecifier pearSpec = ((PearSpecifier) spec);
+      // Legacy parameters that only support string values.
+      Parameter[] parameters = pearSpec.getParameters();
+
+      if (parameters != null) {
+        for (Parameter parameter : parameters) {
+          settings.put(parameter.getName(), parameter.getValue());
+        }
+      }      
+
+      // Parameters supporting arbitrary objects as values
+      NameValuePair[] pearParameters = pearSpec.getPearParameters();
+
+      if (pearParameters != null) {
+        for (NameValuePair pearParameter : pearParameters) {
+          settings.put(pearParameter.getName(), pearParameter.getValue());
+        }
       }
     } else if (spec instanceof ResourceCreationSpecifier) {
       for (NameValuePair p : ((ResourceCreationSpecifier) spec).getMetaData()
@@ -563,7 +578,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 +594,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;
 
@@ -610,23 +625,36 @@
     } else if (aSpec instanceof PearSpecifier) {
       PearSpecifier spec = (PearSpecifier) aSpec;
 
-      // If the parameter is already there, update it
       boolean found = false;
-      for (Parameter p : spec.getParameters()) {
+      
+      // Check modern parameters and if the parameter is present there, update it
+      NameValuePair[] parameters = spec.getPearParameters();
+      for (NameValuePair p : parameters) {
         if (p.getName().equals(name)) {
-          p.setValue((String) value);
+          p.setValue(value);
           found = true;
         }
       }
+      
+      // Check legacy parameters and if the parameter is present there, update it
+      Parameter[] legacyParameters = spec.getParameters();
+      if (legacyParameters != null) {
+        for (Parameter p : legacyParameters) {
+          if (p.getName().equals(name)) {
+            p.setValue((String) value);
+            found = true;
+          }
+        }
+      }
 
       // If the parameter is not there, add it
       if (!found) {
-        Parameter[] params = new Parameter[spec.getParameters().length + 1];
-        System.arraycopy(spec.getParameters(), 0, params, 0, spec.getParameters().length);
-        params[params.length - 1] = new Parameter_impl();
+        NameValuePair[] params = new NameValuePair[parameters.length + 1];
+        System.arraycopy(parameters, 0, params, 0, parameters.length);
+        params[params.length - 1] = new NameValuePair_impl();
         params[params.length - 1].setName(name);
-        params[params.length - 1].setValue((String) value);
-        spec.setParameters(params);
+        params[params.length - 1].setValue(value);
+        spec.setPearParameters(params);
       }
     } else if (aSpec instanceof ResourceCreationSpecifier) {
       ResourceMetaData md = ((ResourceCreationSpecifier) aSpec).getMetaData();
@@ -651,7 +679,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..4194b11 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 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 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    
@@ -1115,11 +1208,18 @@
     }
     
     int anchorBegin = anchor.getBegin();
-    int anchorEnd = anchor.getEnd();
 
-    // No need to do additional seeks here (as done in selectCovered) because the current method
-    // does not have to worry about type priorities - it never returns annotations that have
-    // the same offset as the reference annotation.
+    // Zero-width annotations are in the index *after* the wider annotations starting at the same
+    // location, but we would consider a zero-width annotation at the beginning of a larger
+    // reference annotation to be preceding the larger one. So we need to seek right
+    // for any relevant zero-with annotations.
+    while (itr.isValid() && itr.get().getBegin() == anchorBegin) {
+      itr.moveToNext();
+      if (!itr.isValid()) {
+        itr.moveToLast();
+        break;
+      }
+    }
     
     // make sure we're past the beginning of the reference annotation
     while (itr.isValid() && itr.get().getEnd() > anchorBegin) {
@@ -1133,11 +1233,11 @@
       int curEnd = cur.getEnd();
 
       if (
-              curEnd <= anchorBegin && 
-              (cur.getBegin() != curEnd || anchorBegin != curEnd) &&
-              (anchorBegin != anchorEnd || curEnd != anchorBegin)
+              (curEnd <= anchorBegin
+              || (cur.getBegin() == curEnd && curEnd == anchorBegin))
+              && cur != anchor
       ) {
-        precedingAnnotations.add(itr.get());
+        precedingAnnotations.add(cur);
         i++;
       }
     }
@@ -1154,23 +1254,24 @@
    *          a CAS.
    * @param type
    *          a UIMA type.
-   * @param annotation
+   * @param anchor
    *          anchor annotation
    * @param count
    *          number of annotations to collect
    * @return List of aType annotations following anchor annotation
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static List<AnnotationFS> selectFollowing(CAS cas, Type type, AnnotationFS annotation,
+  public static List<AnnotationFS> selectFollowing(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);
 
     // Seek annotation in index
     // withSnapshotIterators() not needed here since we copy the FSes to a list anyway    
     FSIterator<AnnotationFS> itr = cas.getAnnotationIndex(type).iterator();
-    itr.moveTo(annotation);
+    itr.moveTo(anchor);
+    
+    int anchorBegin = anchor.getBegin();
+    int anchorEnd = anchor.getEnd();
 
     // When seeking forward, there is no need to check if the insertion point is beyond the
     // index. If it was, there would be nothing beyond it that could be found and returned.
@@ -1182,24 +1283,41 @@
     // does not have to worry about type priorities - it never returns annotations that have
     // the same offset as the reference annotation.
 
+    if (anchorBegin == anchorEnd) {
+      // zero-width annotations appear *after* larger annotations with the same start position in
+      // the index but the larger annotations are considered to be *following* the zero-width, so we
+      // have to look to the left for larger annotations...
+      if (itr.isValid()) {
+        itr.moveToPrevious();
+        while (itr.isValid() && itr.getNvc().getBegin() == anchorBegin) {
+          itr.moveToPrevious();
+        }
+        
+        if (!itr.isValid()) {
+          itr.moveToFirst();
+        }
+        else {
+          itr.moveToNext();
+        }
+      }
+      else {
+        itr.moveToFirst();
+      }
+    }
+    
     // make sure we're past the end of the reference annotation
-    while (itr.isValid() && itr.get().getBegin() < annotation.getEnd()) {
+    while (itr.isValid() && itr.get().getBegin() < anchorEnd) {
       itr.moveToNext();
     }
 
     // add annotations from the iterator into the result list
-    int refEnd = annotation.getEnd();
-    List<AnnotationFS> followingAnnotations = new LinkedList<AnnotationFS>();
-    for (int i = 0; i < count && itr.isValid(); i++, itr.moveToNext()) {
-      AnnotationFS fs = itr.get();
-      int begin = fs.getBegin();
-      int end = fs.getEnd();
-      if (begin == end && refEnd == begin) {
-        // Skip zero-width annotation at the end of the reference annotation. These are considered
-        // to be "coveredBy" instead of following
-        continue;
+    List<AnnotationFS> followingAnnotations = new ArrayList<AnnotationFS>();
+    for (int i = 0; i < count && itr.isValid(); itr.moveToNext()) {
+      AnnotationFS cur = itr.get();
+      if (cur != anchor && cur.getBegin() >= anchorEnd) {
+        followingAnnotations.add(cur);
+        i ++;
       }
-      followingAnnotations.add(itr.get());
     }
     
     return followingAnnotations;
@@ -1303,4 +1421,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/ConfigurationParameterFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java
index e80bd68..f68fbd4 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ConfigurationParameterFactoryTest.java
@@ -18,6 +18,8 @@
  */
 package org.apache.uima.fit.factory;
 
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.entry;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -28,9 +30,13 @@
 import java.io.File;
 import java.lang.reflect.Field;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.uima.fit.descriptor.ConfigurationParameter;
+import org.apache.uima.resource.impl.Parameter_impl;
+import org.apache.uima.resource.impl.PearSpecifier_impl;
+import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
 import org.junit.Test;
 
 public class ConfigurationParameterFactoryTest {
@@ -210,4 +216,52 @@
     assertArrayEquals(expected, actual);
   }
 
+  @SuppressWarnings("deprecation")
+  @Test
+  public void thatModernAndLegacyPearParametersArePickedUp() {
+    PearSpecifier_impl spec = new PearSpecifier_impl();
+    spec.setParameters( //
+            new Parameter_impl("legacyKey", "legacyValue"), //
+            new Parameter_impl("key", "false"));
+    spec.setPearParameters( //
+            new NameValuePair_impl("modernKey", 1), //
+            new NameValuePair_impl("key", true));
+    
+    Map<String, Object> params = ConfigurationParameterFactory.getParameterSettings(spec);
+    
+    assertThat(params).containsOnly( //
+            entry("legacyKey", "legacyValue"), //
+            entry("modernKey", 1), 
+            entry("key", true));
+  }
+
+  @Test
+  public void thatModernParametersAreUpdated() {
+    PearSpecifier_impl spec = new PearSpecifier_impl();
+    spec.setPearParameters(new NameValuePair_impl("key", 1));
+
+    ConfigurationParameterFactory.setParameter(spec, "key", 2);
+    
+    assertThat(spec.getPearParameters()).containsOnly(new NameValuePair_impl("key", 2));
+  }
+
+  @Test
+  public void thatModernParametersAreAdded() {
+    PearSpecifier_impl spec = new PearSpecifier_impl();
+
+    ConfigurationParameterFactory.setParameter(spec, "key", "value");
+    
+    assertThat(spec.getPearParameters()).containsOnly(new NameValuePair_impl("key", "value"));
+  }
+
+  @SuppressWarnings("deprecation")
+  @Test
+  public void thatLegacyParametersAreUpdated() {
+    PearSpecifier_impl spec = new PearSpecifier_impl();
+    spec.setParameters(new Parameter_impl("legacyKey", "legacyValue"));
+
+    ConfigurationParameterFactory.setParameter(spec, "legacyKey", "newLegacyValue");
+    
+    assertThat(spec.getParameters()).containsOnly(new Parameter_impl("legacyKey", "newLegacyValue"));
+  }
 }
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/AnnotationPredicateTestData.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/AnnotationPredicateTestData.java
new file mode 100644
index 0000000..12dd85e
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/AnnotationPredicateTestData.java
@@ -0,0 +1,137 @@
+/*
+ * 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.AnnotationPredicateTestData.RelativePosition.BEGINNING_WITH;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COLOCATED;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COVERED_BY;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COVERING;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.ENDING_WITH;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.FOLLOWING;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.OVERLAPPING;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.OVERLAPPING_AT_BEGIN;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.OVERLAPPING_AT_END;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.PRECEDING;
+
+import java.util.List;
+
+import org.apache.uima.fit.util.SelectionAssert.TestCase;
+
+public class AnnotationPredicateTestData {
+  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 TestCase T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
+  
+  public static final List<TestCase> NON_ZERO_WIDTH_TEST_CASES = asList(
+      T1 = new TestCase("1) Y begins and ends after X (### [---])", 
+          p -> p.apply(BEGIN, END, END + 1, MAX_VALUE),
+          asList(PRECEDING)),
+      T2 = new TestCase("2) Y begins at X's end and ends after X (###[---])", 
+          p -> p.apply(BEGIN, END, END, MAX_VALUE),
+          asList(PRECEDING)),
+      T3 = new TestCase("3) Y begins within and ends after X (##[#--])", 
+          p -> p.apply(BEGIN, END, END - 1 , MAX_VALUE),
+          asList(OVERLAPPING, OVERLAPPING_AT_BEGIN)),
+      T4 = 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)),
+      T5 = new TestCase("5) Y begins and ends within X (#[#]#)", 
+          p -> p.apply(BEGIN, END, BEGIN + 1, END - 1),
+          asList(OVERLAPPING, COVERING)),
+      T6 = 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, OVERLAPPING_AT_END)),
+      T7 = 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, OVERLAPPING_AT_BEGIN)),
+      T8 = 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)),
+      T9 = 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)),
+      T10 = 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)),
+      T11 = new TestCase("11) Y begins before and ends within X ([--#]##)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN + 1),
+          asList(OVERLAPPING, OVERLAPPING_AT_END)),
+      T12 = new TestCase("12) Y begins before and ends where X begins ([---]###)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN),
+          asList(FOLLOWING)),
+      T13 = new TestCase("13) Y begins and ends before X begins ([---] ###)", 
+          p -> p.apply(BEGIN, END, 0, BEGIN - 1),
+          asList(FOLLOWING)));
+
+  public static final TestCase TZ1, TZ2, TZ3, TZ4, TZ5, TZ6, TZ7, TZ8, TZ9, TZ10, TZ11;
+
+  public static final List<TestCase> ZERO_WIDTH_TEST_CASES = asList(
+      TZ1 = new TestCase("Z1) Zero-width X before Y start (# [---])", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS + 10, Z_POS + 20),
+          asList(PRECEDING)),
+      TZ2 = new TestCase("Z2) Zero-width Y after X's end (### |)", 
+          p -> p.apply(BEGIN, END, END + 1, END + 1),
+          asList(PRECEDING)),
+      TZ3 = new TestCase("Z3) Zero-width X at Y's start (#---])", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS, Z_POS + 10),
+          asList(PRECEDING, OVERLAPPING, COVERED_BY, BEGINNING_WITH)),
+      TZ4 = new TestCase("Z4) Zero-width X at Y's end ([---#)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS-10, Z_POS),
+          asList(FOLLOWING, OVERLAPPING, COVERED_BY, ENDING_WITH)),
+      TZ5 = new TestCase("Z5) Zero-width Y where X begins (|###)", 
+          p -> p.apply(BEGIN, END, BEGIN, BEGIN),
+          asList(FOLLOWING, OVERLAPPING, COVERING, BEGINNING_WITH)),
+      TZ6 = new TestCase("Z6) Zero-width Y within X (#|#)", 
+          p -> p.apply(BEGIN, END, BEGIN + 1, BEGIN + 1),
+          asList(OVERLAPPING, COVERING)),
+      TZ7 = new TestCase("Z7) Zero-width Y at X's end (###|)", 
+          p -> p.apply(BEGIN, END, END, END),
+          asList(PRECEDING, OVERLAPPING, COVERING, ENDING_WITH)),
+      TZ8 = 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)),
+      TZ9 = 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)),
+      TZ10 = new TestCase("Z10) Zero-width Y before X begins (| ###)", 
+          p -> p.apply(BEGIN, END, BEGIN - 1, BEGIN - 1),
+          asList(FOLLOWING)),
+      TZ11 = new TestCase("Z11) Zero-width X matches zero-width Y start/end (#)", 
+          p -> p.apply(Z_POS, Z_POS, Z_POS, Z_POS),
+          asList(FOLLOWING, PRECEDING, OVERLAPPING, COVERED_BY, COVERING, COLOCATED, BEGINNING_WITH, 
+              ENDING_WITH)));
+}
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..711de6d 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.AnnotationPredicateTestData.NON_ZERO_WIDTH_TEST_CASES;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.ZERO_WIDTH_TEST_CASES;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COLOCATED;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COVERED_BY;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.COVERING;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.FOLLOWING;
+import static org.apache.uima.fit.util.AnnotationPredicateTestData.RelativePosition.PRECEDING;
+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.assertSelection;
+import static org.apache.uima.fit.util.SelectionAssert.assertSelectionIsEqualOnRandomData;
 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..464ad56 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
@@ -668,7 +858,7 @@
   }
 
   @Test
-  public void thatSelectFollowingDoesNotFindZeroWidthAnnotationAtEnd()
+  public void thatSelectFollowingDoesFindZeroWidthAnnotationAtEnd()
   {
     Annotation a1 = new Annotation(jCas, 10, 20);
     Annotation a2 = new Annotation(jCas, 20, 20);
@@ -678,11 +868,11 @@
     List<Annotation> selection = selectFollowing(Annotation.class, a1, MAX_VALUE);
     
     assertThat(selection)
-            .isEmpty();
+            .containsExactly(a2);
   }
 
   @Test
-  public void thatSelectPrecedingDoesNotFindZeroWidthAnnotationAtStart()
+  public void thatSelectPrecedingDoesFindZeroWidthAnnotationAtStart()
   {
     Annotation a1 = new Annotation(jCas, 10, 20);
     Annotation a2 = new Annotation(jCas, 10, 10);
@@ -692,11 +882,11 @@
     List<Annotation> selection = selectPreceding(Annotation.class, a1, MAX_VALUE);
     
     assertThat(selection)
-            .isEmpty();
+            .containsExactly(a2);
   }
 
   @Test
-  public void thatSelectPrecedingOnZeroWidthDoesNotFindAnnotationEndingAtSameLocation()
+  public void thatSelectPrecedingOnZeroWidthDoesFindAnnotationEndingAtSameLocation()
   {
     Annotation a1 = new Annotation(jCas, 10, 20);
     Annotation a2 = new Annotation(jCas, 20, 20);
@@ -706,7 +896,7 @@
     List<Annotation> selection = selectPreceding(Annotation.class, a2, MAX_VALUE);
     
     assertThat(selection)
-            .isEmpty();
+            .containsExactly(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..f3b6697
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/SelectionAssert.java
@@ -0,0 +1,188 @@
+/*
+ * 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.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.fit.util.AnnotationPredicateTestData.RelativePosition;
+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 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..2408891 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.2.0-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.2.0-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..6937d67 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.2.0-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..22a49af
--- /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.2.0-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..daae29a 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.2.0-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.2.0-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..76a0fee 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.2.0-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.2.0-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..acedb9b 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.2.0-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.2.0-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..6bcbe74 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
@@ -23,9 +23,12 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.reflect.Modifier;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
@@ -69,6 +72,12 @@
   private File outputDirectory;
 
   /**
+   * Do not add the output directory as a resource to the build.
+   */
+  @Parameter(defaultValue = "true", required = true)
+  private boolean addOutputDirectoryAsResourceDirectory;
+
+  /**
    * Skip generation of META-INF/org.apache.uima.fit/components.txt
    */
   @Parameter(defaultValue = "false", required = true)
@@ -195,6 +204,27 @@
                 + ExceptionUtils.getRootCauseMessage(e), e);
       }
     }
+
+    if (addOutputDirectoryAsResourceDirectory && countGenerated > 0) {
+      Path absoluteDescriptorOutputPath = outputDirectory.toPath().toAbsolutePath();
+      Path absoluteBuildOutputDirectory = Paths.get(project.getBuild().getOutputDirectory())
+              .toAbsolutePath();
+      Path absoluteBuildTestOutputDirectory = Paths.get(project.getBuild().getTestOutputDirectory())
+              .toAbsolutePath();
+
+      // Add the output folder as a new resource folder if any descriptors were generated and only
+      // if the descriptors were generated directly into the build output folder. The latter can
+      // be the case if the mojo is executed in a late build phase where the resources plugin
+      // doesn't run anymore.
+      if (!absoluteBuildOutputDirectory.equals(absoluteDescriptorOutputPath)
+              && !absoluteBuildTestOutputDirectory.equals(absoluteDescriptorOutputPath)) {
+        Resource resource = new Resource();
+        resource.setDirectory(outputDirectory.getPath());
+        resource.setFiltering(false);
+        resource.addInclude("**/*.xml");
+        project.addResource(resource);
+      }
+    }
   }
 
   private void handleError(String message, Exception e) throws MojoExecutionException {
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 98e953e..d13a11a 100644
--- a/uimafit-parent/pom.xml
+++ b/uimafit-parent/pom.xml
@@ -26,27 +26,23 @@
     <version>14-SNAPSHOT</version>
   </parent>
   <artifactId>uimafit-parent</artifactId>
-  <version>2.5.1-SNAPSHOT</version>
+  <version>3.2.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>Apache UIMA uimaFIT - Parent</name>
   <url>${uimaWebsiteUrl}</url>
   <inceptionYear>2012</inceptionYear>
   <properties>
     <spring.version>4.3.30.RELEASE</spring.version>
-    <uima.version>2.10.4</uima.version>
+    <uima.version>3.2.0-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)
-    -->
-    <api_check_oldVersion>2.4.0</api_check_oldVersion>
+    <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>
@@ -91,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>
@@ -106,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>
@@ -137,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>
@@ -197,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>
@@ -294,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>
@@ -303,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>
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..1575e95 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.2.0-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.2.0-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
