diff --git a/build.properties b/build.properties
index 81f61d12dfddf67f29f9fd7356b4c143cdb27245..951eab3513ed7af233eb3ac5827cf31d2b332328 100644
--- a/build.properties
+++ b/build.properties
@@ -57,7 +57,8 @@ dist.jar=${dist.dir}/${product.shortname}-${product.Version}.jar
 dist.src.jar=${dist.dir}/${product.shortname}-${product.Version}-src.jar
 docs.dir=docs
 dist.javadoc.dir=${docs.dir}/javadoc
-oracle.javadoc.link=https://docs.oracle.com/en/java/javase/20/docs/api/index.html
+dist.javadoc.jar=${dist.dir}/${product.shortname}-${product.Version}-javadoc.jar
+oracle.javadoc.link=https://docs.oracle.com/en/java/javase/23/docs/api/index.html
 jjdoc.vrml.dir=${src.java.dir}/org/web3d/parser/vrml97/doc-files
 jjdoc.x3d.dir=${src.java.dir}/org/web3d/parser/x3d/doc-files
 lib.dir=lib
diff --git a/build.xml b/build.xml
index 53b820ad205b25452ba07964618dcb37b48daadf..92edbd269101ec9b714269aec98f8596b94feca9 100644
--- a/build.xml
+++ b/build.xml
@@ -34,7 +34,7 @@ POSSIBILITY OF SUCH DAMAGE.
 <!-- Seems to render in Mozilla Firefox the best.  Broken in IE7 -->
 <?xml-stylesheet type="text/xsl" href="./ant2html.xsl"?>
 
-<project name="Xj3D NPS" default="run" basedir=".">
+<project name="Xj3D NPS" default="all" basedir=".">
     <description>Builds, tests, and runs the project NPS Xj3D 2.3</description>
 
     <property file="nbproject/private/private.properties"/>
@@ -349,7 +349,7 @@ POSSIBILITY OF SUCH DAMAGE.
     -->
 
     <target name="jar.all"
-            depends="dist,jar,jar.apps,jar.src"
+            depends="dist"
             description="Build all Xj3D application jar files">
         <echo message="TODO for Xj3D release, push updated jar files to savage.nps.edu"/>
     </target>
@@ -385,13 +385,12 @@ POSSIBILITY OF SUCH DAMAGE.
         </jar>
     </target>
 
-    <target name="jar.src"
-            depends="build,compile"
-            description="Build the Xj3D src distribution jar files">
-
+    <target name="jar.apps"
+            depends="build"
+            description="Build the Xj3D browser and cadfilter application jar files">
 
-        <!-- Jar up core and apps source files for debugging reference -->
-        <jar destfile="${dist.src.jar}">
+        <jar destfile="${browser.jar}"
+             basedir="${browser.classes.dir}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -412,13 +411,10 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/GPL.txt"/>
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
-
-            <fileset dir="${src.java.dir}">
-                <include name="**/*.java"/>
-            </fileset>
         </jar>
 
-        <jar destfile="${browser.src.jar}">
+        <jar destfile="${cadfilter.jar}"
+             basedir="${cadfilter.classes.dir}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -439,13 +435,40 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/GPL.txt"/>
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
+        </jar>
 
-            <fileset dir="${browser.src.java.dir}">
-                <include name="**/*.java"/>
-            </fileset>
+        <copy file="apps/replica/src/java/xj3d/replica/images/Xj3dRenderCaptureFailed.png" todir="${replica.classes.dir}/xj3d/replica/images" verbose="true" overwrite="true"/>
+        <jar destfile="${replica.jar}"
+             basedir="${replica.classes.dir}">
+            <manifest>
+                <attribute name="Specification-Version"
+                           value="${product.Version}"/>
+                <attribute name="Specification-Vendor"
+                           value="${spec.vendor}"/>
+                <attribute name="Implementation-Title"
+                           value="${product.Name}"/>
+                <attribute name="Built-By"
+                           value="${my.name} &lt;${my.email}&gt;"/>
+                <attribute name="Implementation-Version"
+                           value="${product.Version} built on ${TODAY_US}"/>
+                <attribute name="Implementation-Vendor"
+                           value="${impl.vendor}"/>
+                <attribute name="Implementation-Vendor-Id"
+                           value="${impl.vendor-id}"/>
+            </manifest>
+            <metainf file="${docs.dir}/BSD.txt"/>
+            <metainf file="${docs.dir}/GPL.txt"/>
+            <metainf file="${docs.dir}/LGPL.txt"/>
+            <metainf file="${docs.dir}/LICENSE"/>
         </jar>
+    </target>
 
-        <jar destfile="${cadfilter.src.jar}">
+    <target name="jar.src"
+            depends="init"
+            description="Build the Xj3D src distribution jar files">
+
+        <!-- Jar up core and apps source files for debugging reference -->
+        <jar destfile="${dist.src.jar}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -467,12 +490,12 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
 
-            <fileset dir="${cadfilter.src.java.dir}">
+            <fileset dir="${src.java.dir}">
                 <include name="**/*.java"/>
             </fileset>
         </jar>
 
-        <jar destfile="${replica.src.jar}">
+        <jar destfile="${browser.src.jar}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -494,19 +517,12 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
 
-            <fileset dir="${replica.src.java.dir}">
+            <fileset dir="${browser.src.java.dir}">
                 <include name="**/*.java"/>
             </fileset>
         </jar>
 
-    </target>
-
-    <target name="jar.apps"
-            depends="build,compile.apps"
-            description="Build the Xj3D browser and cadfilter application jar files">
-
-        <jar destfile="${browser.jar}"
-             basedir="${browser.classes.dir}">
+        <jar destfile="${cadfilter.src.jar}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -527,10 +543,13 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/GPL.txt"/>
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
+
+            <fileset dir="${cadfilter.src.java.dir}">
+                <include name="**/*.java"/>
+            </fileset>
         </jar>
 
-        <jar destfile="${cadfilter.jar}"
-             basedir="${cadfilter.classes.dir}">
+        <jar destfile="${replica.src.jar}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -551,11 +570,19 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/GPL.txt"/>
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
+
+            <fileset dir="${replica.src.java.dir}">
+                <include name="**/*.java"/>
+            </fileset>
         </jar>
+    </target>
 
-        <copy file="apps/replica/src/java/xj3d/replica/images/Xj3dRenderCaptureFailed.png" todir="${replica.classes.dir}/xj3d/replica/images" verbose="true" overwrite="true"/>
-        <jar destfile="${replica.jar}"
-             basedir="${replica.classes.dir}">
+    <target name="jar.javadoc"
+            depends="javadoc"
+            description="Build the Xj3D API jar file">
+
+        <!-- Jar up core and apps source files for debugging reference -->
+        <jar destfile="${dist.javadoc.jar}">
             <manifest>
                 <attribute name="Specification-Version"
                            value="${product.Version}"/>
@@ -576,6 +603,8 @@ POSSIBILITY OF SUCH DAMAGE.
             <metainf file="${docs.dir}/GPL.txt"/>
             <metainf file="${docs.dir}/LGPL.txt"/>
             <metainf file="${docs.dir}/LICENSE"/>
+
+            <fileset dir="${dist.javadoc.dir}"/>
         </jar>
     </target>
 
@@ -907,33 +936,28 @@ POSSIBILITY OF SUCH DAMAGE.
             <classpath refid="app.classpath"/>
 
             <!-- These excludes will avoid most errors, but will have to be
-                 reviewed from time to time to follow Makefile-opengl javadoc
-                 build order -->
+                 reviewed from time to time -->
 			<!-- bugfix: https://stackoverflow.com/questions/16456786/not-able-to-create-javadoc-using-ant -->
             <fileset dir="${src.java.dir}" defaultexcludes="yes" excludes="${xj3d.build.excludes}">
-				<include name="**/*.java" />
-                <exclude name="**/Makefile*"/>
+		<include name="**/*.java" />
                 <exclude name="**/task"/>
                 <exclude name="**/*.html"/>
             </fileset>
 
             <fileset dir="${browser.src.java.dir}" defaultexcludes="yes" excludes="${browser.build.excludes}">
-				<include name="**/*.java" />
-                <exclude name="**/Makefile*"/>
+		<include name="**/*.java" />
                 <exclude name="**/package.html"/>
                 <exclude name="**/*.properties"/>
                 <exclude name="**/xj3d/browser/renderer/**"/>
             </fileset>
 
             <fileset dir="${cadfilter.src.java.dir}" defaultexcludes="yes" excludes="${cadfilter.build.excludes}">
-				<include name="**/*.java" />
-                <exclude name="**/Makefile*"/>
+		<include name="**/*.java" />
                 <exclude name="**/package.html"/>
             </fileset>
 
             <fileset dir="${replica.src.java.dir}" defaultexcludes="yes">
-				<include name="**/*.java" />
-                <exclude name="**/Makefile*"/>
+		<include name="**/*.java" />
                 <exclude name="**/package.html"/>
             </fileset>
 
@@ -1039,7 +1063,7 @@ POSSIBILITY OF SUCH DAMAGE.
     </target>
 
     <target name="dist"
-            depends="build,jar,jar.apps,pack.3rd.party.jars"
+            depends="pack.3rd.party.jars,jar,jar.apps,jar.src,jar.javadoc"
             description="Build then create distribution jars">
 
         <echo message="build dist dependencies complete, starting dist tasks"/>
@@ -1073,14 +1097,12 @@ POSSIBILITY OF SUCH DAMAGE.
         </zip>
         <delete dir="${marshall.dir}"/>
 
-        <antcall target="jar.src"/>
-
         <echo message="Production note: X3D Examples image capture links to jars via property name=xj3d.dir"/>
         <echo message="Production note: X3D-Edit update requires copying Xj3D jars to module www.web3d.org\x3d/tools/X3dEdit4.0/X3dEditModuleSuite/X3dSourceFilePalette/release/modules/ext"/>
 
     </target>
 
-    <target name="all" depends="versions,clean,build,javadoc,dist"
+    <target name="all" depends="versions,clean,dist,javadoc"
             description="complete clean/build ready for distribution and deployment">
         <echo message="build.dist to create a distributable Xj3D complete with documentation"/>
         <!-- build.dist does not include javadoc in installers, but javadoc has ability to detect additional errors..test, -->
diff --git a/jars/README.html b/jars/README.html
index 1d59884cf60c75e9a45f13d24c7ca0e9702cfe34..f6be3e050aadc1ab0a7e38217a82454f3bfa9508 100644
--- a/jars/README.html
+++ b/jars/README.html
@@ -27,32 +27,38 @@
             <a href="jhall.jar">jhall.jar</a>
         </li>
         <li>
-            <a href="jogamp-fat.jar">jogamp-fat.jar"</a>
+            <a href="jogamp-fat.jar">jogamp-fat.jar</a>
         </li>
         <li>
-            <a href="xj3d-2.3-nps.jar">xj3d-2.3-nps.jar</a>
+            <a href="xj3d-2.3-3rdparty-nps.jar">xj3d-2.3-3rdparty-nps.jar</a>
         </li>
         <li>
-            <a href="xj3d-2.3-3rdparty-nps.jar">xj3d-2.3-3rdparty-nps.jar</a>
+            <a href="xj3d-2.3-nps-javadoc.jar">xj3d-2.3-nps-javadoc.jar</a>
         </li>
         <li>
-            <a href="xj3d.browser_2.3.0-nps.jar">xj3d.browser_2.3.0-nps.jar</a>
+            <a href="xj3d-2.3-nps-src.jar">xj3d-2.3-nps-src.jar</a>
+        </li>
+        <li>
+            <a href="xj3d-2.3-nps.jar">xj3d-2.3-nps.jar</a>
         </li>
         <li>
             <a href="xj3d.browser_2.3.0-nps-src.jar">xj3d.browser_2.3.0-nps-src.jar</a>
         </li>
         <li>
-            <a href="xj3d.cadfilter_2.3.0-nps.jar">xj3d.cadfilter_2.3.0-nps.jar</a>
+            <a href="xj3d.browser_2.3.0-nps.jar">xj3d.browser_2.3.0-nps.jar</a>
         </li>
         <li>
             <a href="xj3d.cadfilter_2.3.0-nps-src.jar">xj3d.cadfilter_2.3.0-nps-src.jar</a>
         </li>
         <li>
-            <a href="xj3d.replica_2.3.0-nps.jar">xj3d.replica_2.3.0-nps.jar</a>
+            <a href="xj3d.cadfilter_2.3.0-nps.jar">xj3d.cadfilter_2.3.0-nps.jar</a>
         </li>
         <li>
             <a href="xj3d.replica_2.3.0-nps-src.jar">xj3d.replica_2.3.0-nps-src.jar</a>
         </li>
+        <li>
+            <a href="xj3d.replica_2.3.0-nps.jar">xj3d.replica_2.3.0-nps.jar</a>
+        </li>
         <li>
             <a href="license.html">license.html</a>
             and
diff --git a/jars/xj3d-2.3-3rdparty-nps.jar b/jars/xj3d-2.3-3rdparty-nps.jar
index 73e0f3e1de9ca7a251ecf4f1c5522cd8eb2d941f..441347c8fbe2a262f2ee7610057b92a84049e670 100644
Binary files a/jars/xj3d-2.3-3rdparty-nps.jar and b/jars/xj3d-2.3-3rdparty-nps.jar differ
diff --git a/jars/xj3d-2.3-nps-javadoc.jar b/jars/xj3d-2.3-nps-javadoc.jar
new file mode 100644
index 0000000000000000000000000000000000000000..26de3ee94b5e7b6284ff8395c5b375e402198af2
Binary files /dev/null and b/jars/xj3d-2.3-nps-javadoc.jar differ
diff --git a/jars/xj3d-2.3-nps-src.jar b/jars/xj3d-2.3-nps-src.jar
index c91ffdf4aba038306c07fb7f4a0deb8a13bd85ce..d8bbcdde5ecd32396677ac61482beeb54b0a9fab 100644
Binary files a/jars/xj3d-2.3-nps-src.jar and b/jars/xj3d-2.3-nps-src.jar differ
diff --git a/jars/xj3d-2.3-nps.jar b/jars/xj3d-2.3-nps.jar
index 1c8bafa4d3346bdd4345a968601068a0605b5b64..df035993941707414225438e77a3e27b681afaf3 100644
Binary files a/jars/xj3d-2.3-nps.jar and b/jars/xj3d-2.3-nps.jar differ
diff --git a/jars/xj3d.browser_2.3.0-nps-src.jar b/jars/xj3d.browser_2.3.0-nps-src.jar
index c245c3051d170f2ec3eb514b5ad1eaed93e25356..76b5e8977fd507a53d9ca1b8c32355d74e1b366e 100644
Binary files a/jars/xj3d.browser_2.3.0-nps-src.jar and b/jars/xj3d.browser_2.3.0-nps-src.jar differ
diff --git a/jars/xj3d.browser_2.3.0-nps.jar b/jars/xj3d.browser_2.3.0-nps.jar
index 863fcebb48b6de08426af4d1a7cd6adc8fbe76cb..9b2313df028fab8df4d3160fa78e06183b0b1d05 100644
Binary files a/jars/xj3d.browser_2.3.0-nps.jar and b/jars/xj3d.browser_2.3.0-nps.jar differ
diff --git a/jars/xj3d.cadfilter_2.3.0-nps-src.jar b/jars/xj3d.cadfilter_2.3.0-nps-src.jar
index 1a071134cecbc92fa6556fa65e7b10e0cafb3bc9..7073e5c16ffdca3631f109b9579e5c20c464e11e 100644
Binary files a/jars/xj3d.cadfilter_2.3.0-nps-src.jar and b/jars/xj3d.cadfilter_2.3.0-nps-src.jar differ
diff --git a/jars/xj3d.cadfilter_2.3.0-nps.jar b/jars/xj3d.cadfilter_2.3.0-nps.jar
index 3186a94ff248e2ff741204a6b7af0a923fcbc39f..8068f23c8cd03ffa83f4178d109ab15ec8f66eac 100644
Binary files a/jars/xj3d.cadfilter_2.3.0-nps.jar and b/jars/xj3d.cadfilter_2.3.0-nps.jar differ
diff --git a/jars/xj3d.replica_2.3.0-nps-src.jar b/jars/xj3d.replica_2.3.0-nps-src.jar
index 9a7435308655a186b0d1961e203440c18414a69f..acaa9a4913f909f56510aec2815a86051573ef29 100644
Binary files a/jars/xj3d.replica_2.3.0-nps-src.jar and b/jars/xj3d.replica_2.3.0-nps-src.jar differ
diff --git a/jars/xj3d.replica_2.3.0-nps.jar b/jars/xj3d.replica_2.3.0-nps.jar
index 4735fe52d0ae27f5a86854a2840ad490b2f3a96d..1ccd0ed3a36c6b3040dec64b876de9542cd57bf0 100644
Binary files a/jars/xj3d.replica_2.3.0-nps.jar and b/jars/xj3d.replica_2.3.0-nps.jar differ
diff --git a/src/java/org/web3d/vrml/export/X3DRetainedSAXExporter.java b/src/java/org/web3d/vrml/export/X3DRetainedSAXExporter.java
index 430a0ae22391507419f1a388dce1c1b198e011c1..c6262b09095c8a7266abbb1f33cc2f5362430b06 100644
--- a/src/java/org/web3d/vrml/export/X3DRetainedSAXExporter.java
+++ b/src/java/org/web3d/vrml/export/X3DRetainedSAXExporter.java
@@ -39,8 +39,8 @@ import org.web3d.vrml.renderer.common.nodes.AbstractDynamicFieldNode;
 import org.web3d.vrml.sav.*;
 
 /**
- * A retained exporter that issues SAX events.  Extensions of this class
- * are expected to setup the content handler.  This class should contain
+ * A retained exporter that issues SAX events. Extensions of this class
+ * are expected to setup the content handler. This class should contain
  * as much of the XML specific knowledge as possible.
  *
  * This implementation will use FastInfoSet's AttributesHolder to
@@ -75,7 +75,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
     protected static final int DELTA_ZLIB_INT_ARRAY_ALGORITHM_ID = 33;
 
     /** An empty map to avoid null testing */
-    protected Map EMPTY_MAP = new HashMap();
+    protected Map EMPTY_MAP;
 
     /** The current indent level */
     protected int indent = 0;
@@ -188,6 +188,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         protoDeclSet = new HashSet<>();
         traverser = new SceneGraphTraverser();
         protoMap = new HashMap<>();
+        EMPTY_MAP = new HashMap();
 
         printDocType = false;
         printDocType = true;
@@ -397,8 +398,6 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
     protected void encodeFloatArray(float[] fval, int numElements, VRMLFieldDeclaration decl,
         String qName, AttributesHolder aholder, int ftype) {
 
-        int clen;
-
         if (fval != null && fval.length != 0) {
             String st = createX3DString(decl, fval, numElements);
 
@@ -422,8 +421,6 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
     protected void encodeDoubleArray(double[] fval, int numElements, VRMLFieldDeclaration decl,
         String qName, AttributesHolder aholder, int ftype) {
 
-        int clen;
-
         if (fval != null && fval.length != 0) {
             int span;
             int len2;
@@ -490,6 +487,9 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         Object proto;
         traverser.setObserver(this);
 
+        List<VRMLFieldDeclaration> fields;
+        Iterator<VRMLFieldDeclaration> itr2;
+        VRMLFieldDeclaration decl;
         while(itr.hasNext()) {
             proto = itr.next();
 
@@ -499,11 +499,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 usedNodes.clear();
             } else {
                 printPrototypeDecl((PrototypeDecl)proto);
-                List<VRMLFieldDeclaration> fields = ((VRMLNodeTemplate)proto).getAllFields();
-                Iterator<VRMLFieldDeclaration> itr2 = fields.iterator();
+                fields = ((VRMLNodeTemplate)proto).getAllFields();
+                itr2 = fields.iterator();
 
                 while(itr2.hasNext()) {
-                    VRMLFieldDeclaration decl = itr2.next();
+                    decl = itr2.next();
 
                     if(decl == null)
                         continue;
@@ -612,8 +612,9 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         // Add user-specified attributes
         if (x3dAtts != null) {
             Iterator<Map.Entry<String,String>> itr = x3dAtts.entrySet().iterator();
+            Map.Entry<String,String> entry;
             while(itr.hasNext()) {
-                Map.Entry<String,String> entry = itr.next();
+                entry = itr.next();
                 atts.addAttribute(new QualifiedName("", "", entry.getKey()),
                     entry.getValue());
             }
@@ -640,9 +641,9 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
             handler.startElement("","head","head", new AttributesHolder());
             printNewLine();
 
-
+            AttributesHolder atts;
             for(int i=0; i < len; i++) {
-                AttributesHolder atts = new AttributesHolder();
+                atts = new AttributesHolder();
                 atts.addAttribute(new QualifiedName("", "", "name"),
                     comps[i].getName());
                 atts.addAttribute(new QualifiedName("", "", "level"),
@@ -665,9 +666,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
      */
     @Override
     public void printMetaData(Map<String, String> meta) {
-        Map.Entry[] entries;
-
-        entries = new Map.Entry[meta.size()];
+        Map.Entry[] entries = new Map.Entry[meta.size()];
         meta.entrySet().toArray(entries);
 
         int len = entries.length;
@@ -675,10 +674,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         indentUp();
 
         try {
+            AttributesHolder atts;
             for(int i=0; i < len; i++) {
                 printIndent();
 
-                AttributesHolder atts = new AttributesHolder();
+                atts = new AttributesHolder();
 
                 atts.addAttribute(new QualifiedName("", "", "name"),
                     (String)entries[i].getKey());
@@ -770,10 +770,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         String as;
 
         try {
+            AttributesHolder atts;
             for (Map.Entry<String, String> entrie : entries) {
                 name = entrie.getValue();
                 as = entrie.getKey();
-                AttributesHolder atts = new AttributesHolder();
+                atts = new AttributesHolder();
                 atts.addAttribute(new QualifiedName("", "", "localDEF"),
                         name);
                 if (as != null && !name.equals(as)) {
@@ -806,12 +807,13 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         Object obj;
         String[] defas;
         ImportNodeProxy proxy;
+        AttributesHolder atts;
 
         try {
             for (Map.Entry entrie : entries) {
                 exported = (String) entrie.getKey();
                 obj = entrie.getValue();
-                AttributesHolder atts = new AttributesHolder();
+                atts = new AttributesHolder();
                 if (obj instanceof String[]) {
                     defas = (String[]) entrie.getValue();
                     atts.addAttribute(new QualifiedName("", "","inlineDEF"),
@@ -981,14 +983,15 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         VRMLFieldData value;
         boolean printField;
         boolean printFieldDecl = false;
-        boolean printValue = false;
+        boolean printValue;
         int accessType;
         boolean hasChildren = false;
         int fieldMetadata = parent.getFieldIndex("metadata");
 
         printField = isProtoInstance;
-
         String fieldName;
+        VRMLFieldDeclaration decl;
+        AttributesHolder atts;
 
         for(int i = 0; i < fields.length; i++) {
             if (parent instanceof AbstractDynamicFieldNode) {
@@ -1044,7 +1047,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 }
 
                 if (printField) {
-                    VRMLFieldDeclaration decl = parent.getFieldDeclaration(fields[i]);
+                    decl = parent.getFieldDeclaration(fields[i]);
                     printIndent();
 
                     try {
@@ -1066,8 +1069,8 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                         } else {
                             printIndent();
 
-                            AttributesHolder atts = new AttributesHolder();
-                                atts.addAttribute(new QualifiedName("", "", "name"),
+                            atts = new AttributesHolder();
+                            atts.addAttribute(new QualifiedName("", "", "name"),
                                     decl.getName());
 
                             handler.startElement("","fieldValue","fieldValue", atts);
@@ -1085,8 +1088,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     }
                 } else {
                     // Check for containerfield
-                    VRMLFieldDeclaration decl =
-                        parent.getFieldDeclaration(fields[i]);
+                    decl = parent.getFieldDeclaration(fields[i]);
 
                     fieldName = decl.getName();
                 }
@@ -1139,7 +1141,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     continue;
 
                 if (printField) {
-                    VRMLFieldDeclaration decl = parent.getFieldDeclaration(fields[i]);
+                    decl = parent.getFieldDeclaration(fields[i]);
                     printIndent();
 
                     try {
@@ -1160,7 +1162,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                                 continue;
                             }
                         } else {
-                            AttributesHolder atts = new AttributesHolder();
+                            atts = new AttributesHolder();
                             atts.addAttribute(new QualifiedName("", "",
                                 "name"), decl.getName());
 
@@ -1172,7 +1174,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     }
                 } else {
                     // Check for containerfield
-                    VRMLFieldDeclaration decl = parent.getFieldDeclaration(fields[i]);
+                    decl = parent.getFieldDeclaration(fields[i]);
                     fieldName = decl.getName();
                 }
 
@@ -1223,20 +1225,22 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         int field_url = node.getFieldIndex("url");
         int field_metadata = node.getFieldIndex("metadata");
 
+        VRMLFieldDeclaration decl;
+        VRMLFieldData data;
+        StringBuilder buf = new StringBuilder("Can't get field: ");
+        int idx;
         // Handle all attributes first
         while(itr.hasNext()) {
-            VRMLFieldDeclaration decl = itr.next();
+            decl = itr.next();
 
             if(decl == null)
                 continue;
 
-            VRMLFieldData data;
-            int idx = node.getFieldIndex(decl.getName());
+            idx = node.getFieldIndex(decl.getName());
 
             try {
                 data = node.getFieldValue(idx);
             } catch(InvalidFieldException e) {
-                StringBuilder buf = new StringBuilder("Can't get field: ");
                 buf.append(decl.getName());
                 buf.append(" for: ");
                 buf.append(node);
@@ -1246,6 +1250,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 buf.append(field_url);
 
                 errorReporter.errorReport(buf.toString(), null);
+                buf.setLength(0); // reset
                 continue;
             }
 
@@ -1279,18 +1284,16 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
         // Handle non-node <field> values
         while(itr.hasNext()) {
-            VRMLFieldDeclaration decl = itr.next();
+            decl = itr.next();
 
             if(decl == null)
                 continue;
 
-            VRMLFieldData data;
-            int idx = node.getFieldIndex(decl.getName());
+            idx = node.getFieldIndex(decl.getName());
 
             try {
                 data = node.getFieldValue(idx);
             } catch(InvalidFieldException e) {
-                StringBuilder buf = new StringBuilder("Can't get field: ");
                 buf.append(decl.getName());
                 buf.append(" for: ");
                 buf.append(node);
@@ -1300,6 +1303,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 buf.append(field_url);
 
                 errorReporter.errorReport(buf.toString(), null);
+                buf.setLength(0); // reset
                 continue;
             }
 
@@ -1463,9 +1467,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         String fieldName;
 
         // Find IS relationships to pre-print
+        VRMLFieldDeclaration decl;
+        VRMLFieldDeclaration defaultDecl;
+        String is;
         while(itr.hasNext()) {
-            VRMLFieldDeclaration decl = itr.next();
-            VRMLFieldDeclaration defaultDecl = null;
+            decl = itr.next();
 
             if(decl == null)
                 continue;
@@ -1474,7 +1480,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
             idx = node.getFieldIndex(fieldName);
 
-            String is = findIS(node, idx, isMap);
+            is = findIS(node, idx, isMap);
 
             if (is != null) {
                 isList.add(new String[] {decl.getName(), is});
@@ -1490,9 +1496,13 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 //            currentCompressor = new TestCompressor();
         }
 
+        VRMLFieldData data;
+        VRMLFieldData fdata;
+        String[] url;
+        int pos, midx, access;
+        String emd;
         while(itr.hasNext()) {
-            VRMLFieldDeclaration decl = itr.next();
-            VRMLFieldDeclaration defaultDecl = null;
+            decl = itr.next();
 
             if(decl == null)
                 continue;
@@ -1505,7 +1515,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 defaultDecl = defaultNode.getFieldDeclaration(didx);
             }
 
-            String is = findIS(node, idx, isMap);
+            is = findIS(node, idx, isMap);
 
             if (is != null) {
                 continue;
@@ -1521,14 +1531,12 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     continue;
             }
 
-            int access = decl.getAccessType();
+            access = decl.getAccessType();
             if (access == FieldConstants.EVENTIN || access == FieldConstants.EVENTOUT)
                 continue;
 
-            VRMLFieldData data;
             try {
                 data = node.getFieldValue(idx);
-
             } catch(InvalidFieldException e) {
                 // Don't print exceptions here.  There is a difference in spec setup
                 // between the default node and real one.  Not sure how best to deal with this.
@@ -1562,8 +1570,8 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     continue;
             }
 
-            if (removeWorldUrl && (urlFields.contains(idx))) {
-                String[] url = data.stringArrayValues;
+            if (removeWorldUrl && urlFields.contains(idx)) {
+                url = data.stringArrayValues;
 
                 if (url != null && worldUrl != null) {
                     for(int j=0; j < url.length; j++) {
@@ -1578,11 +1586,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
             if (upgradeInline) {
                 if (decl.getName().equals("url")) {
-                    String[] url = data.stringArrayValues;
+                    url = data.stringArrayValues;
 
                     if (url != null) {
                         for(int j=0; j < url.length; j++) {
-                            int pos = url[j].indexOf(".wrl");
+                            pos = url[j].indexOf(".wrl");
                             if (pos >= 0) {
                                 url[j] = url[j].substring(0, pos);
                                 url[j] = url[j] + encodingTo;
@@ -1601,13 +1609,11 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
             atts.addAttribute(new QualifiedName("", "",
                 "encoder"), "1");
 
-            int[] data = currentCompressor.compress(node);
-
             atts.addAttributeWithAlgorithmData(
                 new QualifiedName("", "", "", "data"),
                 null,
                 EncodingAlgorithmIndexes.INT,
-                data);
+                currentCompressor.compress(node));  // Print data
         }
 
         if (hasChildren && !isProtoInstance) {
@@ -1622,7 +1628,7 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         } else {
             if (!isProtoInstance) {
                 try {
-                    if (isList.size() > 0) {
+                    if (!isList.isEmpty()) {
                         handler.startElement("",elementName,elementName, atts);
 
                         printNewLine();
@@ -1657,8 +1663,8 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
                 indentUp();
 
-                int midx = node.getFieldIndex("metadata");
-                VRMLFieldData fdata = node.getFieldValue(midx);
+                midx = node.getFieldIndex("metadata");
+                fdata = node.getFieldValue(midx);
 
                 // Print original metadata
                 if (fdata.nodeValue != null) {
@@ -1682,9 +1688,6 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 handler.endElement("","MetadataInteger","MetadataInteger");
                 printNewLine();
 
-                // Print data
-                int[] data = currentCompressor.compress(node);
-
                 printIndent();
 
                 atts = new AttributesHolder();
@@ -1695,14 +1698,14 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                     new QualifiedName("", "", "", "value"),
                     null,
                     EncodingAlgorithmIndexes.INT,
-                    data);
+                    currentCompressor.compress(node)); // Print data
 
                 handler.startElement("","MetadataInteger","MetadataInteger", atts);
                 handler.endElement("","MetadataInteger","MetadataInteger");
                 printNewLine();
 
 
-                String emd = currentCompressor.getEncoderMetadata();
+                emd = currentCompressor.getEncoderMetadata();
 
                 if (emd != null) {
                     // TODO: Need to fix this
@@ -1776,15 +1779,22 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
             Iterator<VRMLFieldDeclaration> itr = fields.iterator();
 
             List<String[]> isList = new ArrayList<>();
+            VRMLFieldDeclaration decl;
+            VRMLFieldData data = null;
+            int idx, field_url, len, len2;
+            String is;
+            String[] urls;
+            StringBuilder buf;
+            boolean foundProtocol = false;
             while(itr.hasNext()) {
-                VRMLFieldDeclaration decl = itr.next();
+                decl = itr.next();
 
                 if(decl == null)
                     continue;
 
-                int idx = node.getFieldIndex(decl.getName());
+                idx = node.getFieldIndex(decl.getName());
 
-                String is = findIS(node, idx, isMap);
+                is = findIS(node, idx, isMap);
 
                 if (is == null) {
                     continue;
@@ -1799,16 +1809,15 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
             indentUp();
 
-            int field_url = node.getFieldIndex("url");
+            field_url = node.getFieldIndex("url");
 
-            VRMLFieldDeclaration decl = node.getFieldDeclaration(field_url);
+            decl = node.getFieldDeclaration(field_url);
 
-            VRMLFieldData data = null;
             try {
                 data = node.getFieldValue(field_url);
 
             } catch(InvalidFieldException e) {
-                StringBuilder buf = new StringBuilder("Can't get field: ");
+                buf = new StringBuilder("Can't get field: ");
                 buf.append(decl.getName());
                 buf.append(" for: ");
                 buf.append(node);
@@ -1818,15 +1827,13 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
                 buf.append(field_url);
 
                 errorReporter.errorReport(buf.toString(), null);
+                buf.setLength(0); // reset
             }
 
             if (upgrading) {
-                String[] urls = new String[data.stringArrayValues.length];
+                urls = new String[data.stringArrayValues.length];
 
-                boolean foundProtocol = false;
-
-                int len = urls.length;
-                int len2;
+                len = urls.length;
 
                 for(int i=0; i < len; i++) {
                     urls[i] = data.stringArrayValues[i];
@@ -1983,12 +1990,14 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
             int idx;
             boolean valReq;
 
+            VRMLFieldDeclaration decl;
+            VRMLFieldData val = null;
+            int access;
             while(itr.hasNext()) {
-                VRMLFieldDeclaration decl = itr.next();
+                decl = itr.next();
 
                 idx = proto.getFieldIndex(decl.getName());
-                VRMLFieldData val = null;
-                int access = decl.getAccessType();
+                access = decl.getAccessType();
 
                 if (access != FieldConstants.EVENTIN && access != FieldConstants.EVENTOUT) {
                     val = proto.getFieldValue(idx);
@@ -2093,22 +2102,24 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
         int len = url.length;
         StringBuilder urlAtt = new StringBuilder();
 
+        int pos, locpos;
+        String original, target;
         for(int i=0; i < len; i++) {
             urlAtt.append("\"");
 
             if (upgrading) {
-                int pos = url[i].indexOf(".wrl");
-                int locpos = url[i].indexOf("#");
+                pos = url[i].indexOf(".wrl");
+                locpos = url[i].indexOf("#");
 
                 if (pos >= 0) {
 
-                    String original = url[i];
+                    original = url[i];
                     url[i] = url[i].substring(0, pos);
 
                     url[i] = url[i] + encodingTo;
 
                     if (locpos > 0) {
-                        String target = original.substring(locpos);
+                        target = original.substring(locpos);
                         url[i] = url[i] + target;
                     }
                 }
@@ -2134,10 +2145,10 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
             Iterator<VRMLFieldDeclaration> itr = fields.iterator();
             int idx;
 
+            VRMLFieldDeclaration decl;
             while(itr.hasNext()) {
-                VRMLFieldDeclaration decl = itr.next();
+                decl = itr.next();
                 idx = proto.getFieldIndex(decl.getName());
-                VRMLFieldData val = null;
 
                 // Ignore metadata for EP
                 if (decl.getName().equals("metadata"))
@@ -2365,8 +2376,6 @@ public abstract class X3DRetainedSAXExporter extends BaseRetainedExporter
 
         // Print the field value
 
-        VRMLNode n;
-
         if (val != null) {
             switch(val.dataType) {
                 case VRMLFieldData.NODE_DATA:
diff --git a/src/java/org/web3d/vrml/nodes/VRMLWorldRootChildNodeType.java b/src/java/org/web3d/vrml/nodes/VRMLWorldRootChildNodeType.java
index 9a5e5ec24bebdbf1d6da5c193f3253ab45eac6c2..1e84f9e97d4178c8766ae717b33f918394184425 100644
--- a/src/java/org/web3d/vrml/nodes/VRMLWorldRootChildNodeType.java
+++ b/src/java/org/web3d/vrml/nodes/VRMLWorldRootChildNodeType.java
@@ -18,8 +18,8 @@ package org.web3d.vrml.nodes;
 // None
 
 /**
- * An abstract representation of the a node that can be used directly at the
- * root of the scene graph.
+ * An abstract representation of a node that can be used directly at the root of
+ * the scene graph.
  * <p>
  *
  * Only X3DChildNode and LayerSet nodes can appear at the root level of a
diff --git a/src/java/org/web3d/vrml/renderer/CRProtoCreator.java b/src/java/org/web3d/vrml/renderer/CRProtoCreator.java
index bc14a8731d657068661c17e92abf61055ef8b0d8..aac5a861c8c2de15bf0e768e2fdd36ccc8ca3c4d 100644
--- a/src/java/org/web3d/vrml/renderer/CRProtoCreator.java
+++ b/src/java/org/web3d/vrml/renderer/CRProtoCreator.java
@@ -351,13 +351,13 @@ public abstract class CRProtoCreator
      */
     private void processDEFs(Map<String, VRMLNode> defMappings) {
         Set<Entry<String, VRMLNode>> def_set = defMappings.entrySet();
-        Iterator<Entry<String, VRMLNode>> itr = def_set.iterator();
-
-        while(itr.hasNext()) {
-            Map.Entry<String, VRMLNode> e = itr.next();
-            String name = e.getKey();
-            VRMLNodeType src_node = (VRMLNodeType) e.getValue();
-            VRMLNodeType dest_node = (VRMLNodeType) nodeMap.get(src_node);
+        String name;
+        VRMLNodeType src_node;
+        VRMLNodeType dest_node;
+        for (Entry<String, VRMLNode> e : def_set) {
+            name = e.getKey();
+            src_node = (VRMLNodeType) e.getValue();
+            dest_node = (VRMLNodeType) nodeMap.get(src_node);
 
             scene.addDEFNode(name, dest_node);
         }
@@ -379,21 +379,27 @@ public abstract class CRProtoCreator
         Map<String, VRMLNode> def_map = scene.getDEFNodes();
         Map<String, Map<String, VRMLNode>> export_map = new HashMap<>();
 
+        Map.Entry<String, VRMLNode> e;
+        ImportNodeProxy value;
+        String key, inline;
+        ImportNodeProxy proxy;
+        Map<String, VRMLNode> exports;
+        VRMLInlineNodeType i_node;
         while(itr.hasNext()) {
-            Map.Entry<String, VRMLNode> e = itr.next();
+            e = itr.next();
             try {
-                ImportNodeProxy value = (ImportNodeProxy)e.getValue();
-                String key = e.getKey();
+                value = (ImportNodeProxy)e.getValue();
+                key = e.getKey();
 
-                ImportNodeProxy proxy = (ImportNodeProxy)value.clone();
+                proxy = (ImportNodeProxy)value.clone();
 
-                String inline = value.getInlineDEFName();
-                Map<String, VRMLNode> exports = export_map.get(inline);
+                inline = value.getInlineDEFName();
+                exports = export_map.get(inline);
                 if(exports == null) {
                     exports = new HashMap<>();
                     export_map.put(inline, exports);
 
-                    VRMLInlineNodeType i_node = (VRMLInlineNodeType)def_map.get(inline);
+                    i_node = (VRMLInlineNodeType)def_map.get(inline);
                     i_node.setImportNodes(exports);
                 }
 
diff --git a/src/java/org/web3d/vrml/renderer/DefaultNodeFactory.java b/src/java/org/web3d/vrml/renderer/DefaultNodeFactory.java
index c55149ae5f8ebd2a4c2dacc08725254375f34c0b..80f19068bbc8fed06c7878e29ad74924feffef47 100644
--- a/src/java/org/web3d/vrml/renderer/DefaultNodeFactory.java
+++ b/src/java/org/web3d/vrml/renderer/DefaultNodeFactory.java
@@ -107,7 +107,7 @@ public class DefaultNodeFactory
     private static final int INC_SIZE = 4;
 
     /** The class listing for the constructor for clone copying */
-    private static final Class<?>[] NODE_CLASS = { VRMLNodeType.class };
+    private static final Class<?> NODE_CLASS = VRMLNodeType.class;
 
     /** Message if the spec version number for VRML is not 2.0 */
     private static final String INVALID_VRML_SPEC_VERSION =
@@ -338,7 +338,7 @@ public class DefaultNodeFactory
      * Set specification version
      * @param major 2 (VRML97), 3, or 4
      * @param minor 0, 1, 2, 3
-     * @throws UnsupportedSpecVersionException 
+     * @throws UnsupportedSpecVersionException
      */
     @Override
     public void setSpecVersion(int major, int minor) throws UnsupportedSpecVersionException
diff --git a/src/java/org/web3d/vrml/renderer/ProtoCopier.java b/src/java/org/web3d/vrml/renderer/ProtoCopier.java
index 932b1944cfc154192141aee4ea828ed2550eacc8..0969ab5ecabad86005edd3da398b464a04dcf5cc 100644
--- a/src/java/org/web3d/vrml/renderer/ProtoCopier.java
+++ b/src/java/org/web3d/vrml/renderer/ProtoCopier.java
@@ -146,10 +146,10 @@ public class ProtoCopier implements SceneGraphTraversalSimpleObserver {
         if(scn == null)
             throw new NullPointerException("No scene supplied");
 
-        scene = scn;
-        protoInstance = src;
-        majorVersion = major;
-        minorVersion = minor;
+        this.scene = scn;
+        this.protoInstance = src;
+        this.majorVersion = major;
+        this.minorVersion = minor;
         this.nodeMap = nodeMap;
         this.staticNodes = staticNodes;
     }
@@ -210,17 +210,19 @@ public class ProtoCopier implements SceneGraphTraversalSimpleObserver {
             protoInstance.addBodyChild(out_kid);
         } else {
             VRMLNodeType out_parent = (VRMLNodeType)nodeMap.get(parent);
-            VRMLFieldDeclaration decl = parent.getFieldDeclaration(field);
+            if (out_parent != null) {
+                VRMLFieldDeclaration decl = parent.getFieldDeclaration(field);
 
-            int idx = out_parent.getFieldIndex(decl.getName());
+                int idx = out_parent.getFieldIndex(decl.getName());
 
-            try {
-                out_parent.setValue(idx, out_kid);
-            } catch(FieldException ife) {
-                errorReporter.warningReport(
-                    "ProtoCopier error setting copied node! Parent:" +
-                    parent.getClass() + " child: " + child.getClass() +
-                   " field " + field, ife);
+                try {
+                    out_parent.setValue(idx, out_kid);
+                } catch (FieldException ife) {
+                    errorReporter.warningReport(
+                            "ProtoCopier error setting copied node! Parent:"
+                            + parent.getClass() + " child: " + child.getClass()
+                            + " field " + field, ife);
+                }
             }
         }
     }
@@ -322,7 +324,11 @@ public class ProtoCopier implements SceneGraphTraversalSimpleObserver {
                 break;
 
             case TypeConstants.ScriptNodeType:
-System.out.println("ProtoCopier can't handle script fields containing protos. Must fix");
+                System.err.println("ProtoCopier can't handle script fields containing protos. Must fix");
+                break;
+
+            default:
+                break;
         }
     }
 }
diff --git a/src/java/org/web3d/vrml/renderer/common/nodes/shape/BaseShape.java b/src/java/org/web3d/vrml/renderer/common/nodes/shape/BaseShape.java
index 2745c34c339a6bd237b3fc61bf1bebf7903df943..4155c083bf9aa912718dc2d25c2c0c16bcc6bdad 100644
--- a/src/java/org/web3d/vrml/renderer/common/nodes/shape/BaseShape.java
+++ b/src/java/org/web3d/vrml/renderer/common/nodes/shape/BaseShape.java
@@ -49,13 +49,13 @@ public abstract class BaseShape extends AbstractNode
 
     /** Index for the bboxCenter field */
     private static final int FIELD_BBOX_CENTER = LAST_NODE_INDEX + 4;
-    
+
     /** Index for the bboxDisplay field */
     private static final int FIELD_BBOX_DISPLAY = LAST_NODE_INDEX + 5;
-    
+
     /** Index for the visible field */
     private static final int FIELD_VISIBLE = LAST_NODE_INDEX + 6;
-    
+
     /** Index for the castShadow field */
     private static final int FIELD_CASTSHADOW = LAST_NODE_INDEX + 7;
 
@@ -119,13 +119,13 @@ public abstract class BaseShape extends AbstractNode
 
     /** SFVec3f bboxSize NULL */
     protected float[] vfBboxSize;
-    
+
     /** SFBool bboxDisplay false */
     protected boolean vfBboxDisplay;
-    
+
     /** SFBool visible true */
     protected boolean vfVisible;
-    
+
     /** SFBool castShadow true */
     protected boolean vfCastShadow;
 
@@ -196,7 +196,7 @@ public abstract class BaseShape extends AbstractNode
         fieldMap.put("bboxDisplay", FIELD_BBOX_DISPLAY);
         fieldMap.put("visible", FIELD_VISIBLE);
         fieldMap.put("castShadow", FIELD_CASTSHADOW);
-        
+
         forceLighting = PropertyTools.fetchSystemProperty(FORCE_LIGHTING_PROP,
                 DEFAULT_FORCE_LIGHTING);
     }
@@ -224,7 +224,7 @@ public abstract class BaseShape extends AbstractNode
      * @param node The node to copy
      * @throws IllegalArgumentException Incorrect node type
      */
-    protected BaseShape(BaseShape node) {
+    protected BaseShape(VRMLNodeType node) {
         this(); // invoke default constructor
 
         checkNodeType(node);
@@ -240,12 +240,12 @@ public abstract class BaseShape extends AbstractNode
         vfBboxSize[0] = field[0];
         vfBboxSize[1] = field[1];
         vfBboxSize[2] = field[2];
-        
+
         boolean b = ((VRMLBoundedNodeType)node).getBboxDisplay();
         vfBboxDisplay = b;
          b = ((VRMLBoundedNodeType)node).getVisible();
         vfVisible = b;
-         b = node.getCastShadow();
+         b = ((BaseShape)node).getCastShadow();
         vfCastShadow = b;
     }
 
@@ -417,17 +417,17 @@ public abstract class BaseShape extends AbstractNode
     public float[] getBboxSize() {
         return vfBboxSize;
     }
-    
+
     @Override
     public boolean getBboxDisplay() {
         return vfBboxDisplay;
     }
-    
+
     @Override
     public boolean getVisible() {
         return vfVisible;
     }
-    
+
     public boolean getCastShadow() {
         return vfCastShadow;
     }
@@ -488,7 +488,7 @@ public abstract class BaseShape extends AbstractNode
     //----------------------------------------------------------
     // Methods defined by LocalColorsListener
     //----------------------------------------------------------
-    
+
     /**
      * The localColors state has change.
      *
@@ -628,21 +628,21 @@ public abstract class BaseShape extends AbstractNode
                 fieldData.dataType = VRMLFieldData.FLOAT_ARRAY_DATA;
                 fieldData.numElements = 1;
                 break;
-                
+
             case FIELD_BBOX_DISPLAY:
                 fieldData.clear();
                 fieldData.booleanValue = vfBboxDisplay;
                 fieldData.dataType = VRMLFieldData.BOOLEAN_DATA;
                 fieldData.numElements = 1;
                 break;
-                
+
             case FIELD_VISIBLE:
                 fieldData.clear();
                 fieldData.booleanValue = vfVisible;
                 fieldData.dataType = VRMLFieldData.BOOLEAN_DATA;
                 fieldData.numElements = 1;
                 break;
-                
+
             case FIELD_CASTSHADOW:
                 fieldData.clear();
                 fieldData.booleanValue = vfCastShadow;
@@ -703,7 +703,7 @@ public abstract class BaseShape extends AbstractNode
                 ifve.getMessage());
         }
     }
-    
+
     @Override
     public void setValue(int index, boolean value) {
         switch(index)
@@ -711,15 +711,15 @@ public abstract class BaseShape extends AbstractNode
             case FIELD_BBOX_DISPLAY:
                 setBboxDisplay(value);
                 break;
-                
+
             case FIELD_VISIBLE:
                 setVisible(value);
                 break;
-                
+
             case FIELD_CASTSHADOW:
                 setCastShadow(value);
                 break;
-            
+
             default:
                 super.setValue(index, value);
         }
@@ -828,30 +828,30 @@ public abstract class BaseShape extends AbstractNode
         vfBboxSize[1] = newBboxSize[1];
         vfBboxSize[2] = newBboxSize[2];
     }
-    
-    /** Set the bounding box display for this node. Only used by the field 
+
+    /** Set the bounding box display for this node. Only used by the field
      * parser
-     * 
+     *
      * @param val the display value to set
      */
     @Override
     public void setBboxDisplay(boolean val) {
         vfBboxDisplay = val;
     }
-    
-    /** Set visible field for this node. Only used by the field 
+
+    /** Set visible field for this node. Only used by the field
      * parser
-     * 
+     *
      * @param val the display value to set
      */
     @Override
     public void setVisible(boolean val) {
         vfVisible = val;
     }
-    
-    /** Set castShadow field for this node. Only used by the field 
+
+    /** Set castShadow field for this node. Only used by the field
      * parser
-     * 
+     *
      * @param val the display value to set
      */
     public void setCastShadow(boolean val) {
diff --git a/src/java/org/web3d/vrml/renderer/common/nodes/texture/BaseImageTexture.java b/src/java/org/web3d/vrml/renderer/common/nodes/texture/BaseImageTexture.java
index 9b0b1ff1105143e7a2b56deb928f566f4883db0a..31e23294c6c740926c87a946b87b3ddb21e42dfa 100644
--- a/src/java/org/web3d/vrml/renderer/common/nodes/texture/BaseImageTexture.java
+++ b/src/java/org/web3d/vrml/renderer/common/nodes/texture/BaseImageTexture.java
@@ -26,7 +26,9 @@ import org.web3d.vrml.nodes.VRMLSingleExternalNodeType;
 import org.web3d.vrml.nodes.VRMLFieldData;
 import org.web3d.vrml.nodes.VRMLUrlListener;
 import org.web3d.vrml.nodes.VRMLContentStateListener;
+
 import org.web3d.vrml.renderer.common.nodes.BaseTexture2DNode;
+
 import org.web3d.vrml.util.URLChecker;
 
 /**
@@ -129,17 +131,14 @@ public class BaseImageTexture extends BaseTexture2DNode
             new VRMLFieldDeclaration(FieldConstants.FIELD,
                                      "SFNode",
                                      "textureProperties");
-        
         fieldDecl[FIELD_AUTOREFRESH] =
             new VRMLFieldDeclaration(FieldConstants.FIELD,
                                      "SFTime",
                                      "autoRefresh");
-        
         fieldDecl[FIELD_AUTOREFRESHTIMELIMIT] =
             new VRMLFieldDeclaration(FieldConstants.FIELD,
                                      "SFTime",
                                      "autoRefreshTimeLimit");
-        
         fieldDecl[FIELD_LOAD] =
             new VRMLFieldDeclaration(FieldConstants.FIELD,
                                      "SFBool",
@@ -159,7 +158,7 @@ public class BaseImageTexture extends BaseTexture2DNode
         fieldMap.put("repeatS", FIELD_REPEATS);
         fieldMap.put("repeatT", FIELD_REPEATT);
         fieldMap.put("textureProperties", FIELD_TEXTURE_PROPERTIES);
-        
+
         fieldMap.put("autoRefresh",FIELD_AUTOREFRESH);
         fieldMap.put("autoRefreshTimeLimit",FIELD_AUTOREFRESHTIMELIMIT);
         fieldMap.put("load",FIELD_LOAD);
@@ -219,7 +218,7 @@ public class BaseImageTexture extends BaseTexture2DNode
             index = node.getFieldIndex("load");
             field = node.getFieldValue(index);
             vfLoad = field.booleanValue;
-        } 
+        }
         catch(VRMLException ve) {
             throw new IllegalArgumentException(ve.getMessage());
         }
@@ -292,7 +291,7 @@ public class BaseImageTexture extends BaseTexture2DNode
             fireFieldChanged(FIELD_LOAD);
         }
     }
-    
+
     /**
      * Get a string for caching this object.  Null means do not cache this
      * texture.
@@ -365,7 +364,7 @@ public class BaseImageTexture extends BaseTexture2DNode
     public void setWorldUrl(String url) {
         if((url == null) || (url.isEmpty()))
             return;
-        
+
         worldURL = url;
     }
 
@@ -417,7 +416,7 @@ public class BaseImageTexture extends BaseTexture2DNode
 
         return vfURL;
     }
-    
+
     //----------------------------------------------------------
     // Methods overriding BaseTexture2DNode abstract class.
     //----------------------------------------------------------
@@ -634,17 +633,28 @@ public class BaseImageTexture extends BaseTexture2DNode
     @Override
     public VRMLFieldData getFieldValue(int index) throws InvalidFieldException {
         VRMLFieldData fieldData = fieldLocalData.get();
-
+        fieldData.clear();
         switch(index) {
             case FIELD_URL:
-                fieldData.clear();
                 fieldData.stringArrayValues = vfURL;
                 fieldData.dataType = VRMLFieldData.STRING_ARRAY_DATA;
                 fieldData.numElements = vfURL.length;
                 break;
+            case FIELD_AUTOREFRESH:
+                fieldData.doubleValue = vfAutoRefresh;
+                fieldData.dataType = VRMLFieldData.DOUBLE_DATA;
+                break;
+            case FIELD_AUTOREFRESHTIMELIMIT:
+                fieldData.doubleValue = vfAutoRefreshTimeLimit;
+                fieldData.dataType = VRMLFieldData.DOUBLE_DATA;
+                break;
+            case FIELD_LOAD:
+                fieldData.booleanValue = vfLoad;
+                fieldData.dataType = VRMLFieldData.BOOLEAN_DATA;
+                break;
 
             default:
-                return(super.getFieldValue(index));
+                return super.getFieldValue(index);
         }
 
         return fieldData;
@@ -723,7 +733,7 @@ public class BaseImageTexture extends BaseTexture2DNode
     public void setValue(int index, double value)
         throws InvalidFieldException {
 
-        switch(index) 
+        switch(index)
         {
             case FIELD_AUTOREFRESH:
                 setAutoRefresh(value);
diff --git a/src/java/org/web3d/vrml/renderer/ogl/OGLExternPrototypeDecl.java b/src/java/org/web3d/vrml/renderer/ogl/OGLExternPrototypeDecl.java
index 19b723023285a0350d6858f403cb79c128be26a6..5c325aa8e9484c9044c200b165d6f355fdf4a490 100644
--- a/src/java/org/web3d/vrml/renderer/ogl/OGLExternPrototypeDecl.java
+++ b/src/java/org/web3d/vrml/renderer/ogl/OGLExternPrototypeDecl.java
@@ -97,8 +97,7 @@ public class OGLExternPrototypeDecl extends CRExternPrototypeDecl {
                 "No matching PROTO instances in " + scene.getLoadedURI() +
                 " to match this EXTERNPROTO " + getVRMLNodeName());
 
-        VRMLWorldRootNodeType root =
-            (VRMLWorldRootNodeType)scene.getRootNode();
+        VRMLWorldRootNodeType root = (VRMLWorldRootNodeType)scene.getRootNode();
 
         setProtoDetails(proto_def);
         OGLProtoCreator creator =
diff --git a/src/java/org/web3d/vrml/renderer/ogl/nodes/shape/OGLShape.java b/src/java/org/web3d/vrml/renderer/ogl/nodes/shape/OGLShape.java
index e04de74cc212159bd406bf2d66909c159f684ab8..68d6ce39258ff0d8057135affff82739830395ae 100644
--- a/src/java/org/web3d/vrml/renderer/ogl/nodes/shape/OGLShape.java
+++ b/src/java/org/web3d/vrml/renderer/ogl/nodes/shape/OGLShape.java
@@ -76,6 +76,7 @@ public class OGLShape extends BaseShape
      * Construct a new default shape node implementation.
      */
     public OGLShape() {
+        super();
         checkMaterialListener = false;
         shareCount = 0;
     }
@@ -88,7 +89,7 @@ public class OGLShape extends BaseShape
      * @param node The node to copy
      * @throws IllegalArgumentException Incorrect node type
      */
-    public OGLShape(BaseShape node) {
+    public OGLShape(VRMLNodeType node) {
         super(node);
         checkMaterialListener = false;
     }
diff --git a/src/java/org/xj3d/core/loading/ContentLoader.java b/src/java/org/xj3d/core/loading/ContentLoader.java
index 0f1c99341a7d0e03f8ddc9f9a434d4acdb271384..54a8136e88e9f46291ef868e7d00c41c4dce119b 100644
--- a/src/java/org/xj3d/core/loading/ContentLoader.java
+++ b/src/java/org/xj3d/core/loading/ContentLoader.java
@@ -39,19 +39,19 @@ class ContentLoader implements Runnable
     /** Message for an unexpected exception message */
     private static final String UNEXPECTED_EXCEPTION_MSG =
         "[ContentLoader] unexpected Xj3D exception during model loading";
-    
-    private static final String Xj3D_ISSUE_LIST = 
+
+    private static final String XJ3D_ISSUE_LIST =
             "New Xj3D issue needed to improve the open source, please see\n" +
             "  https://gitlab.nps.edu/Savage/xj3d/issues";
- 
+
     /** The threading running this loader */
     private Thread thread;
 
     /** The list of data we are fetching from */
-    private ContentLoadQueue pendingContentLoadQueue;
+    private final ContentLoadQueue pendingContentLoadQueue;
 
     /** The map of nodes we are currently loading to their loader */
-    private Map<String[], LoadRequest> inProgressLoadRequestMap;
+    private final Map<String[], LoadRequest> inProgressLoadRequestMap;
 
     /** Flag indicating that the current load should be terminated */
     private boolean terminateCurrent;
@@ -117,19 +117,19 @@ class ContentLoader implements Runnable
 
                 // Register now that we are processing this object
                 inProgressLoadRequestMap.put(currentLoadRequest.url, currentLoadRequest);
-                
+
                 currentLoadRequest.loadRequestHandler.processLoadRequest(errorReporter,
                                                                          currentLoadRequest.url,
                                                                      currentLoadRequest.loadDetailsList);
                 // Register now that we finished processing this object
                 inProgressLoadRequestMap.remove(currentLoadRequest.url);
-            } 
-            catch (Exception e) 
+            }
+            catch (Exception e)
             {
                 // Any other exception
 //                System.out.println ("ContentLoader exception:"); // debug
                 errorReporter.errorReport  (UNEXPECTED_EXCEPTION_MSG, e);
-                errorReporter.messageReport(Xj3D_ISSUE_LIST);
+                errorReporter.messageReport(XJ3D_ISSUE_LIST);
 //                e.printStackTrace(System.out); // debug
                 inProgressLoadRequestMap.remove(currentLoadRequest.url);
                 continue;
diff --git a/src/java/org/xj3d/core/loading/LoaderThreadPool.java b/src/java/org/xj3d/core/loading/LoaderThreadPool.java
index 73a80b610e7291d08287fa8e20c9df796e92e4c5..5ec826e74797e3dc2cae4f6faa9499ab4fc3c1ed 100644
--- a/src/java/org/xj3d/core/loading/LoaderThreadPool.java
+++ b/src/java/org/xj3d/core/loading/LoaderThreadPool.java
@@ -86,9 +86,9 @@ public class LoaderThreadPool {
         // fetch the system property defining the values
         Integer prop = AccessController.doPrivileged((PrivilegedAction<Integer>) () -> {
             int num_processors = Runtime.getRuntime().availableProcessors();
-            
+
             DEFAULT_THREAD_COUNT = (num_processors == 1) ? 1 : (num_processors - 1);
-            
+
             // privileged code goes here, for example:
             return Integer.getInteger(THREAD_COUNT_PROP, DEFAULT_THREAD_COUNT);
         });
@@ -99,7 +99,7 @@ public class LoaderThreadPool {
 
         if (size != DEFAULT_THREAD_COUNT)
             System.out.println(THREAD_COUNT_PROP + " set to: " + size);
-        
+
         loaders = new ContentLoader[size];
 
         for(int i = size; --i >= 0;)
@@ -226,13 +226,13 @@ public class LoaderThreadPool {
      * Ensure all threads are running.
      */
     public void restartThreads() {
-        
+
         // TODO: Deprecated in JDK16. How to compensate?
     	if (threadGroup.isDestroyed()) {
             threadGroup = null;
             threadPool = new LoaderThreadPool();
     	}
-        int size = loaders.length;
+//        int size = loaders.length;
         for(ContentLoader loader : loaders) {
             if(!loader.isAlive())
                 loader = new ContentLoader(threadGroup, pending, inProgress);