diff --git a/.github/workflows/build-packaging.yml b/.github/workflows/build-packaging.yml
index 1591457df4..dc6dda480d 100644
--- a/.github/workflows/build-packaging.yml
+++ b/.github/workflows/build-packaging.yml
@@ -1,4 +1,11 @@
 name: Zowe Build and Packaging
+
+permissions:
+  id-token: write
+  issues: write
+  pull-requests: write
+  contents: write
+
 on:
   push:
     branches:
@@ -130,7 +137,7 @@ jobs:
           
           echo BUILD_WHAT=$BUILD_WHAT >> $GITHUB_OUTPUT
       
-      - name: '[Prep 7] Comment on PR to indicate build is started'
+      - name: '[Prep 7] Comment on PR to indicate build is started'         
         uses: actions/github-script@v5
         id: create-comment
         if: (github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request') && startsWith(env.CURRENT_BRANCH, 'PR-')
@@ -265,6 +272,7 @@ jobs:
         timeout-minutes: 10
         uses: zowe-actions/shared-actions/publish@main
         with:
+          sigstore-sign-artifacts: true
           artifacts: |
             .pax/zowe.pax
             .pax/zowe-smpe.zip
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fc042086f3..9edb889b67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
 
 All notable changes to the Zowe Installer will be documented in this file.
 <!--Add the PR or issue number to the entry if available.-->
+## `2.15.0`
+
+## New features and enhancements
+
+## Minor enhancements/defect fixes
+- Bugfix: `zwe diagnose` running under comfigmgr and output formatted. Fixes #[3627](https://github.com/zowe/zowe-install-packaging/issues/3627).
+
 ## `2.14.0`
 
 ### New features and enhancements
@@ -16,9 +23,8 @@ All notable changes to the Zowe Installer will be documented in this file.
 - Enhancement: Added utility "getesm" into bin/utils. When run it outputs to STDOUT which ESM your system is using. (#3662)
 
 #### Minor enhancements/defect fixes
-- Enhancement: `/bin/utils/date-add.rex` utility is accepting the date formatting as combination of YY|YYYY, MM, DD and any separator.
 - Bugfix: Workflow files in the Zowe PAX are now ASCII-encoded. Fixes [#3591](https://github.com/zowe/zowe-install-packaging/issues/3591).
-
+- Enhancement: `/bin/utils/date-add.rex` utility is accepting the date formatting as combination of YY|YYYY, MM, DD and any separator.
 
 ## `2.12.0`
 
@@ -26,7 +32,6 @@ All notable changes to the Zowe Installer will be documented in this file.
 
 #### Minor enhancements/defect fixes
 
-
 ## `2.11.0`
 
 ### New features and enhancements
diff --git a/bin/commands/certificate/keyring-jcl/connect/.parameters b/bin/commands/certificate/keyring-jcl/connect/.parameters
index 8ae86cb266..1160a03958 100644
--- a/bin/commands/certificate/keyring-jcl/connect/.parameters
+++ b/bin/commands/certificate/keyring-jcl/connect/.parameters
@@ -8,6 +8,6 @@ trust-cas||string|||||Labels of extra certificate authorities should be trusted,
 connect-user||string|required||||Certificate owner. Can be `SITE` or a user ID.
 connect-label||string|required||||Certificate label to connect.
 trust-zosmf||boolean|||||Whether to trust z/OSMF CA.
-zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify "_auto_" to let Zowe to detect automatically. This only works for RACF.
+zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify `_auto_` to let Zowe to detect automatically. This works for RACF and TSS.
 zosmf-user||string||IZUSVR|||z/OSMF user name. This is used to automatically detect z/OSMF root certificate authorities.
 ignore-security-failures||boolean|||||Whether to ignore security setup job failures.
diff --git a/bin/commands/certificate/keyring-jcl/generate/.parameters b/bin/commands/certificate/keyring-jcl/generate/.parameters
index 6017cd675d..5a16628783 100644
--- a/bin/commands/certificate/keyring-jcl/generate/.parameters
+++ b/bin/commands/certificate/keyring-jcl/generate/.parameters
@@ -16,6 +16,6 @@ country||string|||||Country of certificate and certificate authority.
 validity||string|||||Validity days of certificate.
 trust-cas||string|||||Labels of extra certificate authorities should be trusted, separated by comma (Maximum 2).
 trust-zosmf||boolean|||||Whether to trust z/OSMF CA.
-zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify "_auto_" to let Zowe to detect automatically. This only works for RACF.
+zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify `_auto_` to let Zowe to detect automatically. This works for RACF and TSS.
 zosmf-user||string||IZUSVR|||z/OSMF user name. This is used to automatically detect z/OSMF root certificate authorities.
 ignore-security-failures||boolean|||||Whether to ignore security setup job failures.
diff --git a/bin/commands/certificate/keyring-jcl/import-ds/.parameters b/bin/commands/certificate/keyring-jcl/import-ds/.parameters
index f0cb41275a..801991dcce 100644
--- a/bin/commands/certificate/keyring-jcl/import-ds/.parameters
+++ b/bin/commands/certificate/keyring-jcl/import-ds/.parameters
@@ -7,7 +7,7 @@ keyring-name||string|required||||Name of the keyring.
 alias|a|string|required|localhost|||Certificate alias name.
 trust-cas||string|||||Labels of extra certificate authorities should be trusted, separated by comma (Maximum 2).
 trust-zosmf||boolean|||||Whether to trust z/OSMF CA.
-zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify "_auto_" to let Zowe to detect automatically. This only works for RACF.
+zosmf-ca||string||_auto_|||Labels of z/OSMF root certificate authorities. Specify `_auto_` to let Zowe to detect automatically. This works for RACF and TSS.
 zosmf-user||string||IZUSVR|||z/OSMF user name. This is used to automatically detect z/OSMF root certificate authorities.
 import-ds-name||string|required||||Name of the data set holds certificate to import into keyring.
 import-ds-password||string|required||||Password of the data set holds certificate to import.
diff --git a/bin/commands/diagnose/index.sh b/bin/commands/diagnose/index.sh
index e843993523..d1f07e8ebe 100644
--- a/bin/commands/diagnose/index.sh
+++ b/bin/commands/diagnose/index.sh
@@ -11,25 +11,59 @@
 # Copyright Contributors to the Zowe Project.
 #######################################################################
 
-error_code="${ZWE_CLI_PARAMETER_ERROR_CODE}"
+USE_CONFIGMGR=$(check_configmgr_enabled)
+if [ "${USE_CONFIGMGR}" = "true" ]; then
+  _CEE_RUNOPTS="XPLINK(ON),HEAPPOOLS(OFF)" ${ZWE_zowe_runtimeDirectory}/bin/utils/configmgr -script "${ZWE_zowe_runtimeDirectory}/bin/commands/diagnose/cli.js"
+else
+
+  error_code="${ZWE_CLI_PARAMETER_ERROR_CODE}"
 
-server_code=$(echo "${error_code}" | cut -c4)
+  print_message ""
 
-if echo $error_code | grep -q -E "^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$"; then
-  if [[ "$server_code" == [Dd] ]]; then
-    print_message "This code corresponds to the errors related to the ZOWE Desktop and the App Server."
-    print_message "To find the description of this error code, refer to the Zowe documentation at https://github.com/zowe/docs-site/blob/master/docs/troubleshoot/app-framework/appserver-error-codes.md"
-  elif [[ "$server_code" == [Ss] ]]; then
-    print_message "This code corresponds to the errors related to the Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)"
-    print_message "To find the description of this error code, refer to the Zowe documentation for ZSS at https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes and for ZIS at https://github.com/zowe/docs-site/blob/master/docs/troubleshoot/app-framework/zis-error-codes.md"
-  elif [[ "$server_code" == [Aa] ]]; then
-    print_message "This code corresponds to the errors related to the Zowe API Mediation Layer (APIML)."
-    print_message "To find the description of this error code, refer to the Zowe documentation at https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes"
-  elif [[ "$server_code" == [Ll] ]]; then
-    print_message "This code corresponds to the errors related to the Zowe Launcher and ZWE"
-    print_message "To find the description of this error code, refer to the Zowe documentation for the Launcher at https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes and https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h, and for ZWE at https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/ "
+  if echo $error_code | grep -q -E "^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$"; then
+    server_code=$(echo "${error_code}" | cut -c4)
+    if [[ "$server_code" == [Dd] ]]; then
+      print_message "This code corresponds to the errors related to the ZOWE Desktop and the App Server."
+      print_message ""
+      print_message "To find the description of this error code, refer to the:"
+      print_message ""
+      print_message "  Zowe documentation for Application framework"
+      print_message "    https://docs.zowe.org/stable/troubleshoot/app-framework/appserver-error-codes"
+    elif [[ "$server_code" == [Ss] ]]; then
+      print_message "This code corresponds to the errors related to the Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)."
+      print_message ""
+      print_message "To find the description of this error code, refer to the:"
+      print_message ""
+      print_message "  Zowe documentation for ZSS"
+      print_message "    https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes"
+      print_message "  Zowe documentation for ZIS"
+      print_message "    https://docs.zowe.org/stable/troubleshoot/app-framework/zis-error-codes"
+    elif [[ "$server_code" == [Aa] ]]; then
+      print_message "This code corresponds to the errors related to the Zowe API Mediation Layer (APIML)."
+      print_message ""
+      print_message "To find the description of this error code, refer to the:"
+      print_message ""
+      print_message "  Zowe documentation for API Mediation Layer"
+      print_message "    https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes"
+    elif [[ "$server_code" == [Ll] ]]; then
+      print_message "This code corresponds to the errors related to the Zowe Launcher and ZWE."
+      print_message ""
+      print_message "To find the description of this error code, refer to the:"
+      print_message ""
+      print_message "  Zowe documentation for Launcher"
+      print_message "    https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes"
+      print_message "  Launcher error codes"
+      print_message "    https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h"
+      print_message "  Zowe documentation for ZWE"
+      print_message "    https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/"
+    fi
+    print_message ""
+    print_message "You may also explore reports from other users experiencing the same error by searching"
+    print_message "https://github.com/search?q=org%3Azowe+${error_code}&type=discussions"
+  else
+    print_error_and_exit "ZWEL0102E: Invalid parameter --error-code='${error_code}'" "" 102
   fi
-  print_message "You may also explore reports from other users experiencing the same error by searching here https://github.com/search?q=org%3Azowe+${error_code}&type=discussions"
-else
-  print_error_and_exit "Invalid Error Code" "" 102
+
+  print_message ""
+
 fi
diff --git a/bin/commands/diagnose/index.ts b/bin/commands/diagnose/index.ts
index 1fe91dc198..8fb6518277 100644
--- a/bin/commands/diagnose/index.ts
+++ b/bin/commands/diagnose/index.ts
@@ -8,31 +8,60 @@
  
   Copyright Contributors to the Zowe Project.
 */
-
 import * as std from 'cm_std';
 import * as common from '../../libs/common';
 
-export function execute() {
-  const errorCode: string = std.getenv('ZWE_CLI_PARAMETER_ERROR_CODE');
+const THIS_CODE = "\nThis code corresponds to the errors related to the";
+const FIND_DESC = "To find the description of this error code, refer to the:\n ";
+const URL = {
+    apiML: "https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes",
+    appFW : "https://docs.zowe.org/stable/troubleshoot/app-framework/appserver-error-codes",
+    launcher: "https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes",
+    launcherGit: "https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h",
+    zss: "https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes",
+    zis: "https://docs.zowe.org/stable/troubleshoot/app-framework/zis-error-codes",
+    zwe: "https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/"
+}
+
+function thisCodeCorrespondsTo(component: string){
+    common.printMessage(`${THIS_CODE} ${component}.\n`);
+    common.printMessage(`${FIND_DESC}`);
+}
 
-  const serverCode: string = errorCode.charAt(3);
+function printLinks(description: string, link: string){
+    if (link.indexOf('github') > 0)
+        common.printMessage(`  ${description}`)
+    else 
+    common.printMessage(`  Zowe documentation for ${description}`)
+    common.printMessage(`    ${link}`);
+}
 
-  if (/^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$/.test(errorCode)) {
-    if (serverCode.toLowerCase() === 'd') {
-      common.printMessage("This code corresponds to the errors related to the ZOWE Desktop and the App Server.");
-      common.printMessage("To find the description of this error code, refer to the Zowe documentation at https://github.com/zowe/docs-site/blob/master/docs/troubleshoot/app-framework/appserver-error-codes.md");
-    } else if (serverCode.toLowerCase() === 's') {
-      common.printMessage("This code corresponds to the errors related to the Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)");
-      common.printMessage("To find the description of this error code, refer to the Zowe documentation for ZSS at https://docs.zowe.org/stable/troubleshoot/app-framework/zss-error-codes and for ZIS at https://github.com/zowe/docs-site/blob/master/docs/troubleshoot/app-framework/zis-error-codes.md");
-    } else if (serverCode.toLowerCase() === 'a') {
-      common.printMessage("This code corresponds to the errors related to the Zowe API Mediation Layer (APIML).");
-      common.printMessage("To find the description of this error code, refer to the Zowe documentation at https://docs.zowe.org/stable/troubleshoot/troubleshoot-apiml-error-codes");
-    } else if (serverCode.toLowerCase() === 'l') {
-      common.printMessage("This code corresponds to the errors related to the Zowe Launcher and ZWE");
-      common.printMessage("To find the description of this error code, refer to the Zowe documentation for the Launcher at https://docs.zowe.org/stable/troubleshoot/launcher/launcher-error-codes and https://github.com/zowe/launcher/blob/v2.x/master/src/msg.h, and for ZWE at https://docs.zowe.org/stable/appendix/zwe_server_command_reference/zwe/");
+export function execute() {
+    const errorCode = std.getenv('ZWE_CLI_PARAMETER_ERROR_CODE');
+    if (/^[zZ][wW][eE][AaSsDdLl][A-Za-z]?[0-9]{3,4}[A-Za-z]$/.test(errorCode)) {
+        const serverCode = errorCode.charAt(3);
+        if (serverCode.toLowerCase() === 'd') {
+            thisCodeCorrespondsTo('ZOWE Desktop and the App Server');
+            printLinks('Application framework', `${URL.appFW}`);
+        }
+        else if (serverCode.toLowerCase() === 's') {
+            thisCodeCorrespondsTo('Zowe Subsystem Services (ZSS) and Zowe Installation Services (ZIS)');
+            printLinks('ZSS', `${URL.zss}`);
+            printLinks('ZIS', `${URL.zis}`);
+        }
+        else if (serverCode.toLowerCase() === 'a') {
+            thisCodeCorrespondsTo('Zowe API Mediation Layer (APIML)');
+            printLinks('API Mediation Layer', `${URL.apiML}`);
+        }
+        else if (serverCode.toLowerCase() === 'l') {
+            thisCodeCorrespondsTo('Zowe Launcher and ZWE');
+            printLinks('Launcher', `${URL.launcher}`);
+            printLinks('Launcher error codes', `${URL.launcherGit}`);
+            printLinks('ZWE', `${URL.zwe}`);
+        }
+        common.printMessage(`\nYou may also explore reports from other users experiencing the same error by searching\nhttps://github.com/search?q=org%3Azowe+${errorCode}&type=discussions\n`);
+    }
+    else {
+        common.printErrorAndExit(`ZWEL0102E: Invalid parameter --error-code='${errorCode}'`, undefined, 102);
     }
-    common.printMessage(`You may also explore reports from other users experiencing the same error by searching here https://github.com/search?q=org%3Azowe+${errorCode}&type=discussions`)
-  } else {
-    common.printErrorAndExit("Invalid Error Code", undefined, 102);
-  }
 }
diff --git a/bin/libs/certificate.sh b/bin/libs/certificate.sh
index 49fcc232ef..13dec5e1d4 100644
--- a/bin/libs/certificate.sh
+++ b/bin/libs/certificate.sh
@@ -876,7 +876,15 @@ EOF
 
   if [ "${trust_zosmf}" = "1" ]; then
     if [ "${zosmf_root_ca}" = "_auto_" ]; then
-      zosmf_root_ca=$(detect_zosmf_root_ca "${ZWE_PRIVATE_ZOSMF_USER}")
+      if [ "${security_product}" = "RACF" ]; then
+        zosmf_root_ca=$(detect_zosmf_root_ca_racf "${ZWE_PRIVATE_ZOSMF_USER}")
+      fi
+      if [ "${security_product}" = "TSS" ]; then
+        zosmf_root_ca=$(detect_zosmf_root_ca_tss "${ZWE_PRIVATE_ZOSMF_USER}")
+      fi
+      if [ "${security_product}" = "ACF2" ]; then
+        zosmf_root_ca=$(detect_zosmf_root_ca_acf2 "${ZWE_PRIVATE_ZOSMF_USER}")
+      fi
     fi
     if [ -z "${zosmf_root_ca}" ]; then
       print_error_and_exit "Error ZWEL0137E: z/OSMF root certificate authority is not provided (or cannot be detected) with trusting z/OSMF option enabled." "" 137
@@ -1397,12 +1405,76 @@ EOF
     "${labels_with_private_key}"
 }
 
-# this only works for RACF
-detect_zosmf_root_ca() {
+# FIXME
+#   - Support for multiple? | long | special characters entries
+detect_zosmf_root_ca_tss() {
+  zosmf_user=${1:-IZUSVR}
+  zosmf_root_ca=
+
+  print_trace "- Detect z/OSMF keyring by listing ID(${zosmf_user}) [TSS]"
+  zosmf_certs=$(tsocmd "TSS LIST(${zosmf_user}) KEYRING(ALL)" 2>&1)
+  code=$?
+  if [ ${code} -ne 0 ]; then
+    print_trace "  * Exit code: ${code}"
+    print_trace "  * Output:"
+    if [ -n "${zosmf_certs}" ]; then
+      print_trace "$(padding_left "${zosmf_certs}" "    ")"
+    fi
+    return 1
+  fi
+
+  # Output example:
+  # KEYRING LABEL = KEYRING.IZUDFLT
+  zosmf_keyring_name=$(echo "${zosmf_certs}" | grep "KEYRING LABEL = " | awk -F= '{ print $2 }'  | head -n 1)
+  if [ -n "${zosmf_keyring_name}" ]; then
+    print_trace "  * z/OSMF keyring name is ${zosmf_keyring_name}"
+    # Output example:
+    #   ACID(CERTAUTH)  DIGICERT(ABCDEFGH)  DEFAULT(NO )  USAGE(CERTAUTH)
+    #   LABLCERT(ZOSMF_ROOT_CA                   )
+    zosmf_root_ca=$(echo "${zosmf_certs}" | grep -A 1 "ACID(CERTAUTH)" | grep "LABLCERT(" | head -n 1)
+    zosmf_root_ca=$(echo "${zosmf_root_ca}" | awk '{ print substr( $0, 12, length($0)-13) }')
+    zosmf_root_ca=$(echo "${zosmf_root_ca}" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//')
+    if [ -n "${zosmf_root_ca}" ]; then
+      print_trace "  * z/OSMF root certificate authority found: ${zosmf_root_ca}"
+      echo "${zosmf_root_ca}"
+      return 0
+    else
+      print_trace "  * Error: cannot detect z/OSMF root certificate authority"
+      return 2
+    fi
+  else
+    print_trace "  * Error: failed to detect z/OSMF keyring name"
+    return 3
+  fi
+}
+
+# FIXME
+#   - add similar code using ACFUNIX instead of tsocmd
+#   - or use JCLs to be sure it will always works
+detect_zosmf_root_ca_acf2() {
+  zosmf_user=${1:-IZUSVR}
+  zosmf_root_ca=
+
+  print_trace "- Detect z/OSMF keyring by listing ID(${zosmf_user}) [ACF2]"
+  echo "${zosmf_root_ca}"
+  return 1
+}
+
+# FIXME
+#   - Support for multiple? | long | special characters entries
+#   - RACDCERT LISTRING will be confused if label contains 'CERTAUTH' word:
+#
+#  Certificate Label Name             Cert Owner     USAGE      DEFAULT
+#  --------------------------------   ------------   --------   -------
+#  CERTAUTH_FOR_T800                  ID(SKYNET)     DEADLY       YES
+#  JOHN_CONNOR                        CERTAUTH       CERTAUTH     NO
+#
+#  Will return CERTAUTH_FOR_T800 instead of JOHN_CONNOR
+detect_zosmf_root_ca_racf() {
   zosmf_user=${1:-IZUSVR}
   zosmf_root_ca=
 
-  print_trace "- Detect z/OSMF keyring by listing ID(${zosmf_user})"
+  print_trace "- Detect z/OSMF keyring by listing ID(${zosmf_user}) [RACF]"
   zosmf_certs=$(tsocmd "RACDCERT LIST ID(${zosmf_user})" 2>&1)
   code=$?
   if [ ${code} -ne 0 ]; then
diff --git a/bin/libs/configmgr.ts b/bin/libs/configmgr.ts
index ba16685f1e..26c16fa89a 100644
--- a/bin/libs/configmgr.ts
+++ b/bin/libs/configmgr.ts
@@ -14,6 +14,7 @@ import * as os from 'cm_os';
 import * as xplatform from 'xplatform';
 import { ConfigManager } from 'Configuration';
 import * as fs from './fs';
+import * as stringlib from './string';
 
 import * as objUtils from '../utils/ObjUtils';
 
@@ -415,7 +416,7 @@ function getMemberNameFromConfigPath(configPath: string): string|undefined {
 function stripMemberName(configPath: string, memberName: string): string {
   //Turn PARMLIB(my.zowe(yaml)):PARMLIB(my.other.zowe(yaml))
   //Into PARMLIB(my.zowe):FILE(/some/path.yaml):PARMLIB(my.other.zowe)
-  const replacer = new RegExp('\\('+memberName+'\\)\\)', 'gi');
+  const replacer = new RegExp('\\('+stringlib.escapeDollar(memberName)+'\\)\\)', 'gi');
   return configPath.replace(replacer, ")");
 }
   
diff --git a/bin/libs/string.sh b/bin/libs/string.sh
index 1c1be161ba..c5b95d38bb 100755
--- a/bin/libs/string.sh
+++ b/bin/libs/string.sh
@@ -22,7 +22,7 @@ trim() {
     input=${1}
   fi
 
-  echo "${input}" | xargs
+  echo "${input}" | sed -e 's/^[[:space:]]*//;s/[[:space:]]*$//'
 }
 
 ###############################
diff --git a/bin/libs/string.ts b/bin/libs/string.ts
index 7fa5c6020f..20acafbf6d 100644
--- a/bin/libs/string.ts
+++ b/bin/libs/string.ts
@@ -344,3 +344,16 @@ export function itemInList(stringList: string, stringToFind?: string, separator:
   }
   return stringList.split(separator).includes(stringToFind);
 }
+
+export function escapeDollar(str: string): string | undefined {
+  if (str === null || str === undefined)
+    return undefined;
+  return str.replace(/[$]/g, '\\$&');
+}
+
+export function escapeRegExp(str: string): string | undefined {
+  if (str === null || str === undefined)
+      return undefined;
+  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+}
+
diff --git a/bin/libs/zos-dataset.ts b/bin/libs/zos-dataset.ts
index c1960ec929..74d10aed9e 100644
--- a/bin/libs/zos-dataset.ts
+++ b/bin/libs/zos-dataset.ts
@@ -18,7 +18,7 @@ import * as shell from './shell';
 import * as zoslib from './zos';
 
 export function isDatasetExists(datasetName: string): boolean {
-  const result = shell.execSync('sh', '-c', `cat "//'${datasetName}'" 1>/dev/null 2>&1`);
+  const result = shell.execSync('sh', '-c', `cat "//'${stringlib.escapeDollar(datasetName)}'" 1>/dev/null 2>&1`);
   return result.rc === 0;
 }
 
@@ -27,7 +27,7 @@ export function isDatasetExists(datasetName: string): boolean {
 //                1: data set is not in catalog
 //                2: data set member doesn't exist
 export function tsoIsDatasetExists(datasetName: string): number {
-  const result = zoslib.tsoCommand(`listds '${datasetName}' label`);
+  const result = zoslib.tsoCommand(`listds '${stringlib.escapeDollar(datasetName)}' label`);
   if (result.rc != 0) {
     if (result.out.includes('NOT IN CATALOG')) {
       return 1;
@@ -44,7 +44,7 @@ export function tsoIsDatasetExists(datasetName: string): number {
 }
 
 export function createDataSet(dsName: string, dsOptions: string): number {
-  const result=zoslib.tsoCommand(`ALLOCATE NEW DA('${dsName}') ${dsOptions}`);
+  const result=zoslib.tsoCommand(`ALLOCATE NEW DA('${stringlib.escapeDollar(dsName)}') ${dsOptions}`);
   return result.rc;
 }
 
@@ -55,7 +55,7 @@ export function copyToDataset(filePath: string, dsName: string, cpOptions: strin
     }
   }
 
-  const cpCommand=`cp ${cpOptions} -v "${filePath}" "//'${dsName}'"`;
+  const cpCommand=`cp ${cpOptions} -v "${filePath}" "//'${stringlib.escapeDollar(dsName)}'"`;
   common.printDebug('- '+cpCommand);
   const result=shell.execOutSync('sh', '-c', `${cpCommand} 2>&1`);
   if (result.rc == 0) {
@@ -79,7 +79,7 @@ export function datasetCopyToDataset(prefix: string, datasetFrom: string, datase
     }
   }
 
-  const cmd=`exec '${prefix}.${std.getenv('ZWE_PRIVATE_DS_SZWEEXEC')}(ZWEMCOPY)' '${datasetFrom} ${datasetTo}'`;
+  const cmd = `exec '${stringlib.escapeDollar(prefix)}.${std.getenv('ZWE_PRIVATE_DS_SZWEEXEC')}(ZWEMCOPY)' '${stringlib.escapeDollar(datasetFrom)} ${stringlib.escapeDollar(datasetTo)}'`;
   const result = zoslib.tsoCommand(cmd);
   return result.rc;
 }
@@ -91,7 +91,7 @@ export function datasetCopyToDataset(prefix: string, datasetFrom: string, datase
 //                1: there are some users
 // @output        output of operator command "d grs"
 export function listDatasetUser(datasetName: string): number {
-  const cmd=`D GRS,RES=(*,${datasetName})`;
+  const cmd = `D GRS,RES=(*,'${stringlib.escapeDollar(datasetName)}')`;
   const result=zoslib.operatorCommand(cmd);
   return result.out.includes('NO REQUESTORS FOR RESOURCE') ? 0 : 1;
   // example outputs:
@@ -128,7 +128,7 @@ export function listDatasetUser(datasetName: string): number {
 //                3: data set is in use
 // @output        tso listds label output
 export function deleteDataset(dataset: string): number {
-  const cmd=`delete '${dataset}'`;
+  const cmd=`delete '${stringlib.escapeDollar(dataset)}'`;
   const result=zoslib.tsoCommand(cmd);
   if (result.rc != 0) {
     if (result.out.includes('NOT IN CATALOG')) {
@@ -170,7 +170,7 @@ export function isDatasetSmsManaged(dataset: string): { rc: number, smsManaged?:
   // SMS flag is in `FORMAT 1 DSCB` section second line, after 780037
 
   common.printTrace(`- Check if ${dataset} is SMS managed`);
-  const labelResult = zoslib.tsoCommand(`listds '${dataset}' label`);
+  const labelResult = zoslib.tsoCommand(`listds '${stringlib.escapeDollar(dataset)}' label`);
   const datasetLabel=labelResult.out;
   if (labelResult.rc == 0) {
     let formatIndex = datasetLabel.indexOf('--FORMAT 1 DSCB--');
@@ -212,14 +212,13 @@ export function isDatasetSmsManaged(dataset: string): { rc: number, smsManaged?:
 
 export function getDatasetVolume(dataset: string): { rc: number, volume?: string } {
   common.printTrace(`- Find volume of data set ${dataset}`);
-  const result = zoslib.tsoCommand(`listds '${dataset}'`);
+  const result = zoslib.tsoCommand(`listds '${stringlib.escapeDollar(dataset)}'`);
   if (result.rc == 0) {
     let volumesIndex = result.out.indexOf('--VOLUMES--');
     let volume: string;
     if (volumesIndex != -1) {
       let startIndex = volumesIndex + '--VOLUMES--'.length;
-      let endIndex = result.out.indexOf('--',startIndex);
-      volume = result.out.substring(startIndex, endIndex).trim();
+      volume = result.out.substring(startIndex).trim();
     }
     if (!volume) {
       common.printError("  * Failed to find volume information of the data set.");
@@ -235,7 +234,7 @@ export function getDatasetVolume(dataset: string): { rc: number, volume?: string
 export function apfAuthorizeDataset(dataset: string): number {
   const result = isDatasetSmsManaged(dataset);
   if (result.rc) {
-    common.printError("Error ZWEL0134E: Failed to find SMS status of data set ${dataset}.");
+    common.printError(`Error ZWEL0134E: Failed to find SMS status of data set ${dataset}.`);
     return 134;
   }
 
@@ -256,7 +255,7 @@ export function apfAuthorizeDataset(dataset: string): number {
     }
   }
 
-  const apfCmd="SETPROG APF,ADD,DSNAME=${dataset},${apfVolumeParam}"
+  const apfCmd=`SETPROG APF,ADD,DSNAME=${dataset},${apfVolumeParam}`;
   if (std.getenv('ZWE_CLI_PARAMETER_SECURITY_DRY_RUN') == "true") {
     common.printMessage("- Dry-run mode, security setup is NOT performed on the system.");
     common.printMessage("  Please apply this operator command manually:");
@@ -277,7 +276,7 @@ export function apfAuthorizeDataset(dataset: string): number {
 }
 
 export function createDatasetTmpMember(dataset: string, prefix: string='ZW'): string | null {
-  common.printTrace(`  > create_data_set_tmp_member in ${dataset}`);
+    common.printTrace(`  > createDatasetTmpMember in ${dataset}`);
   for (var i = 0; i < 100; i++) {
     let rnd=Math.floor(Math.random()*10000);
 
diff --git a/bin/libs/zos-fs.ts b/bin/libs/zos-fs.ts
index 99305bc4b9..e0023a449f 100644
--- a/bin/libs/zos-fs.ts
+++ b/bin/libs/zos-fs.ts
@@ -20,11 +20,13 @@ import * as shell from './shell';
 // Get file encoding from z/OS USS tagging
 export function getFileEncoding(filePath: string): number|undefined {
   //zos.changeTag(file, id)
-  let returnArray = os.stat(filePath);
-  if (!returnArray[1] && ((returnArray[0].mode & os.S_IFREG) == os.S_IFREG)) { //no error, and is file
-    return returnArray[0].ccsid;
-  } else {
-    common.printError(`getFileEncoding path=${filePath}, err=${returnArray[1]}`);
+  if (os.platform == 'zos') {
+    let returnArray = zos.zstat(filePath);
+    if (!returnArray[1] && ((returnArray[0].mode & os.S_IFMT) == os.S_IFREG)) { //no error, and is file
+      return returnArray[0].ccsid;
+    } else {
+      common.printError(`getFileEncoding path=${filePath}, err=${returnArray[1]}`);
+    }
   }
   return undefined;
 }
@@ -85,7 +87,7 @@ export function detectFileEncoding(fileName: string, expectedSample: string, exp
 
 export function copyMvsToUss(dataset: string, file: string): number {
   common.printDebug(`copyMvsToUss dataset=${dataset}, file=${file}`);
-  const result = shell.execSync('sh', '-c', `cp "//'${dataset}'" "${file}"`);
+  const result = shell.execSync('sh', '-c', `cp "//'${stringlib.escapeDollar(dataset)}'" '${file}'`);
   return result.rc;
 }
 
@@ -109,7 +111,7 @@ export function ensureFileEncoding(file: string, expectedSample: string, expecte
       }
     }
     common.printTrace(`- Remove encoding tag of ${file}.`);
-    zos.changeTag(file, 0);
+    shell.execSync('sh', '-c', `chtag -r "${file}"`);
   } else {
     common.printTrace(`- Failed to detect encoding of ${file}.`);
   }
diff --git a/bin/libs/zos.ts b/bin/libs/zos.ts
index b49e81451b..8cc5dea000 100644
--- a/bin/libs/zos.ts
+++ b/bin/libs/zos.ts
@@ -16,7 +16,7 @@ import * as shell from './shell';
 import * as stringlib from './string';
 
 export function tsoCommand(...args:string[]): { rc: number, out: string } {
-  let message="tsocmd "+args.join(' ');
+  let message = "tsocmd " + '"' + args.join(' ') + '"';
   common.printDebug('- '+message);
   //we echo at the end to avoid a configmgr quirk where trying to read stdout when empty can hang waiting for bytes
   const result = shell.execOutSync('sh', '-c', `${message} 2>&1 && echo '.'`);
diff --git a/bin/libs/zwecli.sh b/bin/libs/zwecli.sh
index eb0e249a3c..0131c5ff5b 100755
--- a/bin/libs/zwecli.sh
+++ b/bin/libs/zwecli.sh
@@ -376,6 +376,9 @@ zwecli_inline_execute_command() {
 
   export ZWE_PRIVATE_CLI_IS_TOP_LEVEL_COMMAND=false
 
+  print_trace "- zwecli_inline_execute_command"
+  print_trace "  * ${*}"
+
   # process new command
   . "${ZWE_zowe_runtimeDirectory}/bin/zwe"
 
diff --git a/bin/zwe b/bin/zwe
index baaf43bb9d..80e6247115 100755
--- a/bin/zwe
+++ b/bin/zwe
@@ -69,7 +69,9 @@ while [ $# -gt 0 ]; do
       print_error_and_exit "Error ZWEL0103E: Invalid type of parameter ${arg}" "" 103
     fi
   fi
-  shift
+  if [ $# -gt 0 ]; then
+    shift
+  fi
 done
 
 # debug results
diff --git a/build/zwe/types/@qjstypes/zos.d.ts b/build/zwe/types/@qjstypes/zos.d.ts
index ec41ae6571..551948c5c2 100644
--- a/build/zwe/types/@qjstypes/zos.d.ts
+++ b/build/zwe/types/@qjstypes/zos.d.ts
@@ -11,8 +11,13 @@
 export type ZStat = {
     dev: number;
     ino: number;
+    mode: number;
+    nlink: number;
     uid: number;
     gid: number;
+    rdev: number;
+    size: number;
+    blocks: number;
     atime: number;
     mtime: number;
     ctime: number;
diff --git a/manifest.json.template b/manifest.json.template
index 65de58a3d7..cb8813927d 100644
--- a/manifest.json.template
+++ b/manifest.json.template
@@ -1,6 +1,6 @@
 {
   "name": "Zowe",
-  "version": "2.14.0",
+  "version": "2.15.0",
   "description": "Zowe is an open source project created to host technologies that benefit the Z platform from all members of the Z community (Integrated Software Vendors, System Integrators and z/OS consumers). Zowe, like Mac or Windows, comes with a set of APIs and OS capabilities that applications build on and also includes some applications out of the box. Zowe offers modern interfaces to interact with z/OS and allows you to work with z/OS in a way that is similar to what you experience on cloud platforms today. You can use these interfaces as delivered or through plug-ins and extensions that are created by clients or third-party vendors.",
   "license": "EPL-2.0",
   "homepage": "https://zowe.org",
diff --git a/smpe/bld/service/promoted-apar.txt b/smpe/bld/service/promoted-apar.txt
index 50dd21d4dd..07ec28cc3e 100644
--- a/smpe/bld/service/promoted-apar.txt
+++ b/smpe/bld/service/promoted-apar.txt
@@ -1,3 +1,6 @@
+IO29346
+IO29347
+IO29348
 IO29343
 IO29344
 IO29345
diff --git a/smpe/bld/service/promoted-close.txt b/smpe/bld/service/promoted-close.txt
index dd88e48cee..ee6b38e692 100644
--- a/smpe/bld/service/promoted-close.txt
+++ b/smpe/bld/service/promoted-close.txt
@@ -1,3 +1,48 @@
+    IO29346 -
+      PROBLEM SUMMARY:
+      ****************************************************************
+      * USERS AFFECTED: All Zowe users                               *
+      ****************************************************************
+      * PROBLEM DESCRIPTION: Update Zowe FMID AZWE002 to match the   *
+      *                      community release                       *
+      ****************************************************************
+      * RECOMMENDATION: Apply provided service                       *
+      ****************************************************************
+      The Zowe community version was updated to 2.14.0.
+      This PTF provides the community changes in SMP/E format.
+      Follow this link for more details on the community changes:
+      https://docs.zowe.org/stable/
+
+    IO29347 -
+      PROBLEM SUMMARY:
+      ****************************************************************
+      * USERS AFFECTED: All Zowe users                               *
+      ****************************************************************
+      * PROBLEM DESCRIPTION: Update Zowe FMID AZWE002 to match the   *
+      *                      community release                       *
+      ****************************************************************
+      * RECOMMENDATION: Apply provided service                       *
+      ****************************************************************
+      The Zowe community version was updated to 2.14.0.
+      This PTF provides the community changes in SMP/E format.
+      Follow this link for more details on the community changes:
+      https://docs.zowe.org/stable/
+
+    IO29348 -
+      PROBLEM SUMMARY:
+      ****************************************************************
+      * USERS AFFECTED: All Zowe users                               *
+      ****************************************************************
+      * PROBLEM DESCRIPTION: Update Zowe FMID AZWE002 to match the   *
+      *                      community release                       *
+      ****************************************************************
+      * RECOMMENDATION: Apply provided service                       *
+      ****************************************************************
+      The Zowe community version was updated to 2.14.0.
+      This PTF provides the community changes in SMP/E format.
+      Follow this link for more details on the community changes:
+      https://docs.zowe.org/stable/
+
     IO29343 -
       PROBLEM SUMMARY:
       ****************************************************************
diff --git a/smpe/bld/service/promoted-hold.txt b/smpe/bld/service/promoted-hold.txt
index 1fc5b423cc..3337b60c7a 100644
--- a/smpe/bld/service/promoted-hold.txt
+++ b/smpe/bld/service/promoted-hold.txt
@@ -1,3 +1,28 @@
+++HOLD(UO90047) SYSTEM FMID(AZWE002) REASON(ACTION) DATE(24026)
+  COMMENT(
+  ****************************************************************
+  * Affected function: Zowe servers                              *
+  ****************************************************************
+  * Description: stop servers                                    *
+  ****************************************************************
+  * Timing: pre-APPLY                                            *
+  ****************************************************************
+  * Part: ZWESLSTC and ZWESISTC                                  *
+  ****************************************************************
+  Stop the Zowe servers before installing this update.
+  
+  ****************************************************************
+  * Affected function: Zowe servers                              *
+  ****************************************************************
+  * Description: start servers                                   *
+  ****************************************************************
+  * Timing: post-APPLY                                           *
+  ****************************************************************
+  * Part: ZWESLSTC and ZWESISTC                                  *
+  ****************************************************************
+  Start the Zowe servers after installing this update.
+  
+  ).
 ++HOLD(UO90045) SYSTEM FMID(AZWE002) REASON(ACTION) DATE(23348)
   COMMENT(
   ****************************************************************
diff --git a/smpe/bld/service/promoted-ptf.txt b/smpe/bld/service/promoted-ptf.txt
index 7d09f95e2c..08242dbddd 100644
--- a/smpe/bld/service/promoted-ptf.txt
+++ b/smpe/bld/service/promoted-ptf.txt
@@ -1,3 +1,5 @@
+UO90047
+UO90048
 UO90045
 UO90046
 UO90033
diff --git a/smpe/bld/service/ptf-bucket.txt b/smpe/bld/service/ptf-bucket.txt
index bef1acd7b8..0f4b8c00a3 100644
--- a/smpe/bld/service/ptf-bucket.txt
+++ b/smpe/bld/service/ptf-bucket.txt
@@ -20,5 +20,5 @@
 #UO90031 UO90032 - IO29286 IO29287   IO29288 - Tue Sep 12 18:27:05 UTC 2023
 #UO90033 UO90034 - IO29289 IO29290   IO29291 - Tue Oct 24 19:49:48 UTC 2023
 #UO90045 UO90046 - IO29343 IO29344   IO29345 - Thu Dec 14 16:23:26 UTC 2023
-UO90047 UO90048 - IO29346 IO29347   IO29348
+#UO90047 UO90048 - IO29346 IO29347   IO29348 - Fri Jan 26 17:21:09 UTC 2024
 UO90049 UO90050 - IO29349 IO29350   IO29351