diff --git a/NOTICE b/NOTICE
index e8e650c..719e344 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
 Apache AntUnit
-Copyright 2005-2018,2021 The Apache Software Foundation
+Copyright 2005-2018,2021-2022 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (https://www.apache.org/).
diff --git a/build.xml b/build.xml
index e8cbd91..22a4ba6 100644
--- a/build.xml
+++ b/build.xml
@@ -25,8 +25,8 @@
   <!-- don't fork junit; regexp classes not available -->
   <property name="junit.fork" value="false" />
 
-  <property name="javac.test-source" value="1.5"/>
-  <property name="javac.test-target" value="1.5"/>
+  <property name="javac.-source" value="1.5" />
+  <property name="javac.-target" value="1.5" />
 
   <import file="common/build.xml"/>
 </project>
diff --git a/src/main/org/apache/ant/antunit/AntUnit.java b/src/main/org/apache/ant/antunit/AntUnit.java
index 9222c2d..9ed4169 100644
--- a/src/main/org/apache/ant/antunit/AntUnit.java
+++ b/src/main/org/apache/ant/antunit/AntUnit.java
@@ -27,9 +27,9 @@
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.tools.ant.BuildEvent;
 import org.apache.tools.ant.BuildException;
@@ -42,6 +42,7 @@
 import org.apache.tools.ant.taskdefs.Ant;
 import org.apache.tools.ant.types.Mapper;
 import org.apache.tools.ant.types.PropertySet;
+import org.apache.tools.ant.types.Resource;
 import org.apache.tools.ant.types.ResourceCollection;
 import org.apache.tools.ant.types.resources.FileResource;
 import org.apache.tools.ant.types.resources.Union;
@@ -107,24 +108,24 @@
      * The object responsible for the execution of the unit test.
      * scriptRunner is invoked to executes the targets and keep the
      * reference to the project.  scriptRunner is defined only when the
-     * antunit script is running. 
+     * antunit script is running.
      */
     private AntUnitScriptRunner scriptRunner;
 
     /**
      * listeners.
      */
-    private ArrayList listeners = new ArrayList();
+    private ArrayList<AntUnitListener> listeners = new ArrayList<AntUnitListener>();
 
     /**
      * propertysets.
      */
-    private ArrayList propertySets = new ArrayList();
+    private ArrayList<PropertySet> propertySets = new ArrayList<PropertySet>();
 
     /**
      * Holds references to be inherited by the test project
      */
-    private ArrayList referenceSets = new ArrayList();
+    private ArrayList<ReferenceSet> referenceSets = new ArrayList<ReferenceSet>();
 
     /**
      * has a failure occured?
@@ -241,15 +242,15 @@
         if (!rc.isFilesystemOnly()) {
             throw new BuildException(ERROR_NON_FILES);
         }
+        @SuppressWarnings("unchecked")
+        Iterable<Resource> iterable = (Iterable<Resource>) rc;
 
-        Iterator i = rc.iterator();
-        while (i.hasNext()) {
-            FileResource r = (FileResource) i.next();
+        for (Resource resource : iterable) {
+            FileResource r = (FileResource) resource;
             if (r.isExists()) {
                 doFile(r.getFile());
             } else {
-                log("Skipping " + r + " since it doesn't exist",
-                    Project.MSG_VERBOSE);
+                log("Skipping " + r + " since it doesn't exist", Project.MSG_VERBOSE);
             }
         }
     }
@@ -266,20 +267,19 @@
         };
         try {
             scriptRunner = new AntUnitScriptRunner(prjFactory);
-            List testTargets = scriptRunner.getTestTartgets();
+            List<String> testTargets = scriptRunner.getTestTargets();
             scriptRunner.runSuite(testTargets, notifier);
         } finally {
             scriptRunner=null;
         }
     }
 
-
     /**
      * Redirect output to new project instance.
      * @param outputToHandle the output to handle.
      */
     public void handleOutput(String outputToHandle) {
-        if (scriptRunner!=null) {
+        if (scriptRunner != null) {
             scriptRunner.getCurrentProject().demuxOutput(outputToHandle, false);
         } else {
             super.handleOutput(outputToHandle);
@@ -294,7 +294,7 @@
      */
     public int handleInput(byte[] buffer, int offset, int length)
         throws IOException {
-        if (scriptRunner!=null) {
+        if (scriptRunner != null) {
             return scriptRunner.getCurrentProject().demuxInput(buffer, offset, length);
         }
         return super.handleInput(buffer, offset, length);
@@ -305,7 +305,7 @@
      * @param toFlush the output String to flush.
      */
     public void handleFlush(String toFlush) {
-        if (scriptRunner!=null) {
+        if (scriptRunner != null) {
             scriptRunner.getCurrentProject().demuxFlush(toFlush, false);
         } else {
             super.handleFlush(toFlush);
@@ -317,7 +317,7 @@
      * @param errorOutputToHandle the error output to handle.
      */
     public void handleErrorOutput(String errorOutputToHandle) {
-        if (scriptRunner!=null) {
+        if (scriptRunner != null) {
             scriptRunner.getCurrentProject().demuxOutput(errorOutputToHandle, true);
         } else {
             super.handleErrorOutput(errorOutputToHandle);
@@ -329,7 +329,7 @@
      * @param errorOutputToFlush the error output to flush.
      */
     public void handleErrorFlush(String errorOutputToFlush) {
-        if (scriptRunner!=null) {
+        if (scriptRunner != null) {
             scriptRunner.getCurrentProject().demuxFlush(errorOutputToFlush, true);
         } else {
             super.handleErrorFlush(errorOutputToFlush);
@@ -347,19 +347,15 @@
         p.setInputHandler(getProject().getInputHandler());
         getProject().initSubProject(p);
         //pass through inherited properties
-        for (Iterator outer = propertySets.iterator(); outer.hasNext(); ) {
-            PropertySet set = (PropertySet) outer.next();
-            Map props = set.getProperties();
-            for (Iterator keys = props.keySet().iterator();
-                 keys.hasNext(); ) {
-                String key = keys.next().toString();
-                if (MagicNames.PROJECT_BASEDIR.equals(key)
-                    || MagicNames.ANT_FILE.equals(key)) {
+        for (PropertySet set : propertySets) {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            Map<String,Object> props = (Map) set.getProperties();
+            for (String key : props.keySet()) {
+                if (MagicNames.PROJECT_BASEDIR.equals(key) || MagicNames.ANT_FILE.equals(key)) {
                     continue;
                 }
                 Object value = props.get(key);
-                if (value != null && value instanceof String
-                    && p.getProperty(key) == null) {
+                if (value instanceof String && p.getProperty(key) == null) {
                     p.setNewProperty(key, (String) value);
                 }
             }
@@ -369,8 +365,7 @@
         //with significant modification from taskdefs.Ant in Ant core.
         //unfortunately the only way we can share the code directly
         //would be to extend Ant (which might not be a bad idea?)
-        for (int i = 0; i < referenceSets.size(); ++i) {
-            ReferenceSet set = (ReferenceSet) referenceSets.get(i);
+        for (ReferenceSet set : referenceSets) {
             set.copyReferencesInto(p);
         }
 
@@ -390,12 +385,8 @@
      * @param p the Project to attach to.
      */
     private void attachListeners(File buildFile, Project p) {
-        Iterator it = listeners.iterator();
-        while (it.hasNext()) {
-            AntUnitListener al = (AntUnitListener) it.next();
-            p.addBuildListener(new BuildToAntUnitListener(buildFile
-                                                          .getAbsolutePath(),
-                                                          al));
+        for (AntUnitListener al : listeners) {
+            p.addBuildListener(new BuildToAntUnitListener(buildFile.getAbsolutePath(), al));
             al.setCurrentTestProject(p);
         }
     }
@@ -405,9 +396,7 @@
      * @param targetName the name of the target.
      */
     private void fireStartTest(String targetName) {
-        Iterator it = listeners.iterator();
-        while (it.hasNext()) {
-            AntUnitListener al = (AntUnitListener) it.next();
+        for (AntUnitListener al : listeners) {
             al.startTest(targetName);
         }
     }
@@ -419,9 +408,7 @@
      */
     private void fireFail(String targetName, AssertionFailedException ae) {
         failures++;
-        Iterator it = listeners.iterator();
-        while (it.hasNext()) {
-            AntUnitListener al = (AntUnitListener) it.next();
+        for (AntUnitListener al : listeners) {
             al.addFailure(targetName, ae);
         }
     }
@@ -433,9 +420,7 @@
      */
     private void fireError(String targetName, Throwable t) {
         errors++;
-        Iterator it = listeners.iterator();
-        while (it.hasNext()) {
-            AntUnitListener al = (AntUnitListener) it.next();
+        for (AntUnitListener al : listeners) {
             al.addError(targetName, t);
         }
     }
@@ -445,9 +430,7 @@
      * @param targetName the name of the current target.
      */
     private void fireEndTest(String targetName) {
-        Iterator it = listeners.iterator();
-        while (it.hasNext()) {
-            AntUnitListener al = (AntUnitListener) it.next();
+        for (AntUnitListener al : listeners) {
             al.endTest(targetName);
         }
     }
@@ -461,7 +444,7 @@
         /**
          * references inherited from parent project by antunit scripts
          */
-        private ArrayList references = new ArrayList();
+        private List<Reference> references = new ArrayList<Reference>();
         /**
          * maps source reference ID to target reference ID
          */
@@ -471,13 +454,16 @@
             references.add(reference);
         }
 
+        /**
+         * Create a nested mapper element.
+         * @return {@link Mapper}
+         */
         public Mapper createMapper() {
             if (mapper == null) {
                 return mapper = new Mapper(getProject());
-            } else {
-                throw new BuildException("Only one mapper element is allowed"
-                                         + " per referenceSet", getLocation());
             }
+            throw new BuildException("Only one mapper element is allowed per referenceSet",
+                getLocation());
         }
 
         /**
@@ -503,19 +489,16 @@
          * @param newProject the target project to copy references into
          */
         public void copyReferencesInto(Project newProject) {
-            FileNameMapper mapper = this.mapper == null
-                ? null : this.mapper.getImplementation();
-            HashSet matches = new HashSet();
-            Hashtable src = getProject().getReferences();
+            FileNameMapper mapper = this.mapper == null ? null : this.mapper.getImplementation();
+            Set<String> matches = new HashSet<String>();
+            @SuppressWarnings("unchecked")
+            Hashtable<String,Object> src = getProject().getReferences();
 
-            for (Iterator it = references.iterator(); it.hasNext(); ) {
-                Reference ref = (Reference) it.next();
-
+            for (Reference ref : references) {
                 matches.clear();
                 ref.addMatchingReferences(src, matches);
 
-                for (Iterator ids = matches.iterator(); ids.hasNext(); ) {
-                    String refid = (String) ids.next();
+                for (String refid : matches) {
                     String toRefid = ref.getToRefid();
 
                     //transform the refid with the mapper if necessary
@@ -556,12 +539,12 @@
                 return;
             }
 
-            Class c = orig.getClass();
+            Class<?> c = orig.getClass();
             Object copy = orig;
             try {
-                Method cloneM = c.getMethod("clone", new Class[0]);
+                Method cloneM = c.getMethod("clone");
                 if (cloneM != null) {
-                    copy = cloneM.invoke(orig, new Object[0]);
+                    copy = cloneM.invoke(orig);
                     log("Adding clone of reference " + oldKey,
                         Project.MSG_DEBUG);
                 }
@@ -569,15 +552,14 @@
                 // not Clonable
             }
 
-
             if (copy instanceof ProjectComponent) {
                 ((ProjectComponent) copy).setProject(newProject);
             } else {
                 try {
                     Method setProjectM =
-                        c.getMethod("setProject", new Class[] {Project.class});
+                        c.getMethod("setProject", Project.class);
                     if (setProjectM != null) {
-                        setProjectM.invoke(copy, new Object[] {newProject});
+                        setProjectM.invoke(copy, newProject);
                     }
                 } catch (NoSuchMethodException e) {
                     // ignore this if the class being referenced does not have
@@ -590,8 +572,6 @@
             }
             newProject.addReference(newKey, copy);
         }
-
-
     }
 
     public static class Reference extends Ant.Reference {
@@ -620,22 +600,21 @@
          * @param src table of references to check
          * @param dest set of reference IDs matching this reference pattern
          */
-        public void addMatchingReferences(Hashtable src, Collection dest) {
+        public void addMatchingReferences(Hashtable<String, Object> src, Collection<String> dest) {
             String id = getRefId();
             if (id != null) {
                 if (src.containsKey(id)) {
                     dest.add(id);
                 }
             } else if (matcher != null) {
-                for (Iterator it = src.keySet().iterator(); it.hasNext(); ) {
-                    String refid = (String)it.next();
+                for (String refid : src.keySet()) {
                     if (matcher.matches(refid)) {
                         dest.add(refid);
                     }
                 }
             } else {
-                throw new BuildException("either the refid or regex attribute "
-                                         + "is required for reference elements");
+                throw new BuildException(
+                    "either the refid or regex attribute is required for reference elements");
             }
         }
     }
@@ -658,10 +637,8 @@
         public void buildFinished(BuildEvent event) {
             a.endTestSuite(event.getProject(), buildFile);
         }
-        public void targetStarted(BuildEvent event) {
-        }
-        public void targetFinished(BuildEvent event) {
-        }
+        public void targetStarted(BuildEvent event) {}
+        public void targetFinished(BuildEvent event) {}
         public void taskStarted(BuildEvent event) {}
         public void taskFinished(BuildEvent event) {}
         public void messageLogged(BuildEvent event) {}
diff --git a/src/main/org/apache/ant/antunit/AntUnitExecutionNotifier.java b/src/main/org/apache/ant/antunit/AntUnitExecutionNotifier.java
index 6cb47be..d73a794 100644
--- a/src/main/org/apache/ant/antunit/AntUnitExecutionNotifier.java
+++ b/src/main/org/apache/ant/antunit/AntUnitExecutionNotifier.java
@@ -21,7 +21,7 @@
 package org.apache.ant.antunit;
 
 
-/** 
+/**
  * Provides methods that allow the AntUnitScriptRunner to notify the test progress.
  * @since 1.2
  */
@@ -31,26 +31,26 @@
      * invokes start on all registered test listeners.
      * @param targetName the name of the target.
      */
-    public void fireStartTest(String targetName);
+    void fireStartTest(String targetName);
 
     /**
      * invokes addFailure on all registered test listeners.
      * @param targetName the name of the failed target.
      * @param ae the associated AssertionFailedException.
      */
-    public void fireFail(String targetName, AssertionFailedException ae);
+    void fireFail(String targetName, AssertionFailedException ae);
 
     /**
      * invokes addError on all registered test listeners.
      * @param targetName the name of the failed target.
      * @param t the associated Throwable.
      */
-    public void fireError(String targetName, Throwable t);
+    void fireError(String targetName, Throwable t);
 
     /**
      * invokes endTest on all registered test listeners.
      * @param targetName the name of the current target.
      */
-    public void fireEndTest(String targetName);
+    void fireEndTest(String targetName);
 
 }
diff --git a/src/main/org/apache/ant/antunit/AntUnitScriptRunner.java b/src/main/org/apache/ant/antunit/AntUnitScriptRunner.java
index 891b22e..6a68616 100644
--- a/src/main/org/apache/ant/antunit/AntUnitScriptRunner.java
+++ b/src/main/org/apache/ant/antunit/AntUnitScriptRunner.java
@@ -20,7 +20,6 @@
 
 package org.apache.ant.antunit;
 
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -28,15 +27,16 @@
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
 
-/** 
- * Run antunit tests suites.  This AntUnitScriptRunner is responsible for the 
- * management of the ant project and the correct invocation the target (taking 
+/**
+ * Run antunit tests suites.  This AntUnitScriptRunner is responsible for the
+ * management of the ant project and the correct invocation the target (taking
  * into account properly the [case]setUp and [case]tearDown targets).
  * The user can however provide the order of the test targets and or can filter
  * the list of test targets to execute.
  * The user must also provide its ProjectFactory and an AntUnitExecutionNotifier.
- * @since 1.2 
+ * @since 1.2
  */
 public class AntUnitScriptRunner {
 
@@ -69,13 +69,13 @@
      * Object used to create projects in order to support test isolation.
      */
     private final ProjectFactory prjFactory;
-    
+
     /**
      * Indicates if the startSuite method has been invoked.  Use to fail fast if the
      * the caller forget to call the startSuite method
      */
     private boolean isSuiteStarted;
-    
+
     /**
      * Does that script have a setUp target (defined when scanning the script)
      */
@@ -99,20 +99,20 @@
     /**
      * List of target names
      */
-    private final List testTargets;
+    private final List<String> testTargets = new LinkedList<String>();
 
-    /** 
+    /**
      * The project currently used.
      */
     private Project project = null;
 
-    /** 
-     * Indicates if a target has already be executed using this project. 
+    /**
+     * Indicates if a target has already be executed using this project.
      * Value is undefined when project is null.
      */
     private boolean projectIsDirty;
 
-    
+
     /**
      * Create a new AntScriptRunner on the given environment.
      * @param prjFactory A factory for the ant project that will contains the antunit test to execute.
@@ -122,17 +122,16 @@
     public AntUnitScriptRunner(ProjectFactory prjFactory) throws BuildException {
         this.prjFactory = prjFactory;
         Project newProject = getCurrentProject();
-        Map targets = newProject.getTargets();
+        @SuppressWarnings("unchecked")
+        Map<String, Target> targets = newProject.getTargets();
         hasSetUp = targets.containsKey(SETUP);
         hasTearDown = targets.containsKey(TEARDOWN);
         hasSuiteSetUp = targets.containsKey(SUITESETUP);
         hasSuiteTearDown = targets.containsKey(SUITETEARDOWN);
-        testTargets = new LinkedList();
-        Iterator it = targets.keySet().iterator();
-        while (it.hasNext()) {
-            String name = (String) it.next();
-            if (name.startsWith(TEST) && !name.equals(TEST)) {
-                testTargets.add(name);
+
+        for (String name : targets.keySet()) {
+            if (name.startsWith(TEST) && !TEST.equals(name)) {
+                getTestTargets().add(name);
             }
         }
     }
@@ -160,7 +159,7 @@
             project = prjFactory.createProject();
         }
         //we already set isDirty to true in order to make sure we didn't reuse
-        //this project next time getCleanProject is called.  
+        //this project next time getCleanProject is called.
         projectIsDirty = true;
         return project;
     }
@@ -168,7 +167,16 @@
     /**
      * @return List&lt;String&gt; List of test targets of the script file
      */
-    public List getTestTartgets() {
+    @Deprecated
+    public List<String> getTestTartgets() {
+        return getTestTargets();
+    }
+
+    /**
+     * Get the (names of the) test targets to execute.
+     * @return {@link List} of {@link String}
+     */
+    public List<String> getTestTargets() {
         return testTargets;
     }
 
@@ -184,7 +192,7 @@
      * Executes the suiteSetUp target if presents and report any execution error.
      * <p>A failure is reported to the notifier and by returning false.
      * Note that if the method return false, you are not allowed to run targets.</p>
-     * @return false in case of execution failure.  true in case of success. 
+     * @return false in case of execution failure.  true in case of success.
      */
     private boolean startSuite(AntUnitExecutionNotifier notifier) {
         getCurrentProject().fireBuildStarted();
@@ -202,7 +210,7 @@
         return true;
     }
 
-    /** 
+    /**
      * Run the specific test target, possibly between the setUp and tearDown targets if
      * it exists.  Exception or failures are reported to the notifier.
      * @param name name of the test target to execute.
@@ -214,13 +222,13 @@
             throw new AssertionError();
         }
         Project newProject = getCleanProject();
-        Vector v = new Vector();
+        Vector<String> v = new Vector<String>();
         if (hasSetUp) {
             v.add(SETUP);
         }
         v.add(name);
         // create and register a logcapturer on the newProject
-        LogCapturer lc = new LogCapturer(newProject);
+        new LogCapturer(newProject);
         try {
             notifier.fireStartTest(name);
             newProject.executeTargets(v);
@@ -246,8 +254,8 @@
 
     /**
      * Executes the suiteTearDown target if presents and report any execution error.
-     * @param caught Any internal exception triggered (and caught) by the caller indicating that 
-     * the execution could not be invoked as expected.  
+     * @param caught Any internal exception triggered (and caught) by the caller indicating that
+     * the execution could not be invoked as expected.
      * @param notifier will receive execution notifications.
      */
     private void endSuite(Throwable caught, AntUnitExecutionNotifier notifier) {
@@ -266,14 +274,14 @@
 
     /**
      * Try to see whether the BuildException e is an AssertionFailedException
-     * or is caused by an AssertionFailedException. If so, fire a failure for 
+     * or is caused by an AssertionFailedException. If so, fire a failure for
      * given targetName.  Otherwise fire an error.
      */
-    private void fireFailOrError(String targetName, BuildException e, 
+    private void fireFailOrError(String targetName, BuildException e,
                                  AntUnitExecutionNotifier notifier) {
         boolean failed = false;
         Throwable t = e;
-        while (t != null && t instanceof BuildException) {
+        while (t instanceof BuildException) {
             if (t instanceof AssertionFailedException) {
                 failed = true;
                 notifier.fireFail(targetName, (AssertionFailedException) t);
@@ -293,15 +301,13 @@
      * @param suiteTargets An ordered list of test targets.  It must be a sublist of getTestTargets
      * @param notifier is notified on test progress
      */
-    public void runSuite(List suiteTargets, AntUnitExecutionNotifier notifier) {
+    public void runSuite(List<String> suiteTargets, AntUnitExecutionNotifier notifier) {
         Throwable caught = null;
         try {
             if (!startSuite(notifier)) {
                 return;
             }
-            Iterator iter = suiteTargets.iterator();
-            while (iter.hasNext()) {
-                String name = (String) iter.next();
+            for (String name : suiteTargets) {
                 runTarget(name, notifier);
             }
         } catch (Throwable e) {
@@ -310,5 +316,4 @@
             endSuite(caught, notifier);
         }
     }
-
 }
diff --git a/src/main/org/apache/ant/antunit/LogCapturer.java b/src/main/org/apache/ant/antunit/LogCapturer.java
index 0da6e73..6c64888 100644
--- a/src/main/org/apache/ant/antunit/LogCapturer.java
+++ b/src/main/org/apache/ant/antunit/LogCapturer.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -20,7 +20,6 @@
 
 package org.apache.ant.antunit;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.LinkedList;
 import java.util.Collections;
@@ -41,7 +40,7 @@
 public class LogCapturer implements BuildListener {
     public static final String REFERENCE_ID = "ant.antunit.log";
 
-    private List/*<BuildEvent>*/ events = Collections.synchronizedList(new LinkedList());
+    private List<BuildEvent> events = Collections.synchronizedList(new LinkedList<BuildEvent>());
     private Project p;
 
     public LogCapturer(Project p) {
@@ -184,15 +183,14 @@
     }
 
     private String getLog(int minPriority, boolean mergeLines) {
-        StringBuffer sb = new StringBuffer();
-        for (Iterator/*<BuildEvent>*/ it = new LinkedList(events).iterator();
-             it.hasNext(); ) {
-            append(sb, (BuildEvent) it.next(), minPriority, mergeLines);
+        StringBuilder sb = new StringBuilder();
+        for (BuildEvent buildEvent : new LinkedList<BuildEvent>(events)) {
+            append(sb, buildEvent, minPriority, mergeLines);
         }
         return sb.toString();
     }
 
-    private static void append(StringBuffer sb, BuildEvent event,
+    private static void append(StringBuilder sb, BuildEvent event,
                                int minPriority, boolean mergeLines) {
         if (event.getPriority() <= minPriority) {
             sb.append(event.getMessage());
diff --git a/src/main/org/apache/ant/antunit/junit3/AntUnitSuite.java b/src/main/org/apache/ant/antunit/junit3/AntUnitSuite.java
index 74fe3dc..f399a2f 100644
--- a/src/main/org/apache/ant/antunit/junit3/AntUnitSuite.java
+++ b/src/main/org/apache/ant/antunit/junit3/AntUnitSuite.java
@@ -23,7 +23,6 @@
 import java.io.File;
 import java.io.PrintStream;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.Test;
@@ -57,16 +56,16 @@
      * File reference. Namely, if the File is a relative file, it will
      * be resolve relatively to the execution directory (which might be
      * different different from the project root directory).</p>
-     * 
+     *
      * @param scriptFile
      *            AntUnit script file
      * @param rootClass
      *            The test class that creates this suite. This is used to give
      *            a name to the suite so that an IDE can reexecute this suite.
      */
-    public AntUnitSuite(File scriptFile, Class rootClass) {
+    public AntUnitSuite(File scriptFile, Class<?> rootClass) {
         setName(rootClass.getName()); //This name allows eclipse to reexecute the test
-        AntUnitScriptRunner createdScriptRunner = null;
+        final AntUnitScriptRunner createdScriptRunner;
         try {
             MyProjectFactory prjFactory = new MyProjectFactory(scriptFile);
             createdScriptRunner = new AntUnitScriptRunner(prjFactory);
@@ -82,11 +81,8 @@
         initializationReportingTest = null;
         stdout = new MultiProjectDemuxOutputStream(antScriptRunner, false);
         stderr = new MultiProjectDemuxOutputStream(antScriptRunner, true);
-        List testTargets = antScriptRunner.getTestTartgets();
-        for (Iterator it = testTargets.iterator(); it.hasNext();) {
-            String target = (String) it.next();
-            AntUnitTestCase tc = new AntUnitTestCase(this, scriptFile, target);
-            addTest(tc);
+        for (String target : antScriptRunner.getTestTargets()) {
+            addTest(new AntUnitTestCase(this, scriptFile, target));
         }
     }
 
@@ -100,28 +96,28 @@
         MyProjectFactory prjFactory = new MyProjectFactory(scriptFile);
         antScriptRunner = new AntUnitScriptRunner(prjFactory);
         //the exception is throwed, and it is up to the AntUnitTestCase to handle it.
-        initializationReportingTest = null; 
+        initializationReportingTest = null;
         stdout = new MultiProjectDemuxOutputStream(antScriptRunner, false);
         stderr = new MultiProjectDemuxOutputStream(antScriptRunner, true);
         setName(antScriptRunner.getName() + "[" + scriptFile + "]");
         addTest(singleTc);
     }
-    
+
     /**
      * {@inheritDoc}
      * <p>Run the full AntUnit suite.</p>
      */
     public void run(TestResult testResult) {
-        if (initializationReportingTest!=null) {
+        if (initializationReportingTest != null) {
             initializationReportingTest.run(testResult);
         } else {
-            List testTartgets = antScriptRunner.getTestTartgets();
+            List<String> testTargets = antScriptRunner.getTestTargets();
             JUnitNotificationAdapter notifier = new JUnitNotificationAdapter(
                     testResult, tests());
-            runInContainer(testTartgets, notifier);
+            runInContainer(testTargets, notifier);
         }
     }
-    
+
     /**
      * {@inheritDoc}
      * <p>Run a single test target of the AntUnit suite. suiteSetUp,
@@ -132,7 +128,7 @@
             initializationReportingTest.run(result);
         } else {
             String targetName = ((AntUnitTestCase) test).getTarget();
-            List singleTargetList = Collections.singletonList(targetName);
+            List<String> singleTargetList = Collections.singletonList(targetName);
             JUnitNotificationAdapter notifier = new JUnitNotificationAdapter(
                     result, tests());
             runInContainer(singleTargetList, notifier);
@@ -144,13 +140,13 @@
      * <p>When ant executes a project it redirect the input and the output. In this
      * context we will only redirect output (unit test are not supposed to be
      * interactive).</p>
-     * 
+     *
      * @param targetList
      *            The list of test target to execute
      * @param notifier
      *            The AntUnit notifier that will receive execution notifications
      */
-    public void runInContainer(List targetList, AntUnitExecutionNotifier notifier) {        
+    public void runInContainer(List<String> targetList, AntUnitExecutionNotifier notifier) {
         PrintStream savedErr = System.err;
         PrintStream savedOut = System.out;
         try {
@@ -176,7 +172,7 @@
             this.scriptFile = scriptFile;
         }
 
-        public Project createProject() { 
+        public Project createProject() {
             ProjectHelper prjHelper = ProjectHelper.getProjectHelper();
             Project prj = new Project();
             DefaultLogger logger = new DefaultLogger();
@@ -198,8 +194,6 @@
     }
 
     public BuildException getAntInitialisationException() {
-        return hasAntInitError() ? 
-                initializationReportingTest.getAntScriptError() :
-                null;
+        return hasAntInitError() ? initializationReportingTest.getAntScriptError() : null;
     }
 }
diff --git a/src/main/org/apache/ant/antunit/junit3/AntUnitTestCase.java b/src/main/org/apache/ant/antunit/junit3/AntUnitTestCase.java
index 3442ddf..2cd7e2f 100644
--- a/src/main/org/apache/ant/antunit/junit3/AntUnitTestCase.java
+++ b/src/main/org/apache/ant/antunit/junit3/AntUnitTestCase.java
@@ -28,16 +28,16 @@
 import junit.framework.TestResult;
 
 /**
- * JUnit TestCase that will executes a single AntUnit target.
+ * JUnit TestCase that executes a single AntUnit target.
  * <p>This class is not
  * supposed to be used directly.</p>
  * <p>It is public only because junit must access it as a public.</p>
  */
 public class AntUnitTestCase extends TestCase {
-    // We have to extends TestCase, and not implements Test because otherwise 
-    // JUnit4 will derive the Description composing the suite description from 
+    // We have to extends TestCase, and not implements Test because otherwise
+    // JUnit4 will derive the Description composing the suite description from
     // this className only (AntUnitTestCase), and not from the name.
-    // However, during execution it use the right Description (base on the 
+    // However, during execution it use the right Description (base on the
     // toString)
 
     /**
@@ -56,25 +56,25 @@
      * class has been created directly by the IDE from its name.
      * In case of initialisation problem when the test is build from the suite,
      * the problem is handled at the level of the suite (and this object is never
-     * created) 
+     * created)
      */
     private final BuildException initialisationException;
-    
+
     /**
      * Prepare an AntUnitTestCase that will be executed alone.
-     * <p>This constructor 
-     * is typically used by a junit 3 runner that will reexecute a specific 
+     * <p>This constructor
+     * is typically used by a junit 3 runner that will reexecute a specific
      * test.</p>
-     * <p>The execution of this test will be embed in a suiteSetUp and 
+     * <p>The execution of this test will be embed in a suiteSetUp and
      * suiteTearDown.</p>
-     * @param name The name of the AntUnitTestCase, normally obtained from a 
-     * previous execution. 
+     * @param name The name of the AntUnitTestCase, normally obtained from a
+     * previous execution.
      */
     public AntUnitTestCase(String name) {
         super(name);
         BuildException catchedEx = null;
         AntUnitSuite createdSuite = null;
-        TestCaseName nameParser = new TestCaseName(name);        
+        TestCaseName nameParser = new TestCaseName(name);
         try {
             createdSuite = new AntUnitSuite(this, nameParser.getScript());
         } catch (BuildException e) {
@@ -92,8 +92,8 @@
      * suite that prepare the antScriptRunner and the JUnitExcutionPlatform. It
      * is the responsibility of the suite to execute the suiteSetUp and the
      * suiteTearDown.
-     * 
-     * @param target test target 
+     *
+     * @param target test target
      * @param suite test suite
      * @param scriptFile test file
      */
@@ -113,7 +113,7 @@
         return target;
     }
 
-    /** 
+    /**
      * Called by a Junit Runner that want to executes specifically
      * this test target.
      * <p>This implementation delegates the call to the suite.</p>
@@ -139,7 +139,7 @@
     protected void runTest() throws BuildException {
         throw initialisationException;
     }
-    
+
     /**
      * Handle the serialization and the parsing of the name of a TestCase. The
      * name of the TestCase contains the filename of the script and the target,
diff --git a/src/main/org/apache/ant/antunit/junit3/JUnitNotificationAdapter.java b/src/main/org/apache/ant/antunit/junit3/JUnitNotificationAdapter.java
index 4b09202..39808b0 100644
--- a/src/main/org/apache/ant/antunit/junit3/JUnitNotificationAdapter.java
+++ b/src/main/org/apache/ant/antunit/junit3/JUnitNotificationAdapter.java
@@ -36,9 +36,9 @@
 class JUnitNotificationAdapter implements AntUnitExecutionNotifier {
 
     private final TestResult junitTestResult;
-    private Map testByTarget = new HashMap(); 
+    private Map<String, AntUnitTestCase> testByTarget = new HashMap<String, AntUnitTestCase>();
 
-    public JUnitNotificationAdapter(TestResult testResult, Enumeration tests) {
+    public JUnitNotificationAdapter(TestResult testResult, Enumeration<Test> tests) {
         this.junitTestResult = testResult;
         while(tests.hasMoreElements()) {
             AntUnitTestCase test = (AntUnitTestCase) tests.nextElement();
@@ -48,22 +48,22 @@
 
     public void fireStartTest(String targetName) {
         //TODO : if it is null, eclipse stop the unit test (add a unit test)
-        junitTestResult.startTest((Test) testByTarget.get(targetName));
+        junitTestResult.startTest(testByTarget.get(targetName));
     }
-    
+
     public void fireEndTest(String targetName) {
-        junitTestResult.endTest((Test) testByTarget.get(targetName));
+        junitTestResult.endTest(testByTarget.get(targetName));
     }
 
     public void fireError(String targetName, Throwable t) {
-        junitTestResult.addError((Test) testByTarget.get(targetName), t);
+        junitTestResult.addError(testByTarget.get(targetName), t);
     }
 
     public void fireFail(String targetName, AssertionFailedException ae) {
-        //I don't see how to transform the AntUnit assertion exception into 
+        //I don't see how to transform the AntUnit assertion exception into
         //junit assertion exception (we would loose the stack trace).
         //So failures will be reported as errors
-        junitTestResult.addError((Test) testByTarget.get(targetName), ae);
+        junitTestResult.addError(testByTarget.get(targetName), ae);
     }
 
 }
diff --git a/src/main/org/apache/ant/antunit/junit4/AntUnitSuiteRunner.java b/src/main/org/apache/ant/antunit/junit4/AntUnitSuiteRunner.java
index e3d69d4..337e5f5 100644
--- a/src/main/org/apache/ant/antunit/junit4/AntUnitSuiteRunner.java
+++ b/src/main/org/apache/ant/antunit/junit4/AntUnitSuiteRunner.java
@@ -20,7 +20,6 @@
 
 package org.apache.ant.antunit.junit4;
 
-import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -33,8 +32,8 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
+import junit.framework.Test;
 import junit.framework.TestCase;
 
 import org.apache.ant.antunit.AntUnitExecutionNotifier;
@@ -60,43 +59,40 @@
  * around every test target). Also, more features are available when this runner
  * is used (filtering &amp; sorting)
  */
+@SuppressWarnings("deprecation")
 public class AntUnitSuiteRunner extends Runner implements Filterable, Sortable {
 
     private final AntUnitSuite junit3Suite;
-    private final Map/*<String, Description>*/ targetDescriptions = new HashMap();
-    private final List/*<String>*/ targetsOrder = new LinkedList();
-    
-    private AntUnitSuiteRunner(AntUnitSuite suite, Class junitTestClass) throws InitializationError {
+    private final Map<String, Description> targetDescriptions = new HashMap<String, Description>();
+    private final List<String> targetsOrder = new LinkedList<String>();
+
+    private AntUnitSuiteRunner(AntUnitSuite suite, Class<?> junitTestClass) throws InitializationError {
         junit3Suite = suite;
         if (suite.hasAntInitError()) {
-            throw new InitializationError(
-                    new Throwable[] { suite.getAntInitialisationException() } 
-                  );
-        } else { 
-            Enumeration tests = suite.tests();
-            while (tests.hasMoreElements()) {
-                TestCase nextTc = (TestCase) tests.nextElement();
-                //TODO Handle the possibility for the user to define suite of AntUnit scripts            	
-            	AntUnitTestCase tc = (AntUnitTestCase) nextTc;
-            	Description tc_desc = Description.createTestDescription(junitTestClass, tc.getName());
-            	targetDescriptions.put(tc.getTarget(), tc_desc);
-            	targetsOrder.add(tc.getTarget());
-            }
+            throw new InitializationError(suite.getAntInitialisationException());
+        }
+        for (Enumeration<Test> tests = suite.tests(); tests.hasMoreElements();) {
+            TestCase nextTc = (TestCase) tests.nextElement();
+            //TODO Handle the possibility for the user to define suite of AntUnit scripts
+            AntUnitTestCase tc = (AntUnitTestCase) nextTc;
+            Description tc_desc = Description.createTestDescription(junitTestClass, tc.getName());
+            targetDescriptions.put(tc.getTarget(), tc_desc);
+            targetsOrder.add(tc.getTarget());
         }
     }
 
-    public AntUnitSuiteRunner(Class testCaseClass) throws InitializationError {
+    public AntUnitSuiteRunner(Class<?> testCaseClass) throws InitializationError {
         this(getJUnit3AntSuite(testCaseClass), testCaseClass);
     }
 
-    private static AntUnitSuite getJUnit3AntSuite(Class testCaseClass)
+    private static AntUnitSuite getJUnit3AntSuite(Class<?> testCaseClass)
             throws InitializationError {
         try {
-            Method suiteMethod = testCaseClass.getMethod("suite", new Class[0]);
+            Method suiteMethod = testCaseClass.getMethod("suite");
             if (!Modifier.isStatic(suiteMethod.getModifiers())) {
                 throw new InitializationError("suite method must be static");
             }
-            Object suite = suiteMethod.invoke(null, new Object[0]);
+            Object suite = suiteMethod.invoke(null);
             if (suite == null) {
                 throw new InitializationError("suite method can not return null");
             }
@@ -105,11 +101,11 @@
             }
             return (AntUnitSuite) suite;
         } catch (NoSuchMethodException e) {
-            throw new InitializationError(new Throwable[] { e });
+            throw new InitializationError(e);
         } catch (IllegalAccessException e) {
-            throw new InitializationError(new Throwable[] { e });
+            throw new InitializationError(e);
         } catch (InvocationTargetException e) {
-            throw new InitializationError(new Throwable[] { e });
+            throw new InitializationError(e);
         }
     }
 
@@ -117,11 +113,13 @@
      * Filterable implementation
      */
     public void filter(Filter filter) throws NoTestsRemainException {
-        for (Iterator iter= targetDescriptions.entrySet().iterator(); iter.hasNext();) {
-            Map.Entry mapEntry = (Entry) iter.next(); 
-            if (!filter.shouldRun((Description) mapEntry.getValue()))
+        for (Iterator<Map.Entry<String, Description>> iter =
+            targetDescriptions.entrySet().iterator(); iter.hasNext();) {
+            Map.Entry<String, Description> mapEntry = iter.next();
+            if (!filter.shouldRun(mapEntry.getValue())) {
                 iter.remove();
                 targetsOrder.remove(mapEntry.getKey());
+            }
         }
     }
 
@@ -129,28 +127,23 @@
      * Sortable implementation
      */
     public void sort(final Sorter sorter) {
-        Collections.sort(targetsOrder, new Comparator/*<String>*/() {
-            public int compare(Object target1, Object target2) {
-                Description d2 = (Description)targetDescriptions.get(target2);
-                Description d1 = (Description)targetDescriptions.get(target1);
+        Collections.sort(targetsOrder, new Comparator<String>() {
+            public int compare(String target1, String target2) {
+                Description d2 = targetDescriptions.get(target2);
+                Description d1 = targetDescriptions.get(target1);
                 return sorter.compare(d1, d2);
             }
         });
-        /*for (Runner each : fRunners)
-            sorter.apply(each);
-        */
     }
 
     /**
      * Runner implementation
      */
     public Description getDescription() {
-        Description r = Description.createSuiteDescription(
-                junit3Suite.getName(), new Annotation[0]);
-        
-        Collection childDesc = targetDescriptions.values();
-        for (Iterator iterator = childDesc.iterator(); iterator.hasNext();) {
-            Description desc = (Description) iterator.next();
+        Description r = Description.createSuiteDescription(junit3Suite.getName());
+
+        Collection<Description> childDesc = targetDescriptions.values();
+        for (Description desc : childDesc) {
             r.addChild(desc);
         }
         return r;
@@ -160,14 +153,14 @@
      * Runner implementation
      */
     public void run(final RunNotifier junitNotifier) {
-        LinkedList targetList = new LinkedList(targetDescriptions.keySet());
-        
-        AntUnitExecutionNotifier antUnitNotifier = new AntUnitExecutionNotifier() {            
+        List<String> targetList = new LinkedList<String>(targetDescriptions.keySet());
+
+        AntUnitExecutionNotifier antUnitNotifier = new AntUnitExecutionNotifier() {
             public void fireStartTest(String targetName) {
                 junitNotifier.fireTestStarted(getDescription(targetName));
             }
             public void fireEndTest(String targetName) {
-                junitNotifier.fireTestFinished(getDescription(targetName));                
+                junitNotifier.fireTestFinished(getDescription(targetName));
             }
             public void fireError(String targetName, Throwable t) {
                 Failure failure = new Failure(getDescription(targetName), t);
@@ -176,12 +169,12 @@
             public void fireFail(String targetName, AssertionFailedException ae) {
                 Failure failure = new Failure(getDescription(targetName), ae);
                 junitNotifier.fireTestFailure(failure);
-            }            
+            }
             private Description getDescription(String targetName) {
-                return (Description) targetDescriptions.get(targetName);
+                return targetDescriptions.get(targetName);
             }
         };
-        
+
         junit3Suite.runInContainer(targetList, antUnitNotifier);
     }
 
diff --git a/src/main/org/apache/ant/antunit/listener/BaseAntUnitListener.java b/src/main/org/apache/ant/antunit/listener/BaseAntUnitListener.java
index c55216a..199f619 100644
--- a/src/main/org/apache/ant/antunit/listener/BaseAntUnitListener.java
+++ b/src/main/org/apache/ant/antunit/listener/BaseAntUnitListener.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -37,21 +37,14 @@
 import org.apache.tools.ant.taskdefs.LogOutputStream;
 import org.apache.tools.ant.types.EnumeratedAttribute;
 import org.apache.tools.ant.util.FileUtils;
+import org.apache.tools.ant.util.KeepAliveOutputStream;
 import org.apache.tools.ant.util.TeeOutputStream;
 
 /**
  * A test listener for &lt;antunit&gt; modeled aftern the Plain JUnit
  * test listener that is part of Ant.
  */
-public abstract class BaseAntUnitListener
-    implements AntUnitListener {
-
-    protected BaseAntUnitListener(SendLogTo defaultReportTarget,
-                                  String extension) {
-        logTo = defaultReportTarget;
-        this.extension = extension;
-        logLevel = BaseAntUnitListener.AntUnitLogLevel.NONE;
-    }
+public abstract class BaseAntUnitListener implements AntUnitListener {
 
     /**
      * Formatter for timings.
@@ -59,6 +52,17 @@
     protected static final NumberFormat nf = NumberFormat.getInstance();
 
     /**
+     * Create a new {@link BaseAntUnitListener} instance.
+     * @param defaultReportTarget
+     * @param extension
+     */
+    protected BaseAntUnitListener(SendLogTo defaultReportTarget, String extension) {
+        logTo = defaultReportTarget;
+        this.extension = extension;
+        logLevel = BaseAntUnitListener.AntUnitLogLevel.NONE;
+    }
+
+    /**
      * Directory to write reports to.
      */
     private File toDir;
@@ -118,9 +122,7 @@
     }
 
     protected final void close(OutputStream out) {
-        if (out != System.out && out != System.err) {
-            FileUtils.close(out);
-        }
+        FileUtils.close(out);
     }
 
     public void startTest(String target) {
@@ -135,36 +137,43 @@
     }
 
     protected final OutputStream getOut(String buildFile) {
-        OutputStream l, f;
-        l = f = null;
-        if (logTo.getValue().equals(SendLogTo.ANT_LOG)
-            || logTo.getValue().equals(SendLogTo.BOTH)) {
+        final String dest = logTo.getValue();
+
+        if (logTo.getIndex() < 0) {
+            throw new BuildException(String.format("Invalid @sendlogto value '%s'", dest));
+        }
+        OutputStream l;
+
+        if (SendLogTo.ANT_LOG.equals(dest) || SendLogTo.BOTH.equals(dest)) {
             if (parentTask != null) {
                 l = new LogOutputStream(parentTask, Project.MSG_INFO);
             } else {
-                l = System.out;
+                l = new KeepAliveOutputStream(System.out);
             }
-            if (logTo.getValue().equals(SendLogTo.ANT_LOG)) {
+            if (SendLogTo.ANT_LOG.equals(dest)) {
                 return l;
             }
+        } else {
+            l = null;
         }
-        if (logTo.getValue().equals(SendLogTo.FILE)
-            || logTo.getValue().equals(SendLogTo.BOTH)) {
+        OutputStream f;
 
-            String fileName = "TEST-" + normalize(buildFile) + "." + extension;
-            File file = toDir == null
-                ? (parentTask != null 
-                   ? parentTask.getProject().resolveFile(fileName)
-                   : new File(fileName))
-                : new File(toDir, fileName);
-            try {
-                f = new FileOutputStream(file);
-            } catch (IOException e) {
-                throw new BuildException(e);
-            }
-            if (logTo.getValue().equals(SendLogTo.FILE)) {
-                return f;
-            }
+        String fileName = "TEST-" + normalize(buildFile) + "." + extension;
+        File file;
+        if (toDir != null) {
+            file = new File(toDir, fileName);
+        } else if (parentTask == null) {
+            file = new File(fileName);
+        } else {
+            file = parentTask.getProject().resolveFile(fileName);
+        }
+        try {
+            f = new FileOutputStream(file);
+        } catch (IOException e) {
+            throw new BuildException(e);
+        }
+        if (SendLogTo.FILE.equals(dest)) {
+            return f;
         }
         return new TeeOutputStream(l, f);
     }
@@ -177,18 +186,13 @@
      * @return the normalized name
      */
     protected final String normalize(String buildFile) {
-        File base = parentTask != null
-            ? parentTask.getProject().getBaseDir()
+        File base = parentTask != null ? parentTask.getProject().getBaseDir()
             : new File(System.getProperty("user.dir"));
-        buildFile = FileUtils.getFileUtils()
-            .removeLeadingPath(base, new File(buildFile));
-        if (buildFile.length() > 0
-            && buildFile.charAt(0) == File.separatorChar) {
+        buildFile = FileUtils.getFileUtils().removeLeadingPath(base, new File(buildFile));
+        if (buildFile.length() > 0 && buildFile.charAt(0) == File.separatorChar) {
             buildFile = buildFile.substring(1);
         }
-
-        return buildFile.replace('.', '_').replace(':', '_')
-            .replace(File.separatorChar, '.');
+        return buildFile.replace('.', '_').replace(':', '_').replace(File.separatorChar, '.');
     }
 
     protected final Location getLocation(Throwable t) {
diff --git a/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java b/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java
index a26d01e..6d0f5d5 100644
--- a/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java
+++ b/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -38,27 +38,27 @@
  * This AntUnitListener creates a new buildfile with a target for each
  * failed test target in the AntUnit run. The generated target calls
  * the failed target (with setUp and tearDown if present in the called
- * project). 
+ * project).
  * This is intended for rerunning just failed tests.
  */
 public class FailureAntUnitListener extends BaseAntUnitListener {
- 
+
     /** LineSeparator just for beautifying the output. */
-    private static final String BR = System.getProperty("line.separator"); 
+    private static final String BR = System.getProperty("line.separator");
 
     /** A sorted list (without duplicates) of failed tests. */
-    private static SortedSet failedTests = new TreeSet();
-    
+    private static SortedSet<TestInfos> failedTests = new TreeSet<TestInfos>();
+
     /** Where to write the generated buildfile. */
     private static File failureBuildfile;
-    
+
     /** The current running test project. Needed for addError()/addFailure(). */
     private Project currentTestProject;
 
     /** The current running build file. Needed for addError()/addFailure(). */
     private String currentBuildFile;
-    
-    
+
+
     /** No-arg constructor. */
     public FailureAntUnitListener() {
         super(new BaseAntUnitListener.SendLogTo(SendLogTo.ANT_LOG), "txt");
@@ -73,23 +73,23 @@
         currentTestProject = testProject;
         currentBuildFile = buildFile;
     }
-    
+
     public void addError(String target, Throwable ae) {
         super.addError(target, ae);
         failedTests.add(new TestInfos(currentTestProject, currentBuildFile, target, ae.getMessage()));
     }
-    
+
     public void addFailure(String target, AssertionFailedException ae) {
         super.addFailure(target, ae);
         failedTests.add(new TestInfos(currentTestProject, currentBuildFile, target, ae.getMessage()));
-    } 
-    
+    }
+
     /** not in use */
-    public void endTest(String target) { 
+    public void endTest(String target) {
     }
 
     public void endTestSuite(Project testProject, String buildFile) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         // <project> and antunit-target for direct run
         sb.append("<project default=\"antunit\" xmlns:au=\"antlib:org.apache.ant.antunit\">");
         sb.append(BR);
@@ -102,23 +102,23 @@
         sb.append("  </target>").append(BR);
         sb.append(BR);
         sb.append(BR);
-        
+
         // one target for each failed test
         int testNumber = 0;
         NumberFormat f = NumberFormat.getIntegerInstance();
-        for (Iterator it = failedTests.iterator(); it.hasNext();) {
+        for (Iterator<TestInfos> it = failedTests.iterator(); it.hasNext();) {
             sb.append("  <target name=\"test");
             sb.append(f.format(testNumber++));
             sb.append("\">").append(BR);
-            TestInfos testInfos = (TestInfos) it.next();
+            TestInfos testInfos = it.next();
             sb.append(testInfos);
             sb.append("  </target>").append(BR);
             sb.append(BR);
         }
-        
+
         // close the <project>
         sb.append("</project>").append(BR);
-        
+
         // write the whole file
         try {
             FileOutputStream fos = new FileOutputStream(failureBuildfile);
@@ -130,41 +130,40 @@
             throw new BuildException(e);
         }
     }
-    
-    
+
     /**
      * Class for collecting needed information about failed tests.
      */
-    public class TestInfos implements Comparable {
+    public class TestInfos implements Comparable<TestInfos> {
         /** Does the project has a setUp target? */
         boolean projectHasSetup = false;
-        
+
         /** Does the project has a tearDown target? */
         boolean projectHasTearDown = false;
-        
+
         /** The called target. */
         String target;
-        
+
         /** The buildfile of the project. */
         String buildfile;
-        
+
         /** The error message which was shown. */
         String errorMessage;
-        
+
         public TestInfos(Project project, String buildfile, String target, String errorMessage) {
             projectHasSetup = project.getTargets().containsKey("setUp");
             projectHasTearDown = project.getTargets().containsKey("tearDown");
             this.buildfile = buildfile;
-            this.target = target; 
+            this.target = target;
             this.errorMessage = errorMessage;
         }
-        
-        /** 
-         * Creates an &lt;ant&gt; call according to the stored information. 
+
+        /**
+         * Creates an &lt;ant&gt; call according to the stored information.
          * @see java.lang.Object#toString()
          */
         public String toString() {
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
             // make the reader of the buildfile happy
             sb.append("    <!-- ");
             sb.append(errorMessage);
@@ -191,15 +190,10 @@
             sb.append("    </ant>").append(BR);
             return sb.toString();
         }
-        
+
         // Needed, so that a SortedSet could sort this class into the list.
-        public int compareTo(Object other) {
-            if (!(other instanceof TestInfos)) {
-                return -1;
-            } else {
-                TestInfos that = (TestInfos)other;
-                return this.toString().compareTo(that.toString());   
-            }
+        public int compareTo(TestInfos other) {
+            return this.toString().compareTo((other).toString());
         }
     }
 
diff --git a/src/main/org/apache/ant/antunit/listener/PlainAntUnitListener.java b/src/main/org/apache/ant/antunit/listener/PlainAntUnitListener.java
index 980055e..58a310c 100644
--- a/src/main/org/apache/ant/antunit/listener/PlainAntUnitListener.java
+++ b/src/main/org/apache/ant/antunit/listener/PlainAntUnitListener.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -37,7 +37,7 @@
  * test listener that is part of Ant.
  */
 public class PlainAntUnitListener extends BaseAntUnitListener {
-    private OutputStream out = null;
+    private OutputStream out;
     /**
      * Helper to store intermediate output.
      */
@@ -69,9 +69,7 @@
         inner = new StringWriter();
         wri = new PrintWriter(inner);
         out = getOut(buildFile);
-        StringBuffer sb = new StringBuffer("Build File: ");
-        sb.append(buildFile);
-        sb.append(NEW_LINE);
+        StringBuilder sb = new StringBuilder("Build File: ").append(buildFile).append(NEW_LINE);
         try {
             out.write(sb.toString().getBytes());
             out.flush();
@@ -82,7 +80,7 @@
 
     public void endTestSuite(Project testProject, String buildFile) {
         long runTime = System.currentTimeMillis() - start;
-        StringBuffer sb = new StringBuffer("Tests run: ");
+        StringBuilder sb = new StringBuilder("Tests run: ");
         sb.append(runCount);
         sb.append(", Failures: ");
         sb.append(failureCount);
diff --git a/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java b/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java
index 23eddae..7a91be5 100644
--- a/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java
+++ b/src/main/org/apache/ant/antunit/listener/XMLAntUnitListener.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -96,14 +96,15 @@
 
             Element propertiesElement =
                 DOMUtils.createChildElement(root, XMLConstants.PROPERTIES);
-            Hashtable propertiesMap = testProject.getProperties();
-            for (final Iterator iterator = propertiesMap.entrySet().iterator(); 
+            @SuppressWarnings("unchecked")
+            Hashtable<String,Object> propertiesMap = testProject.getProperties();
+            for (final Iterator<Map.Entry<String, Object>> iterator = propertiesMap.entrySet().iterator();
                  iterator.hasNext();) {
-                final Map.Entry property = (Map.Entry) iterator.next();
+                final Map.Entry<String, Object> property = iterator.next();
                 Element e = DOMUtils.createChildElement(propertiesElement,
                                                         XMLConstants.PROPERTY);
                 e.setAttribute(XMLConstants.ATTR_NAME,
-                               property.getKey().toString());
+                               property.getKey());
                 e.setAttribute(XMLConstants.ATTR_VALUE,
                                property.getValue().toString());
             }
@@ -122,7 +123,7 @@
                 log.setLength(0);
                 domWri.write(e, wri, 1, INDENT);
             }
-            e = DOMUtils.createChildElement(root, XMLConstants.ATTR_TESTS); 
+            e = DOMUtils.createChildElement(root, XMLConstants.ATTR_TESTS);
             DOMUtils.appendText(e, String.valueOf(runCount));
             domWri.write(e, wri, 1, INDENT);
             e = DOMUtils.createChildElement(root, XMLConstants.ATTR_FAILURES);
diff --git a/src/tests/junit/org/apache/ant/antunit/LogCapturerTest.java b/src/tests/junit/org/apache/ant/antunit/LogCapturerTest.java
index 4674478..5a041a3 100644
--- a/src/tests/junit/org/apache/ant/antunit/LogCapturerTest.java
+++ b/src/tests/junit/org/apache/ant/antunit/LogCapturerTest.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -42,8 +42,8 @@
         Project p = new Project();
         LogCapturer c = new LogCapturer(p);
 
-        String[] messages = new String[] {"err", "warn", "info", "verbose",
-                                          "debug"};
+        String[] messages = new String[] { "err", "warn", "info", "verbose", "debug" };
+
         for (int i = 0; i < messages.length; i++) {
             BuildEvent be = new BuildEvent(p);
             be.setMessage(messages[i], i);
@@ -66,8 +66,7 @@
             c.messageLogged(be);
         }
         Assert.assertEquals(c.getErrLog(false),
-                            "0" + StringUtils.LINE_SEP
-                            + "1" + StringUtils.LINE_SEP);
+            "0" + StringUtils.LINE_SEP + "1" + StringUtils.LINE_SEP);
     }
 
     public void testWithMerge() {
diff --git a/src/tests/junit/org/apache/ant/antunit/LogContentTest.java b/src/tests/junit/org/apache/ant/antunit/LogContentTest.java
index 5c3aae8..de6721b 100644
--- a/src/tests/junit/org/apache/ant/antunit/LogContentTest.java
+++ b/src/tests/junit/org/apache/ant/antunit/LogContentTest.java
@@ -8,7 +8,7 @@
  * with the License.  You may obtain a copy of the License at
  *
  * https://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -52,23 +52,18 @@
         Project p = new Project();
         LogCapturer c = new LogCapturer(p);
 
-        String[] msgs = new String[] {"err", "warn", "info", "verbose",
-                                          "debug"};
+        String[] msgs = new String[] { "err", "warn", "info", "verbose", "debug" };
+
         for (int i = 0; i < msgs.length; i++) {
             BuildEvent be = new BuildEvent(p);
             be.setMessage(msgs[i], i);
             c.messageLogged(be);
         }
-        assertMessages(new LogContent(p, LogLevel.ERR), msgs,
-                       Project.MSG_ERR);
-        assertMessages(new LogContent(p, LogLevel.WARN), msgs,
-                       Project.MSG_WARN);
-        assertMessages(new LogContent(p, LogLevel.INFO), msgs,
-                       Project.MSG_INFO);
-        assertMessages(new LogContent(p, LogLevel.VERBOSE), msgs,
-                       Project.MSG_VERBOSE);
-        assertMessages(new LogContent(p, LogLevel.DEBUG), msgs,
-                       Project.MSG_DEBUG);
+        assertMessages(new LogContent(p, LogLevel.ERR), msgs, Project.MSG_ERR);
+        assertMessages(new LogContent(p, LogLevel.WARN), msgs, Project.MSG_WARN);
+        assertMessages(new LogContent(p, LogLevel.INFO), msgs, Project.MSG_INFO);
+        assertMessages(new LogContent(p, LogLevel.VERBOSE), msgs, Project.MSG_VERBOSE);
+        assertMessages(new LogContent(p, LogLevel.DEBUG), msgs, Project.MSG_DEBUG);
     }
 
     public void testWithoutMerge() throws IOException {
@@ -85,9 +80,7 @@
         StringResource s = new StringResource();
         ResourceUtils.copyResource(content, s);
 
-        Assert.assertEquals(s.getValue(),
-                            "0" + StringUtils.LINE_SEP
-                            + "1" + StringUtils.LINE_SEP);
+        Assert.assertEquals(s.getValue(), "0" + StringUtils.LINE_SEP + "1" + StringUtils.LINE_SEP);
     }
 
     public void testWithExplicitMerge() throws IOException {
@@ -132,11 +125,11 @@
         String actual = s.getValue();
         for (int i = 0; i <= upTo && i < messages.length; i++) {
             Assert.assertTrue("checking for " + messages[i] + " in " + actual,
-                              actual.indexOf(messages[i]) > -1);
+                actual.indexOf(messages[i]) > -1);
         }
         for (int i = upTo + 1; i < messages.length; i++) {
             Assert.assertTrue("checking for " + messages[i] + " in " + actual,
-                              actual.indexOf(messages[i]) == -1);
+                actual.indexOf(messages[i]) == -1);
         }
     }
 }
diff --git a/src/tests/junit/org/apache/ant/antunit/SetUpAndTearDownTest.java b/src/tests/junit/org/apache/ant/antunit/SetUpAndTearDownTest.java
index 8c79740..18336a1 100644
--- a/src/tests/junit/org/apache/ant/antunit/SetUpAndTearDownTest.java
+++ b/src/tests/junit/org/apache/ant/antunit/SetUpAndTearDownTest.java
@@ -30,10 +30,10 @@
 import org.apache.tools.ant.Project;
 
 public class SetUpAndTearDownTest extends BuildFileTest {
-    
+
     public static class TestReportListener extends BaseAntUnitListener {
 
-        private OutputStream out = null;
+        private OutputStream out;
         /**
          * Helper to store intermediate output.
          */
@@ -82,12 +82,12 @@
             super.addFailure(target, ae);
             wri.println("failure:" + target + "(" + ae.getMessage() + ")");
         }
-        
+
         public void addError(String target, Throwable ae) {
             super.addError(target, ae);
             wri.println("error:" + target + "(" + ae.getMessage() + ")");
         }
-        
+
         public void messageLogged(int level, String message) {}
    }
 
@@ -124,7 +124,7 @@
         int index = log.indexOf("Tests run: 3, Failures: 3, Errors: 0,");
         assertTrue("summary", index > -1);
     }
-    
+
     public void testErrorSetup() {
         executeTarget("testErrorSetup");
         String log = getLog();
@@ -138,7 +138,7 @@
         int index = log.indexOf("Tests run: 3, Failures: 3, Errors: 0,");
         assertTrue("summary", index > -1);
     }
-    
+
     public void testErrorTeardown() {
         executeTarget("testErrorTeardown");
         String log = getLog();
@@ -180,7 +180,7 @@
         index = log.indexOf("error:suiteSetUp(Expected error)");
         assertTrue("testname", index > -1);
     }
-    
+
     public void testFailureSuiteTearDown() {
         executeTarget("testFailureSuiteTearDown");
         String log = getLog();
@@ -189,7 +189,7 @@
         index = log.indexOf("failure:suiteTearDown(Expected failure)");
         assertTrue("testname", index > -1);
     }
-    
+
     public void testErrorSuiteTearDown() {
         executeTarget("testErrorSuiteTearDown");
         String log = getLog();
diff --git a/src/tests/junit/org/apache/ant/antunit/junit4/AntUnitSuiteRunnerTest.java b/src/tests/junit/org/apache/ant/antunit/junit4/AntUnitSuiteRunnerTest.java
index 73dd8ec..a08e660 100644
--- a/src/tests/junit/org/apache/ant/antunit/junit4/AntUnitSuiteRunnerTest.java
+++ b/src/tests/junit/org/apache/ant/antunit/junit4/AntUnitSuiteRunnerTest.java
@@ -23,7 +23,7 @@
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.List;
 
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -42,10 +42,8 @@
     /**
      * Validates the execution sequence.
      */
-    public void testRunFullSuite() throws FileNotFoundException, IOException,
-            InitializationError {
-        AntUnitSuiteRunner runner = new AntUnitSuiteRunner(
-                JUnit4AntUnitRunnable.class);
+    public void testRunFullSuite() throws FileNotFoundException, IOException, InitializationError {
+        AntUnitSuiteRunner runner = new AntUnitSuiteRunner(JUnit4AntUnitRunnable.class);
 
         runner.run(new RunNotifier());
         File outFile = new File("target/test_output/junit_out.xml");
@@ -53,47 +51,46 @@
         String output = FileUtils.readFully(new FileReader(outFile));
         String EXPECT1 = "suiteSetUp-setUp-test1-tearDown-setUp-test2-tearDown-suiteTearDown";
         String EXPECT2 = "suiteSetUp-setUp-test2-tearDown-setUp-test1-tearDown-suiteTearDown";
-        assertTrue("unexted output : " + output, EXPECT1.equals(output)
-                || EXPECT2.equals(output));
+        assertTrue("unexted output : " + output, EXPECT1.equals(output) || EXPECT2.equals(output));
     }
 
-    
+
     /**
      * When a test is executed, the description used in the notification must be
      * equals to the description declared, otherwise the runner is confused (for
      * example in eclipse you have all the tests listed twice, but reported only
      * once as executed.
-     * 
+     *
      * @throws InitializationError
      */
     public void testDescriptionsReportedInNotifier() throws InitializationError {
         final AntUnitSuiteRunner runner = new AntUnitSuiteRunner(
                 JUnit4AntUnitRunnable.class);
-        final ArrayList tDescs = runner.getDescription().getChildren();
+        final List<Description> tDescs = runner.getDescription().getChildren();
 
         RunNotifier notifierMock = new RunNotifier() {
             Description curTest = null;
 
             public void fireTestStarted(Description description) {
                 if (curTest != null) {
-                    mockExecutionError += "Unexpected fireTestStarted("
-                            + description.getDisplayName() + "\n";
+                    mockExecutionError +=
+                        "Unexpected fireTestStarted(" + description.getDisplayName() + "\n";
                 }
                 if (!tDescs.contains(description)) {
-                    mockExecutionError += "Unexpected fireTestStarted("
-                            + description.getDisplayName() + ")\n";
+                    mockExecutionError +=
+                        "Unexpected fireTestStarted(" + description.getDisplayName() + ")\n";
                 }
                 curTest = description;
             }
 
             public void fireTestFinished(Description description) {
                 if (curTest == null) {
-                    mockExecutionError += "Unexpected fireTestFinished("
-                            + description.getDisplayName() + "\n";
+                    mockExecutionError +=
+                        "Unexpected fireTestFinished(" + description.getDisplayName() + "\n";
                 }
                 if (!curTest.equals(description)) {
-                    mockExecutionError += "Unexpected fireTestFinished("
-                            + description.getDisplayName() + "); expect "
+                    mockExecutionError +=
+                        "Unexpected fireTestFinished(" + description.getDisplayName() + "); expect "
                             + curTest.getDisplayName() + "\n";
                 }
                 curTest = null;
@@ -170,8 +167,7 @@
     public static class JUnit4AntUnitRunnableWithNonStaticSuite {
         public AntUnitSuite suite() {
             File f = new File("src/etc/testcases/antunit/junit.xml");
-            return new AntUnitSuite(f,
-                    JUnit4AntUnitRunnableWithNonStaticSuite.class);
+            return new AntUnitSuite(f, JUnit4AntUnitRunnableWithNonStaticSuite.class);
         }
     }
 
@@ -180,23 +176,22 @@
 
     public static class JUnit4AntUnitRunnableWithInvalidSuiteReturnType {
         public static TestSuite suite() {
-            return new TestSuite("We don't support returning generic TestSuite." +
-                    "  The Runner can not handle that");
+            return new TestSuite(
+                "We don't support returning generic TestSuite.  The Runner can not handle that");
         }
     }
-    
+
     public static class JUnit4AntUnitRunnableWithInvalidSuiteReturningNull {
         public static TestSuite suite() {
             return null;
         }
     }
 
-    
+
     public static class JUnit4AntUnitRunnableRefferencingIncorrectFile {
         public static AntUnitSuite suite() {
             File f = new File("build_script_not_found.xml");
-            return new AntUnitSuite(f,
-                    JUnit4AntUnitRunnableWithNonStaticSuite.class);
+            return new AntUnitSuite(f, JUnit4AntUnitRunnableWithNonStaticSuite.class);
         }
     }
 
