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/NOTICE b/NOTICE
index 095e34a..77fe8bf 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 Apache UIMA uimaFIT
-Copyright 2013-2017 The Apache Software Foundation
+Copyright 2013-2019 The Apache Software Foundation
 
 Copyright 2009-2012 Regents of the University of Colorado.
 All rights reserved.
diff --git a/README b/README
index 49f18bb..90fd2ec 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 
-      Apache uimaFIT (TM) v2.5.0
+      Apache uimaFIT (TM) v3.0.0
       --------------------------
 
 
@@ -37,20 +37,20 @@
      SimplePipeline.runPipeline(reader, ae1, ..., aeN, consumer1, ... consumerN)
 
 
-What's New in 2.5.0
+What's New in 3.0.0
 -------------------
 
-uimaFIT 2.5.0 is a minor feature and bugfix release. It should should serve as a drop-in replacement
-for previous uimaFIT 2.x versions.
+uimaFIT 3.0.0 is a major release because it upgrades uimaFIT to UIMA v3. Upgrading to the new version 
+may require minor adjustments to the code depending on uimaFIT.
 
 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=12332458
 
 Supported Platforms
 -------------------
 
-uimaFIT requires Java 1.8 or higher, UIMA 2.10.3 or higher, and the Spring Framework 3.2.16 or higher.
+uimaFIT requires Java 1.8 or higher, UIMA 3.0.2 or higher, and the Spring Framework 4.3.22 or higher.
 
 
 Availability
@@ -59,7 +59,7 @@
 uimaFIT is licensed under the Apache License 2.0 and is available from the Apache UIMA project:
 
   http://uima.apache.org
-  http://svn.apache.org/repos/asf/uima/uimafit
+  https://github.com/apache/uima-uimafit
 
 uimaFIT is available via Maven Central. If you use Maven for your build environment, then you can
 add uimaFIT as a dependency to your pom.xml file with the following:
@@ -67,7 +67,7 @@
   <dependency>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-core</artifactId>
-    <version>2.5.0</version>
+    <version>3.0.0</version>
   </dependency>
 
 
@@ -78,11 +78,6 @@
 uimafit-cpe            - support for the Collection Processing Engine (multi-threaded pipelines)
 uimafit-maven          - a Maven plugin to automatically enhance UIMA components with uimaFIT
                          metadata and to generate XML descriptors for uimaFIT-enabled components.
-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 788faa0..2a27a51 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,9 +17,7 @@
   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">
+<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</artifactId>
   <packaging>pom</packaging>
@@ -30,11 +28,11 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.0-SNAPSHOT</version>
+    <version>3.0.1-SNAPSHOT</version>
     <relativePath>uimafit-parent</relativePath>
   </parent>
   <properties>
-    <jiraVersion>2.5.0uimaFIT</jiraVersion>
+    <jiraVersion>3.0.0uimaFIT</jiraVersion>
   </properties>
   <scm>
     <connection>scm:git:git://github.com/apache/uima-uimafit</connection>
@@ -53,17 +51,12 @@
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.0-SNAPSHOT</version>
+      <version>3.0.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-cpe</artifactId>
-      <version>2.5.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>uimafit-legacy-support</artifactId>
-      <version>2.5.0-SNAPSHOT</version>
+      <version>3.0.1-SNAPSHOT</version>
     </dependency>
   </dependencies>
   <build>
@@ -105,23 +98,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>
@@ -129,7 +126,6 @@
     <module>uimafit-examples</module>
     <module>uimafit-spring</module>
     <module>uimafit-maven-plugin</module>
-    <module>uimafit-legacy-support</module>
     <module>uimafit-docbook</module>
     <module>uimafit-cpe</module>
     <module>uimafit-benchmark</module>
@@ -166,4 +162,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 fa4aa47..d1f3aab 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 09f1871..5516c5a 100644
--- a/src/main/dist-bin/LICENSE
+++ b/src/main/dist-bin/LICENSE
@@ -201,11 +201,11 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 
-=======================================================================   
+=======================================================================
 
-SPRING FRAMEWORK 3.2.16.RELEASE SUBCOMPONENTS:
+SPRING FRAMEWORK 4.3.22.RELEASE SUBCOMPONENTS:
 
-Spring Framework 3.2.16.RELEASE includes a number of subcomponents
+Spring Framework 4.3.22.RELEASE includes a number of subcomponents
 with separate copyright notices and license terms. The product that
 includes this file does not necessarily use all the open source
 subcomponents referred to below. Your use of the source
@@ -270,7 +270,7 @@
     San Francisco, CA 94103
     United States of America
 
-or email info@gopivotal.com.  All such requests should clearly specify:
+or email info@pivotal.io.  All such requests should clearly specify:
 
     OPEN SOURCE FILES REQUEST
     Attention General Counsel
diff --git a/src/main/dist-bin/NOTICE b/src/main/dist-bin/NOTICE
index 8d0a05e..a661f84 100644
--- a/src/main/dist-bin/NOTICE
+++ b/src/main/dist-bin/NOTICE
@@ -1,12 +1,12 @@
 Apache UIMA uimaFIT
-Copyright 2012-2016 The Apache Software Foundation
+Copyright 2012-2019 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
 
 
 Apache UIMA uimaFIT - Core
-Copyright 2013-2016 The Apache Software Foundation
+Copyright 2013-2019 The Apache Software Foundation
 
 Copyright 2009-2012 Regents of the University of Colorado.
 All rights reserved.
@@ -18,14 +18,14 @@
 
 Apache UIMA uimaFIT - Collection Processing Engine support
 Apache UIMA uimaFIT - Legacy uimaFIT support
-Copyright 2012-2016 The Apache Software Foundation
+Copyright 2012-2019 The Apache Software Foundation
 
 
 Apache UIMA Base: uimaj-core
 Apache UIMA Base: jVinci: Vinci Transport Library
 Apache UIMA Base: uimaj-adapter-vinci: Vinci Adapter
 Apache UIMA Base: uimaj-cpe: Collection Processing Engine
-Copyright 2006-2015 The Apache Software Foundation
+Copyright 2006-2019 The Apache Software Foundation
 
 Portions of Apache UIMA were originally developed by
 International Business Machines Corporation and are
@@ -36,19 +36,23 @@
 
 
 Apache Commons IO
-Copyright 2002-2012 The Apache Software Foundation
+Copyright 2002-2017 The Apache Software Foundation
 
 
 Apache Commons Lang
-Copyright 2001-2011 The Apache Software Foundation
+Copyright 2001-2018 The Apache Software Foundation
 
 
 Commons Logging
-Copyright 2003-2013 The Apache Software Foundation
+Copyright 2003-2014 The Apache Software Foundation
   
   
-Spring Framework 3.2.16.RELEASE
-Copyright (c) 2002-2015 Pivotal, Inc.
+Spring Framework 4.3.22.RELEASE
+Copyright (c) 2002-2019 Pivotal, Inc.
+
+This product is licensed to you under the Apache License, Version 2.0
+(the "License"). You may not use this product except in compliance with
+the License.
 
 This product may include a number of subcomponents with separate
 copyright notices and license terms. Your use of the source code for
diff --git a/uimafit-benchmark/pom.xml b/uimafit-benchmark/pom.xml
index 87c6d5a..6c13ea0 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.0-SNAPSHOT</version>
+    <version>3.0.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <properties>
     <maven.deploy.skip>true</maven.deploy.skip>
-    <maven.compiler.source>1.8</maven.compiler.source>
-    <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
   <dependencies>
     <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimafit-core</artifactId>
-      <version>2.5.0-SNAPSHOT</version>
+      <version>3.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
@@ -47,10 +49,14 @@
       <version>3.6.1</version>
     </dependency>
     <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
   </dependencies>
   <licenses>
     <license>
@@ -111,8 +117,6 @@
               <id>default-cli</id>
               <configuration>
                 <excludes combine.children="append">
-                  <!-- These test files are unreasonable to bear a license header -->
-                  <exclude>src/test/resources/log4j.properties</exclude>
                   <!-- These configuration files cannot bear a license header -->
                   <exclude>src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
                 </excludes>
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
index 1b998e3..b589e92 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/Benchmark.java
@@ -24,7 +24,7 @@
 import java.util.function.IntFunction;
 import java.util.function.LongSupplier;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 public class Benchmark {
     private IntConsumer initializer = t -> {};
diff --git a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
index 8cb98be..cbd62e0 100644
--- a/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
+++ b/uimafit-benchmark/src/main/java/org/apache/uima/fit/benchmark/RunnableWithExceptions.java
@@ -19,5 +19,5 @@
 package org.apache.uima.fit.benchmark;
 
 public interface RunnableWithExceptions {
-    void run() throws Exception;
-  }
\ No newline at end of file
+	void run() throws Exception;
+}
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
index 673491b..2def24a 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/CasUtilBenchmark.java
@@ -31,6 +31,7 @@
 
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.util.CasCreationUtils;
 import org.junit.Before;
 import org.junit.Test;
@@ -63,10 +64,18 @@
       .measure(() -> select(cas, getType(cas, TYPE_NAME_TOKEN)))
       .run();
 
+    new Benchmark("CAS select Token v3", template)
+      .measure(() -> cas.select(getType(cas, TYPE_NAME_TOKEN)))
+      .run();
+
     new Benchmark("CAS select Token and iterate", template)
       .measure(() -> select(cas, getType(cas, TYPE_NAME_TOKEN)).forEach(v -> {}))
       .run();
 
+    new Benchmark("CAS select Token and iterate v3", template)
+      .measure(() -> cas.select(getType(cas, TYPE_NAME_TOKEN)).forEach(v -> {}))
+      .run();
+
     new Benchmark("CAS select Sentence", template)
       .measure(() -> select(cas, getType(cas, TYPE_NAME_SENTENCE)))
       .run();
@@ -83,6 +92,10 @@
       .measure(() -> selectFS(cas, getType(cas, CAS.TYPE_NAME_TOP)).forEach(v -> {}))
       .run();
 
+    new Benchmark("CAS select TOP and iterate v3", template)
+      .measure(() -> cas.select(getType(cas, CAS.TYPE_NAME_TOP)).forEach(v -> {}))
+      .run();
+
     new Benchmark("CAS select ALL", template)
       .measure(() -> selectAll(cas))
       .run();
@@ -90,6 +103,10 @@
     new Benchmark("CAS select ALL and iterate", template)
       .measure(() -> selectAll(cas).forEach(v -> {}))
       .run();
+
+    new Benchmark("CAS select ALL and iterate v3", template)
+      .measure(() -> cas.select().forEach(v -> {}))
+      .run();
   }
   
   @Test
@@ -108,6 +125,14 @@
       })
       .run();
 
+    new Benchmark("CAS selectCovered v3", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        cas.select(sentenceType).forEach(s -> cas.select(tokenType).coveredBy((AnnotationFS) s).forEach(t -> {}));
+      })
+      .run();
+
     new Benchmark("CAS indexCovered", template)
       .measure(() -> indexCovered(cas, getType(cas, TYPE_NAME_SENTENCE), getType(cas, TYPE_NAME_TOKEN))
           .forEach((s, l) -> l.forEach(t -> {})))
@@ -138,6 +163,14 @@
       })
       .run();
 
+    new Benchmark("CAS selectCovering v3", template)
+      .measure(() -> {
+        Type sentenceType = getType(cas, TYPE_NAME_SENTENCE);
+        Type tokenType = getType(cas, TYPE_NAME_TOKEN);
+        cas.select(tokenType).forEach(t -> cas.select(sentenceType).covering((AnnotationFS) t).forEach(s -> {}));
+      })
+      .run();
+
     new Benchmark("CAS indexCovering", template)
       .measure(() -> indexCovering(cas, getType(cas, TYPE_NAME_TOKEN), getType(cas, TYPE_NAME_SENTENCE))
           .forEach((t, l) -> l.forEach(s -> {})))
diff --git a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
index 591dfb8..988a6ca 100644
--- a/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
+++ b/uimafit-benchmark/src/test/java/org/apache/uima/fit/benchmark/JCasUtilBenchmark.java
@@ -59,10 +59,18 @@
       .measure(() -> select(jcas, Token.class))
       .run();
 
+    new Benchmark("JCas select Token v3", template)
+      .measure(() -> jcas.select(Token.class))
+      .run();
+
     new Benchmark("JCas select Token and iterate", template)
       .measure(() -> select(jcas, Token.class).forEach(v -> {}))
       .run();
 
+    new Benchmark("JCas select Token and iterate v3", template)
+      .measure(() -> jcas.select(Token.class).forEach(v -> {}))
+      .run();
+
     new Benchmark("JCas select Sentence", template)
       .measure(() -> select(jcas, Sentence.class))
       .run();
@@ -79,6 +87,10 @@
       .measure(() -> select(jcas, TOP.class).forEach(v -> {}))
       .run();
     
+    new Benchmark("JCas select TOP and iterate v3", template)
+      .measure(() -> jcas.select(TOP.class).forEach(v -> {}))
+      .run();
+
     new Benchmark("JCas select ALL", template)
       .measure(() -> selectAll(jcas))
       .run();
@@ -86,6 +98,9 @@
     new Benchmark("JCas select ALL and iterate", template)
       .measure(() -> selectAll(jcas).forEach(v -> {}))
       .run();
+    new Benchmark("JCas select ALL and iterate v3", template)
+      .measure(() -> jcas.select().forEach(v -> {}))
+      .run();
   }
   
   @Test
@@ -100,6 +115,12 @@
       .measure(() -> select(jcas, Sentence.class).forEach(s -> selectCovered(Token.class, s)))
       .run();
 
+    new Benchmark("JCas selectCovered v3", template)
+      .measure(() -> {
+          jcas.select(Sentence.class).forEach(s -> jcas.select(Token.class).coveredBy(s).forEach(t -> {}));
+      })
+    .run();
+
     new Benchmark("JCas indexCovered", template)
       .measure(() -> indexCovered(jcas, Sentence.class, Token.class).forEach((s, l) -> l.forEach(t -> {})))
       .run();
@@ -117,6 +138,12 @@
       .measure(() -> select(jcas, Token.class).forEach(t -> selectCovering(Sentence.class, t)))
       .run();
 
+    new Benchmark("JCas selectCovering v3", template)
+      .measure(() -> {
+          jcas.select(Token.class).forEach(t -> jcas.select(Sentence.class).covering(t).forEach(s -> {}));
+      })
+    .run();
+
     new Benchmark("JCas indexCovering", template)
       .measure(() -> indexCovering(jcas, Token.class, Sentence.class).forEach((t, l) -> l.forEach(s -> {})))
       .run();
diff --git a/uimafit-benchmark/src/test/resources/simplelogger.properties b/uimafit-benchmark/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-benchmark/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-core/.settings/org.eclipse.jdt.core.prefs b/uimafit-core/.settings/org.eclipse.jdt.core.prefs
index 8fe19c5..1e40e06 100644
--- a/uimafit-core/.settings/org.eclipse.jdt.core.prefs
+++ b/uimafit-core/.settings/org.eclipse.jdt.core.prefs
@@ -1,12 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 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.7
+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
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 2e78eee..54b3f84 100644
--- a/uimafit-core/pom.xml
+++ b/uimafit-core/pom.xml
@@ -17,9 +17,7 @@
   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">
+<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-core</artifactId>
   <packaging>jar</packaging>
@@ -29,23 +27,19 @@
   <parent>
     <groupId>org.apache.uima</groupId>
     <artifactId>uimafit-parent</artifactId>
-    <version>2.5.0-SNAPSHOT</version>
+    <version>3.0.1-SNAPSHOT</version>
     <relativePath>../uimafit-parent</relativePath>
   </parent>
   <dependencies>
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
     <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging-api</artifactId>
-    </dependency>
-    <dependency>
       <groupId>org.apache.uima</groupId>
       <artifactId>uimaj-core</artifactId>
     </dependency>
@@ -62,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>
@@ -75,10 +73,14 @@
     <dependency> <!-- https://issues.apache.org/jira/browse/UIMA-5173 -->
       <groupId>xmlunit</groupId>
       <artifactId>xmlunit</artifactId>
-      <version>1.5</version>
       <scope>test</scope>
     </dependency>
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+    <dependency>    
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
       <scope>test</scope>
@@ -88,30 +90,6 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.15</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <artifactId>jmxtools</artifactId>
-          <groupId>com.sun.jdmk</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jmxri</artifactId>
-          <groupId>com.sun.jmx</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>jms</artifactId>
-          <groupId>javax.jms</groupId>
-        </exclusion>
-        <exclusion>
-          <artifactId>mail</artifactId>
-          <groupId>javax.mail</groupId>
-        </exclusion>
-      </exclusions>
-    </dependency>
   </dependencies>
   <licenses>
     <license>
@@ -172,8 +150,17 @@
               <id>default-cli</id>
               <configuration>
                 <excludes combine.children="append">
-                  <!-- These test files are unreasonable to bear a license header -->
+                <!-- 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>
@@ -182,6 +169,7 @@
                   <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>
+                  <exclude>src/test/resources/pear/DateTime.pear</exclude>
                   <!-- These configuration files cannot bear a license header -->
                   <exclude>src/test/resources/META-INF/org.apache.uima.fit/fsindexes.txt</exclude>
                   <exclude>src/test/resources/META-INF/org.apache.uima.fit/typepriorities.txt</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..e5e2e12 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
@@ -30,7 +30,7 @@
 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)
+   * {@link ExternalResourceFactory#bindResource(org.apache.uima.resource.ResourceCreationSpecifier, String, org.apache.uima.resource.ExternalResourceDescription)
    * bindExternalResource()} as the parameter {@link ExternalResourceFactory#PARAM_RESOURCE_NAME
    * PARAM_RESOURCE_NAME}. <br>
    * <b>It is mandatory that any resource implementing this interface declares the configuration
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..e374551 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.bindResource;
+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());
+        bindResource(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 de53ef7..5913f95 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.bindResource;
+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);
   }
 
@@ -656,7 +668,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);
@@ -828,12 +840,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());
+        bindResource(desc, e.getKey(), e.getValue());
       }
     }
 
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
index 281d365..067de15 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ConfigurationParameterFactory.java
@@ -26,8 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.IllegalClassException;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.uima.UIMA_IllegalArgumentException;
 import org.apache.uima.fit.factory.ExternalResourceFactory.ResourceValueType;
 import org.apache.uima.fit.internal.ReflectionUtil;
@@ -383,7 +382,7 @@
       Object value = configurationData[i * 2 + 1];
 
       if (value == null
-              || ExternalResourceFactory.getExternalResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
+              || ExternalResourceFactory.getResourceParameterType(value) != ResourceValueType.NO_RESOURCE) {
         continue;
       }
 
@@ -563,7 +562,7 @@
         settings.put(p.getName(), p.getValue());
       }
     } else {
-      throw new IllegalClassException("Unsupported resource specifier class [" + spec.getClass()
+      throw new IllegalArgumentException("Unsupported resource specifier class [" + spec.getClass()
               + "]");
     }
     return settings;
@@ -579,13 +578,13 @@
    *          the parameter name.
    * @param value
    *          the parameter value.
-   * @throws IllegalClassException
+   * @throws IllegalArgumentException
    *           if the value is not of a supported type for the given specifier.
    */
   public static void setParameter(ResourceSpecifier aSpec, String name, Object value) {
     if (aSpec instanceof CustomResourceSpecifier) {
       if (!(value instanceof String || value == null)) {
-        throw new IllegalClassException(String.class, value);
+        throw new IllegalArgumentException("Value must be a string");
       }
       CustomResourceSpecifier spec = (CustomResourceSpecifier) aSpec;
 
@@ -651,7 +650,7 @@
       md.getConfigurationParameterSettings().setParameterValue(name,
               convertParameterValue(param, value));
     } else {
-      throw new IllegalClassException("Unsupported resource specifier class [" + aSpec.getClass()
+      throw new IllegalArgumentException("Unsupported resource specifier class [" + aSpec.getClass()
               + "]");
     }
   }
diff --git a/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java b/uimafit-core/src/main/java/org/apache/uima/fit/factory/ExternalResourceFactory.java
index 86869ad..e55aedb 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
@@ -38,7 +38,6 @@
 import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.collection.CollectionReaderDescription;
@@ -118,9 +117,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 +135,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 +168,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 +197,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 +272,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 +317,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,9 +336,9 @@
    *          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());
   }
 
   /**
@@ -351,7 +350,7 @@
    *          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();
     extResBind.setResourceName(aResourceKey);
@@ -368,7 +367,7 @@
    * @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.
@@ -395,7 +394,7 @@
       }
     }
 
-    return ExternalResourceFactory.createExternalResourceDependency(key, api, !era.mandatory(),
+    return ExternalResourceFactory.createResourceDependency(key, api, !era.mandatory(),
             era.description());
   }
 
@@ -412,7 +411,7 @@
    *          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();
     dep.setInterfaceName(aInterface.getName());
@@ -429,19 +428,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 +448,7 @@
         continue;
       }
 
-      ExternalResourceDependency dep = createExternalResourceDependency(field);
+      ExternalResourceDependency dep = createResourceDependency(field);
 
       if (dependencies.containsKey(dep.getKey())) {
         throw new ResourceInitializationException(new IllegalStateException("Key [" + dep.getKey()
@@ -541,7 +540,7 @@
    */
   public static void bindResource(ResourceSpecifier aDesc, String aKey, String aUrl)
           throws InvalidXMLException {
-    ExternalResourceDescription extRes = createExternalResourceDescription(aKey, aUrl);
+    ExternalResourceDescription extRes = createNamedFileResourceDescription(aKey, aUrl);
     bindResource(aDesc, aKey, extRes);
   }
 
@@ -589,7 +588,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);
   }
@@ -597,7 +596,6 @@
   /**
    * Scan the given resource specifier for external resource dependencies and whenever a dependency
    * with a compatible type is found, the resource will be bound.
-   * 
    * @param aDesc
    *          a description.
    * @param aRes
@@ -612,10 +610,10 @@
    *           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);
   }
@@ -638,10 +636,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,10 +660,10 @@
    *           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);
   }
@@ -694,7 +692,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);
   }
@@ -802,7 +800,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 +816,10 @@
 
     // If not, create one
     if (!found) {
-      setExternalResourceDependencies(
+      setResourceDependencies(
               aDesc,
               (ExternalResourceDependency[]) ArrayUtils.add(deps,
-                      createExternalResourceDependency(aKey, aApi, false, null)));
+                      createResourceDependency(aKey, aApi, false, null)));
     }
   }
 
@@ -832,7 +830,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 +849,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 +879,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) {
@@ -890,9 +888,9 @@
         deps = new ExternalResourceDependency[] {};
       }
       aDesc.setExternalResourceDependencies((ExternalResourceDependency[]) ArrayUtils.add(deps,
-              createExternalResourceDependency(aKey, aImpl, false, null)));
+              createResourceDependency(aKey, aImpl, false, null)));
     }
-    bindResource(aDesc, aKey, aImpl, aUrl, aParams);
+    bindResourceUsingUrl(aDesc, aKey, aImpl, aUrl, aParams);
   }
 
   /**
@@ -924,7 +922,7 @@
       }
 
       if (apiClass.isAssignableFrom(resClass)) {
-        bindExternalResource(aDesc, dep.getKey(), aResDesc);
+        bindResource(aDesc, dep.getKey(), aResDesc);
       }
     }
   }
@@ -952,7 +950,7 @@
     // Bind if necessary
     for (ExternalResourceDependency dep : aDesc.getExternalResourceDependencies()) {
       if (aKey.equals(dep.getKey())) {
-        bindExternalResource(aDesc, aKey, aResDesc);
+        bindResource(aDesc, aKey, aResDesc);
       }
     }
   }
@@ -967,7 +965,7 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
+  public static void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
           ExternalResourceDescription aRes) {
     // Create a map of all bindings
     Map<String, ExternalResourceBinding> bindings = new HashMap<String, ExternalResourceBinding>();
@@ -982,7 +980,7 @@
     }
 
     // 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);
 
@@ -1006,7 +1004,7 @@
    * @param aNestedRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ExternalResourceDescription aRes, String aBindTo,
+  public static void bindResource(ExternalResourceDescription aRes, String aBindTo,
           ExternalResourceDescription aNestedRes) {
     if (!(aRes instanceof ExtendedExternalResourceDescription_impl)) {
       throw new IllegalArgumentException("Nested resources are only supported on instances of ["
@@ -1029,7 +1027,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);
 
@@ -1105,7 +1103,7 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceCreationSpecifier aDesc, String aBindTo,
+  public static void bindResource(ResourceCreationSpecifier aDesc, String aBindTo,
           ExternalResourceDescription aRes) {
     ResourceManagerConfiguration resMgrCfg = aDesc.getResourceManagerConfiguration();
     if (resMgrCfg == null) {
@@ -1113,7 +1111,7 @@
       aDesc.setResourceManagerConfiguration(resMgrCfg);
     }
 
-    bindExternalResource(resMgrCfg, aBindTo, aRes);
+    bindResource(resMgrCfg, aBindTo, aRes);
   }
 
   /**
@@ -1126,9 +1124,9 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
+  public static void bindResource(ResourceManagerConfiguration aResMgrCfg, String aBindTo,
           String aRes) {
-    ExternalResourceBinding extResBind = createExternalResourceBinding(aBindTo, aRes);
+    ExternalResourceBinding extResBind = createResourceBinding(aBindTo, aRes);
     aResMgrCfg.addExternalResourceBinding(extResBind);
   }
 
@@ -1142,15 +1140,14 @@
    * @param aRes
    *          the resource that should be bound.
    */
-  public static void bindExternalResource(ResourceCreationSpecifier aDesc, String aBindTo,
-          String aRes) {
+  public static void bindResource(ResourceCreationSpecifier aDesc, String aBindTo, String aRes) {
     ResourceManagerConfiguration resMgrCfg = aDesc.getResourceManagerConfiguration();
     if (resMgrCfg == null) {
       resMgrCfg = new ResourceManagerConfiguration_impl();
       aDesc.setResourceManagerConfiguration(resMgrCfg);
     }
 
-    bindExternalResource(resMgrCfg, aBindTo, aRes);
+    bindResource(resMgrCfg, aBindTo, aRes);
   }
 
   static String uniqueResourceKey(String aKey) {
@@ -1182,7 +1179,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 +1195,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 +1221,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 +1233,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 +1294,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..2d08bcd 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.bindResource;
+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());
+        bindResource(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 ad2bf14..0b32eb1 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
@@ -27,7 +27,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-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.MetaDataType;
@@ -42,10 +41,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
@@ -254,12 +257,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 907c0c7..f75abf7 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
@@ -26,9 +26,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.logging.LogFactory;
 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;
@@ -37,11 +37,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 String[] typePriorityDescriptorLocations;
@@ -57,9 +58,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());
@@ -104,13 +110,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 16be4ab..a0a2f98 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
@@ -26,7 +26,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.logging.LogFactory;
 import org.apache.uima.fit.internal.MetaDataType;
 import org.apache.uima.fit.internal.ResourceManagerFactory;
 import org.apache.uima.resource.ResourceInitializationException;
@@ -37,10 +36,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 String[] typeDescriptorLocations;
@@ -105,13 +106,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 112b78c..73528a1 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 4905564..c9d9a11 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
@@ -68,39 +68,39 @@
   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();
-        }
-        else {
-          // 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 = 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) {
+      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();
+      }
+      else {
+        // 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 = 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) {
+          try {
             resMgr.setExtensionClassPath(ClassUtils.getDefaultClassLoader(), "", true);
           }
-          
-          return resMgr;
+          catch (MalformedURLException e) {
+            throw new ResourceInitializationException(e);
+          }
         }
-      }
-      catch (MalformedURLException e) {
-        throw new ResourceInitializationException(e);
+        
+        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 dc97d5e..b622b54 100644
--- a/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
+++ b/uimafit-core/src/main/java/org/apache/uima/fit/util/CasUtil.java
@@ -33,9 +33,9 @@
 import java.util.Deque;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.uima.cas.ArrayFS;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.cas.CASRuntimeException;
@@ -74,7 +74,9 @@
    *          a type.
    * @return a return value.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
+   * @deprecated Use {@code cas.select(type).iterator()}
    */
+  @Deprecated
   @SuppressWarnings("unchecked")
   public static <T extends FeatureStructure> Iterator<T> iteratorFS(CAS cas, Type type) {
     return (Iterator<T>) FSCollectionFactory.create(cas, type).iterator();
@@ -189,7 +191,7 @@
    * @return A collection of the selected type.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Collection<FeatureStructure> selectFS(ArrayFS array, Type type) {
+  public static List<FeatureStructure> selectFS(ArrayFS array, Type type) {
     return FSCollectionFactory.create(array, type);
   }
 
@@ -204,12 +206,12 @@
    * @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);
+    return (List) FSCollectionFactory.create(array, type);
   }
 
   /**
@@ -233,9 +235,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);
   }
 
   /**
@@ -757,14 +762,14 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Map<AnnotationFS, Collection<AnnotationFS>> indexCovering(CAS cas, Type type,
+  public static Map<AnnotationFS, List<AnnotationFS>> indexCovering(CAS cas, Type type,
           Type coveringType) {
-    Map<AnnotationFS, Collection<AnnotationFS>> index = new HashMap<AnnotationFS, Collection<AnnotationFS>>() {
+    Map<AnnotationFS, List<AnnotationFS>> index = new HashMap<AnnotationFS, List<AnnotationFS>>() {
       private static final long serialVersionUID = 1L;
 
       @Override
-      public Collection<AnnotationFS> get(Object paramObject) {
-        Collection<AnnotationFS> res = super.get(paramObject);
+      public List<AnnotationFS> get(Object paramObject) {
+        List<AnnotationFS> res = super.get(paramObject);
         if (res == null) {
           return emptyList();
         } else {
@@ -774,9 +779,9 @@
     };
     for (AnnotationFS s : select(cas, coveringType)) {
       for (AnnotationFS u : selectCovered(cas, type, s)) {
-        Collection<AnnotationFS> c = index.get(u);
+        List<AnnotationFS> c = index.get(u);
         if (c == EMPTY_LIST) {
-          c = new LinkedList<AnnotationFS>();
+          c = new ArrayList<AnnotationFS>();
           index.put(u, c);
         }
         c.add(s);
@@ -807,14 +812,14 @@
    * @return the index.
    * @see <a href="package-summary.html#SortOrder">Order of selected feature structures</a>
    */
-  public static Map<AnnotationFS, Collection<AnnotationFS>> indexCovered(CAS cas, Type type,
+  public static Map<AnnotationFS, List<AnnotationFS>> indexCovered(CAS cas, Type type,
           Type coveredType) {
-    Map<AnnotationFS, Collection<AnnotationFS>> index = new HashMap<AnnotationFS, Collection<AnnotationFS>>() {
+    Map<AnnotationFS, List<AnnotationFS>> index = new HashMap<AnnotationFS, List<AnnotationFS>>() {
       private static final long serialVersionUID = 1L;
 
       @Override
-      public Collection<AnnotationFS> get(Object paramObject) {
-        Collection<AnnotationFS> res = super.get(paramObject);
+      public List<AnnotationFS> get(Object paramObject) {
+        List<AnnotationFS> res = super.get(paramObject);
         if (res == null) {
           return emptyList();
         } else {
@@ -873,9 +878,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) {
@@ -945,7 +950,7 @@
   }
 
   /**
-   * Get the single instance of the specified type from the JCas.
+   * Get the single instance of the specified type from the CAS.
    * 
    * @param cas
    *          a CAS containing the annotation.
@@ -954,7 +959,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()) {
@@ -1101,7 +1132,7 @@
       throw new IllegalArgumentException("Type [" + type.getName() + "] is not an annotation 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    
@@ -1180,7 +1211,7 @@
     }
 
     // add annotations from the iterator into the result list
-    List<AnnotationFS> followingAnnotations = new LinkedList<AnnotationFS>();
+    List<AnnotationFS> followingAnnotations = new ArrayList<AnnotationFS>();
     for (int i = 0; i < count && itr.isValid(); i++, itr.moveToNext()) {
       followingAnnotations.add(itr.get());
     }
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..67f1d73 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,21 @@
    *          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));
+      Collection<FeatureStructure> result = create(cas.getIndexRepository().getAllIndexedFS(type));
+      return asList(result.toArray(new FeatureStructure[result.size()]));
+      // return (List) cas.select(type).asList(); - This call is still buggy in UIMA 3.0.0
     }
   }
 
@@ -128,9 +129,14 @@
    *          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) {
+    // Was: return new AnnotationIndexAdapter<T>(aIndex);
+    // return aIndex.select().asList(); // That call is still buggy in UIMA 3.0.0
+    Collection<T> result = new AnnotationIndexAdapter<T>(aIndex);
+    return (List) asList(result.toArray());
   }
 
   /**
@@ -141,7 +147,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 +163,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 (List) create(aArray, CasUtil.getType(aArray.getCAS(), aType));
   }
 
   /**
@@ -170,7 +176,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 +185,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 +552,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) {
+  public static <T extends TOP> Collection<T> create(FSList<T> aList, Class<? extends T> aType) {
     return (Collection<T>) 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 +570,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 +585,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 +597,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 +609,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 +642,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..c17c42f 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,7 +534,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>> 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)));
@@ -595,7 +596,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 7ad8d7c..4f6808c 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,8 @@
 
 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.bindResource;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.*;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.ByteArrayInputStream;
@@ -63,7 +63,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);
@@ -75,7 +75,7 @@
    */
   @Test
   public void resource_testSharedInjection() throws Exception {
-    ExternalResourceDescription resDesc = createExternalResourceDescription(
+    ExternalResourceDescription resDesc = createResourceDescription(
             TestExternalResource.class, TestExternalResource.PARAM_VALUE,
             TestExternalResource.EXPECTED_VALUE);
 
@@ -107,12 +107,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);
@@ -124,12 +124,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(
@@ -159,18 +159,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)));
 
@@ -185,10 +185,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);
+    bindResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
@@ -205,10 +205,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);
+    bindResource(resDesc, TestExternalResource2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc1 = saveLoad(createEngineDescription(
             TestAnalysisEngineWithResource.class, TestAnalysisEngineWithResource.PARAM_RESOURCE,
@@ -238,7 +238,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);
@@ -250,8 +250,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(
@@ -282,14 +282,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);
@@ -301,15 +301,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);
+    bindResource(res1, TestSharedResourceObject2.PARAM_RESOURCE, res2);
     
     AnalysisEngineDescription aeDesc =createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
@@ -326,10 +326,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);
+    bindResource(resDesc, TestSharedResourceObject2.PARAM_RESOURCE, resDesc);
 
     AnalysisEngineDescription aeDesc = saveLoad(createEngineDescription(
             TestAnalysisEngineWithSharedResourceObject.class,
@@ -369,6 +369,7 @@
     @ConfigurationParameter(name = ExternalResourceFactory.PARAM_RESOURCE_NAME)
     private String resourceName;
 
+    @Override
     public void afterResourcesInitialized() {
       System.out.println(getClass().getSimpleName() + ".afterResourcesInitialized()");
       // Ensure the External Resource is bound
@@ -379,6 +380,7 @@
       assertConfiguredOk();
     }
 
+    @Override
     public String getResourceName() {
       return resourceName;
     }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
index daf29bf..570fbc6 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/CollectionReaderFactoryExternalResourceTest.java
@@ -39,7 +39,7 @@
 package org.apache.uima.fit.factory;
 
 import static org.apache.uima.fit.factory.CollectionReaderFactory.createReader;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
@@ -62,7 +62,7 @@
     CollectionReader reader = createReader(
             TestReader.class,
             TestReader.PARAM_RESOURCE,
-            createExternalResourceDescription(TestExternalResource.class,
+            createResourceDescription(TestExternalResource.class,
                     TestExternalResource.PARAM_VALUE, TestExternalResource.EXPECTED_VALUE));
 
     reader.hasNext();
@@ -74,16 +74,19 @@
     @ExternalResource(key = PARAM_RESOURCE)
     private TestExternalResource resource;
 
+    @Override
     public boolean hasNext() throws IOException, CollectionException {
       assertNotNull(resource);
       resource.assertConfiguredOk();
       return false;
     }
 
+    @Override
     public void getNext(CAS aCAS) throws IOException, CollectionException {
       // This is never called
     }
 
+    @Override
     public Progress[] getProgress() {
       return new Progress[0];
     }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
index fd38846..049a692 100644
--- a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceConfiguratorTest.java
@@ -20,7 +20,7 @@
 package org.apache.uima.fit.factory;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDependencies;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDependencies;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -41,7 +41,7 @@
 public class ExternalResourceConfiguratorTest extends ComponentTestBase {
   @Test
   public void testAnalyze() throws Exception {
-    ExternalResourceDependency[] deps = createExternalResourceDependencies(ParameterizedAE2.class);
+    ExternalResourceDependency[] deps = createResourceDependencies(ParameterizedAE2.class);
 
     verify(deps);
   }
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java b/uimafit-core/src/test/java/org/apache/uima/fit/factory/ExternalResourceFactoryTest.java
index ad4843e..90a9c66 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,9 @@
 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.bindResource;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -78,7 +77,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 +133,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 +167,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");
+    bindResource(desc, DummyAE2.RES_INJECTED_POJO1, "pojoName1");
+    bindResource(desc, DummyAE2.RES_INJECTED_POJO2, "pojoName2");
 
     // Create a custom resource manager that allows to inject any Java object as an external
     // dependency
@@ -213,7 +213,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 +235,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 +264,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 +282,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 +306,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 +328,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 });
 
@@ -359,9 +359,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 +371,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 +394,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 +437,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 +458,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 +626,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 +649,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 +669,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 db60a19..e50a6d7 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
@@ -21,41 +21,52 @@
 
 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 static org.assertj.core.api.Assertions.assertThat;
 
+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;
 import org.apache.uima.resource.metadata.TypePriorities;
-import org.apache.uima.resource.metadata.TypePriorityList;
 import org.apache.uima.util.CasCreationUtils;
 import org.junit.Test;
 
 /**
  * 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();
-    assertEquals(1, typePrioritiesLists.length);
-    assertEquals(Sentence.class.getName(), typePrioritiesLists[0].getTypes()[0]);
-    assertEquals(Token.class.getName(), typePrioritiesLists[0].getTypes()[1]);
+    assertThat(prio.getPriorityLists()).hasSize(1);
+    assertThat(prio.getPriorityLists()[0].getTypes()).containsExactly(Sentence.class.getName(),
+            Token.class.getName());
   }
 }
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/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 1984210..f8c70da 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;
 
@@ -75,7 +75,6 @@
 
 /**
  * Test cases for {@link JCasUtil}.
- * 
  */
 public class JCasUtilTest extends ComponentTestBase {
   /**
@@ -139,7 +138,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!
@@ -770,7 +769,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)));
@@ -793,7 +792,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());
@@ -807,7 +806,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)));
@@ -816,7 +815,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());
diff --git a/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java
new file mode 100644
index 0000000..68057de
--- /dev/null
+++ b/uimafit-core/src/test/java/org/apache/uima/fit/util/JCasUtilv3Test.java
@@ -0,0 +1,925 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
+
+ getCoveredAnnotations() contains code adapted from the UIMA Subiterator class.
+ */
+package org.apache.uima.fit.util;
+
+import static java.util.Arrays.asList;
+import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription;
+import static org.apache.uima.fit.util.JCasUtil.getAnnotationType;
+import static org.apache.uima.fit.util.JCasUtil.getView;
+import static org.apache.uima.fit.util.JCasUtil.indexCovered;
+import static org.apache.uima.fit.util.JCasUtil.indexCovering;
+import static org.apache.uima.fit.util.JCasUtil.select;
+import static org.apache.uima.fit.util.JCasUtil.selectAt;
+import static org.apache.uima.fit.util.JCasUtil.selectCovered;
+import static org.apache.uima.fit.util.JCasUtil.selectSingleAt;
+import static org.apache.uima.fit.util.JCasUtil.toText;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+import org.apache.uima.UIMAException;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.CASRuntimeException;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.cas.text.AnnotationFS;
+import org.apache.uima.fit.ComponentTestBase;
+import org.apache.uima.fit.type.AnalyzedText;
+import org.apache.uima.fit.type.Sentence;
+import org.apache.uima.fit.type.Token;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.jcas.cas.EmptyFSList;
+import org.apache.uima.jcas.cas.FSArray;
+import org.apache.uima.jcas.cas.NonEmptyFSList;
+import org.apache.uima.jcas.cas.TOP;
+import org.apache.uima.jcas.tcas.Annotation;
+import org.apache.uima.util.CasCreationUtils;
+import org.junit.Test;
+
+/**
+ * Test cases for {@link JCasUtil}.
+ * 
+ */
+public class JCasUtilv3Test extends ComponentTestBase {
+  /**
+   * Test Tokens (Stems + Lemmas) overlapping with each other.
+   */
+  @Test
+  public void testSelectCoveredOverlapping() {
+    add(jCas, 3, 16);
+    add(jCas, 37, 61);
+    add(jCas, 49, 75);
+    add(jCas, 54, 58);
+    add(jCas, 66, 84);
+
+    for (Token t : select(jCas, Token.class)) {
+      // The naive approach is assumed to be correct
+      // uimaFIT: selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
+      List<Sentence> stem1 = jCas.select(Sentence.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+      // uimaFIT: selectCovered(jCas, Sentence.class, t);
+      List<Sentence> stem2 = jCas.select(Sentence.class).coveredBy(t).asList();
+      check(jCas, t, stem1, stem2);
+    }
+  }
+
+  /**
+   * Test what happens if there is actually nothing overlapping with the Token.
+   */
+  @Test
+  public void testSelectCoveredNoOverlap() {
+    new Sentence(jCas, 3, 31).addToIndexes();
+    new Sentence(jCas, 21, 21).addToIndexes();
+    new Sentence(jCas, 24, 44).addToIndexes();
+    new Sentence(jCas, 30, 45).addToIndexes();
+    new Sentence(jCas, 32, 43).addToIndexes();
+    new Sentence(jCas, 47, 61).addToIndexes();
+    new Sentence(jCas, 48, 77).addToIndexes();
+    new Sentence(jCas, 65, 82).addToIndexes();
+    new Sentence(jCas, 68, 80).addToIndexes();
+    new Sentence(jCas, 72, 65).addToIndexes();
+
+    new Token(jCas, 73, 96).addToIndexes();
+
+    for (Token t : select(jCas, Token.class)) {
+      // The naive approach is assumed to be correct
+      // uimaFIT: selectCovered(jCas, Sentence.class, t.getBegin(), t.getEnd());
+      List<Sentence> stem1 = jCas.select(Sentence.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+      // uimaFIT: selectCovered(jCas, Sentence.class, t);
+      List<Sentence> stem2 = jCas.select(Sentence.class).coveredBy(t).asList();
+      check(jCas, t, stem1, stem2);
+    }
+  }
+
+  @Test
+  public void testSelectCoverRandom() throws Exception {
+    final int ITERATIONS = 10;
+
+    for (int i = 0; i < ITERATIONS; i++) {
+      CAS cas = jCas.getCas();
+      initRandomCas(cas, 10 * i);
+
+      JCas jcas = cas.getJCas();
+      Collection<Sentence> sentences = select(jcas, Sentence.class);
+      
+      long timeNaive = 0;
+      long timeOptimized = 0;
+      
+      // Prepare the index
+      long timeIndexed = System.currentTimeMillis();
+      Map<Sentence, List<Token>> index = indexCovered(jcas, Sentence.class, Token.class);
+      timeIndexed = System.currentTimeMillis() - timeIndexed;
+      
+      // -- The order of entries in the index is NOT defined!
+      // Check that order of indexed sentences corresponds to regular CAS-index order
+      // List<Sentence> relevantSentences = new ArrayList<>(sentences);
+      // relevantSentences.retainAll(index.keySet());
+      // assertEquals(relevantSentences, new ArrayList<>(index.keySet()));
+      
+      for (Sentence t : sentences) {
+        long ti = System.currentTimeMillis();
+        // The naive approach is assumed to be correct
+        // uimaFIT: selectCovered(jcas, Token.class, t.getBegin(), t.getEnd());
+        List<Token> expected = jcas.select(Token.class).coveredBy(t.getBegin(), t.getEnd()).asList();
+        timeNaive += System.currentTimeMillis() - ti;
+
+        // Record time for optimized selectCovered
+        ti = System.currentTimeMillis();
+        // uimaFIT: selectCovered(jcas, Token.class, t);
+        List<Token> actual1 = jcas.select(Token.class).coveredBy(t).asList();
+        timeOptimized += System.currentTimeMillis() - ti;
+
+        // Record index lookup time
+        ti = System.currentTimeMillis();
+        Collection<Token> actual2 = index.get(t);
+        timeIndexed += System.currentTimeMillis() - ti;
+
+        check(jcas, t, expected, actual1);
+        check(jcas, t, expected, actual2);
+        
+        // System.out.printf("%n--- OK ---------------%n%n");
+      }
+      System.out.printf(
+              "%3d Optimized: speed up factor %3.2f [naive:%4d optimized:%4d (diff:%4d)]%n", i,
+              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized,
+              timeNaive - timeOptimized);
+      System.out.printf(
+              "%3d Indexed:   speed up factor %3.2f [naive:%4d indexed  :%4d (diff:%4d)]%n%n", i,
+              (double) timeNaive / (double) timeIndexed, timeNaive, timeIndexed,
+              timeNaive - timeIndexed);
+    }
+  }
+
+  /**
+   * Test what happens if there is actually nothing overlapping with the Token.
+   */
+  @Test
+  public void testSelectBetweenInclusion() {
+    Token t1 = new Token(jCas, 45, 57);
+    t1.addToIndexes();
+    Token t2 = new Token(jCas, 52, 52);
+    t2.addToIndexes();
+
+    new Sentence(jCas, 52, 52).addToIndexes();
+
+    // uimaFIT: selectBetween(jCas, Sentence.class, t1, t2);
+    List<Sentence> stem1 = jCas.select(Sentence.class).between(t1, t2).asList();
+    assertTrue(stem1.isEmpty());
+  }
+
+  @Test
+  public void testSelectBetweenRandom() throws Exception {
+    final int ITERATIONS = 10;
+
+    Random rnd = new Random();
+
+    for (int i = 1; i <= ITERATIONS; i++) {
+      CAS cas = jCas.getCas();
+      initRandomCas(cas, 10 * i);
+
+      JCas jcas = cas.getJCas();
+      List<Token> tokens = new ArrayList<Token>(select(jcas, Token.class));
+
+      long timeNaive = 0;
+      long timeOptimized = 0;
+      for (int j = 0; j < ITERATIONS; j++) {
+        Token t1 = tokens.get(rnd.nextInt(tokens.size()));
+        Token t2 = tokens.get(rnd.nextInt(tokens.size()));
+
+        int left = Math.min(t1.getEnd(), t2.getEnd());
+        int right = Math.max(t1.getBegin(), t2.getBegin());
+
+        long ti;
+        List<Sentence> reference;
+        if ((t1.getBegin() < t2.getBegin() && t2.getBegin() < t1.getEnd())
+                || (t1.getBegin() < t2.getEnd() && t2.getEnd() < t1.getEnd())
+                || (t2.getBegin() < t1.getBegin() && t1.getBegin() < t2.getEnd())
+                || (t2.getBegin() < t1.getEnd() && t1.getEnd() < t2.getEnd())) {
+          // If the boundary annotations overlap, the result must be empty
+          ti = System.currentTimeMillis();
+          reference = new ArrayList<Sentence>();
+          timeNaive += System.currentTimeMillis() - ti;
+        } else {
+          ti = System.currentTimeMillis();
+          reference = selectCovered(jcas, Sentence.class, left, right);
+          timeNaive += System.currentTimeMillis() - ti;
+        }
+
+        ti = System.currentTimeMillis();
+        // uimaFIT: selectBetween(Sentence.class, t1, t2);
+        List<Sentence> actual = jcas.select(Sentence.class).between(t1, t2).asList();
+        timeOptimized += System.currentTimeMillis() - ti;
+
+        assertEquals("Naive: Searching between " + t1 + " and " + t2, reference, actual);
+      }
+
+      System.out.format("Speed up factor %.2f [naive:%d optimized:%d diff:%d]\n",
+              (double) timeNaive / (double) timeOptimized, timeNaive, timeOptimized, timeNaive
+                      - timeOptimized);
+    }
+  }
+
+  /**
+   * Test Tokens (Stems + Lemmas) overlapping with each other.
+   */
+  @Test
+  public void testSelectCoveringOverlapping() {
+    add(jCas, 3, 16);
+    add(jCas, 37, 61);
+    add(jCas, 49, 75);
+    add(jCas, 54, 58);
+    add(jCas, 66, 84);
+
+    // uimaFIT: selectCovering(jCas, Token.class, 36, 52).size()
+    assertEquals(0, jCas.select(Token.class).covering(36, 52).count());
+    // uimaFIT: selectCovering(jCas, Token.class, 37, 52).size()
+    assertEquals(1, jCas.select(Token.class).covering(37, 52).count());
+    // uimaFIT: selectCovering(jCas, Token.class, 49, 52).size()
+    assertEquals(2, jCas.select(Token.class).covering(49, 52).count());
+  }
+
+  private void initRandomCas(CAS cas, int size) {
+    Random rnd = new Random();
+    List<Type> types = new ArrayList<Type>();
+    types.add(cas.getTypeSystem().getType(Token.class.getName()));
+    types.add(cas.getTypeSystem().getType(Sentence.class.getName()));
+
+    // Shuffle the types
+    for (int n = 0; n < 10; n++) {
+      Type t = types.remove(rnd.nextInt(types.size()));
+      types.add(t);
+    }
+
+    // Randomly generate annotations
+    for (int n = 0; n < size; n++) {
+      for (Type t : types) {
+        int begin = rnd.nextInt(100);
+        int end = begin + rnd.nextInt(30);
+        cas.addFsToIndexes(cas.createAnnotation(t, begin, end));
+      }
+    }
+  }
+
+  @SuppressWarnings("unused")
+  private void print(Collection<? extends Annotation> annos) {
+    for (Annotation a : annos) {
+      System.out.println(a.getClass().getSimpleName() + " " + a.getBegin() + " " + a.getEnd());
+    }
+  }
+
+  private Token add(JCas jcas, int begin, int end) {
+    Token t = new Token(jcas, begin, end);
+    t.addToIndexes();
+    new Sentence(jcas, begin, end).addToIndexes();
+    return t;
+  }
+
+  private void check(JCas jcas, Annotation t, Collection<? extends Annotation> a1,
+          Collection<? extends Annotation> a2) {
+    // List<Annotation> annos = new ArrayList<Annotation>();
+    // FSIterator fs = jcas.getAnnotationIndex().iterator();
+    // while (fs.hasNext()) {
+    // annos.add((Annotation) fs.next());
+    // }
+    //
+    // System.out.println("--- Index");
+    // print(annos);
+    // System.out.println("--- Container");
+    // print(Collections.singleton(t));
+    // System.out.println("--- Naive");
+    // print(a1);
+    // System.out.println("--- Optimized");
+    // print(a2);
+    assertEquals("Container: [" + t.getBegin() + ".." + t.getEnd() + "]", a1, a2);
+  }
+
+  @Test
+  public void testIterator() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    assertEquals(asList("Rot", "wood", "cheeses", "dew?"),
+        // uimaFIT: toText(JCasUtil.select(jCas, Token.class))
+        jCas.select(Token.class).map(AnnotationFS::getCoveredText).collect(Collectors.toList()));
+  }
+
+  @Test
+  public void testSelectByIndex() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, -1).getCoveredText()
+    assertEquals("dew?", jCas.select(Token.class).backwards().get(0).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, 3).getCoveredText()
+    assertEquals("dew?", jCas.select(Token.class).get(3).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText()
+    assertEquals("Rot", jCas.select(Token.class).get(0).getCoveredText());
+    // uimaFIT: JCasUtil.selectByIndex(jCas, Token.class, -4).getCoveredText()
+    assertEquals("Rot", jCas.select(Token.class).backwards().get(3).getCoveredText());
+    // uimaFIT: assertNull(JCasUtil.selectByIndex(jCas, Token.class, -5));
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jCas.select(Token.class).backwards().get(4))
+        .withMessage("CAS does not contain any '" + Token.class.getName() + "' instances  shifted by: 4.");
+    // uimaFIT: assertNull(JCasUtil.selectByIndex(jCas, Token.class, 4));
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jCas.select(Token.class).backwards().get(4))
+        .withMessage("CAS does not contain any '" + Token.class.getName() + "' instances  shifted by: 4.");
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Test
+  public void testSelectOnArrays() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    Collection<TOP> allFS = select(jCas, TOP.class);
+    FSArray allFSArray = new FSArray(jCas, allFS.size());
+    int i = 0;
+    for (FeatureStructure fs : allFS) {
+      allFSArray.set(i, fs);
+      i++;
+    }
+
+    // Print what is expected
+    for (FeatureStructure fs : allFS) {
+      System.out.println("Type: " + fs.getType().getName() + "]");
+    }
+    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
+
+    // Document Annotation, one sentence and 4 tokens.
+    assertEquals(6, allFS.size());
+
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(toText(select(jCas, Token.class)), toText(allFSArray.select(Token.class)));
+
+    assertEquals(toText((Iterable) jCas.select(Token.class)),
+            toText((Iterable) allFSArray.select(Token.class)));
+  }
+
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  @Test
+  public void testSelectOnLists() throws Exception {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    Collection<TOP> allFS = select(jCas, TOP.class);
+
+    // Building a list... OMG!
+    NonEmptyFSList allFSList = new NonEmptyFSList(jCas);
+    NonEmptyFSList head = allFSList;
+    Iterator<TOP> i = allFS.iterator();
+    while (i.hasNext()) {
+      head.setHead(i.next());
+      if (i.hasNext()) {
+        head.setTail(new NonEmptyFSList(jCas));
+        head = (NonEmptyFSList) head.getTail();
+      } else {
+        head.setTail(new EmptyFSList(jCas));
+      }
+    }
+
+    // Print what is expected
+    for (FeatureStructure fs : allFS) {
+      System.out.println("Type: " + fs.getType().getName() + "]");
+    }
+    System.out.println("Tokens: [" + toText(select(jCas, Token.class)) + "]");
+
+    // Document Annotation, one sentence and 4 tokens.
+    assertEquals(6, allFS.size());
+
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(toText(select(jCas, Token.class)), toText(allFSList.select(Token.class)));
+
+    assertEquals(toText((Iterable) select(jCas, Token.class)),
+            toText((Iterable) select(allFSList, Token.class)));
+  }
+
+  @Test
+  public void testToText() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+    // uimaFIT: toText(select(allFSArray, Token.class))
+    assertEquals(asList(text.split(" ")), toText(jCas.select(Token.class)));
+  }
+
+  @Test
+  public void testSelectSingleRelative() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectSingleRelative(jCas, Token.class, token.get(1), -1)
+    Token preceding =  jCas.select(Token.class).startAt(token.get(1)).get(-1);
+    assertEquals(token.get(0).getCoveredText(), preceding.getCoveredText());
+
+    // selectSingleRelative(jCas, Token.class, token.get(1), 1);
+    Token following = jCas.select(Token.class).startAt(token.get(1)).get(1);
+    assertEquals(token.get(2).getCoveredText(), following.getCoveredText());
+  }
+
+  @Test
+  public void testSingleRelativePreceedingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token lastToken = tokens.get(tokens.size()-1);
+    Token preLastToken = tokens.get(tokens.size()-2);
+    // uimaFIT selectSingleRelative(jCas, AnalyzedText.class, lastToken, -1);
+    AnalyzedText a = jCas.select(AnalyzedText.class).startAt(lastToken).shifted(-1).get();
+    assertEquals(preLastToken.getBegin(), a.getBegin());
+    assertEquals(preLastToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testSingleRelativeFollowingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    Token secondToken = tokens.get(1);
+    // uimaFIT: 
+    // AnalyzedText a = selectSingleRelative(jCas, AnalyzedText.class, firstToken, 1);
+    AnalyzedText a = jCas.select(AnalyzedText.class).startAt(firstToken).get(1);
+    assertEquals(secondToken.getBegin(), a.getBegin());
+    assertEquals(secondToken.getEnd(), a.getEnd());
+  }
+  
+  // Actually, in UIMAv3 this does not fail - and it is ok to not fail
+  @Deprecated()
+  @Test
+  public void testSingleRelativeDifferentTypeSamePositionFail() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingleRelative(jCas, AnalyzedText.class, firstToken, 0));
+    
+    assertThat(jCas.select(AnalyzedText.class).startAt(firstToken).shifted(0).get())
+        .isSameAs(jCas.select(AnalyzedText.class).get());
+  }
+
+  @Test
+  public void testSingleRelativeSameTypeSamePositionOk() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    // uimaFIT: selectSingleRelative(jCas, Token.class, firstToken, 0);
+    assertEquals(firstToken, jCas.select(Token.class).startAt(firstToken).shifted(0).get());
+  }
+
+  @Test
+  public void testSelectFollowing() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectFollowing(jCas, Token.class, token.get(1), 1).get(0).getCoveredText())
+    assertEquals(token.get(2).getCoveredText(), jCas.select(Token.class).following(token.get(1))
+            .get().getCoveredText());
+  }
+
+  @Test
+  public void testSelectPreceding() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+    List<Token> token = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectPreceding(jCas, Token.class, token.get(1), 1).get(0).getCoveredText());
+    assertEquals(token.get(0).getCoveredText(), jCas.select(Token.class).preceding(token.get(1))
+            .get().getCoveredText());
+  }
+
+  @Test
+  public void testSelectPrecedingWithOverlaps() {
+    String text = "a b c d e";
+    tokenBuilder.buildTokens(jCas, text);
+    new Token(jCas, 2, 7).addToIndexes();
+    
+    Token c = JCasUtil.selectAt(jCas, Token.class, 4, 5).get(0);
+
+    // uimaFIT: selectPreceding(jCas, Token.class, c, 2);
+    List<Token> preceedingTokens = jCas.select(Token.class).preceding(c).limit(2).asList();
+    
+    assertEquals(2, preceedingTokens.size());
+    assertEquals("b", preceedingTokens.get(1).getCoveredText());
+    assertEquals("a", preceedingTokens.get(0).getCoveredText());
+  }
+
+  @Test
+  public void testSelectPrecedingWithOverlaps2() {
+    jCas.setDocumentText("abcde");
+    new Token(jCas, 0, 1).addToIndexes();
+    new Token(jCas, 1, 2).addToIndexes();
+    new Token(jCas, 2, 3).addToIndexes();
+    new Token(jCas, 3, 4).addToIndexes();
+    new Token(jCas, 4, 5).addToIndexes();
+    new Token(jCas, 1, 3).addToIndexes();
+    
+    Token c = JCasUtil.selectAt(jCas, Token.class, 2, 3).get(0);
+
+    // selectPreceding(jCas, Token.class, c, 2);
+    List<Token> preceedingTokens = jCas.select(Token.class).preceding(c).limit(2).asList();
+    
+    assertEquals(2, preceedingTokens.size());
+    assertEquals("b", preceedingTokens.get(1).getCoveredText());
+    assertEquals("a", preceedingTokens.get(0).getCoveredText());
+  }
+
+  @Test
+  public void testPrecedingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token lastToken = tokens.get(tokens.size()-1);
+    Token preLastToken = tokens.get(tokens.size()-2);
+    // selectPreceding(jCas, AnalyzedText.class, lastToken, 1).get(0);
+    AnalyzedText a = jCas.select(AnalyzedText.class).preceding(lastToken).limit(1).get();
+    assertEquals(preLastToken.getBegin(), a.getBegin());
+    assertEquals(preLastToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testFollowingDifferentType() {
+    String text = "one two three";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+    
+    for (Token token : tokens) {
+      new AnalyzedText(jCas, token.getBegin(), token.getEnd()).addToIndexes();
+    }    
+    
+    Token firstToken = tokens.get(0);
+    Token secondToken = tokens.get(1);
+    // selectFollowing(jCas, AnalyzedText.class, firstToken, 1).get(0);
+    AnalyzedText a = jCas.select(AnalyzedText.class).following(firstToken).get();
+    assertEquals(secondToken.getBegin(), a.getBegin());
+    assertEquals(secondToken.getEnd(), a.getEnd());
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingBuiltinTypes() {
+    this.jCas.setDocumentText("A B C");
+    // remove the DocumentAnnotation
+    for (Annotation ann : JCasUtil.select(jCas, Annotation.class)) {
+      ann.removeFromIndexes();
+    }
+    Annotation a = new Annotation(this.jCas, 0, 1);
+    Annotation b = new Annotation(this.jCas, 2, 3);
+    Annotation c = new Annotation(this.jCas, 4, 5);
+    for (Annotation ann : Arrays.asList(a, b, c)) {
+      ann.addToIndexes();
+    }
+
+    // uimaFIT: selectPreceding(this.jCas, Annotation.class, b, 2));
+    assertEquals(Arrays.asList(a), jCas.select(Annotation.class).preceding(b).limit(2).asList());
+    // uimaFIT: Arrays.asList(a, b), selectPreceding(this.jCas, Annotation.class, c, 2));
+    // Produces the wrong order
+    assertEquals(Arrays.asList(a, b), jCas.select(Annotation.class).preceding(c).limit(2).asList());
+    // uimaFIT: Arrays.asList(b, c), selectFollowing(this.jCas, Annotation.class, a, 2));
+    assertEquals(Arrays.asList(b, c), jCas.select(Annotation.class).following(a).limit(2).asList());
+    // uimaFIT: Arrays.asList(c), selectFollowing(this.jCas, Annotation.class, b, 2));
+    assertEquals(Arrays.asList(c), jCas.select(Annotation.class).following(b).limit(2).asList());
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingDifferentTypes() {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token c = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, c, d, e)) {
+      token.addToIndexes();
+    }
+    Sentence sentence = new Sentence(this.jCas, 2, 5);
+    sentence.addToIndexes();
+
+    // uimaFIT: selectPreceding(this.jCas, Token.class, sentence, 1)
+    List<Token> preceding = jCas.select(Token.class).preceding(sentence).limit(1).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+    // uimaFIT: selectPreceding(this.jCas, Token.class, sentence, 2)
+    preceding = jCas.select(Token.class).preceding(sentence).limit(2).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 1);
+    List<Token> following1 = jCas.select(Token.class).following(sentence).limit(1).asList();
+    assertEquals(Arrays.asList("D"), JCasUtil.toText(following1));
+    assertEquals(Arrays.asList(d), following1);
+    
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 2);
+    List<Token> following2 = jCas.select(Token.class).following(sentence).limit(2).asList();
+    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following2));
+    assertEquals(Arrays.asList(d, e), following2);
+    
+    // uimaFIT: selectFollowing(this.jCas, Token.class, sentence, 3);
+    List<Token> following3 = jCas.select(Token.class).following(sentence).limit(3).asList();
+    assertEquals(Arrays.asList("D", "E"), JCasUtil.toText(following3));
+    assertEquals(Arrays.asList(d, e), following3);
+  }
+
+  @Test
+  public void testSelectFollowingPrecedingDifferentTypesMatchingSpansReversePriorities() {
+    this.jCas.setDocumentText("A B C D E");
+    Sentence a = new Sentence(this.jCas, 0, 1);
+    Sentence b = new Sentence(this.jCas, 2, 3);
+    Sentence c = new Sentence(this.jCas, 4, 5);
+    Sentence d = new Sentence(this.jCas, 6, 7);
+    Sentence e = new Sentence(this.jCas, 8, 9);
+    for (Sentence sentence : Arrays.asList(a, b, c, d, e)) {
+      sentence.addToIndexes();
+    }
+    AnalyzedText text = new AnalyzedText(this.jCas, 2, 3);
+    text.addToIndexes();
+
+    // uimaFIT: selectPreceding(this.jCas, Sentence.class, text, 1);
+    List<Sentence> preceding = jCas.select(Sentence.class).preceding(text).limit(1).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+    // uimaFIT: selectPreceding(this.jCas, Sentence.class, text, 2);
+    preceding = jCas.select(Sentence.class).preceding(text).limit(2).asList();
+    assertEquals(Arrays.asList("A"), JCasUtil.toText(preceding));
+    assertEquals(Arrays.asList(a), preceding);
+
+    // uimaFIT: selectFollowing(this.jCas, Sentence.class, text, 1);
+    List<Sentence> following = jCas.select(Sentence.class).following(text).limit(1).asList();
+    assertEquals(Arrays.asList("C"), JCasUtil.toText(following));
+    assertEquals(Arrays.asList(c), following);
+    // uimaFIT: selectFollowing(this.jCas, Sentence.class, text, 2);
+    following = jCas.select(Sentence.class).following(text).limit(2).asList();
+    assertEquals(Arrays.asList("C", "D"), JCasUtil.toText(following));
+    assertEquals(Arrays.asList(c, d), following);
+  }
+
+  @Test
+  public void testExists() throws UIMAException {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    // uimaFIT: exists(jcas, Token.class)
+    assertFalse(jcas.select(Token.class).findAny().isPresent());
+
+    new Token(jcas, 0, 1).addToIndexes();
+
+    // uimaFIT: exists(jcas, Token.class)
+    assertTrue(jcas.select(Token.class).findAny().isPresent());
+  }
+
+  @Test
+  public void testSelectSingle() throws UIMAException {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingle(jcas, Token.class)); 
+    
+    assertThatExceptionOfType(CASRuntimeException.class)
+        .isThrownBy(() -> jcas.select(Token.class).single()); 
+
+    new Token(jcas, 0, 1).addToIndexes();
+
+    // uimaFIT: selectSingle(jcas, Token.class);
+    jcas.select(Token.class).single();
+
+    new Token(jcas, 1, 2).addToIndexes();
+
+    // uimaFIT:
+    // assertThatExceptionOfType(IllegalArgumentException.class)
+    //    .isThrownBy(() -> selectSingle(jcas, Token.class))
+    //    .as("selectSingle must fail if there is more than one annotation of the type"); 
+
+    assertThatExceptionOfType(CASRuntimeException.class)
+      .isThrownBy(() -> jcas.select(Token.class).single())
+      .as("selectSingle must fail if there is more than one annotation of the type"); 
+  }
+
+  @Test
+  public void testSelectIsCovered() {
+    String text = "Will you come home today ? \n No , tomorrow !";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+
+    // uimaFIT: selectCovered(Token.class, sentences.get(0)).size()
+    assertEquals(6, jCas.select(Token.class).coveredBy(sentences.get(0)).count());
+    // uimaFIT: selectCovered(Token.class, sentences.get(1)).size()
+    assertEquals(4, jCas.select(Token.class).coveredBy(sentences.get(1)).count());
+
+    // uimaFIT: contains(jCas, sentences.get(0), Token.class)
+    assertTrue(jCas.select(Token.class).coveredBy(sentences.get(0)).findAny().isPresent());
+    tokens.get(0).removeFromIndexes();
+    tokens.get(1).removeFromIndexes();
+    tokens.get(2).removeFromIndexes();
+    tokens.get(3).removeFromIndexes();
+    tokens.get(4).removeFromIndexes();
+    tokens.get(5).removeFromIndexes();
+    // uimaFIT: contains(jCas, sentences.get(0), Token.class)
+    assertFalse(jCas.select(Token.class).coveredBy(sentences.get(0)).findAny().isPresent());
+  }
+
+  @Test
+  public void testGetInternalUimaType() {
+    // uimaFIT: getType(jCas, Annotation.class);
+    Type t = jCas.getCasType(Annotation.class);
+    assertNotNull(t);
+  }
+
+  @Test
+  public void testGetView() throws Exception {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+
+    assertNull(getView(jcas, "view1", null));
+    assertNotNull(getView(jcas, "view1", true));
+    assertNotNull(getView(jcas, "view1", null));
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testGetNonExistingView() throws Exception {
+    JCas jcas = CasCreationUtils.createCas(createTypeSystemDescription(), null, null).getJCas();
+    assertNull(getView(jcas, "view1", false));
+  }
+
+  @Test
+  public void testGetType() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // uimaFIT: getType(jCas, Token.class).getName());
+    assertEquals(Token.class.getName(), jCas.getCasType(Token.class).getName());
+    // uimaFIT: getAnnotationType(jCas, Token.class).getName());
+    assertEquals(Token.class.getName(), jCas.getCasType(Token.class).getName());
+    // uimaFIT: getType(jCas, TOP.class).getName());
+    assertEquals("uima.cas.TOP", jCas.getCasType(TOP.class).getName());
+    // uimaFIT: getType(jCas, Annotation.class).getName());
+    assertEquals("uima.tcas.Annotation", jCas.getCasType(Annotation.class).getName());
+    // uimaFIT: getAnnotationType(jCas, Annotation.class).getName());
+    assertEquals("uima.tcas.Annotation", jCas.getCasType(Annotation.class).getName());
+  }
+
+  @Test(expected = IllegalArgumentException.class)
+  public void testGetNonAnnotationType() {
+    String text = "Rot wood cheeses dew?";
+    tokenBuilder.buildTokens(jCas, text);
+
+    // There is no alternative in UIMA v3
+    getAnnotationType(jCas, TOP.class);
+  }
+
+  @Test
+  public void testIndexCovering() throws Exception {
+    String text = "Will you come home today ? \n No , tomorrow !";
+    tokenBuilder.buildTokens(jCas, text);
+
+    List<Sentence> sentences = new ArrayList<Sentence>(select(jCas, Sentence.class));
+    List<Token> tokens = new ArrayList<Token>(select(jCas, Token.class));
+
+    Map<Token, List<Sentence>> index = indexCovering(jCas, Token.class, Sentence.class);
+
+    // Check covering annotations are found
+    assertEquals(asList(sentences.get(0)), index.get(tokens.get(0)));
+    assertEquals(asList(sentences.get(1)), index.get(tokens.get(tokens.size() - 1)));
+
+    // Check sentence 0 contains first token
+    assertTrue(index.get(tokens.get(0)).contains(sentences.get(0)));
+
+    // Check sentence 0 does not contain last token.
+    assertFalse(index.get(tokens.get(tokens.size() - 1)).contains(sentences.get(0)));
+
+    // Check the first token is contained in any sentence
+    assertTrue(!index.get(tokens.get(0)).isEmpty());
+    // After removing the annotation the index has to be rebuilt.
+    sentences.get(0).removeFromIndexes();
+    index = indexCovering(jCas, Token.class, Sentence.class);
+    // Check the first token is not contained in any sentence
+    assertFalse(!index.get(tokens.get(0)).isEmpty());
+  }
+  
+  @Test
+  public void testSelectAt() throws Exception {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token bc = new Token(this.jCas, 2, 5);
+    Token c = new Token(this.jCas, 4, 5);
+    Token c1 = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 4, 7);
+    Token cd = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, bc, c, c1, d, cd, e)) {
+      token.addToIndexes();
+    }
+
+    List<Token> tokensAt = selectAt(jCas, Token.class, c.getBegin(), c.getEnd());
+    
+    assertEquals(2, tokensAt.size());
+    assertEquals(c.getBegin(), tokensAt.get(0).getBegin());
+    assertEquals(c.getEnd(), tokensAt.get(0).getEnd());
+    assertEquals(c.getBegin(), tokensAt.get(1).getBegin());
+    assertEquals(c.getEnd(), tokensAt.get(1).getEnd());
+  }
+
+  @Test
+  public void testSelectSingleAt() throws Exception {
+    this.jCas.setDocumentText("A B C D E");
+    Token a = new Token(this.jCas, 0, 1);
+    Token b = new Token(this.jCas, 2, 3);
+    Token bc = new Token(this.jCas, 2, 5);
+    Token c = new Token(this.jCas, 4, 5);
+    Token c1 = new Token(this.jCas, 4, 5);
+    Token d = new Token(this.jCas, 4, 7);
+    Token cd = new Token(this.jCas, 6, 7);
+    Token e = new Token(this.jCas, 8, 9);
+    for (Token token : Arrays.asList(a, b, bc, c, c1, d, cd, e)) {
+      token.addToIndexes();
+    }
+
+    try {
+      selectSingleAt(jCas, Token.class, c.getBegin(), c.getEnd());
+      fail("Expected exception not thrown");
+    }
+    catch (IllegalArgumentException ex) {
+      // Ignore.
+    }
+
+    try {
+      selectSingleAt(jCas, Token.class, 1, 4);
+      fail("Expected exception not thrown");
+    }
+    catch (IllegalArgumentException ex) {
+      // Ignore.
+    }
+
+    Token tokenAt = selectSingleAt(jCas, Token.class, b.getBegin(), b.getEnd());
+  
+    assertEquals(b.getBegin(), tokenAt.getBegin());
+    assertEquals(b.getEnd(), tokenAt.getEnd());
+  }
+}
diff --git a/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump b/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
index c5e54c3..915b808 100644
--- a/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
+++ b/uimafit-core/src/test/resources/data/reference/JCasBuilderTest.dump
@@ -2,7 +2,7 @@
 
 -------- View _InitialView begin ----------------------------------
 
-DocumentAnnotation
+DocumentAnnotation:10
    sofa: _InitialView
    begin: 0
    end: 89
@@ -11,52 +11,52 @@
 CAS-Text:
 This sentence is not annotated. But this sentences is annotated. And here every token is.
 [But this sentences is annotated. ]
-Sentence
+Sentence:2
    sofa: _InitialView
    begin: 32
    end: 65
 [And here every token is.]
-Sentence
+Sentence:9
    sofa: _InitialView
    begin: 65
    end: 89
 [And]
-Token
+Token:3
    sofa: _InitialView
    begin: 65
    end: 68
    pos: <null>
    stem: <null>
 [here]
-Token
+Token:4
    sofa: _InitialView
    begin: 69
    end: 73
    pos: <null>
    stem: <null>
 [every]
-Token
+Token:5
    sofa: _InitialView
    begin: 74
    end: 79
    pos: <null>
    stem: <null>
 [token]
-Token
+Token:6
    sofa: _InitialView
    begin: 80
    end: 85
    pos: <null>
    stem: <null>
 [is]
-Token
+Token:7
    sofa: _InitialView
    begin: 86
    end: 88
    pos: <null>
    stem: <null>
 [.]
-Token
+Token:8
    sofa: _InitialView
    begin: 88
    end: 89
@@ -64,6 +64,4 @@
    stem: <null>
 -------- View _InitialView end ----------------------------------
 
-======== CAS 0 end ==================================
-
-
+======== CAS 0 end ==================================
\ No newline at end of file
diff --git a/uimafit-core/src/test/resources/data/reference/test.xmi.dump b/uimafit-core/src/test/resources/data/reference/test.xmi.dump
index 6751fba..fa193bf 100644
--- a/uimafit-core/src/test/resources/data/reference/test.xmi.dump
+++ b/uimafit-core/src/test/resources/data/reference/test.xmi.dump
@@ -2,7 +2,7 @@
 
 -------- View _InitialView begin ----------------------------------
 
-DocumentAnnotation
+DocumentAnnotation:2
    sofa: _InitialView
    begin: 0
    end: 42
@@ -11,75 +11,75 @@
 CAS-Text:
 Me and all my friends are non-conformists.
 [Me and all my friends are non-conformists.]
-Sentence
+Sentence:13
    sofa: _InitialView
    begin: 0
    end: 42
 [Me]
-Token
+Token:3
    sofa: _InitialView
    begin: 0
    end: 2
    pos: "M"
    stem: "me"
 [and]
-Token
+Token:4
    sofa: _InitialView
    begin: 3
    end: 6
    pos: "A"
    stem: "and"
 [all]
-Token
+Token:5
    sofa: _InitialView
    begin: 7
    end: 10
    pos: "A"
    stem: "all"
 [my]
-Token
+Token:6
    sofa: _InitialView
    begin: 11
    end: 13
    pos: "M"
    stem: "my"
 [friends]
-Token
+Token:7
    sofa: _InitialView
    begin: 14
    end: 21
    pos: "F"
    stem: "friend"
 [are]
-Token
+Token:8
    sofa: _InitialView
    begin: 22
    end: 25
    pos: "A"
    stem: "are"
 [non]
-Token
+Token:9
    sofa: _InitialView
    begin: 26
    end: 29
    pos: "N"
    stem: "non"
 [-]
-Token
+Token:10
    sofa: _InitialView
    begin: 29
    end: 30
    pos: "-"
    stem: "-"
 [conformists]
-Token
+Token:11
    sofa: _InitialView
    begin: 30
    end: 41
    pos: "C"
    stem: "conformist"
 [.]
-Token
+Token:12
    sofa: _InitialView
    begin: 41
    end: 42
@@ -87,6 +87,4 @@
    stem: "."
 -------- View _InitialView end ----------------------------------
 
-======== CAS 0 end ==================================
-
-
+======== CAS 0 end ==================================
\ No newline at end of file
diff --git a/uimafit-core/src/test/resources/log4j.properties b/uimafit-core/src/test/resources/log4j.properties
deleted file mode 100644
index cd41466..0000000
--- a/uimafit-core/src/test/resources/log4j.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-log4j.rootLogger=WARN,development
-
-log4j.appender.development=org.apache.log4j.ConsoleAppender
-log4j.appender.development.layout=org.apache.log4j.PatternLayout
-log4j.appender.development.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] (%C{1}) - %m%n
diff --git a/uimafit-core/src/test/resources/simplelogger.properties b/uimafit-core/src/test/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-core/src/test/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-cpe/.settings/org.eclipse.jdt.core.prefs b/uimafit-cpe/.settings/org.eclipse.jdt.core.prefs
index 8fe19c5..1e40e06 100644
--- a/uimafit-cpe/.settings/org.eclipse.jdt.core.prefs
+++ b/uimafit-cpe/.settings/org.eclipse.jdt.core.prefs
@@ -1,12 +1,14 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 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.7
+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
diff --git a/uimafit-cpe/pom.xml b/uimafit-cpe/pom.xml
index 40d0d79..1a35661 100644
--- a/uimafit-cpe/pom.xml
+++ b/uimafit-cpe/pom.xml
@@ -1,49 +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.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>2.5.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>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-	</dependencies>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.0.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-cpe</artifactId>
+  <name>Apache UIMA uimaFIT - Collection Processing Engine support</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-cpe</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+  </dependencies>
 </project>
\ No newline at end of file
diff --git a/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java b/uimafit-cpe/src/main/java/org/apache/uima/fit/cpe/CpePipeline.java
index 4d81500..9089937 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
@@ -24,7 +24,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;
@@ -33,6 +32,8 @@
 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;
 
 /**
@@ -59,12 +60,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 CollectionReaderDescription readerDesc,
-          final AnalysisEngineDescription... descs) throws UIMAException, SAXException,
-          CpeDescriptorException, IOException {
+          final AnalysisEngineDescription... descs)
+          throws SAXException, CpeDescriptorException, IOException, ResourceInitializationException,
+          InvalidXMLException, AnalysisEngineProcessException {
     // Create AAE
     final AnalysisEngineDescription aaeDesc = createEngineDescription(descs);
 
@@ -98,6 +104,7 @@
 
     private boolean isProcessing = true;
 
+    @Override
     public void entityProcessComplete(CAS arg0, EntityProcessStatus arg1) {
       if (arg1.isException()) {
         for (Exception e : arg1.getExceptions()) {
@@ -106,6 +113,7 @@
       }
     }
 
+    @Override
     public void aborted() {
       synchronized (this) {
         if (isProcessing) {
@@ -115,10 +123,12 @@
       }
     }
 
+    @Override
     public void batchProcessComplete() {
       // Do nothing
     }
 
+    @Override
     public void collectionProcessComplete() {
       synchronized (this) {
         if (isProcessing) {
@@ -128,14 +138,17 @@
       }
     }
 
+    @Override
     public void initializationComplete() {
       // Do nothing
     }
 
+    @Override
     public void paused() {
       // Do nothing
     }
 
+    @Override
     public void resumed() {
       // Do nothing
     }
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 eae4b9e..bfcc0f5 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,
@@ -76,8 +76,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));
@@ -92,8 +92,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,
@@ -115,8 +115,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,
@@ -136,17 +136,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 });
 
@@ -262,14 +262,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;
     }
@@ -282,11 +285,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);
     }
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-docbook/pom.xml b/uimafit-docbook/pom.xml
index 6b8080f..dd70617 100644
--- a/uimafit-docbook/pom.xml
+++ b/uimafit-docbook/pom.xml
@@ -1,36 +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
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this 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.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>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.0.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-docbook</artifactId>
+  <name>Apache UIMA uimaFIT - Documentation</name>
+  <packaging>pom</packaging>
+  <properties>
+    <uimaScmProject>${project.artifactId}</uimaScmProject>
+    <bookNameRoot>tools.uimafit.book</bookNameRoot>
+    <maven.deploy.skip>true</maven.deploy.skip>
+  </properties>
 </project>
\ No newline at end of file
diff --git a/uimafit-docbook/src/docbook/tools.uimafit.migration.xml b/uimafit-docbook/src/docbook/tools.uimafit.migration.xml
index b804137..9da8ac0 100644
--- a/uimafit-docbook/src/docbook/tools.uimafit.migration.xml
+++ b/uimafit-docbook/src/docbook/tools.uimafit.migration.xml
@@ -20,6 +20,57 @@
   <title>Migration Guide</title>
   <para>This section provides helpful information on incompatible changes between versions.</para>
   <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 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>
@@ -161,66 +212,4 @@
         The new methods in <literal>CasIOUtil</literal> can be used instead.</para>
     </formalpara>
   </section>
-  <section>
-    <title>Legacy support module</title>
-    <para>The compatibility layer should allow you to migrate to uimaFIT <?eval ${project.version}?> without breaking
-      anything. You should then be able to gradually change the codebase to be compatible with
-      uimaFIT <?eval ${project.version}?>. As far as my tests go, uimaFIT 1.x and <?eval ${project.version}?> can coexist peacefully on the
-      classpath (and indeed both need to be on the classpath in order to use the legacy support
-      module).</para>
-    <para>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:</para>
-    <programlisting>&lt;dependency>
-  &lt;groupId>org.uimafit&lt;/groupId>
-  &lt;artifactId>uimafit&lt;/artifactId>
-  &lt;version>1.4.0&lt;/version>
-&lt;/dependency>
-&lt;dependency>
-  &lt;groupId>org.apache.uima&lt;/groupId>
-  &lt;artifactId>uimafit-legacy-support&lt;/artifactId>
-  &lt;version><?eval ${project.version}?>&lt;/version>
-&lt;/dependency></programlisting>
-    <para>uimaFIT <?eval ${project.version}?> automatically detects the presence of the legacy module and uses it - no
-      additional configuration is necessary.</para>
-    <para>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!</para>
-    <note>
-      <para>The script recursively changes all files under the current working directory! Make
-      sure you are in the right directory before running it! <emphasis>Use the script at your own 
-      risk!</emphasis></para>
-    </note>
-    <programlisting>#!/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'
-</programlisting>    
-  </section>
 </chapter>
diff --git a/uimafit-examples/.settings/org.eclipse.jdt.core.prefs b/uimafit-examples/.settings/org.eclipse.jdt.core.prefs
index 737cd0d..225e1bc 100644
--- a/uimafit-examples/.settings/org.eclipse.jdt.core.prefs
+++ b/uimafit-examples/.settings/org.eclipse.jdt.core.prefs
@@ -1,9 +1,11 @@
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+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.7
+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
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 7614557..ca1564a 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.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>2.5.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>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.0.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>uimafit-examples</artifactId>
+  <name>Apache UIMA uimaFIT - Examples</name>
+  <description>Factories, Injection, and Testing library for UIMA</description>
+  <url>${uimaWebsiteUrl}</url>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+    </dependency>    
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.uima</groupId>
+        <artifactId>jcasgen-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <typeSystemIncludes>
+                <typeSystemInclude>src/main/resources/org/apache/uima/fit/examples/TypeSystem.xml</typeSystemInclude>
+              </typeSystemIncludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <!--
+            This plug-in adds the jcasgen generated source code folder as a project
+            source folder
+        -->
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>add-test-source</id>
+            <phase>process-resources</phase>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
+            <configuration>
+              <sources>
+                <source>${project.build.directory}/generated-sources/jcasgen</source>
+              </sources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <exclude>org/uimafit/tutorial/AbstractTest.java</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.rat</groupId>
+          <artifactId>apache-rat-plugin</artifactId>
+          <executions>
+            <execution>
+              <id>default-cli</id>
+              <configuration>
+                <excludes>
+                  <exclude>release.properties</exclude>
+                  <!-- These example are unreasonable to bear a license header -->
+                  <exclude>src/main/resources/org/apache/uima/fit/examples/pos/sample-gold.txt</exclude>
+                  <exclude>src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt</exclude>
+                  <!-- These test files are unreasonable to bear a license header -->
+                  <exclude>src/test/resources/org/apache/uima/fit/examples/xmi/1.xmi</exclude>
+                  <!-- These configuration files cannot bear a license header -->
+                  <exclude>src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
+                  <!-- Logging configuration files -->
+                  <exclude>src/main/resources/simplelogger.properties</exclude>
+                </excludes>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
 </project>
\ No newline at end of file
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
index 9374f45..3990cee 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 
 import java.io.File;
 
@@ -48,6 +48,7 @@
   public static final class SharedModel implements SharedResourceObject {
     private String uri;
 
+    @Override
     public void load(DataResource aData) throws ResourceInitializationException {
       uri = aData.getUri().toString();
     }
@@ -79,8 +80,8 @@
    * Illustrate how to configure the annotator with the shared model object.
    */
   public static void main(String[] args) throws Exception {
-    ExternalResourceDescription extDesc = createExternalResourceDescription(SharedModel.class,
-            new File("somemodel.bin"));
+    ExternalResourceDescription extDesc = createSharedResourceDescription(
+            new File("somemodel.bin"), SharedModel.class);
 
     // Binding external resource to each Annotator individually
     AnalysisEngineDescription aed1 = createEngineDescription(Annotator.class, Annotator.RES_MODEL,
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
index d0d0935..c463875 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample2.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResource;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.bindResourceUsingUrl;
 
 import java.io.File;
 
@@ -46,6 +46,7 @@
   public static final class SharedModel implements SharedResourceObject {
     private String uri;
 
+    @Override
     public void load(DataResource aData) throws ResourceInitializationException {
       uri = aData.getUri().toString();
     }
@@ -85,8 +86,8 @@
 
     // Bind external resource to the aggregate
     AnalysisEngineDescription aaed = createEngineDescription(aed1, aed2);
-    bindResource(aaed, Annotator.RES_MODEL, SharedModel.class, new File("somemodel.bin").toURI()
-            .toURL().toString());
+    bindResourceUsingUrl(aaed, Annotator.RES_MODEL, SharedModel.class,
+            new File("somemodel.bin").toURI().toURL().toString());
 
     // Check the external resource was injected
     AnalysisEngine ae = createEngine(aaed);
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
index 604def9..baa30d2 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/resource/ExternalResourceExample3.java
@@ -21,7 +21,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createResourceDescription;
 
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
@@ -73,9 +73,9 @@
     AnalysisEngineDescription aed = createEngineDescription(
             Annotator2.class,
             Annotator2.RES_MODEL,
-            createExternalResourceDescription(ChainableResource.class,
+            createResourceDescription(ChainableResource.class,
                     ChainableResource.RES_CHAINED_RESOURCE,
-                    createExternalResourceDescription(ChainableResource.class)));
+                    createResourceDescription(ChainableResource.class)));
 
     // Check the external resource was injected
     AnalysisEngine ae = createEngine(aed);
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
index feeb4b3..2c76941 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex2/RoomNumberAnnotator.java
@@ -28,7 +28,6 @@
 import org.apache.uima.fit.descriptor.TypeCapability;
 import org.apache.uima.fit.examples.tutorial.type.RoomNumber;
 import org.apache.uima.jcas.JCas;
-import org.apache.uima.util.Level;
 
 /**
  * This class demonstrates annotating member variables with the @ConfigurationParameter annotation.
@@ -74,7 +73,7 @@
         RoomNumber annotation = new RoomNumber(aJCas, matcher.start(), matcher.end());
         annotation.setBuilding(mLocations[i]);
         annotation.addToIndexes();
-        getContext().getLogger().log(Level.FINEST, "Found: " + annotation);
+        getLogger().debug("Found: {}", annotation);
       }
     }
   }
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
index 89a595c..868e20d 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaAcronymAnnotator.java
@@ -19,7 +19,8 @@
 package org.apache.uima.fit.examples.tutorial.ex6;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.util.StringTokenizer;
@@ -74,8 +75,9 @@
     AnalysisEngineDescription aed = createEngineDescription(
             UimaAcronymAnnotator.class,
             UimaAcronymAnnotator.RES_ACRONYM_TABLE,
-            createExternalResourceDescription(StringMapResource_impl.class,
-                    "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt"));
+            createSharedResourceDescription(
+                    "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+                    StringMapResource_impl.class));
     
     aed.toXML(new FileOutputStream(new File(outputDirectory, "UimaAcronymAnnotator.xml")));
   }
diff --git a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
index e2fa8b4..cb16058 100644
--- a/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
+++ b/uimafit-examples/src/main/java/org/apache/uima/fit/examples/tutorial/ex6/UimaMeetingAnnotator.java
@@ -19,7 +19,7 @@
 package org.apache.uima.fit.examples.tutorial.ex6;
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 import static org.apache.uima.fit.util.JCasUtil.select;
 
 import java.io.File;
@@ -111,9 +111,9 @@
     File outputDirectory = new File("target/examples/tutorial/ex6/");
     outputDirectory.mkdirs();
 
-    ExternalResourceDescription resource = createExternalResourceDescription(
-            StringMapResource_impl.class,
-            "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt");
+    ExternalResourceDescription resource = createSharedResourceDescription(
+            "file:org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+            StringMapResource_impl.class);
 
     AggregateBuilder builder = new AggregateBuilder();
     builder.add(createEngineDescription(UimaAcronymAnnotator.class,
diff --git a/uimafit-examples/src/main/resources/simplelogger.properties b/uimafit-examples/src/main/resources/simplelogger.properties
new file mode 100644
index 0000000..cd90c2a
--- /dev/null
+++ b/uimafit-examples/src/main/resources/simplelogger.properties
@@ -0,0 +1 @@
+org.slf4j.simpleLogger.defaultLogLevel=warn
diff --git a/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java b/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
index 40cba4f..3faacfc 100644
--- a/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
+++ b/uimafit-examples/src/test/java/org/apache/uima/fit/examples/tutorial/ex6/Example6Test.java
@@ -20,7 +20,7 @@
 
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine;
 import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription;
-import static org.apache.uima.fit.factory.ExternalResourceFactory.createExternalResourceDescription;
+import static org.apache.uima.fit.factory.ExternalResourceFactory.createSharedResourceDescription;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -39,9 +39,9 @@
   @Test
   public void test1() throws Exception {
     // This resource is shared between the UimaAcronymAnnotator and UimaMeetingAnnotator
-    ExternalResourceDescription resource = createExternalResourceDescription(
-            StringMapResource_impl.class,
-            "file:src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt");
+    ExternalResourceDescription resource = createSharedResourceDescription(
+            "file:src/main/resources/org/apache/uima/fit/examples/tutorial/ex6/uimaAcronyms.txt",
+            StringMapResource_impl.class);
 
     AggregateBuilder builder = new AggregateBuilder();
     builder.add(createEngineDescription(UimaAcronymAnnotator.class,
diff --git a/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs b/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 737cd0d..0000000
--- a/uimafit-legacy-support/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,286 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.7
-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 c672e1d..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.0-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.0-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 9ab01f3..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 <tt>AnnotationLiteral</tt>.
- * </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 3f78f75..0000000
--- a/uimafit-legacy-support/src/test/java/org/apache/uima/fit/component/ViewCreatorAnnotatorTest.java
+++ /dev/null
@@ -1,177 +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.
-   */
-  @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.
-   */
-  @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");
-    engine.process(jCas);
-  }
-
-  /**
-   * This test demonstrates that running the viewCreator is doing the right thing (i.e. initializing
-   * the view "myView")
-   */
-  @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 e6af395..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 enginge 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 70ac7d9..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 8a866d6..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 d0c7343..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 f11210c..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/.settings/org.eclipse.jdt.core.prefs b/uimafit-maven-plugin/.settings/org.eclipse.jdt.core.prefs
index 737cd0d..225e1bc 100644
--- a/uimafit-maven-plugin/.settings/org.eclipse.jdt.core.prefs
+++ b/uimafit-maven-plugin/.settings/org.eclipse.jdt.core.prefs
@@ -1,9 +1,11 @@
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+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.7
+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
diff --git a/uimafit-maven-plugin/pom.xml b/uimafit-maven-plugin/pom.xml
index e56476f..9bc6b41 100644
--- a/uimafit-maven-plugin/pom.xml
+++ b/uimafit-maven-plugin/pom.xml
@@ -1,172 +1,174 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-	Licensed to the Apache Software Foundation (ASF) under one
-	or more contributor license agreements. See the NOTICE file
-	distributed with this work for additional information
-	regarding copyright ownership. The ASF licenses this file
-	to you under the Apache License, Version 2.0 (the
-	"License"); you may not use this file except in compliance
-	with the License. You may obtain a copy of the License at
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements. See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership. The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License. You may obtain a copy of the License at
 
-	http://www.apache.org/licenses/LICENSE-2.0
+  http://www.apache.org/licenses/LICENSE-2.0
 
-	Unless required by applicable law or agreed to in writing,
-	software distributed under the License is distributed on an
-	"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-	KIND, either express or implied. See the License for the
-	specific language governing permissions and limitations
-	under the License.
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied. See the License for the
+  specific language governing permissions and limitations
+  under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>org.apache.uima</groupId>
-		<artifactId>uimafit-parent</artifactId>
-		<version>2.5.0-SNAPSHOT</version>
-		<relativePath>../uimafit-parent</relativePath>
-	</parent>
-	<artifactId>uimafit-maven-plugin</artifactId>
-	<name>Apache UIMA uimaFIT - Maven Plugin</name>
-	<packaging>maven-plugin</packaging>
-	<licenses>
-		<license>
-			<name>Apache License, Version 2.0</name>
-			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-			<distribution>repo</distribution>
-		</license>
-	</licenses>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.uima</groupId>
+    <artifactId>uimafit-parent</artifactId>
+    <version>3.0.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <artifactId>uimafit-maven-plugin</artifactId>
+  <name>Apache UIMA uimaFIT - Maven Plugin</name>
+  <packaging>maven-plugin</packaging>
+  <url>${uimaWebsiteUrl}</url>
+  <inceptionYear>2012</inceptionYear>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
 
-	<properties>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>commons-io</groupId>
-			<artifactId>commons-io</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>commons-lang</groupId>
-			<artifactId>commons-lang</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimaj-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>2.5.0-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.javassist</groupId>
-			<artifactId>javassist</artifactId>
-			<version>3.19.0-GA</version>
-		</dependency>
+  <dependencies>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.javassist</groupId>
+      <artifactId>javassist</artifactId>
+      <version>3.19.0-GA</version>
+    </dependency>
 
-		<!-- Dependencies on the Maven Plugin API and friends -->
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-plugin-api</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-core</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-artifact</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-model</artifactId>
-			<version>3.0</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.maven.plugin-tools</groupId>
-			<artifactId>maven-plugin-annotations</artifactId>
-			<version>3.2</version>
-			<scope>provided</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.codehaus.plexus</groupId>
-			<artifactId>plexus-utils</artifactId>
-			<version>2.0.4</version>
-		</dependency>
-		<dependency>
-			<groupId>org.sonatype.plexus</groupId>
-			<artifactId>plexus-build-api</artifactId>
-			<version>0.0.7</version>
-		</dependency>
+    <!-- Dependencies on the Maven Plugin API and friends -->
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+      <version>3.0</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>2.0.4</version>
+    </dependency>
+    <dependency>
+      <groupId>org.sonatype.plexus</groupId>
+      <artifactId>plexus-build-api</artifactId>
+      <version>0.0.7</version>
+    </dependency>
 
-		<!-- Dependencies for accessing JavaDoc -->
-		<dependency>
-			<groupId>com.thoughtworks.qdox</groupId>
-			<artifactId>qdox</artifactId>
-			<version>1.12.1</version>
-		</dependency>
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<version>11.0.1</version>
-		</dependency>
-	</dependencies>
+    <!-- Dependencies for accessing JavaDoc -->
+    <dependency>
+      <groupId>com.thoughtworks.qdox</groupId>
+      <artifactId>qdox</artifactId>
+      <version>1.12.1</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>11.0.1</version>
+    </dependency>
+  </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<artifactId>maven-invoker-plugin</artifactId>
-				<configuration>
-					<debug>true</debug>
-					<projectsDirectory>src/it</projectsDirectory>
-					<cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
-					<pomIncludes>
-						<pomInclude>*/pom.xml</pomInclude>
-					</pomIncludes>
-					<postBuildHookScript>verify</postBuildHookScript>
-					<localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-					<settingsFile>src/it/settings.xml</settingsFile>
-					<goals>
-						<goal>clean</goal>
-						<goal>test-compile</goal>
-					</goals>
-				</configuration>
-				<executions>
-					<execution>
-						<id>integration-test</id>
-						<goals>
-							<goal>install</goal>
-							<goal>run</goal>
-						</goals>
-					</execution>
-				</executions>
-				<dependencies>
-					<dependency>
-						<groupId>commons-io</groupId>
-						<artifactId>commons-io</artifactId>
-						<version>2.2</version>
-					</dependency>
-					<dependency>
-						<groupId>xmlunit</groupId>
-						<artifactId>xmlunit</artifactId>
-						<version>1.4</version>
-					</dependency>
-				</dependencies>
-			</plugin>
-			<plugin>
-				<groupId>org.apache.maven.plugins</groupId>
-				<artifactId>maven-javadoc-plugin</artifactId>
-				<configuration>
-					<!-- Exclude generated help mojo -->
-					<sourceFileExcludes>
-						<sourceFileExclude>**/org/apache/uima/fit/maven/HelpMojo.java</sourceFileExclude>
-					</sourceFileExcludes>
-				</configuration>
-			</plugin>
-		</plugins>
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-invoker-plugin</artifactId>
+        <configuration>
+          <debug>true</debug>
+          <projectsDirectory>src/it</projectsDirectory>
+          <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
+          <pomIncludes>
+            <pomInclude>*/pom.xml</pomInclude>
+          </pomIncludes>
+          <postBuildHookScript>verify</postBuildHookScript>
+          <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
+          <settingsFile>src/it/settings.xml</settingsFile>
+          <goals>
+            <goal>clean</goal>
+            <goal>test-compile</goal>
+          </goals>
+        </configuration>
+        <executions>
+          <execution>
+            <id>integration-test</id>
+            <goals>
+              <goal>install</goal>
+              <goal>run</goal>
+            </goals>
+          </execution>
+        </executions>
+        <dependencies>
+          <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.2</version>
+          </dependency>
+          <dependency>
+            <groupId>xmlunit</groupId>
+            <artifactId>xmlunit</artifactId>
+            <version>1.4</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <configuration>
+          <!-- Exclude generated help mojo -->
+          <sourceFileExcludes>
+            <sourceFileExclude>**/org/apache/uima/fit/maven/HelpMojo.java</sourceFileExclude>
+          </sourceFileExcludes>
+        </configuration>
+      </plugin>
+    </plugins>
     <pluginManagement>
       <plugins>
         <plugin>
@@ -178,7 +180,7 @@
               <configuration>
                 <excludes combine.children="append">
                   <!-- These configuration files cannot bear a license header -->
-                  <exclude>**/META-INF/org.apache.uima.fit/types.txt</exclude>
+                  <exclude>src/it/with-typesystem-in-descriptors/src/main/resources/META-INF/org.apache.uima.fit/types.txt</exclude>
                 </excludes>
               </configuration>
             </execution>
@@ -186,7 +188,5 @@
         </plugin>
       </plugins>
     </pluginManagement>
-	</build>
-	<url>${uimaWebsiteUrl}</url>
-	<inceptionYear>2012</inceptionYear>
+  </build>
 </project>
\ No newline at end of file
diff --git a/uimafit-maven-plugin/src/it/default/pom.xml b/uimafit-maven-plugin/src/it/default/pom.xml
index fd396ac..facdc1d 100644
--- a/uimafit-maven-plugin/src/it/default/pom.xml
+++ b/uimafit-maven-plugin/src/it/default/pom.xml
@@ -1,68 +1,68 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-	~ Licensed to the Apache Software Foundation (ASF) under one
-	~ or more contributor license agreements. See the NOTICE file
-	~ distributed with this work for additional information
-	~ regarding copyright ownership. The ASF licenses this file
-	~ to you under the Apache License, Version 2.0 (the
-	~ "License"); you may not use this file except in compliance
-	~ with the License. You may obtain a copy of the License at
-	~
-	~ http://www.apache.org/licenses/LICENSE-2.0
-	~
-	~ Unless required by applicable law or agreed to in writing,
-	~ software distributed under the License is distributed on an
-	~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-	~ KIND, either express or implied. See the License for the
-	~ specific language governing permissions and limitations
-	~ under the License.
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements. See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership. The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License. You may obtain a copy of the License at
+  ~
+  ~ http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied. See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
 -->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<modelVersion>4.0.0</modelVersion>
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
 
-	<groupId>org.apache.uima.fit.maven.it</groupId>
-	<artifactId>default</artifactId>
-	<version>1.0-SNAPSHOT</version>
+  <groupId>org.apache.uima.fit.maven.it</groupId>
+  <artifactId>default</artifactId>
+  <version>1.0-SNAPSHOT</version>
 
-	<name>Test for default configuration</name>
+  <name>Test for default configuration</name>
 
-	<properties>
+  <properties>
     <maven.compiler.source>1.7</maven.compiler.source>
     <maven.compiler.target>1.7</maven.compiler.target>
-		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-	</properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
 
-	<dependencies>
-		<dependency>
-			<groupId>org.apache.uima</groupId>
-			<artifactId>uimafit-core</artifactId>
-			<version>@pom.version@</version>
-		</dependency>
-	</dependencies>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>@pom.version@</version>
+    </dependency>
+  </dependencies>
 
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.apache.uima</groupId>
-				<artifactId>uimafit-maven-plugin</artifactId>
-				<version>@pom.version@</version>
-				<configuration>
-					<componentVendor>Apache UIMA</componentVendor>
-					<componentCopyright>Copyright by the respective authors.</componentCopyright>
-				</configuration>
-				<executions>
-					<execution>
-						<id>default</id>
-						<phase>process-classes</phase>
-						<goals>
-							<goal>enhance</goal>
-							<goal>generate</goal>
-						</goals>
-					</execution>
-				</executions>
-			</plugin>
-		</plugins>
-	</build>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.uima</groupId>
+        <artifactId>uimafit-maven-plugin</artifactId>
+        <version>@pom.version@</version>
+        <configuration>
+          <componentVendor>Apache UIMA</componentVendor>
+          <componentCopyright>Copyright by the respective authors.</componentCopyright>
+        </configuration>
+        <executions>
+          <execution>
+            <id>default</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>enhance</goal>
+              <goal>generate</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
index 8a4acaa..cf6cb54 100644
--- a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
+++ b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java
@@ -47,8 +47,8 @@
 
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.LineIterator;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -174,6 +174,7 @@
    */
   private static final String MARK_NO_MISSING_META_DATA = "No missing meta data was found.";
 
+  @Override
   public void execute() throws MojoExecutionException, MojoFailureException {
     // Get the compiled classes from this project
     String[] files = FileUtils.getFilesFromExtension(project.getBuild().getOutputDirectory(),
@@ -458,7 +459,7 @@
       else if (ExternalResourceFactory.isExternalResourceField(field)) {
         type = "external resource";
         // Extract resource key from the uimaFIT annotation
-        pname = ExternalResourceFactory.createExternalResourceDependency(field).getKey();
+        pname = ExternalResourceFactory.createResourceDependency(field).getKey();
         // Extract JavaDoc for this resource from the source file
         pdesc = Util.getParameterDocumentation(aAST, field.getName(), 
                 resourceNameFields.get(pname));
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/GenerateDescriptorsMojo.java
index 6d111b9..797eae8 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
@@ -24,7 +24,7 @@
 import java.io.OutputStream;
 import java.lang.reflect.Modifier;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
diff --git a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
index 195817c..db85bf6 100644
--- a/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
+++ b/uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/util/Util.java
@@ -27,7 +27,7 @@
 import java.util.List;
 import java.util.Set;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.MojoExecutionException;
diff --git a/uimafit-parent/pom.xml b/uimafit-parent/pom.xml
index d43006c..55892b7 100644
--- a/uimafit-parent/pom.xml
+++ b/uimafit-parent/pom.xml
@@ -1,3 +1,22 @@
+<?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>
@@ -7,30 +26,25 @@
     <version>14-SNAPSHOT</version>
   </parent>
   <artifactId>uimafit-parent</artifactId>
-  <version>2.5.0-SNAPSHOT</version>
+  <version>3.0.1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>Apache UIMA uimaFIT - Parent</name>
   <url>${uimaWebsiteUrl}</url>
   <inceptionYear>2012</inceptionYear>
   <properties>
-    <spring.version>3.2.16.RELEASE</spring.version>
-    <uima.version>2.10.3</uima.version>
+    <spring.version>4.3.22.RELEASE</spring.version>
+    <uima.version>3.0.2</uima.version>
+    <slf4j.version>1.7.26</slf4j.version>
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
-    <!-- 
-     BACKWARD_COMPATIBLE_IMPLEMENTER - patch version (=.=.+)
-     BACKWARD_COMPATIBLE_USER        - minor version (=.+.0)
-     NON_BACKWARD_COMPATIBLE         - major version (+.0.0)
-    -->
-    <compat.level>BACKWARD_COMPATIBLE_USER</compat.level>
     <api_check_oldVersion>2.4.0</api_check_oldVersion>
     
     <japicmp.postAnalysisScript>${project.basedir}/../uimafit-parent/src/main/groovy/api-report.groovy</japicmp.postAnalysisScript>
   </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>
@@ -41,6 +55,9 @@
     </repository>
   </repositories>
   <pluginRepositories>
+    <!--
+      - For UIMA/uimaFIT SNAPSHOTs
+    -->
     <pluginRepository>
       <id>apache.snapshots.plugins</id>
       <name>Apache Snapshot Repository - Maven plugins</name>
@@ -72,9 +89,14 @@
         <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.10.0</version>
+        <version>3.12.2</version>
       </dependency>
       <dependency>
         <groupId>org.mockito</groupId>
@@ -82,22 +104,26 @@
         <version>3.2.4</version>
       </dependency>
       <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.6</version>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>3.8.1</version>
       </dependency>
       <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
-        <version>2.2</version>
-        <!-- 2.2 is the last Java 5 compatible version -->
+        <version>2.6</version>
       </dependency>
       <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging-api</artifactId>
-        <version>1.1</version>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-api</artifactId>
+        <version>${slf4j.version}</version>
       </dependency>
       <dependency>
+        <groupId>org.slf4j</groupId>
+        <artifactId>slf4j-simple</artifactId>
+        <version>${slf4j.version}</version>
+      </dependency>    
+      <dependency>
         <groupId>org.apache.uima</groupId>
         <artifactId>uimaj-core</artifactId>
         <version>${uima.version}</version>
@@ -113,11 +139,6 @@
         <version>${uima.version}</version>
       </dependency>
       <dependency>
-        <groupId>org.jdom</groupId>
-        <artifactId>jdom</artifactId>
-        <version>1.1.3</version>
-      </dependency>
-      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>${spring.version}</version>
@@ -159,15 +180,28 @@
 
   <build>
     <plugins>
-      <!-- This should no longer be required with current versions of the maven-resources-plugin
-        <plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-resources-plugin</artifactId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>analyze-only</goal>
+            </goals>
+          </execution>
+        </executions>
         <configuration>
-        <encoding>${project.build.sourceEncoding}</encoding>
+          <failOnWarning>true</failOnWarning>
+          <ignoredDependencies combine.children="append">
+            <!-- 
+              - Logging is used via reflection and cannot be detected by Maven
+            -->
+            <ignoredDependency>org.slf4j:slf4j-simple</ignoredDependency>
+          </ignoredDependencies>
         </configuration>
-        </plugin>
-      -->
+      </plugin>
       <plugin>
         <groupId>org.codehaus.gmaven</groupId>
         <artifactId>gmaven-plugin</artifactId>
@@ -191,6 +225,14 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <!-- 
+          Normally this only gets executed during releases, but we want licenses to be checked on
+          every build to make sure the licenses are included in the PRs.
+         -->
+      </plugin>
     </plugins>
     <pluginManagement>
       <plugins>
@@ -202,6 +244,7 @@
         <plugin>
           <groupId>org.apache.rat</groupId>
           <artifactId>apache-rat-plugin</artifactId>
+          <version>0.13</version>
           <executions>
             <execution>
               <id>default-cli</id>
@@ -209,12 +252,16 @@
                 <excludes combine.children="append">
                   <!-- Plain documentation -->
                   <exclude>README*</exclude>
+                  <!-- GitHub templates -->
+                  <exclude>.github/**</exclude>
                   <!-- Release files -->
                   <exclude>RELEASE_NOTES*</exclude>
                   <exclude>issuesFixed/**</exclude>
                   <exclude>release.properties</exclude>
                   <!-- Build controls -->
                   <exclude>.activate-enforce-compatibility</exclude>
+                  <!-- Logging configuration files -->
+                  <exclude>**/simplelogger.properties</exclude>
                 </excludes>
               </configuration>
             </execution>
@@ -231,6 +278,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>
@@ -240,6 +288,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
+          <version>3.1.0</version>
           <executions>
             <execution>
               <id>attach-javadocs</id>
@@ -286,86 +335,7 @@
             </lifecycleMappingMetadata>
           </configuration>
         </plugin>
-        <plugin>
-          <artifactId>maven-enforcer-plugin</artifactId>
-          <version>1.4.1</version>
-          <executions>
-            <execution>
-              <id>enforce-prerequisites</id>
-              <phase>verify</phase>
-              <goals>
-                <goal>enforce</goal>
-              </goals>
-              <configuration>
-                <rules>
-                  <requireJavaVersion>
-                    <version>[1.8.0,)</version>
-                  </requireJavaVersion>
-                </rules>
-              </configuration>
-            </execution>
-          </executions>
-        </plugin>
       </plugins>
     </pluginManagement>
   </build>
-  <profiles>
-    <profile>
-      <id>enforce-compatibility</id>
-      <activation>
-        <file>
-          <exists>marker-file-identifying-api-compatibility-check</exists>
-        </file>
-      </activation>
-      <properties>
-        <japicmp.postAnalysisScript>${project.basedir}/../uimafit-parent/src/main/groovy/api-report.groovy</japicmp.postAnalysisScript>
-      </properties>
-      <build>
-        <pluginManagement>
-          <plugins>
-            <plugin>
-              <artifactId>maven-enforcer-plugin</artifactId>
-              <dependencies>
-                <dependency>
-                  <groupId>org.semver</groupId>
-                  <artifactId>enforcer-rule</artifactId>
-                  <version>0.9.33</version>
-                </dependency>
-              </dependencies>
-              <executions>
-                <execution>
-                  <id>enforce-compatibility</id>
-                  <phase>verify</phase>
-                  <goals>
-                    <goal>enforce</goal>
-                  </goals>
-                  <configuration>
-                    <rules>
-                      <requireBackwardCompatibility implementation="org.semver.enforcer.RequireBackwardCompatibility">
-                        <previousVersion>${api_check_oldVersion}</previousVersion>
-                        <dumpDetails>true</dumpDetails>
-                        <compatibilityType>${compat.level}</compatibilityType>
-                      </requireBackwardCompatibility>
-                    </rules>
-                  </configuration>
-                </execution>
-              </executions>
-            </plugin>
-            
-            <!-- https://siom79.github.io/japicmp/MavenPlugin.html -->
-            <plugin>
-              <groupId>com.github.siom79.japicmp</groupId>
-              <artifactId>japicmp-maven-plugin</artifactId>
-              <configuration>
-                <parameter combine.children="append">
-                  <breakBuildBasedOnSemanticVersioning>true</breakBuildBasedOnSemanticVersioning>
-                  <reportOnlyFilename>true</reportOnlyFilename>
-                </parameter>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
-      </build>
-    </profile>
-  </profiles>
 </project>
\ No newline at end of file
diff --git a/uimafit-spring/.settings/org.eclipse.jdt.core.prefs b/uimafit-spring/.settings/org.eclipse.jdt.core.prefs
index 737cd0d..225e1bc 100644
--- a/uimafit-spring/.settings/org.eclipse.jdt.core.prefs
+++ b/uimafit-spring/.settings/org.eclipse.jdt.core.prefs
@@ -1,9 +1,11 @@
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+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.7
+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
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 0df5f7d..0917125 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.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>2.5.0-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.0.1-SNAPSHOT</version>
+    <relativePath>../uimafit-parent</relativePath>
+  </parent>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimaj-core</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.uima</groupId>
+      <artifactId>uimafit-core</artifactId>
+      <version>3.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <scope>test</scope>
+    </dependency>    
+  </dependencies>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+</project>
diff --git a/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java b/uimafit-spring/src/test/java/org/apache/uima/fit/spring/SpringContextResourceManagerTest.java
index 24ceb96..ba72bf9 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.bindResource;
 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");
+    bindResource(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
