=== modified file 'build.xml'
--- old/build.xml	2026-02-24 16:36:32 +0000
+++ new/build.xml	2026-05-15 08:59:35 +0000
@@ -610,6 +610,24 @@
          <fileset dir="ddl" />
       </copy>
    </target>
+
+   <target name="deploy.appcds" depends="init-ant-contrib"
+           description="Generate the list of classes to include in the AppCDS archive." >
+      <!-- Server AppCDS -->
+      
+      <!-- Client AppCDS -->
+      <exec executable="bash" dir="${deploy.home}/server" failonerror="true" osfamily="unix">
+         <arg value="deploy_appcds.sh"/>
+         <arg value="${deploy.home}/lib/p2j.jar"/>
+      </exec>
+      <exec executable="pwsh" dir="${deploy.home}/server" failonerror="true" osfamily="windows">
+         <arg value="-ExecutionPolicy"/>
+         <arg value="Bypass"/>
+         <arg value="-File"/>
+         <arg value="deploy_appcds.ps1"/>
+         <arg value="${deploy.home}/lib/p2j.jar"/>
+      </exec>
+   </target>
    
    <!-- ==================== Jar Targets ==================================== -->
 
@@ -853,6 +871,7 @@
                                data/**/*.p2o
                                cfg/*.xml
                                deploy/lib/**
+                               deploy/lib.client/**
                                deploy/client/**
                                deploy/server/**
                                *.xml
@@ -875,6 +894,12 @@
         <!--  exclude the AspectJ tools -->
         <fileset dir="${fwd.lib.home}" excludes="aspectjtools.jar, fwdspi.jar"/>
       </copy>
+
+      <!-- Copy client jars -->
+      <copy todir="${deploy.home}/lib.client">
+         <fileset dir="${fwd.home}/p2j/dist/client" excludes="**/aspectjtools.jar"/>
+         <fileset dir="${fwd.lib.home}" includes="p2j.jar, libp2j.so, p2j.dll"/>
+      </copy>
    </target>
 
    <!-- deploy the application jars, NOT FWD -->
@@ -918,7 +943,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 +1051,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." />
 

=== added file 'deploy/server/deploy_appcds.ps1'
--- old/deploy/server/deploy_appcds.ps1	1970-01-01 00:00:00 +0000
+++ new/deploy/server/deploy_appcds.ps1	2026-05-15 08:06:55 +0000
@@ -0,0 +1,182 @@
+param (
+    [Parameter(Position=0)]
+    [string]$P2jJar = "..\lib\p2j.jar",
+    
+    [string]$DirXml = "",
+    [string]$AppCdsDir = "",
+    
+    [switch]$h,
+    [switch]$help
+)
+
+function Show-Usage {
+   Write-Host "Usage: deploy_appcds.ps1 [[-P2jJar] <path_to_p2j.jar>] [-DirXml <directory.xml>] [-AppCdsDir <appcds_dir>]"
+   Write-Host "Where:"
+   Write-Host "`t-P2jJar    = Path to p2j.jar (default=`"..\lib\p2j.jar`")"
+   Write-Host "`t-DirXml    = Path to directory.xml (default=`"..\server\directory.xml`")"
+   Write-Host "`t-AppCdsDir = Path to output appcds folder (default=`"..\appcds\client`")"
+   Write-Host "`t-Help      = Usage information"
+}
+
+if ($h -or $help -or $P2jJar -eq "-h" -or $P2jJar -eq "--help" -or $args -contains "-Help" -or $args -contains "-h" -or $args -contains "--help") {
+   Show-Usage
+   exit 1
+}
+
+$ErrorActionPreference = "Stop"
+
+$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
+$DeployHome = (Get-Item (Join-Path $ScriptDir "..")).FullName
+
+# Ensure P2jJar is an absolute path
+if (-not [System.IO.Path]::IsPathRooted($P2jJar)) {
+    $P2jJar = (Resolve-Path $P2jJar).Path
+}
+
+if ([string]::IsNullOrWhiteSpace($DirXml)) {
+    $DirXml = Join-Path $DeployHome "server\directory.xml"
+} elseif (-not [System.IO.Path]::IsPathRooted($DirXml)) {
+    $DirXml = (Resolve-Path $DirXml -ErrorAction SilentlyContinue).Path
+    if (-not $DirXml) {
+        $DirXml = Join-Path (Get-Location).Path $DirXml
+    }
+}
+
+if (-not (Test-Path $DirXml)) {
+    Write-Error "Error: $DirXml not found."
+    exit 1
+}
+
+$TmpProps = [System.IO.Path]::GetTempFileName()
+# Run JvmArgsExtractor
+$javaArgs = @("-cp", $P2jJar, "com.goldencode.util.JvmArgsExtractor", "-f", $DirXml, "-o", $TmpProps)
+& java $javaArgs
+
+if ($LASTEXITCODE -ne 0) {
+    Write-Error "Error: Failed to extract JVM args."
+    Remove-Item $TmpProps -Force
+    exit 1
+}
+
+# Read properties
+$props = @{}
+foreach ($line in (Get-Content $TmpProps)) {
+    if ([string]::IsNullOrWhiteSpace($line) -or $line.StartsWith("#")) {
+        continue
+    }
+    $idx = $line.IndexOf("=")
+    if ($idx -gt 0) {
+        $key = $line.Substring(0, $idx).Trim()
+        $value = $line.Substring($idx + 1).Trim()
+        $value = $value.Replace("\:", ":").Replace("\=", "=")
+        $props[$key] = $value
+    }
+}
+
+Remove-Item $TmpProps -Force
+
+if ([string]::IsNullOrWhiteSpace($AppCdsDir)) {
+    $AppCdsDir = Join-Path $DeployHome "appcds\client"
+} elseif (-not [System.IO.Path]::IsPathRooted($AppCdsDir)) {
+    $AppCdsDir = (Resolve-Path $AppCdsDir -ErrorAction SilentlyContinue).Path
+    if (-not $AppCdsDir) {
+        $AppCdsDir = Join-Path (Get-Location).Path $AppCdsDir
+    }
+}
+
+# Remove existing appcds directory to prevent Java from reusing a stale .jsa archive.
+# The JVM does not overwrite an existing SharedArchiveFile in-place; removing the
+# directory guarantees a clean dump on every run.
+if (Test-Path $AppCdsDir) {
+    Remove-Item -Recurse -Force -Path $AppCdsDir
+}
+New-Item -ItemType Directory -Force -Path $AppCdsDir | Out-Null
+
+$appcdsClientsStr = $props["appcds.clients"]
+if ([string]::IsNullOrWhiteSpace($appcdsClientsStr)) {
+    Write-Host "No clients found for AppCDS."
+    exit 0
+}
+
+$clients = $appcdsClientsStr.Split(',')
+
+foreach ($client in $clients) {
+    $clientType = $client.Trim()
+    if ([string]::IsNullOrWhiteSpace($clientType)) {
+        continue
+    }
+    
+    Write-Host "Processing client: $clientType"
+    
+    $clientCp = $props["appcds.classpath.$clientType"]
+    $clientArgsStr = $props["appcds.jvmargs.$clientType"]
+    
+    Write-Host "JVM classpath for $clientType: $clientCp"
+    Write-Host "JVM args for $clientType: $clientArgsStr"
+    
+    $baseLst = [System.IO.Path]::GetTempFileName()
+    $runtimeLst = [System.IO.Path]::GetTempFileName()
+    
+    # 1. LstExporter
+    Set-Location (Join-Path $DeployHome "lib")
+    
+    $lstArgs = @("-cp", $clientCp, "com.goldencode.util.LstExporter",
+        "com.goldencode.p2j.main.ClientDriver",
+        "com.goldencode.p2j.ui.client",
+        "-com.goldencode.p2j.persist",
+        "-com.goldencode.p2j.main.StandardServer",
+        "!com.goldencode.p2j.util",
+        "-o", $baseLst)
+        
+    & java $lstArgs
+    
+    if ($LASTEXITCODE -ne 0) {
+        Write-Error "Error: LstExporter failed for $clientType"
+        Remove-Item $baseLst -Force
+        Remove-Item $runtimeLst -Force
+        exit 1
+    }
+    
+    # 2. ClientDriver to dump runtime class list
+    Set-Location ([System.IO.Path]::GetTempPath())
+    
+    $dumpArgs = @("-cp", $clientCp,
+        "-Djava.library.path=$DeployHome\lib",
+        "-XX:DumpLoadedClassList=$runtimeLst",
+        "com.goldencode.p2j.main.ClientDriver")
+        
+    & java $dumpArgs
+    # Ignore failure as it's allowed in ant
+    
+    # 3. Concatenate
+    $finalLst = Join-Path $AppCdsDir "$clientType.lst"
+    Get-Content $baseLst, $runtimeLst | Set-Content $finalLst
+    
+    # 4. Build JSA archive
+    Set-Location (Join-Path $DeployHome "client")
+    
+    # Split clientArgsStr into an array of arguments
+    $clientArgs = -split $clientArgsStr
+    
+    $jsaArgs = @("-cp", $clientCp,
+        "-Djava.library.path=$DeployHome\lib",
+        "-Xshare:dump",
+        "-XX:SharedClassListFile=$AppCdsDir\$clientType.lst",
+        "-XX:SharedArchiveFile=$AppCdsDir\$clientType.jsa")
+    $jsaArgs += $clientArgs
+    $jsaArgs += "com.goldencode.p2j.main.ClientDriver"
+    
+    & java $jsaArgs
+    
+    if ($LASTEXITCODE -ne 0) {
+        Write-Error "Error: JSA archive generation failed for $clientType"
+        Remove-Item $baseLst -Force
+        Remove-Item $runtimeLst -Force
+        exit 1
+    }
+    
+    Remove-Item $baseLst -Force
+    Remove-Item $runtimeLst -Force
+}
+
+Write-Host "AppCDS deployment completed successfully."

=== added file 'deploy/server/deploy_appcds.sh'
--- old/deploy/server/deploy_appcds.sh	1970-01-01 00:00:00 +0000
+++ new/deploy/server/deploy_appcds.sh	2026-05-15 11:06:38 +0000
@@ -0,0 +1,181 @@
+#!/bin/bash
+
+# Default values
+P2J_JAR="../lib/p2j.jar"
+DIR_XML=""
+APPCDS_DIR=""
+
+show_usage()
+{
+   i=0;        usage[$i]="Usage: $(basename $0) [-f <directory.xml>] [-d <appcds_dir>] [path_to_p2j.jar]"
+   i=$((i+1)); usage[$i]="Where:"
+   i=$((i+1)); usage[$i]="path_to_p2j.jar \t= Path to p2j.jar (default=\"../lib/p2j.jar\")"
+   i=$((i+1)); usage[$i]="-f | --file \t= Path to directory.xml (default=\"../server/directory.xml\")"
+   i=$((i+1)); usage[$i]="-d | --dir \t= Path to output appcds folder (default=\"../appcds/client\")"
+   i=$((i+1)); usage[$i]="-h | --help \t= Usage information"
+
+   for i in "${usage[@]}"; do
+      echo -e "$i"
+   done
+}
+
+while [[ $# -gt 0 ]]; do
+    case "$1" in
+        -h|--help|-\?)
+            show_usage
+            exit 1
+            ;;
+        -f|--file)
+            DIR_XML="$2"
+            shift 2
+            ;;
+        -d|--dir)
+            APPCDS_DIR="$2"
+            shift 2
+            ;;
+        *)
+            if [[ "$1" == -* ]]; then
+                echo "Unknown option: $1"
+                show_usage
+                exit 1
+            fi
+            # Positional argument
+            P2J_JAR="$1"
+            shift
+            ;;
+    esac
+done
+
+# Resolve DEPLOY_HOME relative to this script
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+DEPLOY_HOME="$(cd "$SCRIPT_DIR/.." && pwd)"
+
+# Ensure P2J_JAR is an absolute path if it exists
+if [[ "$P2J_JAR" != /* ]]; then
+    P2J_JAR="$PWD/$P2J_JAR"
+fi
+
+DIR_XML="${DIR_XML:-$DEPLOY_HOME/server/directory.xml}"
+if [[ "$DIR_XML" != /* ]]; then
+    DIR_XML="$PWD/$DIR_XML"
+fi
+
+APPCDS_DIR="${APPCDS_DIR:-$DEPLOY_HOME/appcds/client}"
+if [[ "$APPCDS_DIR" != /* ]]; then
+    APPCDS_DIR="$PWD/$APPCDS_DIR"
+fi
+
+if [ ! -f "$DIR_XML" ]; then
+    echo "Error: $DIR_XML not found."
+    exit 1
+fi
+
+TMP_PROPS=$(mktemp)
+java -cp "$P2J_JAR" com.goldencode.util.JvmArgsExtractor -f "$DIR_XML" -o "$TMP_PROPS"
+
+if [ $? -ne 0 ]; then
+    echo "Error: Failed to extract JVM args."
+    rm -f "$TMP_PROPS"
+    exit 1
+fi
+
+# Read properties into dynamically named variables
+while IFS='=' read -r key value; do
+    if [[ $key == \#* ]] || [ -z "$key" ]; then
+        continue
+    fi
+    key=$(echo "$key" | xargs)
+    value="${value//\\:/:}"
+    value="${value//\\=/=}"
+    
+    var_name="${key//./_}"
+    var_name="${var_name//-/_}"
+    declare "$var_name=$value"
+done < "$TMP_PROPS"
+
+rm -f "$TMP_PROPS"
+
+# Remove existing appcds directory to prevent Java from reusing a stale .jsa archive.
+# The JVM does not overwrite an existing SharedArchiveFile in-place; removing the
+# directory guarantees a clean dump on every run.
+if [ -d "$APPCDS_DIR" ]; then
+    rm -rf "$APPCDS_DIR"
+fi
+mkdir -p "$APPCDS_DIR"
+
+if [ -z "$appcds_clients" ]; then
+    echo "No clients found for AppCDS."
+    exit 0
+fi
+
+IFS=',' read -ra clients <<< "$appcds_clients"
+for client_type in "${clients[@]}"; do
+    client_type=$(echo "$client_type" | xargs)
+    if [ -z "$client_type" ]; then
+        continue
+    fi
+    
+    echo "Processing client: $client_type"
+    
+    cp_var="appcds_classpath_$client_type"
+    args_var="appcds_jvmargs_$client_type"
+    
+    client_cp="${!cp_var}"
+    client_args="${!args_var}"
+    
+    echo "JVM classpath for $client_type: $client_cp"
+    echo "JVM args for $client_type: $client_args"
+    
+    base_lst=$(mktemp)
+    runtime_lst=$(mktemp)
+    
+    # 1. LstExporter
+    cd "$DEPLOY_HOME/lib" || exit 1
+    java -cp "$client_cp" com.goldencode.util.LstExporter \
+        "com.goldencode.p2j.main.ClientDriver" \
+        "com.goldencode.p2j.ui.client" \
+        "-com.goldencode.p2j.persist" \
+        "-com.goldencode.p2j.main.StandardServer" \
+        "!com.goldencode.p2j.util" \
+        "-o" "$base_lst"
+        
+    if [ $? -ne 0 ]; then
+        echo "Error: LstExporter failed for $client_type"
+        rm -f "$base_lst" "$runtime_lst"
+        exit 1
+    fi
+    
+    # 2. ClientDriver to dump runtime class list
+    cd /tmp || exit 1
+    java -cp "$client_cp" \
+        -Djava.library.path="$DEPLOY_HOME/lib" \
+        -XX:DumpLoadedClassList="$runtime_lst" \
+        com.goldencode.p2j.main.ClientDriver
+        
+    # 3. Concatenate
+    final_lst="$APPCDS_DIR/${client_type}.lst"
+    cat "$base_lst" "$runtime_lst" > "$final_lst"
+    
+    # 4. Build JSA archive
+    cd "$DEPLOY_HOME/client" || exit 1
+    
+    # We must split client_args on spaces properly without quotes
+    # so that -Xmx512m -Dfoo=bar are treated as separate args
+    java -cp "$client_cp" \
+        -Djava.library.path="$DEPLOY_HOME/lib" \
+        -Xshare:dump \
+        -XX:SharedClassListFile="$APPCDS_DIR/${client_type}.lst" \
+        -XX:SharedArchiveFile="$APPCDS_DIR/${client_type}.jsa" \
+        $client_args \
+        com.goldencode.p2j.main.ClientDriver
+        
+    if [ $? -ne 0 ]; then
+        echo "Error: JSA archive generation failed for $client_type"
+        rm -f "$base_lst" "$runtime_lst"
+        exit 1
+    fi
+    
+    rm -f "$base_lst" "$runtime_lst"
+done
+
+echo "AppCDS deployment completed successfully."

=== 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-15 11:06:51 +0000
@@ -1187,11 +1187,14 @@
             <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/client/default.jsa -Xmx128m -Djava.awt.headless=true"/>
           </node>
           <node class="string" name="workingDir">
             <node-attribute name="value" value="{client_start_dir}"/>
           </node>
+          <node class="string" name="libPath">
+            <node-attribute name="value" value="{client_lib_path}"/>
+          </node>
           <node class="string" name="cfgOverrides">
             <node-attribute name="value" value="client:cmd-line-option:debugalert=true"/>
           </node>

=== modified file 'deploy/server/prepare_dir.sh'
--- old/deploy/server/prepare_dir.sh	2026-04-06 21:37:53 +0000
+++ new/deploy/server/prepare_dir.sh	2026-05-15 06:50:48 +0000
@@ -295,6 +295,7 @@
 admin_port=$(getval "admin_port" "7443" $infile)
 log_rotation_limit=$(getval "log_rotation_limit" "50000000" $infile)
 log_rotation_count=$(getval "log_rotation_count" "4" $infile)
+client_lib_path=$(getval "client_lib_path" "../lib" $infile)
 
 # Handle DB load. No entry implies H2 hotel DB.
 if ! load_array_from_json "dbnames" "$infile" db_array false \
@@ -346,6 +347,7 @@
 sed \
     -e "s#{spawner_path}#$spawner_path#g" \
     -e "s#{client_start_dir}#$client_start_dir#g" \
+    -e "s#{client_lib_path}#$client_lib_path#g" \
     -e "s/{dateFormat}/$dateFormat/g" \
     -e "s/{numberGroupSep}/$numberGroupSep/g" \
     -e "s/{numberDecimalSep}/$numberDecimalSep/g" \

=== modified file 'docker/docker-compose.yml'
--- old/docker/docker-compose.yml	2026-04-09 22:04:15 +0000
+++ new/docker/docker-compose.yml	2026-05-15 11:21:15 +0000
@@ -43,6 +43,7 @@
     volumes:
       - ${LOG_DIR:-../deploy/logs}:/opt/hotel/logs
       - ${CFG_DIR:-../deploy/etc}:/opt/hotel/etc
+      - ${APPCDS_DIR:-../deploy/appcds}:/opt/hotel/appcds
     environment:
       START_SERVER_GETOPTS: '-c /opt/hotel/etc/server.xml'
 

=== modified file 'docker/docker-compose_client.yml'
--- old/docker/docker-compose_client.yml	2026-04-09 22:04:15 +0000
+++ new/docker/docker-compose_client.yml	2026-05-15 11:21:53 +0000
@@ -44,6 +44,7 @@
     volumes:
       - ${LOG_DIR:-../deploy/logs}:/opt/hotel/logs
       - ${CFG_DIR:-../deploy/etc}:/opt/hotel/etc
+      - ${APPCDS_DIR:-../deploy/appcds}:/opt/hotel/appcds
     environment:
       START_SERVER_GETOPTS: '-c /opt/hotel/etc/server.xml'
 
@@ -59,6 +60,7 @@
       - 2202:22
     volumes:
       - ${LOG_DIR:-../deploy/logs}:/opt/hotel/logs
+      - ${APPCDS_DIR:-../deploy/appcds}:/opt/hotel/appcds
 
 volumes:
   hotel_db_postgres:

=== modified file 'docker/docker-compose_create_pg_cluster.yml'
--- old/docker/docker-compose_create_pg_cluster.yml	2026-01-21 23:26:06 +0000
+++ new/docker/docker-compose_create_pg_cluster.yml	2026-05-15 05:24:16 +0000
@@ -1,19 +1,19 @@
 services:
 
   hotel_db:
-    image: hotel_gui_postgres:latest
+    image: hotel_gui_pg14_server:451_11326c-16563_20260514a
     container_name: hotel_db
     command: >
       bash -c "
         cd /tmp &&
-        sudo fwd_create_pg_cluster.sh --pgdata /pgdata/fwdcluster --rolefile-path /docker-entrypoint-initdb.d
+        sudo fwd_create_pg_cluster.sh --pgdata ${PGDATA:-/opt/hotel/db/fwdcluster}
       "
     ports:
       - ${PGPORT:-5432}:${PGPORT:-5432}
     volumes:
-      - hotel_db_postgres:/pgdata:delegated
+      - hotel_db_postgres:/opt/hotel/db:delegated
     environment: 
-      PGDATA: /pgdata/fwdcluster
+      PGDATA: /opt/hotel/db/fwdcluster
       PGPORT: ${PGPORT:-5432}
 
 volumes:

=== modified file 'docker/docker-compose_prepare.yml'
--- old/docker/docker-compose_prepare.yml	2026-04-09 22:04:15 +0000
+++ new/docker/docker-compose_prepare.yml	2026-05-15 11:13:53 +0000
@@ -11,6 +11,7 @@
       - ${LOG_DIR:-../deploy/logs}:/opt/hotel/logs
       - ${CFG_DIR:-../deploy/etc}:/opt/hotel/etc
       - ${SEC_DIR:-../deploy/security}:/opt/hotel/security
+      - ${APPCDS_DIR:-../deploy/appcds}:/opt/hotel/appcds
     environment:
       ADMIN_CONSOLE_PASSWORD: "${ADMIN_CONSOLE_PASSWORD:-test123}"
       APP_DBUSER_PASSWORD: "${APP_DBUSER_PASSWORD:-user}"

=== modified file 'docker/docker-compose_server.yml'
--- old/docker/docker-compose_server.yml	2026-04-09 22:04:15 +0000
+++ new/docker/docker-compose_server.yml	2026-05-15 11:15:34 +0000
@@ -40,6 +40,7 @@
     volumes:
       - ${LOG_DIR:-../deploy/logs}:/opt/hotel/logs
       - ${CFG_DIR:-../deploy/etc}:/opt/hotel/etc
+      - ${APPCDS_DIR:-../deploy/appcds}:/opt/hotel/appcds
     environment:
       START_SERVER_GETOPTS: '-c /opt/hotel/etc/server.xml'
     depends_on:

=== modified file 'docker/docker_prepare.sh'
--- old/docker/docker_prepare.sh	2026-04-09 22:04:15 +0000
+++ new/docker/docker_prepare.sh	2026-05-15 08:21:45 +0000
@@ -22,6 +22,7 @@
 [--log_dir=<logdir>] \
 [--cfg_dir=<cfgdir>] \
 [--cfg_file=<cfgfile>] \
+[--appcds_dir=<appcdsdir>] \
 [--admin_pw=<password>] \
 [--db_user_pw=<password>] \
 [--root_ca_pw=<password>] \
@@ -37,6 +38,7 @@
    i=$((i+1)); usage[$i]="\t--log_dir=<logdir> Path to directory containing log files (def=${log_dir})."
    i=$((i+1)); usage[$i]="\t--cfg_dir=<cfgdir> Path to directory containing configuration files (def=${cfg_dir})."
    i=$((i+1)); usage[$i]="\t--cfg_file=<cfgfile> JSON configuration file in <cfgdir> (def=${cfg_file})."
+   i=$((i+1)); usage[$i]="\t--appcds_dir=<appcdsdir> Path to directory containing AppCDS files (def=${appcds_dir})."
    i=$((i+1)); usage[$i]="\t--admin_pw=<password> Password to use for the Admin Console (def=${admin_console_pw})."
    i=$((i+1)); usage[$i]="\t--db_user_pw=<password> Password to use for \"fwd_user\" (def=${db_user_pw})."
    i=$((i+1)); usage[$i]="\t--root_ca_pw=<password> The root CA private-key encryption password (def=${root_ca_pw})."
@@ -81,11 +83,13 @@
 entrypoint_sh="docker-entrypoint_prepare.sh"
 container_entrypoint_sh="/docker-entrypoint.d/${entrypoint_sh}"
 container_cfg_dir=${container_project_dir}/etc
+container_appcds_dir=${container_project_dir}/appcds
 container_log_dir=${container_project_dir}/logs
 container_db_dir=${container_project_dir}/db
 container_name_server=${proj}_server
 log_dir="./deploy/logs"
 cfg_dir="./deploy/etc"
+appcds_dir="./deploy/appcds"
 cfg_file="prepare_dir.json"
 docker_image=$image_server
 admin_console_pw="test123"
@@ -108,6 +112,7 @@
               "log_dir"*       ) log_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "cfg_dir"*       ) cfg_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "cfg_file"*      ) cfg_file=$(echo $OPTARG | cut -d"=" -f2) ;;
+              "appcds_dir"*    ) appcds_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "admin_pw"*      ) admin_console_pw=$(echo $OPTARG | cut -d"=" -f2) ;;
               "db_user_pw"*    ) db_user_pw=$(echo $OPTARG | cut -d"=" -f2) ;;
               "root_ca_pw"*    ) root_ca_pw=$(echo $OPTARG | cut -d"=" -f2) ;;
@@ -139,6 +144,7 @@
 fi
 vmap_log="-v ${log_dir}:${container_log_dir}"
 vmap_cfg="-v ${cfg_dir}:${container_cfg_dir}"
+vmap_appcds="-v ${appcds_dir}:${container_appcds_dir}"
 app_env="-e APP_DBUSER_PASSWORD=${db_user_pw}"
 app_env+=" -e ADMIN_CONSOLE_PASSWORD=${admin_console_pw}"
 app_env+=" -e ROOT_CA_PASSWORD=\"${root_ca_pw}\""
@@ -161,7 +167,7 @@
 
 run_cmd="$dryrun docker run --rm -it $detach_opt --name $container_name \
    $net \
-   $vmap_log $vmap_cfg \
+   $vmap_log $vmap_cfg $vmap_appcds \
    $app_env \
    $docker_image $container_entrypoint_sh $entrypoint_opts"
 

=== modified file 'docker/run_docker.sh'
--- old/docker/run_docker.sh	2025-09-16 17:25:17 +0000
+++ new/docker/run_docker.sh	2026-05-15 08:25:49 +0000
@@ -30,6 +30,7 @@
 [--db_user_pw=<password>] \
 [--log_dir=<logdir>] \
 [--cfg_dir=<cfgdir>] \
+[--appcds_dir=<appcdsdir>] \
 [--cfg_file=<cfgfile>] \
 [--clear_logs] \
 [--skip_server] \
@@ -58,6 +59,7 @@
    i=$((i+1)); usage[$i]="\t--log_dir=<logdir> Path to directory containing log files. Maps to container ${container_log_dir} (def=${log_dir})."
    i=$((i+1)); usage[$i]="\t--cfg_dir=<cfgdir> Path to directory containing configuration files. Maps to container ${container_cfg_dir} (def=${cfg_dir})."
    i=$((i+1)); usage[$i]="\t--cfg_file=<cfgfile> JSON configuration file in <cfgdir>. Will overwrite the directory.xml if --opt_overwrite is included."
+   i=$((i+1)); usage[$i]="\t--appcds_dir=<appcdsdir> Path to directory containing appcds files. Maps to container ${container_appcds_dir} (def=${appcds_dir})."
    i=$((i+1)); usage[$i]="\t--clear_logs = clear '*.log' from logging directories."
    i=$((i+1)); usage[$i]="\t--skip_server = Skip starting the server in the container."
    i=$((i+1)); usage[$i]="\t--inspect = Open a bash in the running container."
@@ -107,10 +109,12 @@
 repo_entrypoint_sh="./docker/repo/entrypoint/${entrypoint_sh}"
 container_dbdump=/dbdump
 container_cfg_dir=/opt/${app}/etc
+container_appcds_dir=/opt/${app}/appcds
 container_log_dir=/opt/${app}/logs
 container_db_dir=/opt/${app}/db
 cfg_dir=./deploy/etc
 log_dir=./deploy/logs
+appcds_dir=./deploy/appcds
 dblang=${LANG%%.*}
 dbcodepage=${LANG#*.}
 dbcodepage=${dbcodepage,,//-/}
@@ -151,6 +155,7 @@
               "log_dir"*       ) log_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "cfg_dir"*       ) cfg_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "cfg_file"*      ) cfg_file=$(echo $OPTARG | cut -d"=" -f2) ;;
+              "appcds_dir"*    ) appcds_dir=$(echo $OPTARG | cut -d"=" -f2) ;;
               "reports"*       ) reports=true
                                  [[ "$OPTARG" == *=* ]] && report_place=$(echo "$OPTARG" | cut -d'=' -f2) ;;
               "clear_logs"     ) clear_logs=true ;;
@@ -202,6 +207,7 @@
 [ -n "$dbdump" ] && vmap_dump="-v ${dbdump}:${container_dbdump}"
 vmap_log="-v ${log_dir}:${container_log_dir}"
 vmap_cfg="-v ${cfg_dir}:${container_cfg_dir}"
+vmap_appcds="-v ${appcds_dir}:${container_appcds_dir}"
 vmap_entrypoint="-v ${repo_entrypoint_sh}:${container_entrypoint_sh}"
 
 # Establish docker run parameters
@@ -277,7 +283,7 @@
    run_cmd="docker run --rm -it $detach_opt --name $container_name \
       $ports $net \
       $userinfo \
-      $vmap_log $vmap_cfg $vmap_entrypoint \
+      $vmap_log $vmap_cfg $vmap_entrypoint $vmap_appcds \
       $vmap_db $vmap_dump \
       $DB_ENV \
       $DB_APP_ENV \

=== modified file 'json_template.sh'
--- old/json_template.sh	2026-04-06 21:37:53 +0000
+++ new/json_template.sh	2026-05-15 06:53:26 +0000
@@ -233,6 +233,7 @@
 pkgrootfolder=`echo $pkgroot |sed  's/\./\//g'`
 spawner_path="/opt/spawner/spawn"
 client_start_dir="$PWD/deploy/client"
+client_lib_path="$PWD/deploy/lib"
 server_log="../logs"
 client_log="../logs"
 keyboard="US"
@@ -396,6 +397,7 @@
 sed \
     -e "s#{spawner_path}#$spawner_path#g" \
     -e "s#{client_start_dir}#$client_start_dir#g" \
+    -e "s#{client_lib_path}#$client_lib_path#g" \
     -e "s/{dateFormat}/$dateFormat/g" \
     -e "s/{numberGroupSep}/$numberGroupSep/g" \
     -e "s/{numberDecimalSep}/$numberDecimalSep/g" \
@@ -502,6 +504,7 @@
    setval "directory_xml_file" $directory_xml_file $prepare_dir
    setval "spawner_path" $spawner_path $prepare_dir
    setval "client_start_dir" $client_start_dir $prepare_dir
+   setval "client_lib_path" $client_lib_path $prepare_dir
    setval "dateFormat" $dateFormat $prepare_dir
    setval "numberGroupSep" $numberGroupSep $prepare_dir
    setval "numberDecimalSep" $numberDecimalSep $prepare_dir

=== modified file 'docker/repo/entrypoint/docker-entrypoint_prepare.sh'
--- old/docker/repo/entrypoint/docker-entrypoint_prepare.sh	2025-07-10 19:09:03 +0000
+++ new/docker/repo/entrypoint/docker-entrypoint_prepare.sh	2026-05-15 08:09:43 +0000
@@ -23,3 +23,8 @@
 echo "Preparing the configuration with ${cfg_file}"
 ./prepare_dir.sh -of ${cfg_file}
 
+# Build AppCDS
+echo "Building AppCDS for ${appname}"
+./deploy_appcds.sh -f /opt/${appname}/etc/directory.xml \
+                   -d /opt/${appname}/appcds/client \
+                   /opt/fwd/build/lib/p2j.jar
\ No newline at end of file
