diff --git a/src/main/java/org/apache/xmlbeans/XmlBeans.java b/src/main/java/org/apache/xmlbeans/XmlBeans.java
index d7ae860..5c131a2 100644
--- a/src/main/java/org/apache/xmlbeans/XmlBeans.java
+++ b/src/main/java/org/apache/xmlbeans/XmlBeans.java
@@ -33,8 +33,7 @@
  * for managing XML Bean types, type systems, QNames, paths,
  * and queries.
  */
-public final class XmlBeans
-{
+public final class XmlBeans {
     private static final String HOLDER_CLASS_NAME = "TypeSystemHolder";
     private static final String TYPE_SYSTEM_FIELD = "typeSystem";
 
@@ -42,8 +41,7 @@
     private static String XMLBEANS_VERSION = "4.0.0";
     private static String XMLBEANS_VENDOR = "Apache Software Foundation";
 
-    static
-    {
+    static {
         Package pkg = XmlBeans.class.getPackage();
         if (pkg != null && pkg.getImplementationVersion() != null) {
             XMLBEANS_TITLE = pkg.getImplementationTitle();
@@ -57,8 +55,7 @@
      * the value of
      * {@link Package#getImplementationTitle() XmlBeans.class.getPackage().getImplementationTitle()}.
      */
-    public static final String getTitle()
-    {
+    public static final String getTitle() {
         return XMLBEANS_TITLE;
     }
 
@@ -67,8 +64,7 @@
      * the value of
      * {@link Package#getImplementationVendor() XmlBeans.class.getPackage().getImplementationVendor()}.
      */
-    public static final String getVendor()
-    {
+    public static final String getVendor() {
         return XMLBEANS_VENDOR;
     }
 
@@ -77,8 +73,7 @@
      * the value of
      * {@link Package#getImplementationVersion() XmlBeans.class.getPackage().getImplementationVersion()}.
      */
-    public static final String getVersion()
-    {
+    public static final String getVersion() {
         return XMLBEANS_VERSION;
     }
 
@@ -86,11 +81,9 @@
      * Thread local QName cache for general use
      */
     private static final ThreadLocal _threadLocalLoaderQNameCache =
-        new ThreadLocal()
-        {
-            protected Object initialValue()
-            {
-                return new SoftReference(new QNameCache( 32 ));
+        new ThreadLocal() {
+            protected Object initialValue() {
+                return new SoftReference(new QNameCache(32));
             }
         };
 
@@ -102,13 +95,11 @@
     /**
      * Returns a thread local QNameCache
      */
-    public static QNameCache getQNameCache ( )
-    {
-        SoftReference softRef = (SoftReference)_threadLocalLoaderQNameCache.get();
+    public static QNameCache getQNameCache() {
+        SoftReference softRef = (SoftReference) _threadLocalLoaderQNameCache.get();
         QNameCache qnameCache = (QNameCache) (softRef).get();
-        if (qnameCache==null)
-        {
-            qnameCache = new QNameCache( 32 );
+        if (qnameCache == null) {
+            qnameCache = new QNameCache(32);
             _threadLocalLoaderQNameCache.set(new SoftReference(qnameCache));
         }
         return qnameCache;
@@ -117,23 +108,20 @@
     /**
      * Obtains a name from the thread local QNameCache
      */
-    public static QName getQName ( String localPart )
-    {
-        return getQNameCache().getName( "",  localPart );
+    public static QName getQName(String localPart) {
+        return getQNameCache().getName("", localPart);
     }
 
     /**
      * Obtains a name from the thread local QNameCache
      */
 
-    public static QName getQName ( String namespaceUri, String localPart )
-    {
-        return getQNameCache().getName( namespaceUri,  localPart );
+    public static QName getQName(String namespaceUri, String localPart) {
+        return getQNameCache().getName(namespaceUri, localPart);
     }
 
-    private static RuntimeException causedException ( RuntimeException e, Throwable cause )
-    {
-        e.initCause( cause );
+    private static RuntimeException causedException(RuntimeException e, Throwable cause) {
+        e.initCause(cause);
 
         return e;
     }
@@ -142,9 +130,8 @@
      * Compiles an XPath, returning a String equal to that which was passed,
      * but whose identity is that of one which has been precompiled and cached.
      */
-    public static String compilePath ( String pathExpr ) throws XmlException
-    {
-        return compilePath( pathExpr, null );
+    public static String compilePath(String pathExpr) throws XmlException {
+        return compilePath(pathExpr, null);
     }
 
     /**
@@ -153,24 +140,22 @@
      * takes an option for specifying text that indicates the name of context node.
      * The default is "this", as in "$this".
      *
-     * @param  options  Options for the path. For example, you can call
-     * the {@link XmlOptions#setXqueryCurrentNodeVar(String) XmlOptions.setXqueryCurrentNodeVar(String)}
-     * method to specify a particular name for the expression
-     * variable that indicates the context node.
+     * @param options Options for the path. For example, you can call
+     *                the {@link XmlOptions#setXqueryCurrentNodeVar(String) XmlOptions.setXqueryCurrentNodeVar(String)}
+     *                method to specify a particular name for the expression
+     *                variable that indicates the context node.
      */
-    public static String compilePath ( String pathExpr, XmlOptions options )
-        throws XmlException
-    {
-        return getContextTypeLoader().compilePath( pathExpr, options );
+    public static String compilePath(String pathExpr, XmlOptions options)
+        throws XmlException {
+        return getContextTypeLoader().compilePath(pathExpr, options);
     }
 
     /**
      * Compiles an XQuery, returning a String equal to that which was passed,
      * but whose identity is that of one which has been precompiled and cached.
      */
-    public static String compileQuery ( String queryExpr ) throws XmlException
-    {
-        return compileQuery( queryExpr, null );
+    public static String compileQuery(String queryExpr) throws XmlException {
+        return compileQuery(queryExpr, null);
     }
 
     /**
@@ -178,17 +163,16 @@
      * but whose identity is that of one which has been precompiled and cached;
      * takes an option for specifying text that indicates the context node.
      *
-     * @param  options  Options for the query. For example, you can call
-     * the {@link XmlOptions#setXqueryCurrentNodeVar(String) XmlOptions.setXqueryCurrentNodeVar(String)}
-     * method to specify a particular name for the expression
-     * variable that indicates the context node and the
-     * {@link XmlOptions#setXqueryVariables(java.util.Map) XmlOptions.setXqueryVariables(Map)}
-     * method to map external variable names to values.
+     * @param options Options for the query. For example, you can call
+     *                the {@link XmlOptions#setXqueryCurrentNodeVar(String) XmlOptions.setXqueryCurrentNodeVar(String)}
+     *                method to specify a particular name for the expression
+     *                variable that indicates the context node and the
+     *                {@link XmlOptions#setXqueryVariables(java.util.Map) XmlOptions.setXqueryVariables(Map)}
+     *                method to map external variable names to values.
      */
-    public static String compileQuery ( String queryExpr, XmlOptions options )
-        throws XmlException
-    {
-        return getContextTypeLoader().compileQuery( queryExpr, options );
+    public static String compileQuery(String queryExpr, XmlOptions options)
+        throws XmlException {
+        return getContextTypeLoader().compileQuery(queryExpr, options);
     }
 
     /**
@@ -215,28 +199,28 @@
     /**
      * Creates an XmlCursor for a DOM node which is implemented by XmlBwans
      */
-    public static XmlCursor nodeToCursor ( Node n ) {
+    public static XmlCursor nodeToCursor(Node n) {
         return Locale.nodeToCursor(n);
     }
 
     /**
      * Creates an XmlObject for a DOM node which is implemented by XmlBwans
      */
-    public static XmlObject nodeToXmlObject ( Node n ) {
+    public static XmlObject nodeToXmlObject(Node n) {
         return Locale.nodeToXmlObject(n);
     }
 
     /**
      * Creates an XmlObject for a DOM node which is implemented by XmlBwans
      */
-    public static XMLStreamReader nodeToXmlStreamReader ( Node n ) {
+    public static XMLStreamReader nodeToXmlStreamReader(Node n) {
         return Locale.nodeToXmlStream(n);
     }
 
     /**
      * Returns the XmlObject for a DOM node which is implemented by XmlBwans
      */
-    public static Node streamToNode ( XMLStreamReader xs ) {
+    public static Node streamToNode(XMLStreamReader xs) {
         return Locale.streamToNode(xs);
     }
 
@@ -248,8 +232,7 @@
      * linking, and returns a unioned typeloader that is suitable for
      * creating instances.
      */
-    public static SchemaTypeLoader loadXsd(XmlObject[] schemas) throws XmlException
-    {
+    public static SchemaTypeLoader loadXsd(XmlObject[] schemas) throws XmlException {
         return loadXsd(schemas, null);
     }
 
@@ -306,12 +289,11 @@
      * as described in {@link XmlOptions#setCompileNoValidation}.</li>
      * </ul>
      *
-     * @param schemas The schema definitions from which to build the schema type system.
+     * @param schemas  The schema definitions from which to build the schema type system.
      * @param typepath The path to already-compiled schema types for linking while processing.
-     * @param options Options specifying an error listener and/or validation behavior.
+     * @param options  Options specifying an error listener and/or validation behavior.
      */
-    public static SchemaTypeSystem compileXsd(XmlObject[] schemas, SchemaTypeLoader typepath, XmlOptions options) throws XmlException
-    {
+    public static SchemaTypeSystem compileXsd(XmlObject[] schemas, SchemaTypeLoader typepath, XmlOptions options) throws XmlException {
         return compileXmlBeans(null, null, schemas, null, typepath, null, options);
     }
 
@@ -354,12 +336,11 @@
      * as described in {@link XmlOptions#setCompileNoValidation}.</li>
      * </ul>
      *
-     * @param schemas The schema definitions from which to build the schema type system.
+     * @param schemas  The schema definitions from which to build the schema type system.
      * @param typepath The path to already-compiled schema types for linking while processing.
-     * @param options Options specifying an error listener and/or validation behavior.
+     * @param options  Options specifying an error listener and/or validation behavior.
      */
-    public static SchemaTypeSystem compileXsd(SchemaTypeSystem system, XmlObject[] schemas, SchemaTypeLoader typepath, XmlOptions options) throws XmlException
-    {
+    public static SchemaTypeSystem compileXsd(SchemaTypeSystem system, XmlObject[] schemas, SchemaTypeLoader typepath, XmlOptions options) throws XmlException {
         return compileXmlBeans(null, system, schemas, null, typepath, null, options);
     }
 
@@ -414,13 +395,13 @@
      * as described in {@link XmlOptions#setCompileNoValidation}.</li>
      * </ul>
      *
-     * @param name The type system name or null to use a randomly generated name.
-     * @param system A pre-existing SchemaTypeSystem used in incremental compilation.
-     * @param schemas The schema definitions from which to build the schema type system.
-     * @param config The configuration controls the code generation shape.
+     * @param name     The type system name or null to use a randomly generated name.
+     * @param system   A pre-existing SchemaTypeSystem used in incremental compilation.
+     * @param schemas  The schema definitions from which to build the schema type system.
+     * @param config   The configuration controls the code generation shape.
      * @param typepath The path to already-compiled schema types for linking while processing.
-     * @param filer The Filer instance used to create binary binding files and source text files.
-     * @param options Options specifying an error listener and/or validation behavior.
+     * @param filer    The Filer instance used to create binary binding files and source text files.
+     * @param options  Options specifying an error listener and/or validation behavior.
      */
     public static SchemaTypeSystem compileXmlBeans(String name, SchemaTypeSystem system, XmlObject[] schemas, BindingConfig config, SchemaTypeLoader typepath, Filer filer, XmlOptions options) throws XmlException {
         return SchemaTypeSystemCompiler.compile(name, system, schemas, config, typepath != null ? typepath : getContextTypeLoader(), filer, options);
@@ -461,40 +442,31 @@
      * Note: you will almost always need typeLoaderForClassLoader()
      * instead (see {@link XmlBeans#typeLoaderForClassLoader}).
      */
-    public static SchemaTypeSystem typeSystemForClassLoader(ClassLoader loader, String stsName)
-    {
-        try
-        {
+    public static SchemaTypeSystem typeSystemForClassLoader(ClassLoader loader, String stsName) {
+        try {
             ClassLoader cl = loader == null ? Thread.currentThread().getContextClassLoader() : loader;
             Class clazz = cl.loadClass(stsName + "." + HOLDER_CLASS_NAME);
             SchemaTypeSystem sts = (SchemaTypeSystem)
                 (clazz.getDeclaredField(TYPE_SYSTEM_FIELD).get(null));
-            if (sts == null)
-            {
+            if (sts == null) {
                 throw new RuntimeException("SchemaTypeSystem is null for field " +
-                    TYPE_SYSTEM_FIELD + " on class with name " + stsName +
-                    "." + HOLDER_CLASS_NAME +
-                    ". Please verify the version of xmlbeans.jar is correct.");
+                                           TYPE_SYSTEM_FIELD + " on class with name " + stsName +
+                                           "." + HOLDER_CLASS_NAME +
+                                           ". Please verify the version of xmlbeans.jar is correct.");
             }
             return sts;
-        }
-        catch (ClassNotFoundException e)
-        {
+        } catch (ClassNotFoundException e) {
             throw causedException(new RuntimeException("Cannot load SchemaTypeSystem. " +
-                "Unable to load class with name " + stsName + "." + HOLDER_CLASS_NAME +
-                ". Make sure the generated binary files are on the classpath."), e);
-        }
-        catch (NoSuchFieldException e)
-        {
+                                                       "Unable to load class with name " + stsName + "." + HOLDER_CLASS_NAME +
+                                                       ". Make sure the generated binary files are on the classpath."), e);
+        } catch (NoSuchFieldException e) {
             throw causedException(new RuntimeException("Cannot find field " +
-                TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
-                ". Please verify the version of xmlbeans.jar is correct."), e);
-        }
-        catch (IllegalAccessException e)
-        {
+                                                       TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
+                                                       ". Please verify the version of xmlbeans.jar is correct."), e);
+        } catch (IllegalAccessException e) {
             throw causedException(new RuntimeException("Field " +
-                TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
-                "is not accessible. Please verify the version of xmlbeans.jar is correct."), e);
+                                                       TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
+                                                       "is not accessible. Please verify the version of xmlbeans.jar is correct."), e);
         }
     }
 
@@ -510,22 +482,20 @@
      * Returns the SchemaType from a corresponding XmlObject subclass,
      * or null if none.
      */
-    public static SchemaType typeForClass(Class c)
-    {
-        if (c == null || !XmlObject.class.isAssignableFrom(c))
+    public static SchemaType typeForClass(Class c) {
+        if (c == null || !XmlObject.class.isAssignableFrom(c)) {
             return null;
+        }
 
-        try
-        {
+        try {
             Field typeField = c.getField("type");
 
-            if (typeField == null)
+            if (typeField == null) {
                 return null;
+            }
 
-            return (SchemaType)typeField.get(null);
-        }
-        catch (Exception e)
-        {
+            return (SchemaType) typeField.get(null);
+        } catch (Exception e) {
             return null;
         }
     }
@@ -544,7 +514,8 @@
      * which is the universal base type from which all other types
      * can be derived, and of which all instances are valid.)
      */
-    public static SchemaType NO_TYPE = getNoType();
+    public static final SchemaType NO_TYPE = getNoType();
 
-    private XmlBeans ( ) { }
+    private XmlBeans() {
+    }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/Diff.java b/src/main/java/org/apache/xmlbeans/impl/tool/Diff.java
index 504eb46..49adb83 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/Diff.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/Diff.java
@@ -19,69 +19,56 @@
 import org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl;
 
 import java.io.*;
-import java.util.List;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.ArrayList;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
-import java.util.Enumeration;
 import java.util.zip.ZipEntry;
 
-public class Diff
-{
-    public static void main(String[] args)
-    {
-        if (args.length != 2)
-        {
+public class Diff {
+    public static void main(String[] args) {
+        if (args.length != 2) {
             System.out.println("Usage: diff <jarname1> <jarname2> to compare two jars");
             System.out.println("  or   diff <dirname1> <dirname2> to compare two dirs");
             return;
         }
         File file1 = new File(args[0]);
-        if (!file1.exists())
-        {
+        if (!file1.exists()) {
             System.out.println("File \"" + args[0] + "\" not found.");
             return;
         }
         File file2 = new File(args[1]);
-        if (!file2.exists())
-        {
+        if (!file2.exists()) {
             System.out.println("File \"" + args[1] + "\" not found.");
             return;
         }
-        List result = new ArrayList();
-        if (file1.isDirectory())
-        {
-            if (!file2.isDirectory())
-            {
+        List<String> result = new ArrayList<>();
+        if (file1.isDirectory()) {
+            if (!file2.isDirectory()) {
                 System.out.println("Both parameters have to be directories if the first parameter is a directory.");
                 return;
             }
             dirsAsTypeSystems(file1, file2, result);
-        }
-        else
-        {
-            if (file2.isDirectory())
-            {
+        } else {
+            if (file2.isDirectory()) {
                 System.out.println("Both parameters have to be jar files if the first parameter is a jar file.");
                 return;
             }
-            try
-            {
-            JarFile jar1 = new JarFile(file1);
-            JarFile jar2 = new JarFile(file2);
-            jarsAsTypeSystems(jar1, jar2, result);
+            try {
+                JarFile jar1 = new JarFile(file1);
+                JarFile jar2 = new JarFile(file2);
+                jarsAsTypeSystems(jar1, jar2, result);
+            } catch (IOException ioe) {
+                ioe.printStackTrace();
             }
-            catch (IOException ioe)
-            { ioe.printStackTrace(); }
         }
-        if (result.size() < 1)
+        if (result.size() < 1) {
             System.out.println("No differences encountered.");
-        else
-        {
+        } else {
             System.out.println("Differences:");
-            for (int i = 0; i < result.size(); i++)
-                System.out.println(result.get(i).toString());
+            for (String s : result) {
+                System.out.println(s);
+            }
         }
     }
 
@@ -89,69 +76,61 @@
      * Diffs the contents of two jars, looking only at the schema typesystems
      * saved inside those jars
      */
-    public static void jarsAsTypeSystems(JarFile jar1, JarFile jar2, List diffs)
-    {
-        Enumeration entries1 = jar1.entries();
-        Enumeration entries2 = jar2.entries();
-        List list1 = new ArrayList();
-        List list2 = new ArrayList();
-        for (; entries1.hasMoreElements(); )
-        {
-            ZipEntry ze = (ZipEntry) entries1.nextElement();
+    public static void jarsAsTypeSystems(JarFile jar1, JarFile jar2, List<String> diffs) {
+        Enumeration<JarEntry> entries1 = jar1.entries();
+        Enumeration<JarEntry> entries2 = jar2.entries();
+        List<ZipEntry> list1 = new ArrayList<>();
+        List<ZipEntry> list2 = new ArrayList<>();
+        while (entries1.hasMoreElements()) {
+            ZipEntry ze = entries1.nextElement();
             String name = ze.getName();
-            if (name.startsWith(SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system/s") && name.endsWith(".xsb"))
+            if (name.startsWith(SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system/s") && name.endsWith(".xsb")) {
                 list1.add(ze);
+            }
         }
-        for (; entries2.hasMoreElements(); )
-        {
-            ZipEntry ze = (ZipEntry) entries2.nextElement();
+        while (entries2.hasMoreElements()) {
+            ZipEntry ze = entries2.nextElement();
             String name = ze.getName();
-            if (name.startsWith(SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system/s") && name.endsWith(".xsb"))
+            if (name.startsWith(SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system/s") && name.endsWith(".xsb")) {
                 list2.add(ze);
+            }
         }
-        ZipEntry[] files1 = (ZipEntry[]) list1.toArray(new ZipEntry[list1.size()]);
-        ZipEntry[] files2 = (ZipEntry[]) list2.toArray(new ZipEntry[list2.size()]);
-        ZipEntryNameComparator comparator = new ZipEntryNameComparator();
+        ZipEntry[] files1 = list1.toArray(new ZipEntry[0]);
+        ZipEntry[] files2 = list2.toArray(new ZipEntry[0]);
+        Comparator<ZipEntry> comparator = Comparator.comparing(ZipEntry::getName);
         Arrays.sort(files1, comparator);
         Arrays.sort(files2, comparator);
         int i1 = 0;
         int i2 = 0;
-        while (i1 < files1.length && i2 < files2.length)
-        {
+        while (i1 < files1.length && i2 < files2.length) {
             String name1 = files1[i1].getName();
             String name2 = files2[i2].getName();
             int dif = name1.compareTo(name2);
-            if (dif == 0)
-            {
+            if (dif == 0) {
                 // Compare the files
                 zipEntriesAsXsb(files1[i1], jar1, files2[i2], jar2, diffs);
-                i1++; i2++; // Move to next pair
-            }
-            else if (dif < 0)
-            {
+                i1++;
+                i2++; // Move to next pair
+            } else if (dif < 0) {
                 // dir1 contains a file that dir2 doesn't
                 diffs.add("Jar \"" + jar1.getName() + "\" contains an extra file: \"" +
-                    name1 + "\"");
+                          name1 + "\"");
                 i1++;
-            }
-            else if (dif > 0)
-            {
+            } else {
                 // dir2 contains a file that dir1 doesn't
                 diffs.add("Jar \"" + jar2.getName() + "\" contains an extra file: \"" +
-                    name2 + "\"");
+                          name2 + "\"");
                 i2++;
             }
         }
-        while (i1 < files1.length)
-        {
+        while (i1 < files1.length) {
             diffs.add("Jar \"" + jar1.getName() + "\" contains an extra file: \"" +
-                files1[i1].getName() + "\"");
+                      files1[i1].getName() + "\"");
             i1++;
         }
-        while (i2 < files2.length)
-        {
+        while (i2 < files2.length) {
             diffs.add("Jar \"" + jar2.getName() + "\" contains an extra file: \"" +
-                files2[i2].getName() + "\"");
+                      files2[i2].getName() + "\"");
             i2++;
         }
     }
@@ -162,223 +141,155 @@
      * Updated diffs with a list of differences (for the time being, strings
      * describing the difference)
      */
-    public static void dirsAsTypeSystems(File dir1, File dir2, List diffs)
-    {
+    public static void dirsAsTypeSystems(File dir1, File dir2, List<String> diffs) {
         assert dir1.isDirectory() : "Parameters must be directories";
         assert dir2.isDirectory() : "Parameters must be directories";
 
-        /**
-         * Navigate three directories deep to get to the type system.
-         * Assume the schema[METADATA_PACKAGE_LOAD]/system/* structure
+        /*
+          Navigate three directories deep to get to the type system.
+          Assume the schema[METADATA_PACKAGE_LOAD]/system/* structure
          */
         File temp1 = new File(dir1, SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system");
         File temp2 = new File(dir2, SchemaTypeSystemImpl.METADATA_PACKAGE_GEN + "/system");
-        if (temp1.exists() && temp2.exists())
-        {
+        if (temp1.exists() && temp2.exists()) {
             File[] files1 = temp1.listFiles();
             File[] files2 = temp2.listFiles();
-            if (files1.length == 1 && files2.length == 1)
-            {
+
+            assert (files1 != null && files2 != null);
+
+            if (files1.length == 1 && files2.length == 1) {
                 temp1 = files1[0];
                 temp2 = files2[0];
-            }
-            else
-            {
-                if (files1.length == 0)
+            } else {
+                if (files1.length == 0) {
                     temp1 = null;
-                if (files2.length == 0)
+                }
+                if (files2.length == 0) {
                     temp2 = null;
-                if (files1.length > 1)
-                {
+                }
+                if (files1.length > 1) {
                     diffs.add("More than one typesystem found in dir \"" +
-                        dir1.getName() + "\"");
+                              dir1.getName() + "\"");
                     return;
                 }
-                if (files2.length > 1)
-                {
+                if (files2.length > 1) {
                     diffs.add("More than one typesystem found in dir \"" +
-                        dir2.getName() + "\"");
+                              dir2.getName() + "\"");
                     return;
-                }                    
+                }
+            }
+        } else {
+            if (!temp1.exists()) {
+                temp1 = null;
+            }
+            if (!temp2.exists()) {
+                temp2 = null;
             }
         }
-        else
-        {
-            if (!temp1.exists())
-                temp1 = null;
-            if (!temp2.exists())
-                temp2 = null;
-        }
-        if (temp1 == null && temp2 == null)
+        if (temp1 == null && temp2 == null) {
             return;
-        else if (temp1 == null || temp2 == null)
-        {
-            if (temp1 == null)
+        } else if (temp1 == null || temp2 == null) {
+            if (temp1 == null) {
                 diffs.add("No typesystems found in dir \"" + dir1 + "\"");
-            if (temp2 == null)
+            }
+            if (temp2 == null) {
                 diffs.add("No typesystems found in dir \"" + dir2 + "\"");
+            }
             return;
-        }
-        else
-        {
+        } else {
             dir1 = temp1;
             dir2 = temp2;
         }
 
         boolean diffIndex = isDiffIndex();
-        XsbFilenameFilter xsbName = new XsbFilenameFilter();
+        FilenameFilter xsbName = (dir, name) -> name.endsWith(".xsb");
         File[] files1 = dir1.listFiles(xsbName);
         File[] files2 = dir2.listFiles(xsbName);
-        FileNameComparator comparator = new FileNameComparator();
+
+        assert (files1 != null && files2 != null);
+
+        Comparator<File> comparator = Comparator.comparing(File::getName);
         Arrays.sort(files1, comparator);
         Arrays.sort(files2, comparator);
         int i1 = 0;
         int i2 = 0;
-        while (i1 < files1.length && i2 < files2.length)
-        {
+        while (i1 < files1.length && i2 < files2.length) {
             String name1 = files1[i1].getName();
             String name2 = files2[i2].getName();
             int dif = name1.compareTo(name2);
-            if (dif == 0)
-            {
-                if (diffIndex || !files1[i1].getName().equals("index.xsb"))
+            if (dif == 0) {
+                if (diffIndex || !files1[i1].getName().equals("index.xsb")) {
                     filesAsXsb(files1[i1], files2[i2], diffs); // Compare the files
-                i1++; i2++; // Move to next pair
-            }
-            else if (dif < 0)
-            {
+                }
+                i1++;
+                i2++; // Move to next pair
+            } else if (dif < 0) {
                 // dir1 contains a file that dir2 doesn't
                 diffs.add("Dir \"" + dir1.getName() + "\" contains an extra file: \"" +
-                    name1 + "\"");
+                          name1 + "\"");
                 i1++;
-            }
-            else if (dif > 0)
-            {
+            } else {
                 // dir2 contains a file that dir1 doesn't
                 diffs.add("Dir \"" + dir2.getName() + "\" contains an extra file: \"" +
-                    name2 + "\"");
+                          name2 + "\"");
                 i2++;
             }
         }
-        while (i1 < files1.length)
-        {
+        while (i1 < files1.length) {
             diffs.add("Dir \"" + dir1.getName() + "\" contains an extra file: \"" +
-                files1[i1].getName() + "\"");
+                      files1[i1].getName() + "\"");
             i1++;
         }
-        while (i2 < files2.length)
-        {
+        while (i2 < files2.length) {
             diffs.add("Dir \"" + dir2.getName() + "\" contains an extra file: \"" +
-                files2[i2].getName() + "\"");
+                      files2[i2].getName() + "\"");
             i2++;
         }
     }
 
-    private static boolean isDiffIndex()
-    {
+    private static boolean isDiffIndex() {
         String prop = SystemProperties.getProperty("xmlbeans.diff.diffIndex");
-        if (prop == null)
-            return true;
-        if ("0".equals(prop) || "false".equalsIgnoreCase(prop))
-            return false;
-        return true;
+        return prop == null || !"0".equals(prop) && !"false".equalsIgnoreCase(prop);
     }
 
     /**
      * Diffs the two given files assuming they are in xsb format
      * Updates diffs with differences in string format
      */
-    public static void filesAsXsb(File file1, File file2, List diffs)
-    {
+    public static void filesAsXsb(File file1, File file2, List<String> diffs) {
         assert file1.exists() : "File \"" + file1.getAbsolutePath() + "\" does not exist.";
         assert file2.exists() : "File \"" + file2.getAbsolutePath() + "\" does not exist.";
-        try
-        {
-        FileInputStream stream1 = new FileInputStream(file1);
-        FileInputStream stream2 = new FileInputStream(file2);
-        streamsAsXsb(stream1, file1.getName(), stream2, file2.getName(), diffs);
+        try (FileInputStream stream1 = new FileInputStream(file1);
+             FileInputStream stream2 = new FileInputStream(file2)) {
+            streamsAsXsb(stream1, file1.getName(), stream2, file2.getName(), diffs);
+        } catch (IOException ignored) {
         }
-        catch (FileNotFoundException fnfe)
-        { }
-        catch (IOException ioe)
-        { }
     }
 
     public static void zipEntriesAsXsb(ZipEntry file1, JarFile jar1,
-        ZipEntry file2, JarFile jar2, List diffs)
-    {
-        try
-        {
-        InputStream stream1 = jar1.getInputStream(file1);
-        InputStream stream2 = jar2.getInputStream(file2);
-        streamsAsXsb(stream1, file1.getName(), stream2, file2.getName(), diffs);
+                                       ZipEntry file2, JarFile jar2, List<String> diffs) {
+        try (InputStream stream1 = jar1.getInputStream(file1);
+             InputStream stream2 = jar2.getInputStream(file2)) {
+            streamsAsXsb(stream1, file1.getName(), stream2, file2.getName(), diffs);
+        } catch (IOException ignored) {
         }
-        catch (IOException ioe)
-        { }
     }
 
     public static void streamsAsXsb(InputStream stream1, String name1,
-        InputStream stream2, String name2, List diffs)
-        throws IOException
-    {
+                                    InputStream stream2, String name2, List<String> diffs)
+        throws IOException {
+        String charset = StandardCharsets.UTF_8.name();
         ByteArrayOutputStream buf1 = new ByteArrayOutputStream();
         ByteArrayOutputStream buf2 = new ByteArrayOutputStream();
-        XsbDumper.dump(stream1, "", new PrintStream(buf1));
-        XsbDumper.dump(stream2, "", new PrintStream(buf2));
-        stream1.close();
-        stream2.close();
-        readersAsText(new StringReader(buf1.toString()), name1,
-            new StringReader(buf2.toString()), name2, diffs);
+        XsbDumper.dump(stream1, "", new PrintStream(buf1, true, charset));
+        XsbDumper.dump(stream2, "", new PrintStream(buf2, true, charset));
+        readersAsText(new StringReader(buf1.toString(charset)), name1,
+            new StringReader(buf2.toString(charset)), name2, diffs);
     }
 
     public static void readersAsText(Reader r1, String name1, Reader r2, String name2,
-        List diffs)
-        throws IOException
-    {
+                                     List<String> diffs)
+        throws IOException {
         org.apache.xmlbeans.impl.util.Diff.readersAsText(r1, name1, r2, name2, diffs);
     }
-
-    private static class XsbFilenameFilter implements FilenameFilter
-    {
-        public boolean accept(File dir, String name)
-        {
-            return name.endsWith(".xsb");
-        }
-    }
-
-    private static class ZipEntryNameComparator implements Comparator
-    {
-        public boolean equals(Object object)
-        {
-            return this == object;
-        }
-
-        public int compare(Object object1, Object object2)
-        {
-            assert (object1 instanceof ZipEntry) : "Must pass in a java.util.zip.ZipEntry as argument";
-            assert (object2 instanceof ZipEntry) : "Must pass in a java.util.zip.ZipEntry as argument";
-
-            String name1 = ((ZipEntry) object1).getName();
-            String name2 = ((ZipEntry) object2).getName();
-            return name1.compareTo(name2);
-        }
-    }
-
-    private static class FileNameComparator implements Comparator
-    {
-        public boolean equals(Object object)
-        {
-            return this == object;
-        }
-
-        public int compare(Object object1, Object object2)
-        {
-            assert (object1 instanceof File) : "Must pass in a java.io.File as argument";
-            assert (object2 instanceof File) : "Must pass in a java.io.File as argument";
-
-            String name1 = ((File) object1).getName();
-            String name2 = ((File) object2).getName();
-            return name1.compareTo(name2);
-        }
-    }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/Extension.java b/src/main/java/org/apache/xmlbeans/impl/tool/Extension.java
index ffd7b8d..34e6103 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/Extension.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/Extension.java
@@ -15,56 +15,57 @@
 
 package org.apache.xmlbeans.impl.tool;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 
 
- /**
-  * An extension is a javabean that represents a SchemaCompilerExtension to be passed for callback into the
-  *  XmlBeans Schema Compiler.
-  */
+/**
+ * An extension is a javabean that represents a SchemaCompilerExtension to be passed for callback into the
+ * XmlBeans Schema Compiler.
+ */
 public class Extension {
-        private Class className;
-        private List params = new ArrayList();
+    private Class className;
+    private List<Param> params = new ArrayList<>();
 
-        public Class getClassName() {
-            return className;
+    public Class getClassName() {
+        return className;
+    }
+
+    public void setClassName(Class className) {
+        this.className = className;
+    }
+
+    public List<Param> getParams() {
+        return params;
+    }
+
+    public Param createParam() {
+        Param p = new Param();
+        params.add(p);
+        return p;
+    }
+
+    /**
+     * A Param is just a name value pair applicable to the extension.
+     */
+    public class Param {
+        private String name;
+        private String value;
+
+        public String getName() {
+            return name;
         }
 
-        public void setClassName(Class className) {
-            this.className = className;
-        }
-        public List getParams() {
-            return params;
+        public void setName(String name) {
+            this.name = name;
         }
 
-        public Param createParam() {
-            Param p = new Param();
-            params.add(p);
-            return p;
+        public String getValue() {
+            return value;
         }
 
-        /**
-         * A Param is just a name value pair applicable to the extension.
-         */
-        public class Param {
-            private String name;
-            private String value;
-
-            public String getName() {
-                return name;
-            }
-
-            public void setName(String name) {
-                this.name = name;
-            }
-
-            public String getValue() {
-                return value;
-            }
-
-            public void setValue(String value) {
-                this.value = value;
-            }
+        public void setValue(String value) {
+            this.value = value;
         }
-    }
\ No newline at end of file
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/RunXQuery.java b/src/main/java/org/apache/xmlbeans/impl/tool/RunXQuery.java
index b782a1f..9ffe860 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/RunXQuery.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/RunXQuery.java
@@ -15,14 +15,21 @@
 
 package org.apache.xmlbeans.impl.tool;
 
-import java.io.*;
-import java.util.*;
-import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlBeans;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlOptions;
 
-public class RunXQuery
-{
-    public static void printUsage()
-    {
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class RunXQuery {
+    public static void printUsage() {
         System.out.println("Run an XQuery against an XML instance");
         System.out.println("Usage:");
         System.out.println("xquery [-verbose] [-pretty] [-q <query> | -qf query.xq] [file.xml]*");
@@ -31,12 +38,11 @@
         System.out.println(" -pretty pretty-prints the results");
         System.out.println(" -license prints license information");
         System.out.println(" the query is run on each XML file specified");
-        System.out.println("");
+        System.out.println();
     }
 
-    public static void main ( String[] args ) throws Exception
-    {
-        Set flags = new HashSet();
+    public static void main(String[] args) throws Exception {
+        Set<String> flags = new HashSet<>();
         flags.add("h");
         flags.add("help");
         flags.add("usage");
@@ -48,90 +54,82 @@
         CommandLine cl =
             new CommandLine(
                 args, flags,
-                Arrays.asList( new String[] { "q", "qf" } ) );
-        
-        if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null)
-        {
+                Arrays.asList("q", "qf"));
+
+        if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null) {
             printUsage();
             System.exit(0);
             return;
         }
 
         String[] badopts = cl.getBadOpts();
-        if (badopts.length > 0)
-        {
-            for (int i = 0; i < badopts.length; i++)
-                System.out.println("Unrecognized option: " + badopts[i]);
+        if (badopts.length > 0) {
+            for (String badopt : badopts) {
+                System.out.println("Unrecognized option: " + badopt);
+            }
             printUsage();
             System.exit(0);
             return;
         }
 
-        if (cl.getOpt("license") != null)
-        {
+        if (cl.getOpt("license") != null) {
             CommandLine.printLicense();
             System.exit(0);
             return;
         }
 
-        if (cl.getOpt("version") != null)
-        {
+        if (cl.getOpt("version") != null) {
             CommandLine.printVersion();
             System.exit(0);
             return;
         }
 
         args = cl.args();
-        
-        if (args.length == 0)
-        {
+
+        if (args.length == 0) {
             printUsage();
             System.exit(0);
             return;
         }
 
-        boolean verbose = cl.getOpt( "verbose" ) != null;
-        boolean pretty = cl.getOpt( "pretty" ) != null;
+        boolean verbose = cl.getOpt("verbose") != null;
+        boolean pretty = cl.getOpt("pretty") != null;
 
         //
         // Get and compile the query
         //
-        
-        String query = cl.getOpt( "q" );
-        String queryfile = cl.getOpt( "qf" );
 
-        if (query == null && queryfile == null)
-        {
-            System.err.println( "No query specified" );
+        String query = cl.getOpt("q");
+        String queryfile = cl.getOpt("qf");
+
+        if (query == null && queryfile == null) {
+            System.err.println("No query specified");
             System.exit(0);
             return;
         }
-        
-        if (query != null && queryfile != null)
-        {
-            System.err.println( "Specify -qf or -q, not both." );
+
+        if (query != null && queryfile != null) {
+            System.err.println("Specify -qf or -q, not both.");
             System.exit(0);
             return;
         }
-        
-        try
-        {
-            if (queryfile != null)
-            {
-                File queryFile = new File( queryfile );
-                FileInputStream is = new FileInputStream( queryFile );
-                InputStreamReader r = new InputStreamReader( is );
-                
+
+        try {
+            if (queryfile != null) {
+                File queryFile = new File(queryfile);
+                FileInputStream is = new FileInputStream(queryFile);
+                InputStreamReader r = new InputStreamReader(is, StandardCharsets.ISO_8859_1);
+
                 StringBuilder sb = new StringBuilder();
 
-                for ( ; ; )
-                {
+                for (; ; ) {
                     int ch = r.read();
 
-                    if (ch < 0)
+                    if (ch < 0) {
                         break;
+                    }
 
-                    sb.append( (char) ch );
+                    sb.append((char) ch);
                 }
 
                 r.close();
@@ -139,28 +137,22 @@
 
                 query = sb.toString();
             }
-        }
-        catch ( Throwable e )
-        {
-            System.err.println( "Cannot read query file: " + e.getMessage() );
+        } catch (Throwable e) {
+            System.err.println("Cannot read query file: " + e.getMessage());
             System.exit(1);
             return;
         }
 
-        if (verbose)
-        {
-            System.out.println( "Compile Query:" );
-            System.out.println( query );
+        if (verbose) {
+            System.out.println("Compile Query:");
+            System.out.println(query);
             System.out.println();
         }
-            
-        try
-        {
-            query= XmlBeans.compileQuery( query );
-        }
-        catch ( Exception e )
-        {
-            System.err.println( "Error compiling query: " + e.getMessage() );
+
+        try {
+            query = XmlBeans.compileQuery(query);
+        } catch (Exception e) {
+            System.err.println("Error compiling query: " + e.getMessage());
             System.exit(1);
             return;
         }
@@ -168,75 +160,65 @@
         //
         // Get the instance
         //
-        
-        File[] files = cl.getFiles();
-        
-        for (int i = 0; i < files.length; i++)
-        {
-            XmlObject x;
-                
-            try
-            {
-                if (verbose)
-                {
-                    InputStream is = new FileInputStream( files[i] );
 
-                    for ( ; ; )
-                    {
+        File[] files = cl.getFiles();
+
+        for (File file : files) {
+            XmlObject x;
+
+            try {
+                if (verbose) {
+                    InputStream is = new FileInputStream(file);
+
+                    for (; ; ) {
                         int ch = is.read();
 
-                        if (ch < 0)
+                        if (ch < 0) {
                             break;
+                        }
 
-                        System.out.write( ch );
+                        System.out.write(ch);
                     }
-                    
+
                     is.close();
 
                     System.out.println();
                 }
-                
-                x = XmlObject.Factory.parse( files[i] );
-            }
-            catch ( Throwable e )
-            {
-                System.err.println( "Error parsing instance: " + e.getMessage() );
+
+                x = XmlObject.Factory.parse(file);
+            } catch (Throwable e) {
+                System.err.println("Error parsing instance: " + e.getMessage());
                 System.exit(1);
                 return;
             }
-            
-            if (verbose)
-            {
-                System.out.println( "Executing Query..." );
+
+            if (verbose) {
+                System.out.println("Executing Query...");
                 System.err.println();
             }
-    
-            XmlObject[] result = null;
-    
-            try
-            {
-                result = x.execQuery( query );
-            }
-            catch ( Throwable e )
-            {
-                System.err.println( "Error executing query: " + e.getMessage() );
+
+            XmlObject[] result;
+
+            try {
+                result = x.execQuery(query);
+            } catch (Throwable e) {
+                System.err.println("Error executing query: " + e.getMessage());
                 System.exit(1);
                 return;
             }
-    
-            if (verbose)
-            {
-                System.out.println( "Query Result:" );
+
+            if (verbose) {
+                System.out.println("Query Result:");
             }
-            
+
             XmlOptions opts = new XmlOptions();
             opts.setSaveOuter();
-            if (pretty)
+            if (pretty) {
                 opts.setSavePrettyPrint();
-            
-            for (int j = 0; j < result.length; j++)
-            {
-                result[j].save( System.out, opts );
+            }
+
+            for (XmlObject xmlObject : result) {
+                xmlObject.save(System.out, opts);
                 System.out.println();
             }
         }
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java b/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
index 04d4259..6a6a920 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
@@ -25,6 +25,7 @@
 import org.apache.xmlbeans.impl.xb.xmlconfig.ConfigDocument;
 import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
 import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument;
+import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument.Schema;
 import org.xml.sax.EntityResolver;
 
 import java.io.File;
@@ -141,7 +142,6 @@
             return;
         }
 
-        args = cl.args();
         boolean verbose = (cl.getOpt("verbose") != null);
         boolean quiet = (cl.getOpt("quiet") != null);
         if (verbose) {
@@ -589,20 +589,6 @@
             this.javasource = javasource;
         }
 
-        /**
-         * @deprecated
-         */
-        public String getJar() {
-            return null;
-        }
-
-        /**
-         * @deprecated
-         */
-        public void setJar(String jar) {
-            // no op
-        }
-
         public Collection<XmlError> getErrorListener() {
             return errorListener;
         }
@@ -663,7 +649,7 @@
     private static SchemaTypeSystem loadTypeSystem(String name, File[] xsdFiles, File[] wsdlFiles, URL[] urlFiles, File[] configFiles,
                                                    File[] javaFiles, ResourceLoader cpResourceLoader,
                                                    boolean download, boolean noUpa, boolean noPvr, boolean noAnn, boolean noVDoc, boolean noExt,
-                                                   Set<String> mdefNamespaces, File baseDir, Map sourcesToCopyMap,
+                                                   Set<String> mdefNamespaces, File baseDir, Map<String, String> sourcesToCopyMap,
                                                    Collection<XmlError> outerErrorListener, File schemasDir, EntityResolver entResolver, File[] classpath, String javasource) {
         XmlErrorWatcher errorListener = new XmlErrorWatcher(outerErrorListener);
 
@@ -681,7 +667,7 @@
             SchemaTypeLoader loader = XmlBeans.typeLoaderForClassLoader(SchemaDocument.class.getClassLoader());
 
             // step 1, parse all the XSD files.
-            ArrayList<SchemaDocument.Schema> scontentlist = new ArrayList<>();
+            ArrayList<Schema> scontentlist = new ArrayList<>();
             if (xsdFiles != null) {
                 for (File xsdFile : xsdFiles) {
                     try {
@@ -766,7 +752,7 @@
                 }
             }
 
-            SchemaDocument.Schema[] sdocs = (SchemaDocument.Schema[]) scontentlist.toArray(new SchemaDocument.Schema[0]);
+            Schema[] sdocs = scontentlist.toArray(new Schema[0]);
 
             // now the config files.
             ArrayList<ConfigDocument.Config> cdoclist = new ArrayList<>();
@@ -855,7 +841,7 @@
     }
 
     private static void addSchema(String name, SchemaDocument schemadoc,
-                                  XmlErrorWatcher errorListener, boolean noVDoc, List<SchemaDocument.Schema> scontentlist) {
+                                  XmlErrorWatcher errorListener, boolean noVDoc, List<Schema> scontentlist) {
         StscState.addInfo(errorListener, "Loading schema file " + name);
         XmlOptions opts = new XmlOptions().setErrorListener(errorListener);
         if (noVDoc) {
@@ -868,7 +854,7 @@
 
     private static void addWsdlSchemas(String name,
                                        org.apache.xmlbeans.impl.xb.substwsdl.DefinitionsDocument wsdldoc,
-                                       XmlErrorWatcher errorListener, boolean noVDoc, List scontentlist) {
+                                       XmlErrorWatcher errorListener, boolean noVDoc, List<Schema> scontentlist) {
         if (wsdlContainsEncoded(wsdldoc)) {
             StscState.addWarning(errorListener, "The WSDL " + name + " uses SOAP encoding. SOAP encoding is not compatible with literal XML Schema.", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
         }
@@ -879,18 +865,17 @@
         }
         XmlObject[] types = wsdldoc.getDefinitions().getTypesArray();
         int count = 0;
-        for (int j = 0; j < types.length; j++) {
-            XmlObject[] schemas = types[j].selectPath("declare namespace xs=\"http://www.w3.org/2001/XMLSchema\" xs:schema");
+        for (XmlObject type : types) {
+            Schema[] schemas = (Schema[]) type.selectPath("declare namespace xs=\"http://www.w3.org/2001/XMLSchema\" xs:schema");
             if (schemas.length == 0) {
                 StscState.addWarning(errorListener, "The WSDL " + name + " did not have any schema documents in namespace 'http://www.w3.org/2001/XMLSchema'", XmlErrorCodes.GENERIC_ERROR, wsdldoc);
                 continue;
             }
 
-            for (int k = 0; k < schemas.length; k++) {
-                if (schemas[k] instanceof SchemaDocument.Schema &&
-                    schemas[k].validate(opts)) {
+            for (Schema schema : schemas) {
+                if (schema.validate(opts)) {
                     count++;
-                    scontentlist.add(schemas[k]);
+                    scontentlist.add(schema);
                 }
             }
         }
@@ -924,7 +909,7 @@
         boolean noVDoc = params.isNoVDoc();
         boolean noExt = params.isNoExt();
         boolean incrSrcGen = params.isIncrementalSrcGen();
-        Collection outerErrorListener = params.getErrorListener();
+        Collection<XmlError> outerErrorListener = params.getErrorListener();
 
         String repackage = params.getRepackage();
 
@@ -941,8 +926,8 @@
         }
 
         SchemaCodePrinter codePrinter = params.getSchemaCodePrinter();
-        List extensions = params.getExtensions();
-        Set mdefNamespaces = params.getMdefNamespaces();
+        List<Extension> extensions = params.getExtensions();
+        Set<String> mdefNamespaces = params.getMdefNamespaces();
 
         EntityResolver cmdLineEntRes = params.getEntityResolver() == null ?
             ResolverUtil.resolverForCatalog(params.getCatalogFile()) : params.getEntityResolver();
@@ -955,12 +940,14 @@
 
         // Calculate the usenames based on the relativized filenames on the filesystem
         if (baseDir == null) {
-            baseDir = new File(SystemProperties.getProperty("user.dir"));
+            String userDir = SystemProperties.getProperty("user.dir");
+            assert (userDir != null);
+            baseDir = new File(userDir);
         }
 
         ResourceLoader cpResourceLoader = null;
 
-        Map sourcesToCopyMap = new HashMap();
+        Map<String, String> sourcesToCopyMap = new HashMap<>();
 
         if (classpath != null) {
             cpResourceLoader = new PathResourceLoader(classpath);
@@ -1005,12 +992,12 @@
             system.save(filer);
 
             // gen source files
-            result &= SchemaTypeSystemCompiler.generateTypes(system, filer, options);
+            result = SchemaTypeSystemCompiler.generateTypes(system, filer, options);
 
             if (incrSrcGen) {
                 // We have to delete extra source files that may be out of date
                 SchemaCodeGenerator.deleteObsoleteFiles(srcDir, srcDir,
-                    new HashSet(filer.getSourceFiles()));
+                    new HashSet<>(filer.getSourceFiles()));
             }
 
             if (result) {
@@ -1024,7 +1011,7 @@
             if (result && !nojavac) {
                 start = System.currentTimeMillis();
 
-                List sourcefiles = filer.getSourceFiles();
+                List<File> sourcefiles = filer.getSourceFiles();
 
                 if (javaFiles != null) {
                     sourcefiles.addAll(java.util.Arrays.asList(javaFiles));
@@ -1067,12 +1054,12 @@
         return result;
     }
 
-    private static void runExtensions(List extensions, SchemaTypeSystem system, File classesDir) {
+    private static void runExtensions(List<Extension> extensions, SchemaTypeSystem system, File classesDir) {
         if (extensions != null && extensions.size() > 0) {
-            SchemaCompilerExtension sce = null;
-            Iterator i = extensions.iterator();
-            Map extensionParms = null;
-            String classesDirName = null;
+            SchemaCompilerExtension sce;
+            Iterator<Extension> i = extensions.iterator();
+            Map<String, String> extensionParms;
+            String classesDirName;
             try {
                 classesDirName = classesDir.getCanonicalPath();
             } catch (java.io.IOException e) {
@@ -1081,7 +1068,7 @@
             }
 
             while (i.hasNext()) {
-                Extension extension = (Extension) i.next();
+                Extension extension = i.next();
                 try {
                     sce = (SchemaCompilerExtension) extension.getClassName().newInstance();
                 } catch (InstantiationException e) {
@@ -1095,10 +1082,8 @@
                 }
 
                 System.out.println("Running Extension: " + sce.getExtensionName());
-                extensionParms = new HashMap();
-                Iterator parmsi = extension.getParams().iterator();
-                while (parmsi.hasNext()) {
-                    Extension.Param p = (Extension.Param) parmsi.next();
+                extensionParms = new HashMap<>();
+                for (Extension.Param p : extension.getParams()) {
                     extensionParms.put(p.getName(), p.getValue());
                 }
                 extensionParms.put("classesDir", classesDirName);
@@ -1113,8 +1098,8 @@
         XmlObject[] useAttrs = wsdldoc.selectPath(
             "declare namespace soap='http://schemas.xmlsoap.org/wsdl/soap/' " +
             ".//soap:body/@use|.//soap:header/@use|.//soap:fault/@use");
-        for (int i = 0; i < useAttrs.length; i++) {
-            if ("encoded".equals(((SimpleValue) useAttrs[i]).getStringValue())) {
+        for (XmlObject useAttr : useAttrs) {
+            if ("encoded".equals(((SimpleValue) useAttr).getStringValue())) {
                 return true;
             }
         }
@@ -1123,10 +1108,6 @@
 
     private static final String CONFIG_URI = "http://xml.apache.org/xmlbeans/2004/02/xbean/config";
     private static final String COMPATIBILITY_CONFIG_URI = "http://www.bea.com/2002/09/xbean/config";
-    private static final Map MAP_COMPATIBILITY_CONFIG_URIS;
-
-    static {
-        MAP_COMPATIBILITY_CONFIG_URIS = new HashMap();
-        MAP_COMPATIBILITY_CONFIG_URIS.put(COMPATIBILITY_CONFIG_URI, CONFIG_URI);
-    }
+    private static final Map<String, String> MAP_COMPATIBILITY_CONFIG_URIS
+        = Collections.singletonMap(COMPATIBILITY_CONFIG_URI, CONFIG_URI);
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/XMLBeanXSTCHarness.java b/src/main/java/org/apache/xmlbeans/impl/tool/XMLBeanXSTCHarness.java
index bf87c72..a73782a 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/XMLBeanXSTCHarness.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/XMLBeanXSTCHarness.java
@@ -15,95 +15,76 @@
 
 package org.apache.xmlbeans.impl.tool;
 
-import org.apache.xmlbeans.SchemaTypeLoader;
-import org.apache.xmlbeans.XmlBeans;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.SchemaTypeSystem;
-import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.*;
 
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 
-public class XMLBeanXSTCHarness implements XSTCTester.Harness
-{
-    public void runTestCase(XSTCTester.TestCaseResult result)
-    {
+public class XMLBeanXSTCHarness implements XSTCTester.Harness {
+    public void runTestCase(XSTCTester.TestCaseResult result) {
         XSTCTester.TestCase testCase = result.getTestCase();
-        
-        // System.out.println("Running case " + testCase.getDescription());
-        
-        try
-        {
-            Collection errors = new ArrayList();
-            boolean schemaValid = true;
-            boolean instanceValid = true;
-            
-            if (testCase.getSchemaFile() == null)
-                return;
-            
-            // step 1, load schema file etc.
-            SchemaTypeLoader loader = null;
-            try
-            {
-                XmlObject schema = XmlObject.Factory.parse(testCase.getSchemaFile(), new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
-                XmlObject schema2 = null;
-                if (testCase.getResourceFile() != null)
-                    schema2 = XmlObject.Factory.parse(testCase.getResourceFile(), new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
-                XmlObject[] schemas = schema2 == null ? new XmlObject[] { schema } : new XmlObject[] { schema, schema2 };
-                SchemaTypeSystem system = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), new XmlOptions().setErrorListener(errors));
-                loader = XmlBeans.typeLoaderUnion(new SchemaTypeLoader[] { system, XmlBeans.getBuiltinTypeSystem() });
+
+        Collection<XmlError> errors = new ArrayList<>();
+        boolean schemaValid = true;
+        boolean instanceValid = true;
+
+        if (testCase.getSchemaFile() == null) {
+            return;
+        }
+
+        // step 1, load schema file etc.
+        SchemaTypeLoader loader = null;
+        try {
+            XmlObject schema = XmlObject.Factory.parse(testCase.getSchemaFile(), new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
+            XmlObject schema2 = null;
+            if (testCase.getResourceFile() != null) {
+                schema2 = XmlObject.Factory.parse(testCase.getResourceFile(), new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
             }
-            catch (Exception e)
-            {
-                schemaValid = false;
-                if (!(e instanceof XmlException) || errors.isEmpty())
-                {
-                    result.setCrash(true);
-                    StringWriter sw = new StringWriter();
-                    e.printStackTrace(new PrintWriter(sw));
-                    result.addSvMessages(Collections.singleton(sw.toString()));
-                }
+            XmlObject[] schemas = schema2 == null ? new XmlObject[]{schema} : new XmlObject[]{schema, schema2};
+            SchemaTypeSystem system = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), new XmlOptions().setErrorListener(errors));
+            loader = XmlBeans.typeLoaderUnion(system, XmlBeans.getBuiltinTypeSystem());
+        } catch (Exception e) {
+            schemaValid = false;
+            if (!(e instanceof XmlException) || errors.isEmpty()) {
+                result.setCrash(true);
+                StringWriter sw = new StringWriter();
+                e.printStackTrace(new PrintWriter(sw));
+                result.addSvMessages(Collections.singleton(XmlError.forMessage(sw.toString())));
             }
-            
-            result.addSvMessages(errors);
-            result.setSvActual(schemaValid);
-            errors.clear();
-            
-            if (loader == null)
-                return;
-            
-            if (testCase.getInstanceFile() == null)
-                return;
-            
-            // step 2, load instance file and validate
-            try
-            {
-                XmlObject instance = loader.parse(testCase.getInstanceFile(), null, new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
-                if (!instance.validate(new XmlOptions().setErrorListener(errors)))
-                    instanceValid = false;
-            }
-            catch (Exception e)
-            {
+        }
+
+        result.addSvMessages(errors);
+        result.setSvActual(schemaValid);
+        errors.clear();
+
+        if (loader == null) {
+            return;
+        }
+
+        if (testCase.getInstanceFile() == null) {
+            return;
+        }
+
+        // step 2, load instance file and validate
+        try {
+            XmlObject instance = loader.parse(testCase.getInstanceFile(), null, new XmlOptions().setErrorListener(errors).setLoadLineNumbers());
+            if (!instance.validate(new XmlOptions().setErrorListener(errors))) {
                 instanceValid = false;
-                if (!(e instanceof XmlException) || errors.isEmpty())
-                {
-                    result.setCrash(true);
-                    StringWriter sw = new StringWriter();
-                    e.printStackTrace(new PrintWriter(sw));
-                    result.addIvMessages(Collections.singleton(sw.toString()));
-                }
             }
-            result.addIvMessages(errors);
-            result.setIvActual(instanceValid);
-                    
+        } catch (Exception e) {
+            instanceValid = false;
+            if (!(e instanceof XmlException) || errors.isEmpty()) {
+                result.setCrash(true);
+                StringWriter sw = new StringWriter();
+                e.printStackTrace(new PrintWriter(sw));
+                result.addIvMessages(Collections.singleton(XmlError.forMessage(sw.toString())));
+            }
         }
-        finally
-        {
-            // System.out.println(result.succeeded() ? "Success.": "Failure.");
-        }
+        result.addIvMessages(errors);
+        result.setIvActual(instanceValid);
+
     }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/XSTCTester.java b/src/main/java/org/apache/xmlbeans/impl/tool/XSTCTester.java
index b88fd9c..11b0f29 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/XSTCTester.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/XSTCTester.java
@@ -15,38 +15,26 @@
 
 package org.apache.xmlbeans.impl.tool;
 
-import org.apache.xmlbeans.SystemProperties;
-import org.apache.xmlbeans.impl.xb.ltgfmt.TestsDocument;
+import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.xb.ltgfmt.FileDesc;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlError;
-import org.apache.xmlbeans.XmlCalendar;
+import org.apache.xmlbeans.impl.xb.ltgfmt.TestsDocument;
 
 import java.io.File;
-import java.io.PrintWriter;
-import java.io.FileWriter;
 import java.io.IOException;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Date;
-import java.util.regex.Pattern;
+import java.io.PrintWriter;
 import java.net.URI;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.*;
+import java.util.regex.Pattern;
 
-public class XSTCTester
-{
-    public static void printUsage()
-    {
+public class XSTCTester {
+    public static void printUsage() {
         System.out.println("Usage: xstc [-showpass] [-errcode] foo_LTGfmt.xml ...");
     }
 
-    public static void main(String[] args) throws IOException
-    {
-        Set flags = new HashSet();
+    public static void main(String[] args) throws IOException {
+        Set<String> flags = new HashSet<>();
         flags.add("h");
         flags.add("help");
         flags.add("usage");
@@ -55,27 +43,25 @@
         flags.add("errcode");
 
         long start = System.currentTimeMillis();
-        
+
         CommandLine cl = new CommandLine(args, flags, Collections.EMPTY_SET);
-        if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null)
-        {
+        if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null) {
             printUsage();
             System.exit(0);
             return;
         }
 
-        if (cl.getOpt("version") != null)
-        {
+        if (cl.getOpt("version") != null) {
             CommandLine.printVersion();
             System.exit(0);
             return;
         }
 
         String[] badopts = cl.getBadOpts();
-        if (badopts.length > 0)
-        {
-            for (int i = 0; i < badopts.length; i++)
-                System.out.println("Unrecognized option: " + badopts[i]);
+        if (badopts.length > 0) {
+            for (String badopt : badopts) {
+                System.out.println("Unrecognized option: " + badopt);
+            }
             printUsage();
             System.exit(0);
             return;
@@ -90,103 +76,101 @@
         boolean errcode = (cl.getOpt("errcode") != null);
 
         File[] allFiles = cl.getFiles();
-        Collection ltgFiles = new ArrayList();
+        Collection<File> ltgFiles = new ArrayList<>();
         Harness harness = new XMLBeanXSTCHarness();
-        
-        for (int i = 0; i < allFiles.length; i++)
-        {
-            if (allFiles[i].getName().indexOf("LTG") >= 0)
-                ltgFiles.add(allFiles[i]);
+
+        for (File allFile : allFiles) {
+            if (allFile.getName().contains("LTG")) {
+                ltgFiles.add(allFile);
+            }
         }
-        
+
         File resultsFile = new File("out.html");
-        PrintWriter writer = new PrintWriter(new FileWriter(resultsFile));
-        writer.println("<html>");
-        writer.println("<style>td {border-bottom: 1px solid black} xmp {white-space: normal; word-wrap: break-word; word-break: break-all} </style>");
-        writer.println("<body>");
+        try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(resultsFile.toPath(), StandardCharsets.ISO_8859_1))) {
+            writer.println("<html>");
+            writer.println("<style>td {border-bottom: 1px solid black} xmp {white-space: normal; word-wrap: break-word; word-break: break-all} </style>");
+            writer.println("<body>");
 
-        writer.println("<script language='JavaScript' type='text/javascript'>");
-        writer.println("var w;");
-        writer.println("function openWindow(schema, instance) {");
-        writer.println("  if (w == null) {");
-        writer.println("    w = window.open('about:blank', 'xstc');");
-        writer.println("  }");
-        writer.println("  if (w.closed) {");
-        writer.println("    w = window.open('about:blank', 'xstc');");
-        writer.println("  }");
-        writer.println("  w.document.open();");
-        writer.println("  w.document.write(\"<frameset rows=*,*><frame src='\" + schema + \"'><frame src='\" + instance + \"'></frameset>\");");
-        writer.println("  w.document.close();");
-        writer.println("  w.focus();");
-        writer.println("}");
-        writer.println("</script>");
+            writer.println("<script language='JavaScript' type='text/javascript'>");
+            writer.println("var w;");
+            writer.println("function openWindow(schema, instance) {");
+            writer.println("  if (w == null) {");
+            writer.println("    w = window.open('about:blank', 'xstc');");
+            writer.println("  }");
+            writer.println("  if (w.closed) {");
+            writer.println("    w = window.open('about:blank', 'xstc');");
+            writer.println("  }");
+            writer.println("  w.document.open();");
+            writer.println("  w.document.write(\"<frameset rows=*,*><frame src='\" + schema + \"'><frame src='\" + instance + \"'></frameset>\");");
+            writer.println("  w.document.close();");
+            writer.println("  w.focus();");
+            writer.println("}");
+            writer.println("</script>");
 
-        writer.println("<h1>XML Schema Test Collection Results</h1>");
-        writer.println("<p>Run on " + (new XmlCalendar(new Date())) + "</p>");
-        writer.println("<p>Values in schema or instance valid columns are results from compiling or validating respectively.");
-        writer.println("Red or orange background mean the test failed.</p>");
-        writer.println("<table style='border: 1px solid black' cellpadding=0 cellspacing=0>");
-        writer.println("<tr><td witdh=10%>id</td><td width=70%>Description</td><td width=10%>sch v</td><td width=10%>ins v</td></tr>");
-        int failures = 0;
-        int cases = 0;
-        for (Iterator i = ltgFiles.iterator(); i.hasNext(); )
-        {
-            File ltgFile = (File)i.next();
-            System.out.println("Processing test cases in " + ltgFile);
-            Collection ltgErrors = new ArrayList();
-            TestCase[] testCases = parseLTGFile(ltgFile, ltgErrors);
-            Collection results = new ArrayList();
-            if (testCases != null) for (int j = 0; j < testCases.length; j++)
-            {
-                TestCaseResult result = new TestCaseResult();
-                result.testCase = testCases[j];
-                harness.runTestCase(result);
-                cases += 1;
-                if (!result.succeeded(errcode))
-                    failures += 1;
-                else if (!showpass)
-                    continue;
-                results.add(result);
+            writer.println("<h1>XML Schema Test Collection Results</h1>");
+            writer.println("<p>Run on " + (new XmlCalendar(new Date())) + "</p>");
+            writer.println("<p>Values in schema or instance valid columns are results from compiling or validating respectively.");
+            writer.println("Red or orange background mean the test failed.</p>");
+            writer.println("<table style='border: 1px solid black' cellpadding=0 cellspacing=0>");
+            writer.println("<tr><td witdh=10%>id</td><td width=70%>Description</td><td width=10%>sch v</td><td width=10%>ins v</td></tr>");
+            int failures = 0;
+            int cases = 0;
+            for (File ltgFile : ltgFiles) {
+                System.out.println("Processing test cases in " + ltgFile);
+                Collection<String> ltgErrors = new ArrayList<>();
+                TestCase[] testCases = parseLTGFile(ltgFile, ltgErrors);
+                final Collection<TestCaseResult> results = new ArrayList<>();
+                if (testCases != null) {
+                    for (TestCase testCase : testCases) {
+                        TestCaseResult result = new TestCaseResult();
+                        result.testCase = testCase;
+                        harness.runTestCase(result);
+                        cases += 1;
+                        if (!result.succeeded(errcode)) {
+                            failures += 1;
+                        } else if (!showpass) {
+                            continue;
+                        }
+                        results.add(result);
+                    }
+                }
+                writer.println("<tr><td colspan=4 bgcolor=skyblue>" + ltgFile + "</td></tr>");
+                if (!ltgErrors.isEmpty()) {
+                    writer.println("<tr><td>Errors within the LTG file:");
+                    writer.println("<xmp>");
+                    for (String ltgError : ltgErrors) {
+                        writer.println(ltgError);
+                    }
+                    writer.println("</xmp>");
+                    writer.println("</td></tr>");
+                } else {
+                    if (results.size() == 0) {
+                        writer.println("<tr><td colspan=4 bgcolor=green>Nothing to report</td></tr>");
+                    }
+                }
+                for (TestCaseResult result : results) {
+                    summarizeResultAsHTMLTableRows(result, writer, errcode);
+                }
             }
-            writer.println("<tr><td colspan=4 bgcolor=skyblue>" + ltgFile + "</td></tr>");
-            if (!ltgErrors.isEmpty())
-            {
-                writer.println("<tr><td>Errors within the LTG file:");
-                writer.println("<xmp>");
-                for (Iterator j = ltgErrors.iterator(); j.hasNext(); )
-                    writer.println(j.next());
-                writer.println("</xmp>");
-                writer.println("</td></tr>");
-            }
-            else
-            {
-                if (results.size() == 0)
-                    writer.println("<tr><td colspan=4 bgcolor=green>Nothing to report</td></tr>");
-            }
-            if (results == null)
-                continue;
-            for (Iterator j = results.iterator(); j.hasNext() ;)
-            {
-                summarizeResultAsHTMLTableRows((TestCaseResult)j.next(), writer, errcode);
-            }
+            writer.println("<tr><td colspan=4>Summary: " + failures + " failures out of " + cases + " cases run.</td></tr>");
+            writer.println("</table>");
         }
-        writer.println("<tr><td colspan=4>Summary: " + failures + " failures out of " + cases + " cases run.</td></tr>");
-        writer.println("</table>");
-        writer.close();
-        
+
         long finish = System.currentTimeMillis();
-        System.out.println("Time run tests: " + ((double)(finish - start) / 1000.0) + " seconds" );
-        
+        System.out.println("Time run tests: " + ((double) (finish - start) / 1000.0) + " seconds");
+
         // Launch results
         System.out.println("Results output to " + resultsFile);
-        if (SystemProperties.getProperty("os.name").toLowerCase().indexOf("windows") >= 0)
+        String osName = SystemProperties.getProperty("os.name");
+        assert (osName != null);
+        if (osName.toLowerCase(Locale.ROOT).contains("windows")) {
             Runtime.getRuntime().exec("cmd /c start iexplore \"" + resultsFile.getAbsolutePath() + "\"");
-        else
+        } else {
             Runtime.getRuntime().exec("mozilla file://" + resultsFile.getAbsolutePath());
+        }
     }
-    
-    public static class TestCase
-    {
+
+    public static class TestCase {
         private File ltgFile;
         private String id;
         private String origin;
@@ -199,176 +183,152 @@
         private boolean rvExpected;
         private String errorCode;
 
-        public File getLtgFile()
-        {
+        public File getLtgFile() {
             return ltgFile;
         }
 
-        public String getId()
-        {
+        public String getId() {
             return id;
         }
 
-        public String getOrigin()
-        {
+        public String getOrigin() {
             return origin;
         }
 
-        public String getDescription()
-        {
+        public String getDescription() {
             return description;
         }
 
-        public File getSchemaFile()
-        {
+        public File getSchemaFile() {
             return schemaFile;
         }
 
-        public File getInstanceFile()
-        {
+        public File getInstanceFile() {
             return instanceFile;
         }
 
-        public File getResourceFile()
-        {
+        public File getResourceFile() {
             return resourceFile;
         }
 
-        public boolean isSvExpected()
-        {
+        public boolean isSvExpected() {
             return svExpected;
         }
 
-        public boolean isIvExpected()
-        {
+        public boolean isIvExpected() {
             return ivExpected;
         }
 
-        public boolean isRvExpected()
-        {
+        public boolean isRvExpected() {
             return rvExpected;
         }
 
-        public String getErrorCode()
-        {
+        public String getErrorCode() {
             return errorCode;
         }
 
     }
-    
-    public static class TestCaseResult
-    {
+
+    public static class TestCaseResult {
         private TestCase testCase;
         private boolean svActual;
-        private Collection svMessages = new ArrayList();
+        private final Collection<XmlError> svMessages = new ArrayList<>();
         private boolean ivActual;
-        private Collection ivMessages = new ArrayList();
+        private final Collection<XmlError> ivMessages = new ArrayList<>();
         private boolean crash;
 
-        public TestCase getTestCase()
-        {
+        public TestCase getTestCase() {
             return testCase;
         }
 
-        public boolean isSvActual()
-        {
+        public boolean isSvActual() {
             return svActual;
         }
 
-        public void setSvActual(boolean svActual)
-        {
+        public void setSvActual(boolean svActual) {
             this.svActual = svActual;
         }
 
-        public boolean isIvActual()
-        {
+        public boolean isIvActual() {
             return ivActual;
         }
 
-        public void setIvActual(boolean ivActual)
-        {
+        public void setIvActual(boolean ivActual) {
             this.ivActual = ivActual;
         }
 
-        public Collection getSvMessages()
-        {
+        public Collection<XmlError> getSvMessages() {
             return Collections.unmodifiableCollection(svMessages);
         }
 
-        public void addSvMessages(Collection svMessages)
-        {
+        public void addSvMessages(Collection<XmlError> svMessages) {
             this.svMessages.addAll(svMessages);
         }
 
-        public Collection getIvMessages()
-        {
+        public Collection<XmlError> getIvMessages() {
             return Collections.unmodifiableCollection(ivMessages);
         }
 
-        public void addIvMessages(Collection ivMessages)
-        {
+        public void addIvMessages(Collection<XmlError> ivMessages) {
             this.ivMessages.addAll(ivMessages);
         }
-        
-        public void setCrash(boolean crash)
-        {
+
+        public void setCrash(boolean crash) {
             this.crash = crash;
         }
-        
-        public boolean isCrash()
-        {
+
+        public boolean isCrash() {
             return crash;
         }
-        
-        public boolean succeeded(boolean errcode)
-        {
+
+        public boolean succeeded(boolean errcode) {
             boolean success = !crash &&
-                (isIvActual() == testCase.isIvExpected()) &&
-                (isSvActual() == testCase.isSvExpected());
-            if (errcode && testCase.getErrorCode() != null)
+                              (isIvActual() == testCase.isIvExpected()) &&
+                              (isSvActual() == testCase.isSvExpected());
+            if (errcode && testCase.getErrorCode() != null) {
                 success &= errorReported(testCase.getErrorCode(), svMessages) || errorReported(testCase.getErrorCode(), ivMessages);
+            }
             return success;
         }
 
     }
-    
-    public static interface Harness
-    {
-        public void runTestCase(TestCaseResult result);
+
+    public interface Harness {
+        void runTestCase(TestCaseResult result);
     }
-    
-    public static String makeHTMLLink(File file, boolean value)
-    {
-        if (file == null)
+
+    public static String makeHTMLLink(File file, boolean value) {
+        if (file == null) {
             return "&nbsp;";
+        }
         URI uri = file.getAbsoluteFile().toURI();
-        return "<a href=\"" + uri + "\" target=_blank>" + Boolean.toString(value) + "</a>";
+        return "<a href=\"" + uri + "\" target=_blank>" + value + "</a>";
     }
-    
+
     private static final Pattern leadingSpace = Pattern.compile("^\\s+", Pattern.MULTILINE);
-    
-    public static String makeHTMLDescription(TestCase testCase)
-    {
+
+    public static String makeHTMLDescription(TestCase testCase) {
         StringBuilder sb = new StringBuilder();
         sb.append("<a class=noline href='javascript:openWindow(\"");
-        if (testCase.getSchemaFile() == null)
+        if (testCase.getSchemaFile() == null) {
             sb.append("about:No schema");
-        else
+        } else {
             sb.append(testCase.getSchemaFile().getAbsolutePath().replaceAll("\\\\", "\\\\\\\\"));
+        }
 
         sb.append("\", \"");
-        if (testCase.getInstanceFile() == null)
+        if (testCase.getInstanceFile() == null) {
             sb.append("about:No instance");
-        else
+        } else {
             sb.append(testCase.getInstanceFile().getAbsolutePath().replaceAll("\\\\", "\\\\\\\\"));
+        }
         sb.append("\")'><xmp>");
         sb.append(leadingSpace.matcher(testCase.getDescription()).replaceAll(""));
         sb.append("</xmp></a>");
         return sb.toString();
     }
-    
-    public static void summarizeResultAsHTMLTableRows(TestCaseResult result, PrintWriter out, boolean errcode)
-    {
+
+    public static void summarizeResultAsHTMLTableRows(TestCaseResult result, PrintWriter out, boolean errcode) {
         TestCase testCase = result.getTestCase();
 
         boolean errorRow = errcode && testCase.getErrorCode() != null;
@@ -377,131 +337,134 @@
         boolean sRight = testCase.getSchemaFile() == null || testCase.isSvExpected() == result.isSvActual();
         boolean iRight = testCase.getInstanceFile() == null || testCase.isIvExpected() == result.isIvActual();
         boolean codeRight = true;
-        if (errorRow)
+        if (errorRow) {
             codeRight = (errorReported(testCase.getErrorCode(), result.svMessages) || errorReported(testCase.getErrorCode(), result.ivMessages));
+        }
 
         out.println(result.isCrash() ? "<tr bgcolor=black color=white>" : "<tr>");
         int idRowSpan = 1 + (errorRow ? 1 : 0) + (messagesRow ? 1 : 0);
         out.println("<td rowspan=" + idRowSpan + " valign=top>" + testCase.getId() + "</td>");
         out.println("<td valign=top>" + makeHTMLDescription(testCase) + "</td>");
         String sLinks;
-        if (testCase.getResourceFile() == null)
+        if (testCase.getResourceFile() == null) {
             sLinks = makeHTMLLink(testCase.getSchemaFile(), result.isSvActual());
-        else
+        } else {
             sLinks = makeHTMLLink(testCase.getSchemaFile(), result.isSvActual()) + "<br>" + makeHTMLLink(testCase.getResourceFile(), result.isSvActual());
-        
+        }
+
         out.println((sRight ? "<td valign=top>" : result.isSvActual() ? "<td bgcolor=orange valign=top>" : "<td bgcolor=red valign=top>") + sLinks + "</td>");
         out.println((iRight ? "<td valign=top>" : result.isIvActual() ? "<td bgcolor=orange valign=top>" : "<td bgcolor=red valign=top>") + makeHTMLLink(testCase.getInstanceFile(), result.isIvActual()) + "</td>");
         out.println("</tr>");
-        if (errorRow)
-        {
+        if (errorRow) {
             out.println("<tr>");
             out.println((codeRight ? "<td colspan=4 valid=top>" : "<td colspan=4 bgcolor=orange valign=top>") + "expected error: " + testCase.getErrorCode() + "</td>");
             out.println("</tr>");
         }
-        if (messagesRow)
-        {
-            if (!result.succeeded(errcode))
+        if (messagesRow) {
+            if (!result.succeeded(errcode)) {
                 out.println("<tr><td colspan=4 bgcolor=yellow><xmp>");
-            else
+            } else {
                 out.println("<tr><td colspan=4><xmp>");
-            for (Iterator j = result.getSvMessages().iterator(); j.hasNext(); )
-                out.println(j.next());
-            for (Iterator j = result.getIvMessages().iterator(); j.hasNext(); )
-                out.println(j.next());
+            }
+            for (XmlError s : result.getSvMessages()) {
+                out.println(s);
+            }
+            for (XmlError xmlError : result.getIvMessages()) {
+                out.println(xmlError);
+            }
             out.println("</xmp></tr></td>");
         }
     }
-    
-    public static TestCase[] parseLTGFile(File ltgFile, Collection outerErrors)
-    {
-        Collection errors = new ArrayList();
-        try
-        {
+
+    public static TestCase[] parseLTGFile(File ltgFile, Collection<String> outerErrors) {
+        Collection<XmlError> errors = new ArrayList<>();
+        try {
             XmlOptions ltgOptions = new XmlOptions();
             ltgOptions.setLoadSubstituteNamespaces(Collections.singletonMap("", "http://www.bea.com/2003/05/xmlbean/ltgfmt"));
             ltgOptions.setErrorListener(errors);
             ltgOptions.setLoadLineNumbers();
             TestsDocument doc = TestsDocument.Factory.parse(ltgFile, ltgOptions);
-            if (!doc.validate(ltgOptions))
+            if (!doc.validate(ltgOptions)) {
                 throw new Exception("Document " + ltgFile + " not valid.");
-            
+            }
+
             org.apache.xmlbeans.impl.xb.ltgfmt.TestCase[] testCases = doc.getTests().getTestArray();
-            
-            Collection result = new ArrayList();
-            for (int i = 0; i < testCases.length; i++)
-            {
+
+            Collection<TestCase> result = new ArrayList<>();
+            for (org.apache.xmlbeans.impl.xb.ltgfmt.TestCase testCase : testCases) {
                 TestCase newCase = new TestCase();
                 newCase.ltgFile = ltgFile;
-                newCase.id = testCases[i].getId();
-                newCase.origin = testCases[i].getOrigin();
-                newCase.description = testCases[i].getDescription();
-                FileDesc[] filedescs = testCases[i].getFiles().getFileArray();
-                testCases[i].getOrigin();
-                for (int j = 0; j < filedescs.length; j++)
-                {
-                    String dir = filedescs[j].getFolder();
-                    String filename = filedescs[j].getFileName();
+                newCase.id = testCase.getId();
+                newCase.origin = testCase.getOrigin();
+                newCase.description = testCase.getDescription();
+                FileDesc[] filedescs = testCase.getFiles().getFileArray();
+                testCase.getOrigin();
+                for (FileDesc filedesc : filedescs) {
+                    String dir = filedesc.getFolder();
+                    String filename = filedesc.getFileName();
                     File theFile = new File(ltgFile.getParentFile(), dir + "/" + filename);
-                    if (!theFile.exists() || !theFile.isFile() || !theFile.canRead())
-                    {
-                        outerErrors.add(XmlError.forObject("Can't read file " + theFile, filedescs[j]).toString());
+                    if (!theFile.exists() || !theFile.isFile() || !theFile.canRead()) {
+                        outerErrors.add(XmlError.forObject("Can't read file " + theFile, filedesc).toString());
                         continue;
                     }
-                    
-                    switch (filedescs[j].getRole().intValue())
-                    {
+
+                    switch (filedesc.getRole().intValue()) {
                         case FileDesc.Role.INT_INSTANCE:
-                            if (newCase.instanceFile != null)
-                                outerErrors.add(XmlError.forObject("More than one instance file speicifed - ignoring all but last", filedescs[j]).toString());
+                            if (newCase.instanceFile != null) {
+                                outerErrors.add(XmlError.forObject("More than one instance file speicifed - ignoring all but last", filedesc).toString());
+                            }
                             newCase.instanceFile = theFile;
-                            newCase.ivExpected = filedescs[j].getValidity();
+                            newCase.ivExpected = filedesc.getValidity();
                             break;
-                            
+
                         case FileDesc.Role.INT_SCHEMA:
-                            if (newCase.schemaFile != null)
-                                outerErrors.add(XmlError.forObject("More than one schema file speicifed - ignoring all but last", filedescs[j]).toString());
+                            if (newCase.schemaFile != null) {
+                                outerErrors.add(XmlError.forObject("More than one schema file speicifed - ignoring all but last", filedesc).toString());
+                            }
                             newCase.schemaFile = theFile;
-                            newCase.svExpected = filedescs[j].getValidity();
+                            newCase.svExpected = filedesc.getValidity();
                             break;
-                            
+
                         case FileDesc.Role.INT_RESOURCE:
-                            if (newCase.resourceFile != null)
-                                outerErrors.add(XmlError.forObject("More than one resource file speicifed - ignoring all but last", filedescs[j]).toString());
+                            if (newCase.resourceFile != null) {
+                                outerErrors.add(XmlError.forObject("More than one resource file speicifed - ignoring all but last", filedesc).toString());
+                            }
                             newCase.resourceFile = theFile;
-                            newCase.rvExpected = filedescs[j].getValidity();
+                            newCase.rvExpected = filedesc.getValidity();
                             break;
-                        
+
                         default:
-                            throw new XmlException(XmlError.forObject("Unexpected file role", filedescs[j]));
+                            throw new XmlException(XmlError.forObject("Unexpected file role", filedesc));
                     }
 
-                    if (filedescs[j].getCode() != null)
-                        newCase.errorCode = filedescs[j].getCode().getID();
+                    if (filedesc.getCode() != null) {
+                        newCase.errorCode = filedesc.getCode().getID();
+                    }
                 }
                 result.add(newCase);
             }
-            return (TestCase[])result.toArray(new TestCase[result.size()]);
-        }
-        catch (Exception e)
-        {
-            if (errors.isEmpty())
+            return result.toArray(new TestCase[0]);
+        } catch (Exception e) {
+            if (errors.isEmpty()) {
                 outerErrors.add(e.getMessage());
-            else for (Iterator i = errors.iterator(); i.hasNext(); )
-                outerErrors.add(i.next().toString());
+            } else {
+                for (XmlError error : errors) {
+                    outerErrors.add(error.toString());
+                }
+            }
             return null;
         }
     }
 
-    public static boolean errorReported(String errorCode, Collection set)
-    {
-        if (errorCode == null || set == null || set.size() == 0)
+    public static boolean errorReported(String errorCode, Collection<XmlError> set) {
+        if (errorCode == null || set == null || set.size() == 0) {
             return false;
+        }
 
-        for (Iterator i = set.iterator(); i.hasNext(); )
-        {
-            if (errorCode.equals(((XmlError)i.next()).getErrorCode()))
+        for (XmlError xmlError : set) {
+            if (errorCode.equals(xmlError.getErrorCode())) {
                 return true;
+            }
         }
 
         return false;
diff --git a/src/main/java/org/apache/xmlbeans/impl/util/FilerImpl.java b/src/main/java/org/apache/xmlbeans/impl/util/FilerImpl.java
index 5e4d9b0..14e9b3b 100755
--- a/src/main/java/org/apache/xmlbeans/impl/util/FilerImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/util/FilerImpl.java
@@ -1,77 +1,66 @@
 /*   Copyright 2004 The Apache Software Foundation
-*
-*   Licensed under the Apache License, Version 2.0 (the "License");
-*   you may not use this file except in compliance with the License.
-*   You may obtain a copy of the License at
-*
-*       http://www.apache.org/licenses/LICENSE-2.0
-*
-*   Unless required by applicable law or agreed to in writing, software
-*   distributed under the License is distributed on an "AS IS" BASIS,
-*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-*   See the License for the specific language governing permissions and
-*  limitations under the License.
-*/
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
 
 package org.apache.xmlbeans.impl.util;
 
 import org.apache.xmlbeans.Filer;
+import org.apache.xmlbeans.impl.repackage.Repackager;
 
-import java.io.IOException;
-import java.io.File;
-import java.io.Writer;
-import java.io.FileReader;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
+import java.io.*;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
 import java.nio.charset.CodingErrorAction;
-import java.util.Set;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.ArrayList;
-
-import org.apache.xmlbeans.impl.repackage.Repackager;
+import java.util.Set;
 
 /**
  * This implementation of Filer writes to disk.
  */
-public class FilerImpl implements Filer
-{
-    private File classdir;
-    private File srcdir;
-    private Repackager repackager;
-    private boolean verbose;
-    private List sourceFiles;
-    private boolean incrSrcGen;
-    private Set seenTypes;
+public class FilerImpl implements Filer {
+    private final File classdir;
+    private final File srcdir;
+    private final Repackager repackager;
+    private final boolean verbose;
+    private final List<File> sourceFiles;
+    private final boolean incrSrcGen;
+    private Set<String> seenTypes;
     private static final Charset CHARSET;
 
-    static
-    {
+    static {
         Charset temp = null;
-        try
-        {
+        try {
             temp = Charset.forName(System.getProperty("file.encoding"));
+        } catch (Exception ignored) {
         }
-        catch (Exception e) {}
         CHARSET = temp;
     }
 
-    public FilerImpl(File classdir, File srcdir, Repackager repackager, boolean verbose, boolean incrSrcGen)
-    {
+    public FilerImpl(File classdir, File srcdir, Repackager repackager, boolean verbose, boolean incrSrcGen) {
         this.classdir = classdir;
         this.srcdir = srcdir;
         this.repackager = repackager;
         this.verbose = verbose;
-        this.sourceFiles = (sourceFiles != null ? sourceFiles : new ArrayList());
+        this.sourceFiles = new ArrayList<>();
         this.incrSrcGen = incrSrcGen;
-        if (this.incrSrcGen)
-            seenTypes = new HashSet();
+        if (this.incrSrcGen) {
+            seenTypes = new HashSet<>();
+        }
     }
 
     /**
@@ -79,18 +68,17 @@
      *
      * @param typename fully qualified type name
      * @return a stream to write the type to
-     * @throws java.io.IOException
      */
-    public OutputStream createBinaryFile(String typename) throws IOException
-    {
-        if (verbose)
+    public OutputStream createBinaryFile(String typename) throws IOException {
+        if (verbose) {
             System.err.println("created binary: " + typename);
+        }
         // KHK: for now the typename will already be a relative filename for the binary
         //String filename = typename.replace('.', File.separatorChar) + ".xsb";
         File source = new File(classdir, typename);
         source.getParentFile().mkdirs();
 
-        return new FileOutputStream( source );
+        return new FileOutputStream(source);
     }
 
     /**
@@ -98,57 +86,51 @@
      *
      * @param typename fully qualified type name
      * @return a stream to write the type to
-     * @throws java.io.IOException
      */
-    public Writer createSourceFile(String typename) throws IOException
-    {
-        if (incrSrcGen)
+    public Writer createSourceFile(String typename) throws IOException {
+        if (incrSrcGen) {
             seenTypes.add(typename);
+        }
 
-        if (typename.indexOf('$') > 0)
-        {
+        if (typename.indexOf('$') > 0) {
             typename =
-                typename.substring( 0, typename.lastIndexOf( '.' ) ) + "." +
-                typename.substring( typename.indexOf( '$' ) + 1 );
+                typename.substring(0, typename.lastIndexOf('.')) + "." +
+                typename.substring(typename.indexOf('$') + 1);
         }
 
         String filename = typename.replace('.', File.separatorChar) + ".java";
 
         File sourcefile = new File(srcdir, filename);
         sourcefile.getParentFile().mkdirs();
-        if (verbose)
+        if (verbose) {
             System.err.println("created source: " + sourcefile.getAbsolutePath());
+        }
 
         sourceFiles.add(sourcefile);
 
-        if (incrSrcGen && sourcefile.exists())
-        {
+        if (incrSrcGen && sourcefile.exists()) {
             // Generate the file in a buffer and then compare it to the
             // file already on disk
             return new IncrFileWriter(sourcefile, repackager);
-        }
-        else
-        {
+        } else {
             return repackager == null ?
-                (Writer) writerForFile( sourcefile ) :
-                (Writer) new RepackagingWriter( sourcefile, repackager );
+                writerForFile(sourcefile) :
+                new RepackagingWriter(sourcefile, repackager);
         }
     }
 
-    public List getSourceFiles()
-    {
-        return new ArrayList(sourceFiles);
+    public List<File> getSourceFiles() {
+        return new ArrayList<>(sourceFiles);
     }
 
-    public Repackager getRepackager()
-    {
+    public Repackager getRepackager() {
         return repackager;
     }
 
-    private static final Writer writerForFile(File f) throws IOException
-    {
-        if (CHARSET == null)
-            return new FileWriter(f);
+    private static Writer writerForFile(File f) throws IOException {
+        if (CHARSET == null) {
+            return Files.newBufferedWriter(f.toPath(), StandardCharsets.ISO_8859_1);
+        }
 
         FileOutputStream fileStream = new FileOutputStream(f);
         CharsetEncoder ce = CHARSET.newEncoder();
@@ -156,19 +138,16 @@
         return new OutputStreamWriter(fileStream, ce);
     }
 
-    static class IncrFileWriter extends StringWriter
-    {
-        private File _file;
-        private Repackager _repackager;
+    static class IncrFileWriter extends StringWriter {
+        private final File _file;
+        private final Repackager _repackager;
 
-        public IncrFileWriter(File file, Repackager repackager)
-        {
+        public IncrFileWriter(File file, Repackager repackager) {
             _file = file;
             _repackager = repackager;
         }
 
-        public void close() throws IOException
-        {
+        public void close() throws IOException {
             super.close();
 
             // This is where all the real work happens
@@ -176,56 +155,39 @@
                 _repackager.repackage(getBuffer()) :
                 getBuffer();
             String str = sb.toString();
-            List diffs = new ArrayList();
-            StringReader sReader = new StringReader(str);
-            FileReader fReader = new FileReader(_file);
+            List<String> diffs = new ArrayList<>();
 
-            try
-            {
+            try (StringReader sReader = new StringReader(str);
+                 FileReader fReader = new FileReader(_file)) {
                 Diff.readersAsText(sReader, "<generated>",
                     fReader, _file.getName(), diffs);
             }
-            finally
-            {
-                sReader.close();
-                fReader.close();
-            }
 
-            if (diffs.size() > 0)
-            {
+            if (diffs.size() > 0) {
                 // Diffs encountered, replace the file on disk with text from
                 // the buffer
-                Writer fw = writerForFile(_file);
-                try
-                {   fw.write(str); }
-                finally
-                {   fw.close(); }
+                try (Writer fw = writerForFile(_file)) {
+                    fw.write(str);
+                }
             }
-            else
-                ; // If no diffs, don't do anything
         }
     }
 
-    static class RepackagingWriter extends StringWriter
-    {
-        public RepackagingWriter ( File file, Repackager repackager )
-        {
+    static class RepackagingWriter extends StringWriter {
+        public RepackagingWriter(File file, Repackager repackager) {
             _file = file;
             _repackager = repackager;
         }
 
-        public void close ( ) throws IOException
-        {
+        public void close() throws IOException {
             super.close();
 
-            Writer fw = writerForFile( _file );
-            try
-            { fw.write( _repackager.repackage( getBuffer() ).toString() ); }
-            finally
-            { fw.close(); }
+            try (Writer fw = writerForFile(_file)) {
+                fw.write(_repackager.repackage(getBuffer()).toString());
+            }
         }
 
-        private File _file;
-        private Repackager _repackager;
+        private final File _file;
+        private final Repackager _repackager;
     }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
index 331fa60..b3f59ef 100644
--- a/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
+++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaBase64Holder.java
@@ -110,7 +110,7 @@
     //because computing hashcode is expensive we'll cache it
     protected boolean _hashcached = false;
     protected int hashcode = 0;
-    protected static MessageDigest md5;
+    protected static final MessageDigest md5;
 
     static {
         try {
diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
index 6e7c5e2..112c03d 100644
--- a/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
+++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaHexBinaryHolder.java
@@ -111,7 +111,7 @@
     //because computing hashcode is expensive we'll cache it
     protected boolean _hashcached = false;
     protected int hashcode = 0;
-    protected static MessageDigest md5;
+    protected static final MessageDigest md5;
 
     static {
         try {
