diff --git a/build.xml b/build.xml
index b05bcb13e87f3a12baf02fc9289044e88f1cbbe8..631de636b5321466d72a51916182ba9ea1894109 100644
--- a/build.xml
+++ b/build.xml
@@ -4,7 +4,7 @@
      customized build.xml for each autogenerated X3D example archive build.xml -->
 
 <!--
-  Copyright (c) 1995-2021 held by the author(s).  All rights reserved.
+  Copyright (c) 1995-2022 held by the author(s).  All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions
@@ -59,8 +59,6 @@ POSSIBILITY OF SUCH DAMAGE.
 
     <property environment="env"/>
 
-    <!-- compiled stylesheets are no longer supported as of saxon 9.4 -->
-
     <!-- java jvmarg parameters ignored on server unless forked -->
     <!-- Xj3D converter tends to lock up Netbeans unless forked -->
     <property name="fork"                      value="true"/>
@@ -106,23 +104,27 @@ POSSIBILITY OF SUCH DAMAGE.
     <!-- trouble report json-schema-validator-2.2.11.jar at https://github.com/java-json-tools/json-schema-validator/issues/287#issuecomment-544100447 -->
     <property name="json-schema-validator.jar"     value="lib/json-schema-validator-2.2.6-lib.jar"/>
 
-	<!-- https://mvnrepository.com/artifact/net.sf.saxon/Saxon-HE/9.8.0-5 -->
-	<!-- https://www.saxonica.com/documentation9.5/using-xsl/commandline.html -->
+    <!-- https://www.saxonica.com/html/documentation11/about/index.html      -->
+    <!-- https://www.saxonica.com/html/documentation11/using-xsl/commandline -->
     <property name="saxon.dir"        location="../../../tools/jar" description="relative path from archive examples/Subdirectory"/>
-    <property name="saxon.jar"           value="saxon-he-10.6.jar"/><!-- saxon9he.jar -->
-    <property name="saxononicaSA.dir" location="C:/java/saxonsa9-1-0-6j"/><!-- not actively used -->
+    <property name="saxon.jar"           value="saxon-he-11.2.jar"/><!-- previously saxon-he-10.6.jar saxon9he.jar -->
+
+    <!-- compiled stylesheets are no longer supported as of saxon 9.4 -->
+<!--<property name="saxononicaSA.dir" location="C:/java/saxonsa9-1-0-6j"/> not actively used -->
 
     <property name="c14n.dir"            value="../../../tools/canonical/dist/lib"/>
     <property name="c14n.jar"            value="X3dC14n.jar"/>
-    <property name="log4j.dir"           value="../../../tools/canonical/lib"/>
-    <property name="log4j.jar"           value="log4j-1.2.15.jar"/>
+    <!-- https://logging.apache.org/log4j/2.x/manual/api.html -->
+    <property name="log4j.dir"        location="../../../tools/canonical/lib"/>
+    <property name="log4j-api.jar"       value="log4j-api-2.17.1.jar"/>
+    <property name="log4j-core.jar"      value="log4j-core-2.17.1.jar"/>
 
     <property name="stylesheet.dir"   location="../../../stylesheets"/>
     <property name="local.dir"        location="."/>
 	
     <!-- ensure backwards compatibility to specified version of Java -->
-    <property name="java.source"                    value="1.8"/>
-    <property name="java.target"                    value="1.8"/>
+    <property name="java.source"                    value="17"/><!-- 1.8 is strictest, 15 or higher allows use of """text blocks""" for Script CDATA -->
+    <property name="java.target"                    value="17"/>
     
     <property name="javac.verbose"                  value="false"/>
     <property name="java.classes.dir"               value="classes"/>
@@ -1541,13 +1543,13 @@ ignoreSetupDownloadErrors=true
         <antcall target="get.slideshowTools"/>
     </target>
 
-    <target name="get.saxon" description="get saxon.jar if not checked out" depends="get.saxon.check" unless="saxon.found">
+    <target name="get.web3d.saxon" description="get saxon.jar if not checked out" depends="get.web3d.saxon.check" unless="saxon.found">
         <echo message="get saxon.jar if not checked out"/>
         <mkdir dir="${saxon.dir}"/>
         <get src="https://svn.code.sf.net/p/x3d/code/www.web3d.org/x3d/tools/jar/${saxon.jar}"
             dest="${saxon.dir}/${saxon.jar}" verbose="true" ignoreerrors="${ignoreSetupDownloadErrors}"/>
     </target>
-    <target name="get.saxon.check">
+    <target name="get.web3d.saxon.check">
         <condition property="saxon.found" else="false">
             <available file="${saxon.dir}/${saxon.jar}"/>
         </condition>
@@ -1598,7 +1600,7 @@ ignoreSetupDownloadErrors=true
         <diagnostics/>
     </target>
 
-    <target name="HelloWorld" description="Copy HelloWorld.x3d example from common example archives and convert to other encodings" depends="get.saxon">
+    <target name="HelloWorld" description="Copy HelloWorld.x3d example from common example archives and convert to other encodings" depends="get.web3d.saxon">
         <delete failonerror="false">
             <fileset dir="." includes="HelloWorld.*"/>
             <fileset dir="." includes="HelloWorldX_ITE.html"/>
@@ -1751,9 +1753,10 @@ ignoreSetupDownloadErrors=true
         <Saxon10  scene="HelloWorld"
             stylesheet="${stylesheet.dir}/X3dToJava"
              extension="java"
-				expand="on"
-        parameterPair1="className=HelloWorld"/>
-		<!-- expand:on since DTD defaults needed -->
+                expand="on"
+        parameterPair1="className=HelloWorld"
+        parameterPair2="strictJava8=false"/>
+	<!-- expand:on since DTD defaults needed -->
         <echo>HelloWorld.py creation with X3dToPython.xslt</echo>
         <!-- JavaScript Object Notation (JSON) -->
         <Saxon10  scene="HelloWorld"
@@ -1805,7 +1808,7 @@ ignoreSetupDownloadErrors=true
         </if>
     </target>
 
-    <target name="newScene" description="Copy newScene.x3d example from common example archives and convert to other encodings" depends="get.saxon">
+    <target name="newScene" description="Copy newScene.x3d example from common example archives and convert to other encodings" depends="get.web3d.saxon">
         <delete failonerror="false">
             <fileset dir="." includes="newScene*"/>
             <fileset dir="." includes="newSceneX_ITE.html"/>
@@ -1927,9 +1930,10 @@ ignoreSetupDownloadErrors=true
         <Saxon10  scene="newScene"
             stylesheet="${stylesheet.dir}/X3dToJava"
              extension="java"
-				expand="on"
-        parameterPair1="className=newScene"/>
-		<!-- expand:on since DTD defaults needed -->
+		expand="on"
+        parameterPair1="className=newScene"
+        parameterPair2="strictJava8=false"/>
+        <!-- expand:on since DTD defaults needed -->
         <echo>newScene.py creation with X3dToPython.xslt</echo>
         <!-- JavaScript Object Notation (JSON) -->
         <Saxon10  scene="newScene"
@@ -2157,7 +2161,7 @@ ignoreSetupDownloadErrors=true
     </target>
 
     <target name="validate.schematron" description="validate each .x3d scene using X3D Schematron rules (caution: time consuming unless xmlcatalog points to local copy)"
-        depends="get.saxon,clean.duplicates">
+        depends="get.web3d.saxon,clean.duplicates">
         <echo message="Validate using X3D Schematron: ${archive.name} archive"/>
         <echo message="   using ${X3dSchematronValidityChecks.dir}/${X3dSchematronValidityChecks}.xslt"/>
         <echo message="https://www.web3d.org/x3d/tools/schematron/X3dSchematron.html"/>
@@ -2325,7 +2329,7 @@ ignoreSetupDownloadErrors=true
         <echo message="${archive.name}.zip upload complete."/>
     </target>
 
-    <target name="processScenes" description="process all scenes with all conversion tasks" depends="get.saxon">
+    <target name="processScenes" description="process all scenes with all conversion tasks" depends="get.web3d.saxon">
         <echo>TODO: note that if Viewpoint descriptions changed, or the visible rendered scene changed,</echo>
         <echo>      then you must delete the pretty-print .html version in order to trigger target task</echo>
         <echo>      processScenes.captureImages that regenerates the viewpoint snapshot images.</echo>
@@ -2354,7 +2358,7 @@ ignoreSetupDownloadErrors=true
         <echo message="${archive.name} processScenes complete."/>
     </target>
 
-    <target name="processScenes.htmlPrettyPrintPages" description="convert each .x3d scene into pretty-print .html version, also generate SVG diagrams of 2D plots such as Extrusion crossSection" depends="get.saxon">
+    <target name="processScenes.htmlPrettyPrintPages" description="convert each .x3d scene into pretty-print .html version, also generate SVG diagrams of 2D plots such as Extrusion crossSection" depends="get.web3d.saxon">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -2422,7 +2426,7 @@ ignoreSetupDownloadErrors=true
         <echo>processScenes.htmlPrettyPrintPages complete.</echo>
     </target>
 
-    <target name="processScenes.X3dToX3domXhtml" description="convert each .x3d scene into *X3dom.xhtml version for X3DOM" depends="get.saxon,clean.RoundTrip">
+    <target name="processScenes.X3dToX3domXhtml" description="convert each .x3d scene into *X3dom.xhtml version for X3DOM" depends="get.web3d.saxon,clean.RoundTrip">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -2485,7 +2489,7 @@ ignoreSetupDownloadErrors=true
         <echo>processScenes.X3dToX3domXhtml complete.</echo>
     </target>
 
-    <target name="processScenes.X3dToX_ITE.html" description="convert each .x3d scene into *X_ITE.html version for X3DOM" depends="get.saxon,clean.RoundTrip">
+    <target name="processScenes.X3dToX_ITE.html" description="convert each .x3d scene into *X_ITE.html version for X3DOM" depends="get.web3d.saxon,clean.RoundTrip">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -2548,7 +2552,7 @@ ignoreSetupDownloadErrors=true
         <echo>processScenes.X3dToX_ITE.html complete.</echo>
     </target>
 
-    <target name="processScenes.X3DtoVRML97" description="convert each .x3d scene to .wrl VRML97 encoding" depends="get.saxon">
+    <target name="processScenes.X3DtoVRML97" description="convert each .x3d scene to .wrl VRML97 encoding" depends="get.web3d.saxon">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -2778,7 +2782,7 @@ ignoreSetupDownloadErrors=true
         <antcall target="processScenes.json"/>
     </target> -->
 
-    <target name="processScenes.json" description="convert each .x3d scene to Javascript Object Notation .json version" depends="get.saxon,clean.RoundTrip">
+    <target name="processScenes.json" description="convert each .x3d scene to Javascript Object Notation .json version" depends="get.web3d.saxon,clean.RoundTrip">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -2860,7 +2864,7 @@ ignoreSetupDownloadErrors=true
         <echo>processScenes.json complete.</echo>
     </target>
 
-    <target name="processScenes.X3dToX3dvClassicVrmlEncoding" description="convert each .x3d scene to .x3dv ClassicVrml encoding" depends="get.saxon,clean.RoundTrip">
+    <target name="processScenes.X3dToX3dvClassicVrmlEncoding" description="convert each .x3d scene to .x3dv ClassicVrml encoding" depends="get.web3d.saxon,clean.RoundTrip">
         <for param="file.path.name">
             <path>
                 <fileset refid="x3dScenes"/>
@@ -3496,7 +3500,8 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
     <path id="project-classpath">
         <pathelement location="."/>
         <pathelement location="lib/CreateContentCatalog.jar"/>
-        <pathelement location="${log4j.dir}/${log4j.jar}"/>
+        <pathelement location="${log4j.dir}/${log4j-api.jar}"/>
+        <pathelement location="${log4j.dir}/${log4j-core.jar}"/>
         <!-- ensure system JAVA_HOME points to JDK -->
         <pathelement location="${java.home}/lib/rt.jar"/>
         <!--
@@ -3525,6 +3530,7 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
         <!-- Will be overridden if called from catalog.server or jenkins -->
         <property name="catalog.local.dtd" value="-localDTD"/> <!-- -localDTD or -onlineDTD for scene validation -->
         <echo  message="catalog.builder: catalog.local.dtd=${catalog.local.dtd}, passed archive.name=../${archive.name}, CreateContentCatalog.dir=${CreateContentCatalog.dir}"/>
+        <echo  message="$log4j.dir=${log4j.dir} $log4j-api.jar=${log4j-api.jar} $log4j-core.jar=${log4j-core.jar}"/>
         <java classname="ContentCatalogBuilder" fork="no" failonerror="false">
             <classpath refid="project-classpath"/>
             <jvmarg value="-DentityExpansionLimit=4000000"/>
@@ -3544,7 +3550,7 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
         <xmlvalidate file="ContentCatalog${archive.name}.xml" failonerror="true"  warn="true" lenient="true"/>
     </target>
 
-    <target name="catalog.generateHtmlPages" description="generate HTML pages for entire catalog" depends="get.saxon">
+    <target name="catalog.generateHtmlPages" description="generate HTML pages for entire catalog" depends="get.web3d.saxon">
         <echo message="local.dir=${local.dir}"/>
         <echo message="check well-formedness ${CreateContentCatalog.dir}/CreateContentCatalogPages.xslt"/>
         <xmlvalidate file="${CreateContentCatalog.dir}/CreateContentCatalogPages.xslt" failonerror="true" warn="true" lenient="true"/>
@@ -4222,6 +4228,7 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
                         <!-- process individual files here. show full path to facilitate user loading, editing of reported files -->
                         <echo>${archive.path}/${relative.path1}/${relative.path2}/${name.short}.x3d converted to ${name.short}.java</echo>
                         <!-- Saxon10 is locally defined macro -->
+                        <!-- option parameterPair3="strictJava8=false" -->
                         <Saxon10  scene="${relative.path1}/${relative.path2}/${name.short}"
                             stylesheet="${stylesheet.dir}/X3dToJava"
                         parameterPair1="packageName=${archive.name}.${relative.path1}.${relative.path2}"
@@ -4233,15 +4240,15 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
                         <!-- expand:on since DTD defaults needed -->
 						<!-- <echo message="... compiling ${name.short}.java"/> -->
 						<javac  srcdir="${relative.path1}/${relative.path2}/"
-                              includes="${name.short}.java"
-							 classpath="${x3djsail.stylesheets.dir}/${jsai.full.archive.jar.name}"
-							   destdir="${java.classes.dir}"
-							     debug="on"
-                                source="${java.source}"
-                                target="${java.target}"
-							   verbose="${javac.verbose}"
-							   failonerror="false"
-							   includeantruntime="false">
+                                                      includes="${name.short}.java"
+                                                     classpath="${x3djsail.stylesheets.dir}/${jsai.full.archive.jar.name}"
+                                                       destdir="${java.classes.dir}"
+                                                         debug="on"
+                                                        source="${java.source}"
+                                                        target="${java.target}"
+                                                       verbose="${javac.verbose}"
+                                                   failonerror="false"
+                                             includeantruntime="false">
                             <!-- the following exclude statements are duplicated in processScenes.java and processScenes.javadoc since fileset is not allowed here -->
                             <exclude name="newX3dScript.java"/>
                             <exclude name="**/CircleLines.*"/>
@@ -4310,7 +4317,7 @@ app.replica.args=-mode scene -mipmaps -antialias 8 -anisotropicDegree 16 -verbos
                             <!-- https://stackoverflow.com/questions/20174355/how-class-loading-is-done-by-using-xbootclasspath-ppath -->
                             <!-- https://stackoverflow.com/questions/48148607/how-to-add-a-jar-to-the-boot-classpath-in-java-9 -->
                             <!-- -Xbootclasspath/p became -Xbootclasspath/a in jdk 9 -->
-                            <compilerarg value="-Xbootclasspath/p:${toString:lib.path.ref}"/>
+                            <!-- <compilerarg value="-Xbootclasspath/p:${toString:lib.path.ref}"/> not allowed with target 15 -->
 						</javac>
 						<echo message="now run and validate the java model"/>
 						<echo message="java -classpath ${java.classes.dir};${x3djsail.stylesheets.dir}/${jsai.full.archive.jar.name} ${archive.name}.${relative.path1}.${name.short}"/>