diff --git a/compilers/eclipse/src/main/java/org/apache/commons/jci2/compilers/EclipseJavaCompiler.java b/compilers/eclipse/src/main/java/org/apache/commons/jci2/compilers/EclipseJavaCompiler.java
index 20ae3cf..f8fe7a7 100644
--- a/compilers/eclipse/src/main/java/org/apache/commons/jci2/compilers/EclipseJavaCompiler.java
+++ b/compilers/eclipse/src/main/java/org/apache/commons/jci2/compilers/EclipseJavaCompiler.java
@@ -81,7 +81,7 @@
             reader = pReader;
             clazzName = ConversionUtils.convertResourceToClassName(pSourceFile);
             fileName = pSourceFile;
-            int dot = clazzName.lastIndexOf('.');
+            final int dot = clazzName.lastIndexOf('.');
             if (dot > 0) {
                 typeName = clazzName.substring(dot + 1).toCharArray();
             } else {
@@ -221,8 +221,8 @@
 
             public NameEnvironmentAnswer findType( final char[] pTypeName, final char[][] pPackageName ) {
                 final StringBuilder result = new StringBuilder();
-                for (int i = 0; i < pPackageName.length; i++) {
-                    result.append(pPackageName[i]);
+                for (final char[] element : pPackageName) {
+                    result.append(element);
                     result.append('.');
                 }
 
@@ -330,7 +330,7 @@
                 return true;
             }
 
-            public boolean isPackage( char[][] parentPackageName, char[] pPackageName ) {
+            public boolean isPackage( final char[][] parentPackageName, final char[] pPackageName ) {
                 final StringBuilder result = new StringBuilder();
                 if (parentPackageName != null) {
                     for (int i = 0; i < parentPackageName.length; i++) {
@@ -358,7 +358,7 @@
         final ICompilerRequestor compilerRequestor = new ICompilerRequestor() {
             public void acceptResult( final CompilationResult pResult ) {
                 if (pResult.hasProblems()) {
-                    for (IProblem iproblem : pResult.getProblems()) {
+                    for (final IProblem iproblem : pResult.getProblems()) {
                         final CompilationProblem problem = new EclipseCompilationProblem(iproblem);
                         if (problemHandler != null) {
                             problemHandler.handle(problem);
@@ -368,7 +368,7 @@
                 }
                 if (!pResult.hasErrors()) {
                     final ClassFile[] clazzFiles = pResult.getClassFiles();
-                    for (ClassFile clazzFile : clazzFiles) {
+                    for (final ClassFile clazzFile : clazzFiles) {
                         final char[][] compoundName = clazzFile.getCompoundName();
                         final StringBuilder clazzName = new StringBuilder();
                         for (int j = 0; j < compoundName.length; j++) {
diff --git a/compilers/eclipse/src/test/java/org/apache/commons/jci2/compilers/EclipseJavaCompilerTestCase.java b/compilers/eclipse/src/test/java/org/apache/commons/jci2/compilers/EclipseJavaCompilerTestCase.java
index 444883f..822b4e1 100644
--- a/compilers/eclipse/src/test/java/org/apache/commons/jci2/compilers/EclipseJavaCompilerTestCase.java
+++ b/compilers/eclipse/src/test/java/org/apache/commons/jci2/compilers/EclipseJavaCompilerTestCase.java
@@ -35,7 +35,7 @@
     public void testAdditionalTopLevelClassCompile() throws Exception {
         try {
             super.testAdditionalTopLevelClassCompile();
-        } catch (AssertionFailedError e) {
+        } catch (final AssertionFailedError e) {
             if (e.getMessage().contains("The type AdditionalTopLevel collides")) {
                 System.err.println("WARNING: See JCI-59 - EclipseJavaCompile#isPackage() is not yet working correctly - ignoring the failure for now");
             } else {
diff --git a/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyCompilationProblem.java b/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyCompilationProblem.java
index 7a6b3af..d871b80 100755
--- a/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyCompilationProblem.java
+++ b/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyCompilationProblem.java
@@ -46,8 +46,8 @@
             error = true;
         }
         if (pMessage instanceof SyntaxErrorMessage) {
-            SyntaxErrorMessage syntaxErrorMessage = (SyntaxErrorMessage)pMessage;
-            SyntaxException syntaxException = syntaxErrorMessage.getCause();
+            final SyntaxErrorMessage syntaxErrorMessage = (SyntaxErrorMessage)pMessage;
+            final SyntaxException syntaxException = syntaxErrorMessage.getCause();
             message = syntaxException.getMessage();
             fileName = syntaxException.getSourceLocator();
             // FIXME: getStartLine() vs. getLine()
diff --git a/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyJavaCompiler.java b/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyJavaCompiler.java
index 6322093..7450791 100644
--- a/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyJavaCompiler.java
+++ b/compilers/groovy/src/main/java/org/apache/commons/jci2/compilers/GroovyJavaCompiler.java
@@ -87,7 +87,7 @@
             
             @SuppressWarnings("unchecked") // Groovy library is not yet generic
             final List<GroovyClass> classes = unit.getClasses();
-            for (GroovyClass clazz : classes) {
+            for (final GroovyClass clazz : classes) {
                 final byte[] bytes = clazz.getBytes();
                 pStore.write(ConversionUtils.convertClassToResourcePath(clazz.getName()), bytes);
             }
@@ -96,7 +96,7 @@
             @SuppressWarnings("unchecked") // Groovy library is not yet generic
             final Collection<WarningMessage> warnings = col.getWarnings();
             if (warnings != null) {
-                for (WarningMessage warning : warnings) {
+                for (final WarningMessage warning : warnings) {
                     final CompilationProblem problem = new GroovyCompilationProblem(warning); 
                     if (problemHandler != null) {
                         problemHandler.handle(problem);
@@ -108,7 +108,7 @@
             @SuppressWarnings("unchecked") // Groovy library is not yet generic
             final Collection<Message> errors = col.getErrors();
             if (errors != null) {
-                for (Message message : errors) {
+                for (final Message message : errors) {
                     final CompilationProblem problem = new GroovyCompilationProblem(message); 
                     if (problemHandler != null) {
                         problemHandler.handle(problem);
@@ -116,7 +116,7 @@
                     problems.add(problem);
                 }
             }
-        } catch (CompilationFailedException e) {
+        } catch (final CompilationFailedException e) {
             throw new RuntimeException("no expected");
         }
 
diff --git a/compilers/janino/src/main/java/org/apache/commons/jci2/compilers/JaninoJavaCompiler.java b/compilers/janino/src/main/java/org/apache/commons/jci2/compilers/JaninoJavaCompiler.java
index 8d38a05..9a5875c 100644
--- a/compilers/janino/src/main/java/org/apache/commons/jci2/compilers/JaninoJavaCompiler.java
+++ b/compilers/janino/src/main/java/org/apache/commons/jci2/compilers/JaninoJavaCompiler.java
@@ -190,9 +190,9 @@
         
         try {
             compiler.compile(resources);
-        } catch ( LocatedException e ) {
+        } catch ( final LocatedException e ) {
             problems.add(new JaninoCompilationProblem(e));
-        } catch ( IOException e ) {
+        } catch ( final IOException e ) {
             // low level problems reading or writing bytes
         	log.error("this error should have been cought before", e);
         }        
diff --git a/compilers/jsr199/src/main/java/org/apache/commons/jci2/compilers/Jsr199JavaCompiler.java b/compilers/jsr199/src/main/java/org/apache/commons/jci2/compilers/Jsr199JavaCompiler.java
index b71e8c6..25e7144 100644
--- a/compilers/jsr199/src/main/java/org/apache/commons/jci2/compilers/Jsr199JavaCompiler.java
+++ b/compilers/jsr199/src/main/java/org/apache/commons/jci2/compilers/Jsr199JavaCompiler.java
@@ -66,9 +66,9 @@
         }
 
         @Override
-        public CharSequence getCharContent(boolean encodingErrors) throws IOException {
+        public CharSequence getCharContent(final boolean encodingErrors) throws IOException {
             log.debug("getCharContent of " + name);
-            byte[] content = reader.getBytes(name);
+            final byte[] content = reader.getBytes(name);
             return new String(content);
         }
 
@@ -85,7 +85,7 @@
         }
 
         @Override
-        public boolean isNameCompatible(String simpleName, Kind kind) {
+        public boolean isNameCompatible(final String simpleName, final Kind kind) {
             log.debug("isNameCompatible " + simpleName + " " + kind);
             // return super.isNameCompatible(simpleName, kind);
             return true;
@@ -104,7 +104,7 @@
         }
 
         @Override
-        public Reader openReader(boolean arg0) throws IOException {
+        public Reader openReader(final boolean arg0) throws IOException {
             log.debug("openReader");
             return super.openReader(arg0);
         }
@@ -137,51 +137,51 @@
         public void flush() {
             log.debug("flush");
         }
-        public ClassLoader getClassLoader(JavaFileManager.Location location) {
+        public ClassLoader getClassLoader(final JavaFileManager.Location location) {
             log.debug("getClassLoader");
             return null;
         }
-        public FileObject getFileForInput(JavaFileManager.Location location, String packageName, String relativeName) {
+        public FileObject getFileForInput(final JavaFileManager.Location location, final String packageName, final String relativeName) {
             log.debug("getFileForInput");
             return null;
         }
-        public FileObject getFileForOutput(JavaFileManager.Location location, String packageName, String relativeName, FileObject sibling) {
+        public FileObject getFileForOutput(final JavaFileManager.Location location, final String packageName, final String relativeName, final FileObject sibling) {
             log.debug("getFileForOutput");
             return null;
         }
-        public JavaFileObject getJavaFileForInput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind) {
+        public JavaFileObject getJavaFileForInput(final JavaFileManager.Location location, final String className, final JavaFileObject.Kind kind) {
             log.debug("getJavaFileForInput");
             return null;
         }
-        public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) {
+        public JavaFileObject getJavaFileForOutput(final JavaFileManager.Location location, final String className, final JavaFileObject.Kind kind, final FileObject sibling) {
             log.debug("getJavaFileForOutput");
             return null;
         }
-        public int isSupportedOption(String option) {
+        public int isSupportedOption(final String option) {
             log.debug("isSupportedOption " + option);
             return 0;
         }
-        public boolean handleOption(String current, Iterator<String> remaining) {
+        public boolean handleOption(final String current, final Iterator<String> remaining) {
             log.debug("handleOption " + current);
             return false;
         }
-        public boolean hasLocation(JavaFileManager.Location location) {
+        public boolean hasLocation(final JavaFileManager.Location location) {
             log.debug("hasLocation " + location);
             return false;
         }
-        public String inferBinaryName(JavaFileManager.Location location, JavaFileObject file) {
-            String s = file.getName().replaceFirst(".java", ".class"); 
+        public String inferBinaryName(final JavaFileManager.Location location, final JavaFileObject file) {
+            final String s = file.getName().replaceFirst(".java", ".class"); 
             log.debug("inferBinaryName " + file.getName() + " -> " + s);
             return s;
         }
-        public Iterable<JavaFileObject> list(JavaFileManager.Location location, String packageName, Set<JavaFileObject.Kind> kinds, boolean recurse) {
+        public Iterable<JavaFileObject> list(final JavaFileManager.Location location, final String packageName, final Set<JavaFileObject.Kind> kinds, final boolean recurse) {
             if (packageName.startsWith("java.")) {
                 return new ArrayList<JavaFileObject>();
             }
             log.debug("list " + location + packageName + kinds + recurse);
             return units;
         }
-        public boolean isSameFile(FileObject fileobject, FileObject fileobject1) {
+        public boolean isSameFile(final FileObject fileobject, final FileObject fileobject1) {
           return false;
         }
     }
@@ -196,11 +196,10 @@
         settings = pSettings;
     }
 
-    public CompilationResult compile( final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore, final ClassLoader classLoader, JavaCompilerSettings settings) {
+    public CompilationResult compile( final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore, final ClassLoader classLoader, final JavaCompilerSettings settings) {
 
         final Collection<JavaFileObject> units = new ArrayList<JavaFileObject>();
-        for (int i = 0; i < pResourcePaths.length; i++) {
-            final String sourcePath = pResourcePaths[i];
+        for (final String sourcePath : pResourcePaths) {
             log.debug("compiling " + sourcePath);
             units.add(new CompilationUnit(sourcePath, pReader));
         }
@@ -208,7 +207,7 @@
         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
 
         if (compiler == null) {
-            ServiceLoader<javax.tools.JavaCompiler> loader = ServiceLoader.load(javax.tools.JavaCompiler.class);
+            final ServiceLoader<javax.tools.JavaCompiler> loader = ServiceLoader.load(javax.tools.JavaCompiler.class);
             compiler = loader.iterator().next();
         }
 
@@ -219,7 +218,7 @@
         final JavaFileManager fileManager = new JciJavaFileManager(units, pStore);
         final DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
 
-        CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, units);
+        final CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, units);
 
         if (task.call().booleanValue()) {
             log.debug("compiled");
diff --git a/compilers/rhino/src/main/java/org/apache/commons/jci2/compilers/RhinoJavaCompiler.java b/compilers/rhino/src/main/java/org/apache/commons/jci2/compilers/RhinoJavaCompiler.java
index f4f093e..7b477dd 100644
--- a/compilers/rhino/src/main/java/org/apache/commons/jci2/compilers/RhinoJavaCompiler.java
+++ b/compilers/rhino/src/main/java/org/apache/commons/jci2/compilers/RhinoJavaCompiler.java
@@ -72,7 +72,7 @@
         
         private final class ProblemCollector implements ErrorReporter {
 
-            public void error(String pMessage, String pFileName, int pLine, String pScript, int pColumn) {
+            public void error(final String pMessage, final String pFileName, final int pLine, final String pScript, final int pColumn) {
 
                 final CompilationProblem problem = new RhinoCompilationProblem(pMessage, pFileName, pLine, pScript, pColumn, true); 
 
@@ -83,7 +83,7 @@
                 problems.add(problem); 
             }
 
-            public void warning(String pMessage, String pFileName, int pLine, String pScript, int pColumn) {
+            public void warning(final String pMessage, final String pFileName, final int pLine, final String pScript, final int pColumn) {
 
                 final CompilationProblem problem = new RhinoCompilationProblem(pMessage, pFileName, pLine, pScript, pColumn, false); 
 
@@ -94,7 +94,7 @@
                 problems.add(problem); 
             }
 
-            public EvaluatorException runtimeError(String pMessage, String pFileName, int pLine, String pScript, int pColumn) {
+            public EvaluatorException runtimeError(final String pMessage, final String pFileName, final int pLine, final String pScript, final int pColumn) {
                 return new EvaluatorException(pMessage, pFileName, pLine, pScript, pColumn);
             }
         }
@@ -121,9 +121,9 @@
 
             try {
                 return compileClass(context, pName);
-            } catch( EvaluatorException e ) {
+            } catch( final EvaluatorException e ) {
                 throw new ClassNotFoundException(e.getMessage(), e);
-            } catch (IOException e) {
+            } catch (final IOException e) {
                 throw new ClassNotFoundException(e.getMessage(), e);
             } finally {
                 Context.exit();
@@ -212,7 +212,7 @@
 
                 store.write(clazzName.replace('.', '/') + ".class", clazzBytes);
 
-                Class<?> c = loader.defineClass(clazzName, clazzBytes);
+                final Class<?> c = loader.defineClass(clazzName, clazzBytes);
                 loader.linkClass(c);
 
                 if (i == 0) {
@@ -224,7 +224,7 @@
             return clazz;
         }
 
-        private String getName(String s) {
+        private String getName(final String s) {
             final int i = s.lastIndexOf('/');
             if (i < 0) {
                 return s;
@@ -257,13 +257,13 @@
 
         final RhinoCompilingClassLoader cl = new RhinoCompilingClassLoader(pReader, pStore, pClassLoader);
 
-        for (int i = 0; i < pResourcePaths.length; i++) {
-            log.debug("compiling " + pResourcePaths[i]);
+        for (final String pResourcePath : pResourcePaths) {
+            log.debug("compiling " + pResourcePath);
             
-            final String clazzName = ConversionUtils.convertResourceToClassName(pResourcePaths[i]);
+            final String clazzName = ConversionUtils.convertResourceToClassName(pResourcePath);
             try {
                 cl.loadClass(clazzName);
-            } catch (ClassNotFoundException e) {
+            } catch (final ClassNotFoundException e) {
             }
         }
 
diff --git a/core/src/main/java/org/apache/commons/jci2/ReloadingClassLoader.java b/core/src/main/java/org/apache/commons/jci2/ReloadingClassLoader.java
index e664556..771c274 100644
--- a/core/src/main/java/org/apache/commons/jci2/ReloadingClassLoader.java
+++ b/core/src/main/java/org/apache/commons/jci2/ReloadingClassLoader.java
@@ -104,27 +104,27 @@
         delegate.clearAssertionStatus();
     }
     @Override
-    public URL getResource(String name) {
+    public URL getResource(final String name) {
         return delegate.getResource(name);
     }
     @Override
-    public InputStream getResourceAsStream(String name) {
+    public InputStream getResourceAsStream(final String name) {
         return delegate.getResourceAsStream(name);
     }
     @Override
-    public Class<?> loadClass(String name) throws ClassNotFoundException {
+    public Class<?> loadClass(final String name) throws ClassNotFoundException {
         return delegate.loadClass(name);
     }
     @Override
-    public void setClassAssertionStatus(String className, boolean enabled) {
+    public void setClassAssertionStatus(final String className, final boolean enabled) {
         delegate.setClassAssertionStatus(className, enabled);
     }
     @Override
-    public void setDefaultAssertionStatus(boolean enabled) {
+    public void setDefaultAssertionStatus(final boolean enabled) {
         delegate.setDefaultAssertionStatus(enabled);
     }
     @Override
-    public void setPackageAssertionStatus(String packageName, boolean enabled) {
+    public void setPackageAssertionStatus(final String packageName, final boolean enabled) {
         delegate.setPackageAssertionStatus(packageName, enabled);
     }
 }
diff --git a/core/src/main/java/org/apache/commons/jci2/compilers/CompilationResult.java b/core/src/main/java/org/apache/commons/jci2/compilers/CompilationResult.java
index ca22097..b48a680 100644
--- a/core/src/main/java/org/apache/commons/jci2/compilers/CompilationResult.java
+++ b/core/src/main/java/org/apache/commons/jci2/compilers/CompilationResult.java
@@ -38,7 +38,7 @@
         final Collection<CompilationProblem> errorsColl = new ArrayList<CompilationProblem>();
         final Collection<CompilationProblem> warningsColl = new ArrayList<CompilationProblem>();
 
-        for (CompilationProblem problem : pProblems) {
+        for (final CompilationProblem problem : pProblems) {
             if (problem.isError()) {
                 errorsColl.add(problem);
             } else {
diff --git a/core/src/main/java/org/apache/commons/jci2/compilers/JavaCompilerFactory.java b/core/src/main/java/org/apache/commons/jci2/compilers/JavaCompilerFactory.java
index 198eb74..1027fda 100644
--- a/core/src/main/java/org/apache/commons/jci2/compilers/JavaCompilerFactory.java
+++ b/core/src/main/java/org/apache/commons/jci2/compilers/JavaCompilerFactory.java
@@ -76,7 +76,7 @@
             try {
                 clazz = Class.forName(className);
                 classCache.put(className, clazz);
-            } catch (ClassNotFoundException e) {
+            } catch (final ClassNotFoundException e) {
                 clazz = null;
             }
         }
@@ -87,7 +87,7 @@
         
         try {
             return (JavaCompiler) clazz.newInstance();
-        } catch (Throwable t) {
+        } catch (final Throwable t) {
             return null;
         }
     }
diff --git a/core/src/main/java/org/apache/commons/jci2/listeners/CompilingListener.java b/core/src/main/java/org/apache/commons/jci2/listeners/CompilingListener.java
index ea62ae8..ca7b547 100644
--- a/core/src/main/java/org/apache/commons/jci2/listeners/CompilingListener.java
+++ b/core/src/main/java/org/apache/commons/jci2/listeners/CompilingListener.java
@@ -105,13 +105,13 @@
 
         final Collection<String> resourceNames = new ArrayList<String>();
         
-        for (File createdFile : created) {
+        for (final File createdFile : created) {
             if (createdFile.getName().endsWith(getSourceFileExtension())) {
                 resourceNames.add(getSourceNameFromFile(pObserver, createdFile));
             }
         }
         
-        for (File changedFile : changed) {
+        for (final File changedFile : changed) {
             if (changedFile.getName().endsWith(getSourceFileExtension())) {
                 resourceNames.add(getSourceNameFromFile(pObserver, changedFile));
             }
@@ -133,7 +133,7 @@
         log.debug("created:" + created.size() + " changed:" + changed.size() + " deleted:" + deleted.size() + " resources");
 
         if (deleted.size() > 0) {
-            for (File deletedFile : deleted) {
+            for (final File deletedFile : deleted) {
                 final String resourceName = ConversionUtils.getResourceNameFromFileName(ConversionUtils.relative(pObserver.getRootDirectory(), deletedFile));
                 
                 if (resourceName.endsWith(getSourceFileExtension())) {
@@ -170,8 +170,8 @@
             if (errors.length > 0) {
                 // FIXME: they need to be marked for re-compilation
                 // and then added as compileables again
-                for (int j = 0; j < resourcesToCompile.length; j++) {
-                    transactionalStore.remove(resourcesToCompile[j]);
+                for (final String element : resourcesToCompile) {
+                    transactionalStore.remove(element);
                 }
             }
             
diff --git a/core/src/main/java/org/apache/commons/jci2/listeners/ReloadingListener.java b/core/src/main/java/org/apache/commons/jci2/listeners/ReloadingListener.java
index 0675667..2c1ecd6 100644
--- a/core/src/main/java/org/apache/commons/jci2/listeners/ReloadingListener.java
+++ b/core/src/main/java/org/apache/commons/jci2/listeners/ReloadingListener.java
@@ -77,7 +77,7 @@
         log.debug("created:" + created.size() + " changed:" + changed.size() + " deleted:" + deleted.size() + " resources");
 
         if (deleted.size() > 0) {
-            for (File file : deleted) {
+            for (final File file : deleted) {
                 final String resourceName = ConversionUtils.getResourceNameFromFileName(ConversionUtils.relative(pObserver.getRootDirectory(), file));
                 store.remove(resourceName);
             }
@@ -85,7 +85,7 @@
         }
 
         if (created.size() > 0) {
-            for (File file : created) {
+            for (final File file : created) {
                 FileInputStream is = null;
                 try {
                     is = new FileInputStream(file);
@@ -101,7 +101,7 @@
         }
 
         if (changed.size() > 0) {
-            for (File file : changed) {
+            for (final File file : changed) {
                 FileInputStream is = null;
                 try {
                     is = new FileInputStream(file);
@@ -142,7 +142,7 @@
     }
 
     void notifyReloadNotificationListeners() {
-        for (ReloadNotificationListener listener : notificationListeners) {
+        for (final ReloadNotificationListener listener : notificationListeners) {
             log.debug("notifying listener " + listener);
 
             listener.handleNotification();
diff --git a/core/src/main/java/org/apache/commons/jci2/readers/FileResourceReader.java b/core/src/main/java/org/apache/commons/jci2/readers/FileResourceReader.java
index b285db7..aebe2a1 100644
--- a/core/src/main/java/org/apache/commons/jci2/readers/FileResourceReader.java
+++ b/core/src/main/java/org/apache/commons/jci2/readers/FileResourceReader.java
@@ -43,7 +43,7 @@
     public byte[] getBytes( final String pResourceName ) {
         try {
             return FileUtils.readFileToString(new File(root, pResourceName), "UTF-8").getBytes();
-        } catch(Exception e) {
+        } catch(final Exception e) {
             return null;
         }
     }
@@ -65,8 +65,8 @@
     private void list( final File pFile, final List<String> pFiles ) {
         if (pFile.isDirectory()) {
             final File[] directoryFiles = pFile.listFiles();
-            for (int i = 0; i < directoryFiles.length; i++) {
-                list(directoryFiles[i], pFiles);
+            for (final File directoryFile : directoryFiles) {
+                list(directoryFile, pFiles);
             }
         } else {
             pFiles.add(pFile.getAbsolutePath().substring(root.getAbsolutePath().length()+1));
diff --git a/core/src/main/java/org/apache/commons/jci2/stores/FileResourceStore.java b/core/src/main/java/org/apache/commons/jci2/stores/FileResourceStore.java
index 00b92b1..003bf17 100644
--- a/core/src/main/java/org/apache/commons/jci2/stores/FileResourceStore.java
+++ b/core/src/main/java/org/apache/commons/jci2/stores/FileResourceStore.java
@@ -48,7 +48,7 @@
             is = new FileInputStream(getFile(pResourceName));
             final byte[] data = IOUtils.toByteArray(is);
             return data;
-        } catch (Exception e) {
+        } catch (final Exception e) {
             return null;
         } finally {
             IOUtils.closeQuietly(is);
@@ -65,7 +65,7 @@
             }
             os = new FileOutputStream(file);
             os.write(pData);
-        } catch (Exception e) {
+        } catch (final Exception e) {
             // FIXME: now what?
         } finally {
             IOUtils.closeQuietly(os);
@@ -98,8 +98,8 @@
     private void list(final File pFile, final List<String> pFiles) {
         if (pFile.isDirectory()) {
             final File[] directoryFiles = pFile.listFiles();
-            for (int i=0; i < directoryFiles.length; i++) {
-                list(directoryFiles[i], pFiles);
+            for (final File directoryFile : directoryFiles) {
+                list(directoryFile, pFiles);
             }
         } else {
             pFiles.add(pFile.getAbsolutePath().substring(root.getAbsolutePath().length()+1));
diff --git a/core/src/main/java/org/apache/commons/jci2/stores/MemoryResourceStore.java b/core/src/main/java/org/apache/commons/jci2/stores/MemoryResourceStore.java
index eb50166..84f1d92 100644
--- a/core/src/main/java/org/apache/commons/jci2/stores/MemoryResourceStore.java
+++ b/core/src/main/java/org/apache/commons/jci2/stores/MemoryResourceStore.java
@@ -61,7 +61,7 @@
         }
         final List<String> names = new ArrayList<String>();
         
-        for (String name : store.keySet()) {
+        for (final String name : store.keySet()) {
             names.add(name);
         }
 
diff --git a/core/src/main/java/org/apache/commons/jci2/stores/ResourceStoreClassLoader.java b/core/src/main/java/org/apache/commons/jci2/stores/ResourceStoreClassLoader.java
index 175376f..0b8db35 100644
--- a/core/src/main/java/org/apache/commons/jci2/stores/ResourceStoreClassLoader.java
+++ b/core/src/main/java/org/apache/commons/jci2/stores/ResourceStoreClassLoader.java
@@ -42,7 +42,7 @@
     private Class<?> fastFindClass(final String name) {
         
         if (stores != null) {
-            for (ResourceStore store : stores) {
+            for (final ResourceStore store : stores) {
                 final byte[] clazzBytes = store.read(ConversionUtils.convertClassToResourcePath(name));
                 if (clazzBytes != null) {
                     log.debug(getId() + " found class: " + name  + " (" + clazzBytes.length + " bytes)");
@@ -55,7 +55,7 @@
     }
     
     @Override
-    protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+    protected synchronized Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
         // log.debug(getId() + " looking for: " + name);
         Class<?> clazz = findLoadedClass(name);
 
diff --git a/core/src/test/java/org/apache/commons/jci2/CompilingClassLoaderTestCase.java b/core/src/test/java/org/apache/commons/jci2/CompilingClassLoaderTestCase.java
index 7d4bac2..566e216 100644
--- a/core/src/test/java/org/apache/commons/jci2/CompilingClassLoaderTestCase.java
+++ b/core/src/test/java/org/apache/commons/jci2/CompilingClassLoaderTestCase.java
@@ -51,10 +51,9 @@
 
         private final Log log = LogFactory.getLog(MockJavaCompiler.class);
 
-        public CompilationResult compile(String[] pResourcePaths, ResourceReader pReader, ResourceStore pStore, ClassLoader pClassLoader, JavaCompilerSettings pSettings ) {
+        public CompilationResult compile(final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore, final ClassLoader pClassLoader, final JavaCompilerSettings pSettings ) {
 
-            for (int i = 0; i < pResourcePaths.length; i++) {
-                final String resourcePath = pResourcePaths[i];
+            for (final String resourcePath : pResourcePaths) {
                 final byte[] resourceContent = pReader.getBytes(resourcePath);
 
                 log.debug("resource " + resourcePath + " = " + ((resourceContent!=null)?new String(resourceContent):null) );
@@ -65,7 +64,7 @@
 
                     try {
                         data = SimpleDump.dump(new String(resourceContent));
-                    } catch (Exception e) {
+                    } catch (final Exception e) {
                         throw new RuntimeException("cannot handle resource " + resourcePath, e);
                     }
 
@@ -73,7 +72,7 @@
 
                     try {
                         data = ExtendedDump.dump();
-                    } catch (Exception e) {
+                    } catch (final Exception e) {
                         throw new RuntimeException("cannot handle resource " + resourcePath, e);
                     }
 
@@ -90,15 +89,15 @@
             return new CompilationResult(new CompilationProblem[0]);
         }
 
-        public CompilationResult compile(String[] pResourcePaths, ResourceReader pReader, ResourceStore pStore, ClassLoader pClassLoader) {
+        public CompilationResult compile(final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore, final ClassLoader pClassLoader) {
             return compile(pResourcePaths, pReader, pStore, pClassLoader, null);
         }
 
-        public CompilationResult compile(String[] pResourcePaths, ResourceReader pReader, ResourceStore pStore) {
+        public CompilationResult compile(final String[] pResourcePaths, final ResourceReader pReader, final ResourceStore pStore) {
             return compile(pResourcePaths, pReader, pStore, null);
         }
 
-        public void setCompilationProblemHandler(CompilationProblemHandler pHandler) {
+        public void setCompilationProblemHandler(final CompilationProblemHandler pHandler) {
         }
 
         public JavaCompilerSettings createDefaultSettings() {
diff --git a/core/src/test/java/org/apache/commons/jci2/ReloadingClassLoaderRemoveTestCase.java b/core/src/test/java/org/apache/commons/jci2/ReloadingClassLoaderRemoveTestCase.java
index b79fe69..8879017 100644
--- a/core/src/test/java/org/apache/commons/jci2/ReloadingClassLoaderRemoveTestCase.java
+++ b/core/src/test/java/org/apache/commons/jci2/ReloadingClassLoaderRemoveTestCase.java
@@ -34,10 +34,10 @@
     private final Log log = LogFactory.getLog(ReloadingClassLoaderRemoveTestCase.class);
     
     private final byte[] clazzSimpleA;
-    private MemoryResourceStore store1 = new MemoryResourceStore();
-    private MemoryResourceStore store2 = new MemoryResourceStore();
-    private MemoryResourceStore store3 = new MemoryResourceStore();
-    private MemoryResourceStore store4 = new MemoryResourceStore();
+    private final MemoryResourceStore store1 = new MemoryResourceStore();
+    private final MemoryResourceStore store2 = new MemoryResourceStore();
+    private final MemoryResourceStore store3 = new MemoryResourceStore();
+    private final MemoryResourceStore store4 = new MemoryResourceStore();
 
     public ReloadingClassLoaderRemoveTestCase() throws Exception {
         clazzSimpleA = SimpleDump.dump("SimpleA");
@@ -60,7 +60,7 @@
      * Bug: The While loop in the removeResourceStore() throws an ArrayOutOfBoundsException
      */
     public void testRemoveStoreNotFoundClassLoaderNoStores() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         checkRemoveResourceStore("No ResourceStore", loader, store1, false);
     }
 
@@ -71,7 +71,7 @@
      * Bug: The While loop in the removeResourceStore() throws an ArrayOutOfBoundsException
      */
     public void testRemoveStoreNotFoundClassLoaderHasStores() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         loader.addResourceStore(store1);
         loader.addResourceStore(store2);
         checkRemoveResourceStore("Has ResourceStore", loader, store3, false);
@@ -86,7 +86,7 @@
      *      array is too large.
      */
     public void testRemoveStoresOne() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         loader.addResourceStore(store1);
         loader.addResourceStore(store2);
         loader.addResourceStore(store3);
@@ -113,7 +113,7 @@
      *      ArrayIndexOutOfBoundsException (??not sure why??)
      */
     public void testRemoveStoresTwo() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         loader.addResourceStore(store1);
         loader.addResourceStore(store2);
         loader.addResourceStore(store3);
@@ -140,7 +140,7 @@
      *      and copies store3 and store2 to their same positions
      */
     public void testRemoveStoresThree() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         loader.addResourceStore(store1);
         loader.addResourceStore(store2);
         loader.addResourceStore(store3);
@@ -167,7 +167,7 @@
      *      ArrayIndexOutOfBoundsException because the length to copy is -1
      */
     public void testRemoveStoresFour() {
-        ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
+        final ReloadingClassLoader loader = new ReloadingClassLoader(getClass().getClassLoader());
         loader.addResourceStore(store1);
         loader.addResourceStore(store2);
         loader.addResourceStore(store3);
@@ -199,37 +199,37 @@
     public void testLoadClassAfterResourceStoreRemoved() {
 
         // Create a class loader & add resource store
-        ReloadingClassLoader loader = new ReloadingClassLoader(this.getClass().getClassLoader());
-        MemoryResourceStore store = new MemoryResourceStore();
+        final ReloadingClassLoader loader = new ReloadingClassLoader(this.getClass().getClassLoader());
+        final MemoryResourceStore store = new MemoryResourceStore();
         loader.addResourceStore(store);
 
         // Check "jci2.Simple" class can't be loaded
         try {
             loader.loadClass("jci2.Simple").newInstance();
             fail("Success loadClass[1]");
-        } catch(ClassNotFoundException e) {
+        } catch(final ClassNotFoundException e) {
             // expected not found
-        } catch(Exception e) {
+        } catch(final Exception e) {
             log.error(e);
             fail("Error loadClass[1]: " + e);
         }
 
         // Add "jci2.Simple" class to the resource store
-        String toStringValue = "FooBar";
+        final String toStringValue = "FooBar";
         try {
-            byte[] classBytes = SimpleDump.dump(toStringValue);
+            final byte[] classBytes = SimpleDump.dump(toStringValue);
             store.write("jci2/Simple.class", classBytes);
-        } catch(Exception e) {
+        } catch(final Exception e) {
             log.error(e);
             fail("Error adding class to store: " + e);
         }
 
         // Check "jci2.Simple" class can now be loaded
         try {
-            Object simple2 = loader.loadClass("jci2.Simple").newInstance();
+            final Object simple2 = loader.loadClass("jci2.Simple").newInstance();
             assertNotNull("Found loadClass[2]",  simple2);        
             assertEquals("toString loadClass[2]",  toStringValue, simple2.toString());        
-        } catch(Exception e) {
+        } catch(final Exception e) {
             log.error(e);
             fail("Error loadClass[2]: " + e);
         }
@@ -241,9 +241,9 @@
         try {
             loader.loadClass("jci2.Simple").newInstance();
             fail("Success loadClass[3]");
-        } catch(ClassNotFoundException e) {
+        } catch(final ClassNotFoundException e) {
             // expected not found
-        } catch(Exception e) {
+        } catch(final Exception e) {
             log.error(e);
             fail("Error loadClass[3]: " + e);
         }
@@ -253,10 +253,10 @@
     /**
      * Check removing a ResourceStore from ReloadingClassLoader
      */
-    private void checkRemoveResourceStore(String label, ReloadingClassLoader loader, ResourceStore store, boolean expected) {
+    private void checkRemoveResourceStore(final String label, final ReloadingClassLoader loader, final ResourceStore store, final boolean expected) {
         try {
             assertEquals(label, expected, loader.removeResourceStore(store));
-        } catch(Exception e) {
+        } catch(final Exception e) {
             log.error(label, e);
             fail(label + " failed: " + e);
         }
diff --git a/core/src/test/java/org/apache/commons/jci2/classes/ExtendedDump.java b/core/src/test/java/org/apache/commons/jci2/classes/ExtendedDump.java
index 81f28bb..6f3688f 100644
--- a/core/src/test/java/org/apache/commons/jci2/classes/ExtendedDump.java
+++ b/core/src/test/java/org/apache/commons/jci2/classes/ExtendedDump.java
@@ -27,7 +27,7 @@
 
     public static byte[] dump() throws Exception {
 
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
         MethodVisitor mv;
 
         cw.visit(V1_4, ACC_PUBLIC + ACC_SUPER, "jci2/Extended", null, "jci2/Simple", null);
@@ -37,13 +37,13 @@
         {
             mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
             mv.visitCode();
-            Label l0 = new Label();
+            final Label l0 = new Label();
             mv.visitLabel(l0);
             mv.visitLineNumber(3, l0);
             mv.visitVarInsn(ALOAD, 0);
             mv.visitMethodInsn(INVOKESPECIAL, "jci2/Simple", "<init>", "()V");
             mv.visitInsn(RETURN);
-            Label l1 = new Label();
+            final Label l1 = new Label();
             mv.visitLabel(l1);
             mv.visitLocalVariable("this", "Ljci/Extended;", null, l0, l1, 0);
             mv.visitMaxs(1, 1);
@@ -52,7 +52,7 @@
         {
             mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
             mv.visitCode();
-            Label l0 = new Label();
+            final Label l0 = new Label();
             mv.visitLabel(l0);
             mv.visitLineNumber(6, l0);
             mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
@@ -64,7 +64,7 @@
             mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
             mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuffer", "toString", "()Ljava/lang/String;");
             mv.visitInsn(ARETURN);
-            Label l1 = new Label();
+            final Label l1 = new Label();
             mv.visitLabel(l1);
             mv.visitLocalVariable("this", "Ljci/Extended;", null, l0, l1, 0);
             mv.visitMaxs(3, 1);
diff --git a/core/src/test/java/org/apache/commons/jci2/classes/SimpleDump.java b/core/src/test/java/org/apache/commons/jci2/classes/SimpleDump.java
index 42d623d..43afad7 100644
--- a/core/src/test/java/org/apache/commons/jci2/classes/SimpleDump.java
+++ b/core/src/test/java/org/apache/commons/jci2/classes/SimpleDump.java
@@ -26,7 +26,7 @@
 
     public static byte[] dump( final String to ) throws Exception {
 
-        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
         MethodVisitor mv;
 
         cw.visit(V1_4, ACC_PUBLIC + ACC_SUPER, "jci2/Simple", null, "java/lang/Object", null);
@@ -36,13 +36,13 @@
         {
             mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
             mv.visitCode();
-            Label l0 = new Label();
+            final Label l0 = new Label();
             mv.visitLabel(l0);
             mv.visitLineNumber(3, l0);
             mv.visitVarInsn(ALOAD, 0);
             mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
             mv.visitInsn(RETURN);
-            Label l1 = new Label();
+            final Label l1 = new Label();
             mv.visitLabel(l1);
             mv.visitLocalVariable("this", "Ljci/Simple;", null, l0, l1, 0);
             mv.visitMaxs(1, 1);
@@ -51,12 +51,12 @@
         {
             mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
             mv.visitCode();
-            Label l0 = new Label();
+            final Label l0 = new Label();
             mv.visitLabel(l0);
             mv.visitLineNumber(6, l0);
             mv.visitLdcInsn(to);
             mv.visitInsn(ARETURN);
-            Label l1 = new Label();
+            final Label l1 = new Label();
             mv.visitLabel(l1);
             mv.visitLocalVariable("this", "Ljci/Simple;", null, l0, l1, 0);
             mv.visitMaxs(1, 1);
diff --git a/core/src/test/java/org/apache/commons/jci2/compilers/AbstractCompilerTestCase.java b/core/src/test/java/org/apache/commons/jci2/compilers/AbstractCompilerTestCase.java
index 6b1d7e1..f5f1788 100644
--- a/core/src/test/java/org/apache/commons/jci2/compilers/AbstractCompilerTestCase.java
+++ b/core/src/test/java/org/apache/commons/jci2/compilers/AbstractCompilerTestCase.java
@@ -343,7 +343,7 @@
     public final String toString( final CompilationProblem[] pProblems ) {
         final StringBuilder sb = new StringBuilder();
 
-        for (CompilationProblem problem : pProblems) {
+        for (final CompilationProblem problem : pProblems) {
             sb.append(problem.getMessage()).append(", ");
         }
 
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/commandline/CommandlineCompiler.java b/examples/src/main/java/org/apache/commons/jci2/examples/commandline/CommandlineCompiler.java
index 596f19f..f79d713 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/commandline/CommandlineCompiler.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/commandline/CommandlineCompiler.java
@@ -46,7 +46,7 @@
  */
 public final class CommandlineCompiler {
     
-    public static void main( String[] args ) throws Exception {
+    public static void main( final String[] args ) throws Exception {
 
         final Options options = new Options();
 
@@ -115,7 +115,7 @@
         final JavaCompilerSettings settings = compiler.createDefaultSettings();
 
 
-        for (Iterator it = cmd.iterator(); it.hasNext();) {
+        for (final Iterator it = cmd.iterator(); it.hasNext();) {
             final Option option = (Option) it.next();
             if ("classpath".equals(option.getOpt())) {
                 final String[] values = option.getValues();
@@ -175,8 +175,8 @@
         
         final String[] resource = cmd.getArgs();
         
-        for (int i = 0; i < resource.length; i++) {
-            System.out.println("compiling " + resource[i]);
+        for (final String element : resource) {
+            System.out.println("compiling " + element);
         }
         
         final CompilationResult result = compiler.compile(resource, reader, store, classloader);
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/configuration/ConfigurationReloading.java b/examples/src/main/java/org/apache/commons/jci2/examples/configuration/ConfigurationReloading.java
index 5e2498e..a580572 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/configuration/ConfigurationReloading.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/configuration/ConfigurationReloading.java
@@ -38,7 +38,7 @@
 
     private final FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
 
-    private void run(String[] args) {
+    private void run(final String[] args) {
 
         final File configFile = new File("some.properties");
 
@@ -47,7 +47,7 @@
         final Collection<Configurable> configurables = new ArrayList<Configurable>();
 
         final FilesystemAlterationListener listener = new FileChangeListener() {
-            public void onStop(FilesystemAlterationObserver pObserver) {
+            public void onStop(final FilesystemAlterationObserver pObserver) {
                 super.onStop(pObserver);
 
                 if (hasChanged()) {
@@ -61,16 +61,16 @@
 
                         System.out.println("Notifying about configuration change " + configFile);
 
-                        for (Configurable configurable : configurables) {
+                        for (final Configurable configurable : configurables) {
                             configurable.configure(props);
                         }
 
-                    } catch (Exception e) {
+                    } catch (final Exception e) {
                         System.err.println("Failed to load configuration " + configFile);
                     } finally {
                     	try {
 							is.close();
-						} catch (IOException e) {
+						} catch (final IOException e) {
 						}
                     }
 
@@ -86,12 +86,12 @@
         while(true) {
             try {
                 Thread.sleep(1000);
-            } catch (InterruptedException e) {
+            } catch (final InterruptedException e) {
             }
         }
     }
 
-    public static void main(String[] args) {
+    public static void main(final String[] args) {
         new ConfigurationReloading().run(args);
     }
 }
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/configuration/Something.java b/examples/src/main/java/org/apache/commons/jci2/examples/configuration/Something.java
index af8eb46..cfddfd6 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/configuration/Something.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/configuration/Something.java
@@ -21,7 +21,7 @@
 
 public class Something implements Configurable {
 
-    public void configure( Properties properties ) throws ConfigurationException {
+    public void configure( final Properties properties ) throws ConfigurationException {
         System.out.println("Configuration changed");
     }
 
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspGenerator.java b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspGenerator.java
index 4e533a1..11706ce 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspGenerator.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspGenerator.java
@@ -38,7 +38,7 @@
         final StringBuilder sb = new StringBuilder();
         final char[] input = s.toCharArray();
 
-        for (char c : input) {
+        for (final char c : input) {
             if (c == '"') {
                 sb.append('\\');
             }
@@ -106,7 +106,7 @@
             char[] watch = open;
             int w = 0;
             while(true) {
-                int c = input.read();
+                final int c = input.read();
 
                 if (c < 0) {
                     break;
@@ -156,12 +156,12 @@
 
             return outputStream.toByteArray();
 
-        } catch (IOException e) {
+        } catch (final IOException e) {
             return null;
         } finally {
             try {
 				output.close();
-			} catch (IOException e) {
+			} catch (final IOException e) {
 			}        	
         }
     }
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspReader.java b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspReader.java
index 3ba1da4..cd7849c 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspReader.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/JspReader.java
@@ -36,7 +36,7 @@
     }
 
 
-    public byte[] getBytes( String pResourceName ) {
+    public byte[] getBytes( final String pResourceName ) {
 
         final byte[] bytes = sources.get(pResourceName);
 
@@ -47,7 +47,7 @@
         return reader.getBytes(pResourceName);
     }
 
-    public boolean isAvailable( String pResourceName ) {
+    public boolean isAvailable( final String pResourceName ) {
 
         if (sources.containsKey(pResourceName)) {
             return true;
diff --git a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/ServerPageServlet.java b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/ServerPageServlet.java
index d7a156b..a1dac71 100644
--- a/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/ServerPageServlet.java
+++ b/examples/src/main/java/org/apache/commons/jci2/examples/serverpages/ServerPageServlet.java
@@ -84,7 +84,7 @@
                 super.onStop();
 
                 boolean reload = false;
-                for (String clazzName : newClasses) {
+                for (final String clazzName : newClasses) {
                     try {
                         final Class clazz = classloader.loadClass(clazzName);
 
@@ -98,7 +98,7 @@
                         newServletsByClassname.put(clazzName, servlet);
 
                         reload = true;
-                    } catch(Exception e) {
+                    } catch(final Exception e) {
                         log("", e);
                     }
                 }
@@ -109,7 +109,7 @@
                 }
             }
 
-            public void write(String pResourceName, byte[] pResourceData) {
+            public void write(final String pResourceName, final byte[] pResourceData) {
                 super.write(pResourceName, pResourceData);
 
                 if (pResourceName.endsWith(".class")) {
@@ -128,14 +128,14 @@
             private final Map<String, byte[]> sources = new HashMap<String, byte[]>();
             private final Set<String> resourceToCompile = new HashSet<String>();
 
-            public void onStart(FilesystemAlterationObserver pObserver) {
+            public void onStart(final FilesystemAlterationObserver pObserver) {
                 super.onStart(pObserver);
 
                 resourceToCompile.clear();
             }
 
 
-            public void onFileChange(File pFile) {
+            public void onFileChange(final File pFile) {
                 if (pFile.getName().endsWith(".jsp")) {
                     final String resourceName = ConversionUtils.stripExtension(getSourceNameFromFile(observer, pFile)) + ".java";
 
@@ -149,7 +149,7 @@
             }
 
 
-            public void onFileCreate(File pFile) {
+            public void onFileCreate(final File pFile) {
                 if (pFile.getName().endsWith(".jsp")) {
                     final String resourceName = ConversionUtils.stripExtension(getSourceNameFromFile(observer, pFile)) + ".java";
 
@@ -163,7 +163,7 @@
             }
 
 
-            public String[] getResourcesToCompile(FilesystemAlterationObserver pObserver) {
+            public String[] getResourcesToCompile(final FilesystemAlterationObserver pObserver) {
                 // we only want to compile the jsp pages
                 final String[] resourceNames = new String[resourceToCompile.size()];
                 resourceToCompile.toArray(resourceNames);
@@ -184,12 +184,12 @@
 
     private String convertRequestToServletClassname( final HttpServletRequest request ) {
 
-        String path = request.getPathInfo().substring(1);
+        final String path = request.getPathInfo().substring(1);
 
         return ConversionUtils.stripExtension(path).replace('/', '.');
     }
 
-    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+    protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
 
         log("Request " + request.getRequestURI());
 
@@ -204,7 +204,7 @@
 
             out.append("<html><body>");
 
-            for (CompilationProblem problem : errors) {
+            for (final CompilationProblem problem : errors) {
                 out.append(problem.toString()).append("<br/>").append('\n');
             }
 
diff --git a/fam/src/main/java/org/apache/commons/jci2/listeners/AbstractFilesystemAlterationListener.java b/fam/src/main/java/org/apache/commons/jci2/listeners/AbstractFilesystemAlterationListener.java
index cec2c18..22cf842 100644
--- a/fam/src/main/java/org/apache/commons/jci2/listeners/AbstractFilesystemAlterationListener.java
+++ b/fam/src/main/java/org/apache/commons/jci2/listeners/AbstractFilesystemAlterationListener.java
@@ -180,7 +180,7 @@
                 if (!pSignal.triggered) {
                     try {
                         pSignal.wait(1000);
-                    } catch (InterruptedException e) {
+                    } catch (final InterruptedException e) {
                     }
 
                     if (++i > pSecondsTimeout) {
diff --git a/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitor.java b/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitor.java
index d05fb50..6ee8f9f 100644
--- a/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitor.java
+++ b/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitor.java
@@ -62,7 +62,7 @@
         if (thread != null) {
             try {
                 thread.join(delay);
-            } catch (InterruptedException e) {
+            } catch (final InterruptedException e) {
             }
         }
     }
@@ -98,7 +98,7 @@
    
     public void removeListener( final FilesystemAlterationListener pListener ) {
         synchronized (observersLock) {
-            for (FilesystemAlterationObserver observer : observers.values()) {
+            for (final FilesystemAlterationObserver observer : observers.values()) {
                 observer.removeListener(pListener);
                 // FIXME: remove observer if there are no listeners?
             }
@@ -121,7 +121,7 @@
         
         while (running) {
 
-            for (FilesystemAlterationObserver observer : observers.values()) {
+            for (final FilesystemAlterationObserver observer : observers.values()) {
                 observer.checkAndNotify();
             }
 
diff --git a/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationObserverImpl.java b/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationObserverImpl.java
index 0bc471a..bc4dd54 100644
--- a/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationObserverImpl.java
+++ b/fam/src/main/java/org/apache/commons/jci2/monitor/FilesystemAlterationObserverImpl.java
@@ -122,7 +122,7 @@
 
             final MonitorFile[] files = file.listFiles();
             final Set<Entry> deleted = new HashSet<Entry>(children.values());
-            for (MonitorFile f : files) {
+            for (final MonitorFile f : files) {
                 final String name = f.getName();
                 final Entry entry = children.get(name);
                 if (entry != null) {
@@ -143,7 +143,7 @@
 
             // the ones not found on disk anymore
 
-            for (Entry entry : deleted) {
+            for (final Entry entry : deleted) {
                 entry.deleteChildrenAndNotify();
                 children.remove(entry.getName());
             }
@@ -151,7 +151,7 @@
 
 
         private void deleteChildrenAndNotify() {
-            for (Entry entry : children.values()) {
+            for (final Entry entry : children.values()) {
                 entry.deleteChildrenAndNotify();
             }
             children.clear();
@@ -255,51 +255,51 @@
 
     private void notifyOnStart() {
         log.debug("onStart " + rootEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onStart(this);
         }
     }
     private void notifyOnStop() {
         log.debug("onStop " + rootEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onStop(this);
         }
     }
 
     private void notifyOnFileCreate( final Entry pEntry ) {
         log.debug("onFileCreate " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onFileCreate(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
     private void notifyOnFileChange( final Entry pEntry ) {
         log.debug("onFileChange " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onFileChange(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
     private void notifyOnFileDelete( final Entry pEntry ) {
         log.debug("onFileDelete " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onFileDelete(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
 
     private void notifyOnDirectoryCreate( final Entry pEntry ) {
         log.debug("onDirectoryCreate " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onDirectoryCreate(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
     private void notifyOnDirectoryChange( final Entry pEntry ) {
         log.debug("onDirectoryChange " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onDirectoryChange(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
     private void notifyOnDirectoryDelete( final Entry pEntry ) {
         log.debug("onDirectoryDelete " + pEntry);
-        for (FilesystemAlterationListener listener : listeners) {
+        for (final FilesystemAlterationListener listener : listeners) {
             listener.onDirectoryDelete(((MonitorFileImpl)pEntry.getFile()).file );
         }
     }
diff --git a/fam/src/test/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitorTestCase.java b/fam/src/test/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitorTestCase.java
index 972dcab..1270bcc 100644
--- a/fam/src/test/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitorTestCase.java
+++ b/fam/src/test/java/org/apache/commons/jci2/monitor/FilesystemAlterationMonitorTestCase.java
@@ -182,7 +182,7 @@
     	try {
         	listener.waitForFirstCheck();
         	fail("should be an timeout");
-        } catch(Exception e) {
+        } catch(final Exception e) {
         	assertEquals("timeout", e.getMessage());
         }
 
@@ -191,7 +191,7 @@
         try {
         	listener.waitForEvent();
         	fail("should be an timeout");
-        } catch(Exception e) {
+        } catch(final Exception e) {
         	assertEquals("timeout", e.getMessage());
         }
         
@@ -200,7 +200,7 @@
         try {
         	listener.waitForCheck();
         	fail("should be an timeout");
-        } catch(Exception e) {
+        } catch(final Exception e) {
         	assertEquals("timeout", e.getMessage());
         }
     
@@ -341,12 +341,12 @@
         fam.setInterval(interval);
 
         listener.waitForCheck();
-        long t1 = System.currentTimeMillis();
+        final long t1 = System.currentTimeMillis();
 
         listener.waitForCheck();
-        long t2 = System.currentTimeMillis();
+        final long t2 = System.currentTimeMillis();
         
-        long diff = t2-t1;
+        final long diff = t2-t1;
         
         // interval should be at around the same interval
         assertTrue("the interval was set to " + interval + " but the time difference was " + diff, (diff > (interval-50)) && (diff < (interval+50)));
