=== modified file 'src/com/goldencode/p2j/main/BrokerCore.java'
--- old/src/com/goldencode/p2j/main/BrokerCore.java	2025-03-10 13:33:42 +0000
+++ new/src/com/goldencode/p2j/main/BrokerCore.java	2025-10-20 20:44:06 +0000
@@ -18,6 +18,8 @@
 ** 007 GBB 20240709 Hard-coded config names replaced by ConfigItem constants.
 ** 008 GBB 20240729 Initialize CentralLogger after SecurityManager is created.
 ** 009 AP  20250303 Added timeout for spawner launching.
+** 010 SBI 20251019 Added dedicatedHost to log message, added PARAM_DEDICATED_MODE template parameter
+**                  and BROKER_DEDICATED_MODE environment variable.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -107,6 +109,15 @@
    /** CLASSPATH placeholder */
    public static final String PARAM_CP = "${remote.broker.classpath}";
 
+   /** remote/agent/dedicatedMode placeholder */
+   public static final String PARAM_DEDICATED_MODE = "${remote.agent.dedicatedMode}";
+
+   /** remote/agent/host placeholder */
+   public static final String PARAM_REMOTE_AGENT_HOST = "${remote.agent.host}";
+   
+   /** client:web:port placeholder */
+   public static final String PARAM_CLIENT_WEB_PORT = "${remote.agent.port}";
+
    /** Broker P2J server address net:server:host */
    public static final String BROKER_HOST = "BROKER_HOST";
    
@@ -122,6 +133,15 @@
    /** Broker runtime class path */
    public static final String BROKER_CLASSPATH = "BROKER_CLASSPATH";
 
+   /** Broker dedicatedHost */
+   public static final String BROKER_DEDICATED_HOST = "BROKER_DEDICATED_HOST";
+
+   /** web client port */
+   public static final String WEB_CLIENT_PORT = "WEB_CLIENT_PORT";
+
+   /** Broker dedicatedMode */
+   public static final String BROKER_DEDICATED_MODE = "BROKER_DEDICATED_MODE";
+
    /** Logger. */
    private static final CentralLogger LOG = CentralLogger.get(BrokerCore.class.getName());
 
@@ -260,6 +280,9 @@
       args.getEnvironment().put(BROKER_PORT, port);
       args.getEnvironment().put(BROKER_JVMARGS, jvmargs);
       args.getEnvironment().put(BROKER_CLASSPATH, classpath);
+      args.getEnvironment().put(BROKER_DEDICATED_HOST, dedicatedHost);
+      args.getEnvironment().put(BROKER_DEDICATED_MODE,
+                                String.valueOf(dedicatedMode));
       
       pb.environment().putAll(args.getEnvironment());
       
@@ -295,16 +318,20 @@
             command.add("-classpath");
             command.add(classpath);
          }
+         else if (cmd.indexOf(BrokerCore.PARAM_REMOTE_AGENT_HOST) > -1)
+         {
+            command.add(cmd.replace(BrokerCore.PARAM_REMOTE_AGENT_HOST, dedicatedHost));
+         }
+         else if (cmd.indexOf(BrokerCore.PARAM_DEDICATED_MODE) > -1)
+         {
+            command.add(cmd.replace(BrokerCore.PARAM_DEDICATED_MODE, String.valueOf(dedicatedMode)));
+         }
          else
          {
             command.add(cmd);
          }
       }
       
-      // add client:web:host
-      command.add("client:web:host=" + dedicatedHost);
-      command.add("client:web:dedicatedMode=" + String.valueOf(dedicatedMode));
-      
       LOG.logp(Level.INFO,
                "BrokerCore.spawn()",
                "",
@@ -444,12 +471,12 @@
          LOG.logp(Level.SEVERE,
                   BrokerCore.class.getName(),
                   "initialize",
-                  "remote:agent:host should be configured as a network host name or IP address");
+                  "remote:agent:host=" + dedicatedHost + " should be configured as a network host name or IP address");
       }
       // get the associated user account name
       associatedUser = cfg.getString("remote", "agent", "user", "");
       // get the dedicated broker mode
-      dedicatedMode = cfg.getBoolean("remote", "agent", "dedicatedMode", false);
+      dedicatedMode = cfg.getBoolean(ConfigItem.BROKER_DEDICATED_MODE, false);
       
       // JVM arguments
       String jargs = cfg.getString("remote", "java", "args", "");

=== modified file 'src/com/goldencode/p2j/main/BrokerManager.java'
--- old/src/com/goldencode/p2j/main/BrokerManager.java	2024-07-15 14:07:29 +0000
+++ new/src/com/goldencode/p2j/main/BrokerManager.java	2025-10-20 20:44:06 +0000
@@ -2,7 +2,7 @@
 ** Module   : BrokerManager.java
 ** Abstract : server side broker manager implementation.
 **
-** Copyright (c) 2014-2024, Golden Code Development Corporation.
+** Copyright (c) 2014-2025, Golden Code Development Corporation.
 
 **
 ** -#- -I- --Date-- ---------------------------------Description----------------------------------
@@ -19,6 +19,7 @@
 ** 008 GBB 20240709 CLIENT_IP constant moved here from WebDriverHandler.
 **                  WebClientConfig renamed to WebAllocatedResources.
 **                  Hard-coded config names replaced by ConfigItem constants.
+** 009 SBI 20251016 Fixed registerBroker, removeUserHostWithCheck.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -227,7 +228,7 @@
          {
             throw new RuntimeException("Only process accounts are allowed.");
          }
-         
+         params.setAgentAddress(host);
          // broker name if any
          params.setBrokerName(sm.getBrokerForProcess(params.getUserId()));
          if (params.getBrokerName() == null)
@@ -323,7 +324,7 @@
                                          Brokers brokers,
                                          BrokerSpawnParameters args)
    {
-      return spawn(dedicatedUser, brokers, args, null, null, null);
+      return spawn(null, dedicatedUser, brokers, args, null, null, null);
    }
    
    /**
@@ -351,7 +352,8 @@
     * 
     * @return  The result of remote spawn.
     */
-   public static BrokerSpawnResult spawn(String dedicatedUser,
+   public static BrokerSpawnResult spawn(ClientBuilder clientBuilder,
+                                         String dedicatedUser,
                                          Brokers brokers,
                                          BrokerSpawnParameters args,
                                          WebClientAllocator allocator,
@@ -385,7 +387,7 @@
                                                                                 uuid,
                                                                                 dedicatedUser);
                   spawn = (clientConfig != null);
-                  updateWebClientOptions(args, clientConfig);
+                  updateWebClientOptions(clientBuilder, args, clientConfig);
                }
                if (spawn)
                {
@@ -426,7 +428,7 @@
                                                                              uuid,
                                                                              dedicatedUser);
                spawn = (clientConfig != null);
-               updateWebClientOptions(args, clientConfig);
+               updateWebClientOptions(clientBuilder, args, clientConfig);
             }
             if (spawn)
             {
@@ -518,8 +520,11 @@
                                                Map<String, List<String>> targetUserHosts)
    {
       List<String> userHosts = targetUserHosts.get(user);
-      userHosts.remove(hostNameOrIpAddress);
-      if (userHosts.isEmpty())
+      if (userHosts != null)
+      {
+         userHosts.remove(hostNameOrIpAddress);
+      }
+      if (userHosts == null || userHosts.isEmpty())
       {
          targetUserHosts.remove(user);
       }
@@ -807,12 +812,15 @@
    /**
     * Update the command line parameters for the spawning process with the web client configuration.
     * 
+    * @param    clientBuilder
+    *           The client builder
     * @param    args
     *           The broker spawn parameters to update
     * @param    allocatedResources
     *           The allocated web resources
     */
-   private static void updateWebClientOptions(BrokerSpawnParameters args,
+   private static void updateWebClientOptions(ClientBuilder clientBuilder,
+                                              BrokerSpawnParameters args,
                                               WebAllocatedResources allocatedResources)
    {
       if (allocatedResources != null)
@@ -820,6 +828,11 @@
          int port = allocatedResources.getPort();
          if (port > 0)
          {
+            if (clientBuilder != null)
+            {
+               clientBuilder.updateCommand(allocatedResources.getUuid(), BrokerCore.PARAM_CLIENT_WEB_PORT, String.valueOf(port));
+               ((WebClientBuilder) clientBuilder).getParams().updateOptions(allocatedResources);
+            }
             args.getCommand().add(ConfigItem.PORT.fullOption() + "=" + port);
          }
          

=== modified file 'src/com/goldencode/p2j/main/ClientBuilder.java'
--- old/src/com/goldencode/p2j/main/ClientBuilder.java	2025-05-23 14:37:32 +0000
+++ new/src/com/goldencode/p2j/main/ClientBuilder.java	2025-10-27 08:36:22 +0000
@@ -37,6 +37,7 @@
 ** 022 CA  20240910 'net:socket:nio' is enabled by default only for Java 8.
 ** 023 CA  20250221 Added constants for the spawner modes.
 ** 024 AL2 20250523 'net:socket:nio' is disabled by default.
+** 025 SBI 20251024 Added updateCommand.
 */
 
 /*
@@ -156,6 +157,35 @@
    }
    
    /**
+    * Update the spawn command registered for this UUID.
+    * 
+    * @param    uuid
+    *           The UUID.
+    * @param    templateParameterKey
+    *           The template parameter key
+    * @param    parameterValue
+    *           The parameter value
+    */
+   public static void updateCommand(String uuid, String templateParameterKey, String parameterValue)
+   {
+      synchronized (pendingCmds)
+      {
+         String[] args = pendingCmds.get(uuid);
+         if (args != null)
+         {
+            for (int i = 0; i < args.length; i++)
+            {
+               String arg = args[i];
+               if (arg.indexOf(templateParameterKey) > -1)
+               {
+                  args[i] = arg.replace(templateParameterKey, parameterValue);
+               }
+            }
+         }
+      }
+   }
+   
+   /**
     * Remove the spawn command registered for this UUID.
     * 
     * @param    uuid
@@ -279,7 +309,7 @@
          args.setPassword(params.getOsPass());
       }
    
-      return BrokerManager.spawn(dedicatedUser, brokers, args, allocator, requestParameters, params.getUuid());
+      return BrokerManager.spawn(this, dedicatedUser, brokers, args, allocator, requestParameters, params.getUuid());
    }
    
    /**

=== modified file 'src/com/goldencode/p2j/main/NativeSecureConnection.java'
--- old/src/com/goldencode/p2j/main/NativeSecureConnection.java	2024-07-29 07:17:59 +0000
+++ new/src/com/goldencode/p2j/main/NativeSecureConnection.java	2025-12-29 15:41:46 +0000
@@ -2,7 +2,7 @@
 ** Module   : NativeSecureConnection.java
 ** Abstract : Helper for connecting to a remote P2J server from native code, via JNI.
 **
-** Copyright (c) 2014-2024, Golden Code Development Corporation.
+** Copyright (c) 2014-2025, Golden Code Development Corporation.
 **
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 CA  20140211 Created initial version.
@@ -12,6 +12,9 @@
 **     IAS 20210325 Added NIO configuration via BootstrapConfig
 ** 004 GBB 20230512 Logging methods replaced by CentralLogger/ConversionStatus.
 ** 005 GBB 20240729 Initialize CentralLogger in try-catch.
+** 006 SBI 20251019 Resolved template variables PARAM_DEDICATED_MODE, PARAM_REMOTE_AGENT_HOST as an environment
+**                  variables BROKER_DEDICATED_MODE and BROKER_DEDICATED_HOST respectively.
+**         20251229 Throw NPEs if BROKER_DEDICATED_MODE or BROKER_DEDICATED_HOST environment variables are not set.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -81,6 +84,9 @@
  */
 public class NativeSecureConnection
 {
+   /** Error message template */
+   private final static String ERROR_TEMPLATE = "Null value not allowed for %s";
+   
    /**
     * Establish a secure connection to the target P2J server and retrieve the spawn command
     * registered with this request, via the specified UUID.
@@ -190,15 +196,19 @@
    private static String[] remote(String[] args)
    {
       // Get environment variables
-      Map<String, String> env = System.getenv();      
+      Map<String, String> env = System.getenv();
       // host
-      String host = env.get(BrokerCore.BROKER_HOST);      
+      String host = env.get(BrokerCore.BROKER_HOST);
       // secure port
-      String port = env.get(BrokerCore.BROKER_PORT);      
+      String port = env.get(BrokerCore.BROKER_PORT);
       // JVM arguments
       String jvmargs = env.get(BrokerCore.BROKER_JVMARGS);
       // classpath
       String classpath = env.get(BrokerCore.BROKER_CLASSPATH);
+      // dedicatedHost
+      String dedicatedHost = env.get(BrokerCore.BROKER_DEDICATED_HOST);
+      // dedicatedMode
+      String dedicatedMode = env.get(BrokerCore.BROKER_DEDICATED_MODE);
 
       // Command line arguments
       List<String> command = new LinkedList<String>();
@@ -211,7 +221,7 @@
          {
             if (host == null)
             {
-               throw new NullPointerException("Null value not allowed for host.");
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_HOST));
             }
             // host
             command.add(cmd.replace(BrokerCore.PARAM_HOST, host));
@@ -221,7 +231,7 @@
          {
             if (port == null)
             {
-               throw new NullPointerException("Null value not allowed for secure port.");
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_PORT));
             }
             // secure port
             command.add(cmd.replace(BrokerCore.PARAM_PORT, port));
@@ -230,7 +240,7 @@
          {
             if (jvmargs == null)
             {
-               throw new NullPointerException("Null value not allowed for JVM arguments.");
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_JVMARGS));
             }
             // add JVM arguments
             String[] tokens = jvmargs.split("\\" + BrokerCore.BROKER_JVMARGS_SEPARATOR);
@@ -240,12 +250,28 @@
          {
             if (classpath == null)
             {
-               throw new NullPointerException("Null value not allowed for CLASSPATH.");
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_CLASSPATH));
             }            
             // add CLASSAPTH
             command.add("-classpath");
             command.add(classpath);
          }
+         else if (cmd.indexOf(BrokerCore.PARAM_REMOTE_AGENT_HOST) > -1)
+         {
+            if (dedicatedHost == null)
+            {
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_DEDICATED_HOST));
+            }            
+            command.add(cmd.replace(BrokerCore.PARAM_REMOTE_AGENT_HOST, dedicatedHost));
+         }
+         else if (cmd.indexOf(BrokerCore.PARAM_DEDICATED_MODE) > -1)
+         {
+            if (dedicatedMode == null)
+            {
+               throw new NullPointerException(String.format(ERROR_TEMPLATE, BrokerCore.BROKER_DEDICATED_MODE));
+            }            
+            command.add(cmd.replace(BrokerCore.PARAM_DEDICATED_MODE, dedicatedMode));
+         }
          else
          {
             command.add(cmd);

=== modified file 'src/com/goldencode/p2j/main/WebClientBuilder.java'
--- old/src/com/goldencode/p2j/main/WebClientBuilder.java	2025-02-21 12:23:25 +0000
+++ new/src/com/goldencode/p2j/main/WebClientBuilder.java	2025-12-29 15:41:46 +0000
@@ -39,6 +39,9 @@
 ** 017 GBB 20240719 Null check for project token.
 ** 018 GBB 20240730 Get the project token from the web parameters instead of resolving each time.
 ** 019 CA  20250221 Added constants for the spawner modes.
+** 020 SBI 20251019 Added web client host parameter if SSO plugin is enabled and added BrokerCore.PARAM_DEDICATED_MODE
+**                  template parameter as a value for ConfigItem.BROKER_DEDICATED_MODE(refs: #9709-146, #9709:147).
+**         20251229 Improved "if" blocks.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -162,6 +165,13 @@
          command.add(ConfigItem.SSO_STORAGE_ID.fullOption() + "=" + params.getStorageId());
       }
       
+      if (remote)
+      {
+         command.add(ConfigItem.HOST.fullOption() + "=" + BrokerCore.PARAM_REMOTE_AGENT_HOST);
+         command.add(ConfigItem.BROKER_DEDICATED_MODE.fullOption() + "=" + BrokerCore.PARAM_DEDICATED_MODE);
+         command.add(ConfigItem.PORT.fullOption() + "=" + BrokerCore.PARAM_CLIENT_WEB_PORT);
+      }
+      
       UUID_OPTIONS.put(this.params.getUuid(), new PostInitOptions(dirOptions.getDriverType(),
                                                                   remote,
                                                                   dirOptions.getOverriddenOptions(),

=== modified file 'src/com/goldencode/p2j/main/WebClientSpawner.java'
--- old/src/com/goldencode/p2j/main/WebClientSpawner.java	2025-08-11 14:37:59 +0000
+++ new/src/com/goldencode/p2j/main/WebClientSpawner.java	2025-10-19 21:16:08 +0000
@@ -36,6 +36,7 @@
 ** 018 AI  20250904 Renamed accessedAtLeastOnce to safeRemoveListener.
 ** 019 SBI 20250910 Removed configuration parameters: MAX_LOST_PINGS and PING_DELAY.
 ** 020 TJD 20250807 Added SNI_HOST_CHECK option to control Jetty's SNIHostCheck feature
+** 021 SBI 20251019 Reused ConfigItem.BROKER_DEDICATED_MODE.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -413,7 +414,7 @@
          int port = config.getInt(ConfigItem.PORT, 0);
          String host = config.getString(ConfigItem.HOST, null);
          
-         boolean dedicatedMode = config.getBoolean("client", "web", "dedicatedMode", false);
+         boolean dedicatedMode = config.getBoolean(ConfigItem.BROKER_DEDICATED_MODE, false);
          
          // dedicated mode section placed just before the driver created
          if (dedicatedMode)

=== modified file 'src/com/goldencode/p2j/util/ConfigItem.java'
--- old/src/com/goldencode/p2j/util/ConfigItem.java	2025-08-11 14:37:59 +0000
+++ new/src/com/goldencode/p2j/util/ConfigItem.java	2025-10-19 21:16:08 +0000
@@ -20,6 +20,7 @@
 **                  update readInClient to be able to read list of objects.
 ** 010 ES  20251008 Added UNITTEST_LEGACY_NAMES parameter.
 ** 011 TJD 20250807 Added SNI_HOST_CHECK option to control Jetty's SNIHostCheck feature
+** 012 SBI 20251019 Added BROKER_DEDICATED_MODE remote/agent/dedicatedMode broker client settings.
 */
 /*
 ** This program is free software: you can redistribute it and/or modify
@@ -598,6 +599,10 @@
    public static final ConfigItem<String> SPAWNER_UUID =
       new ConfigItem<>(String.class, "", "server", "spawner", "uuid", Type.RUNTIME);
    
+   /**remote:agent:dedicatedMode broker configuration */
+   public static final ConfigItem<Boolean> BROKER_DEDICATED_MODE =
+         new ConfigItem<>(Boolean.class, "", "remote", "agent", "dedicatedMode", Type.RUNTIME);
+   
    /** Enables web client debug logging in js. */
    public static final ConfigItem<Boolean> JS_DEBUG_LOGGING = new ConfigItem<>(Boolean.class,
                                                                                "enableDebugLogging",

