=== modified file 'build.xml'
--- old/build.xml	2026-02-24 16:36:32 +0000
+++ new/build.xml	2026-05-11 10:47:51 +0000
@@ -610,6 +610,83 @@
          <fileset dir="ddl" />
       </copy>
    </target>
+
+   <target name="deploy.appcds" depends="deploy.prepare, clean.appcds"
+           description="Generate the list of classes to include in the AppCDS archive." >
+      <!-- Server AppCDS -->
+      
+      <!-- Client AppCDS -->
+      <tempfile
+         property="appcds.tmpfile.client.base"
+         destDir="${java.io.tmpdir}"
+         prefix="appcds_"
+         suffix=".lst"
+         deleteonexit="true"
+      />
+      <tempfile
+         property="appcds.tmpfile.client.runtime.base"
+         destDir="${java.io.tmpdir}"
+         prefix="appcds_"
+         suffix=".lst"
+         deleteonexit="true"
+      />
+
+      <java
+         classname="com.goldencode.util.LstExporter"
+         fork="true"
+         failonerror="true"
+         dir="${deploy.home}/lib" >
+         <classpath>
+            <fileset dir="${deploy.home}/lib" includes="p2j.jar"/>
+         </classpath>
+         <arg value="p2j.jar"/>
+         <arg value="com.goldencode.p2j.main.ClientDriver"/>
+         <arg value="com.goldencode.p2j.ui.client"/>
+         <arg value="-com.goldencode.p2j.persist"/>
+         <arg value="-com.goldencode.p2j.main.StandardServer"/>
+         <arg value="!com.goldencode.p2j.util"/>
+         <arg value="-o"/>
+         <arg value="${appcds.tmpfile.client.base}"/>
+      </java>
+
+      <java
+         classname="com.goldencode.p2j.main.ClientDriver"
+         fork="true"
+         failonerror="false"
+         dir="${java.io.tmpdir}" >
+         <classpath>
+            <fileset dir="${deploy.home}/lib" includes="p2j.jar"/>
+         </classpath>
+         <sysproperty key="java.library.path" value="${deploy.home}/lib"/>
+         <jvmarg value="-XX:DumpLoadedClassList=${appcds.tmpfile.client.runtime.base}"/>
+      </java>
+
+      <mkdir dir="${deploy.home}/client/appcds" />
+
+      <!-- Concatenate the client base and runtime class lists -->
+      <concat destfile="${deploy.home}/client/appcds/appcds.lst" fixlastline="yes">
+         <fileset file="${appcds.tmpfile.client.base}"/>
+         <fileset file="${appcds.tmpfile.client.runtime.base}"/>
+      </concat>
+
+      <!-- Build JSA archive for local use -->
+      <java
+         classname="com.goldencode.p2j.main.ClientDriver"
+         fork="true"
+         failonerror="true"
+         dir="${deploy.home}/client" >
+         <classpath>
+            <fileset dir="${deploy.home}/lib" includes="p2j.jar"/>
+         </classpath>
+         <sysproperty key="java.library.path" value="${deploy.home}/lib"/>
+         <jvmarg value="-Xshare:dump"/>
+         <jvmarg value="-XX:SharedClassListFile=appcds/appcds.lst"/>
+         <jvmarg value="-XX:SharedArchiveFile=appcds/appcds.jsa"/>
+         <jvmarg value="-Xmx512m" />
+         <jvmarg value="-Djava.awt.headless=true"/>
+      </java>
+
+   </target>
    
    <!-- ==================== Jar Targets ==================================== -->
 
@@ -810,7 +887,7 @@
    
    <!-- deploy the application jars, but NOT database -->
    <target name="deploy"
-           depends="clean, convert, jar, deploy.prepare"
+           depends="clean, convert, jar, deploy.prepare, deploy.appcds"
            description="Convert, compile the converted Java sources, create jars, deploys the jars.  Does NOT create/import the database." >
    </target>
    
@@ -918,7 +995,9 @@
 
    <!-- ==================== Clean Targets ==================================== -->
 
-   <target name="clean" depends="clean.convert, clean.build, clean.dist" description="Remove all clean.build, clean.convert, clean.dist files." />
+   <target name="clean" depends="clean.convert, clean.build, clean.dist, clean.appcds"
+           description="Remove all clean.build, clean.convert, clean.dist files."
+   />
 
    <target name="clean.build" description="Remove all built files from the conversion process." >
       <delete includeemptydirs="true" failonerror="false">
@@ -1024,6 +1103,11 @@
    <target name="create.db" depends="create.db.h2, create.db.pg, create.db.mariadb, create.db.sqlserver"
            description="Create empty database instance for all enabled database types." />
    
+   <target name="clean.appcds"
+           description="Remove any generated AppCDS archives and related files." >
+      <delete dir="${deploy.home}/client/appcds" />
+   </target>
+   
    <target name="import.db" depends="import.db.h2, import.db.pg, import.db.mariadb, import.db.sqlserver"
            description="Create empty database instance and import data for all enabled database types." />
 

=== modified file 'deploy/server/directory.xml.template'
--- old/deploy/server/directory.xml.template	2026-02-19 15:08:50 +0000
+++ new/deploy/server/directory.xml.template	2026-05-11 10:21:38 +0000
@@ -1187,7 +1187,7 @@
             <node-attribute name="value" value="{spawner_path}"/>
           </node>
           <node class="string" name="jvmArgs">
-            <node-attribute name="value" value="-Xmx512m -Djava.awt.headless=true"/>
+            <node-attribute name="value" value="-Xshare:on -XX:SharedArchiveFile=appcds/appcds.jsa -Xmx512m -Djava.awt.headless=true"/>
           </node>
           <node class="string" name="workingDir">
             <node-attribute name="value" value="{client_start_dir}"/>

=== modified file 'docker/fwd_4.0_ubuntu_pg_server_Dockerfile'
--- old/docker/fwd_4.0_ubuntu_pg_server_Dockerfile	2026-04-08 22:41:50 +0000
+++ new/docker/fwd_4.0_ubuntu_pg_server_Dockerfile	2026-05-11 11:18:13 +0000
@@ -1,4 +1,4 @@
-# Step 1/25
+# Step 1/26
 ARG FROM_IMAGE=goldencode/fwd_4.0_ubuntu_22.04_pg14:latest
 FROM ${FROM_IMAGE}
 
@@ -14,12 +14,16 @@
 ARG INCREMENTAL_ZIP=${APPNAME}_incremental.zip
 ARG TZDATA_AREA=America
 ARG TZDATA_ZONE=New_York
+ARG APPCDS_CLASSPATH=/opt/fwd/build/lib/p2j.jar
+ARG APPCDS_JVM_OPTS="-Djava.library.path=/opt/${PROJECT}/lib -Xmx512m -Djava.awt.headless=true"
+ARG APPCDS_LST_FILE=/opt/${PROJECT}/client/appcds/appcds.lst
+ARG APPCDS_ARCHIVE=/opt/${PROJECT}/client/appcds/appcds.jsa
 ENV LANG=${LANGUAGE_VALUE}.${ENCODING_VALUE}
 ENV LANGUAGE=${LANGUAGE_VALUE}
 
 USER root
 
-# Step 2/25
+# Step 2/26
 # If the LANGUAGE_VALUE is different from the base image locale, update locale settings
 RUN if [ "$LANGUAGE_VALUE" != "$(locale | grep LANG= | cut -d= -f2)" ]; then \
        localedef --no-archive -f $ENCODING_VALUE -i $LANGUAGE_VALUE ${LANGUAGE_VALUE}.${ENCODING_VALUE} && \
@@ -36,89 +40,92 @@
        echo "${TZDATA_AREA}/${TZDATA_ZONE}" > /etc/timezone; \
     fi
 
-# Step 3/25
+# Step 3/26
 COPY *.zip /tmp/
 
-# Step 4/25
+# Step 4/26
 RUN unzip -oq /tmp/deploy.zip deploy/* -d /tmp/${PROJECT}/
 
-# Step 5/25
+# Step 5/26
 RUN mkdir -p /opt/${PROJECT}/ && \
     cp -r /tmp/${PROJECT}/deploy/client /opt/${PROJECT}/ && \
     cp -r /tmp/${PROJECT}/deploy/server /opt/${PROJECT}/ && \
     cp /tmp/${PROJECT}/deploy/*.sh /opt/${PROJECT}/
 
-# Step 6/25
+# Step 6/26
 RUN unzip -oj /tmp/deploy.zip build/lib/* -d /opt/${PROJECT}/lib/
 
-# Step 7/25
+# Step 7/26
 RUN cp ${FWD_LIB}/build/lib/fwdspi.jar /opt/${PROJECT}/lib
 
-# Step 8/25
+# Step 8/26
 RUN ${SPAWNER_DEPLOY}/postbuild.sh /opt/spawner ${SPAWNER_DEPLOY}/spawn /tmp/${PROJECT}/deploy/server/srv-certs.store /opt/fwd/build/lib/p2j.jar
 
-# Step 9/25
+# Step 9/26
 RUN chown -R fwd:fwd /opt/${PROJECT}
 
-# Step 10/25
+# Step 10/26
 COPY --chown=root:root scripts/monitor_files.sh /root
 
-# Step 11/25
+# Step 11/26
 RUN mkdir /docker-entrypoint.d/
 
-# Step 12/25
+# Step 12/26
 COPY --chown=fwd:fwd entrypoint/docker-entrypoint_server.sh /docker-entrypoint.d/
 
-# Step 13/25
+# Step 13/26
 COPY --chown=fwd:fwd entrypoint/docker-entrypoint_import.sh /docker-entrypoint.d/
 
-# Step 14/25
+# Step 14/26
 COPY --chown=fwd:fwd entrypoint/docker-entrypoint_prepare.sh /docker-entrypoint.d/
 
-# Step 15/25
+# Step 15/26
 COPY --chown=fwd:fwd entrypoint/launch_monitor.sh /docker-entrypoint.d/
 
-# Step 16/25
+# Step 16/26
 COPY --chown=root:root scripts/startssh /usr/local/bin/
 
-# Step 17/25
+# Step 17/26
 COPY --chown=root:root scripts/${PROJECT}_admin /etc/sudoers.d/
 
-# Step 18/25
+# Step 18/26
 RUN if [ -f "/tmp/${PROJECT_ZIP}" ]; then \
        cp /tmp/${PROJECT_ZIP} /home/fwd/repo/dist/ && \
        chown fwd:fwd /home/fwd/repo/dist/${PROJECT_ZIP} && \
        chmod 755 /home/fwd/repo/dist/${PROJECT_ZIP}; \
     fi
 
-# Step 19/25
+# Step 19/26
 RUN if [ -f "/tmp/${DUMPS_ZIP}" ]; then \
        cp /tmp/${DUMPS_ZIP} /home/fwd/repo/dist/ && \
        chown fwd:fwd /home/fwd/repo/dist/${DUMPS_ZIP} && \
        chmod 755 /home/fwd/repo/dist/${DUMPS_ZIP}; \
     fi
 
-# Step 20/25
+# Step 20/26
 RUN if [ -f "/tmp/${INCREMENTAL_ZIP}" ]; then \
        cp /tmp/${INCREMENTAL_ZIP} /home/fwd/repo/dist/ && \
        chown fwd:fwd /home/fwd/repo/dist/${INCREMENTAL_ZIP} && \
        chmod 755 /home/fwd/repo/dist/${INCREMENTAL_ZIP}; \
     fi
 
-# Step 21/25
+# Step 21/26
 ADD ./tools/GenerateDemoData*.class /tmp/
-# Step 22/25
+# Step 22/26
 ADD --chown=fwd:fwd ./data/ /opt/${PROJECT}/data/
-# Step 23/25
+# Step 23/26
 RUN (cd /opt/${PROJECT}; java -classpath ${FWD_LIB}/build/lib/p2j.jar:/tmp: GenerateDemoData)
 
-# Step 24/25
+# Step 24/26
+RUN (cd /opt/${PROJECT}/client; java -Xshare:dump -XX:SharedClassListFile=${APPCDS_LST_FILE} -XX:SharedArchiveFile=${APPCDS_ARCHIVE} ${APPCDS_JVM_OPTS} -classpath ${APPCDS_CLASSPATH} com.goldencode.p2j.main.ClientDriver)
+
+# Step 25/26
 RUN rm -fr /tmp/${PROJECT} && \
     rm /tmp/*.zip
 
 USER fwd
 
-# Step 25/25
+# Step 26/26
 WORKDIR /opt/${PROJECT}
 
 # End of this Dockerfile

