diff --git a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
index 6f137c5b52890551c24902fe323dfee45cb76c2e..3ca2a7d3d80c2dc8e09162eb531a66c6ddc06bca 100644
--- a/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
+++ b/src/xercesc/util/Transcoders/Uniconv390/Uniconv390TransService.cpp
@@ -97,6 +97,7 @@ static int gForceTranscode;
 #define NO_FORCE 0
 #define MUST_USE_ICU  1
 #define MUST_USE_UNICONV  2
+#define MUST_USE_ICU_SRC_OFFS  3
 
 // ---------------------------------------------------------------------------
 //  Local functions
@@ -171,11 +172,14 @@ Uniconv390TransService::Uniconv390TransService()
       gForceTranscode = MUST_USE_ICU;
    else if ( !strcmp(myenviron,"USE_NATIVE") )
       gForceTranscode = MUST_USE_UNICONV;
+   else if ( !strcmp(myenviron,"USE_ICU_SRC_OFFS") )
+      gForceTranscode = MUST_USE_ICU_SRC_OFFS;
   DBGPRINTF3("FORCE PARM=%s %d\n",myenviron,gForceTranscode);
 
-// If we are forcing ICU to be used fro transcoding then we also should
+// If we are forcing ICU to be used for transcoding then we also should
 // force it to be used for case conversions.
-if (gForceTranscode == MUST_USE_ICU) {
+if ((gForceTranscode == MUST_USE_ICU) ||
+    (gForceTranscode == MUST_USE_ICU_SRC_OFFS)) {
    fCaseConverter = new uniconvcaseconverter;
    fCaseConverter->ftoupperhand=UNICONV_ERROR;
    fCaseConverter->ftolowerhand=UNICONV_ERROR;
@@ -363,7 +367,10 @@ bool Uniconv390TransService::isSpace(const XMLCh toCheck) const
 
 bool Uniconv390TransService::supportsSrcOfs() const
 {
-   return false;
+   if (gForceTranscode == MUST_USE_ICU_SRC_OFFS)
+      return true;
+    else
+      return false;
 }
 
 void Uniconv390TransService::upperCase(XMLCh* const toUpperCase) const
@@ -439,7 +446,8 @@ XMLLCPTranscoder* Uniconv390TransService::makeNewLCPTranscoder()
    XMLTransService::Codes resValue;
 DBGPRINTF2("makeNewLCPTranscoder() localencoding=%s \n",nl_langinfo(CODESET));
    // USS default code page is IBM-1047
-   if (gForceTranscode == MUST_USE_ICU) {
+   if ((gForceTranscode == MUST_USE_ICU) ||
+       (gForceTranscode == MUST_USE_ICU_SRC_OFFS)) {
       if (gViewTranscoder)
          printf("IXM1004I LCP - Using ICU - %s\n",nl_langinfo(CODESET));
       fLCPTranscoder = fICUService->makeNewLCPTranscoder();
@@ -477,7 +485,8 @@ char * localname = XMLString::transcode(encodingName, manager);
 ArrayJanitor<char> janText((char*)localname, manager);
 DBGPRINTF3("makeNewXMLTranscoder() encoding=%s blocksize=%d\n",localname,blockSize);
 
-   if (gForceTranscode == MUST_USE_ICU) {
+   if ((gForceTranscode == MUST_USE_ICU) ||
+       (gForceTranscode == MUST_USE_ICU_SRC_OFFS)) {
       if (gViewTranscoder)
          printf("IXM1001I XML - Using ICU - %s\n",localname);
       return fICUService->makeNewXMLTranscoder(encodingName,resValue,blockSize, manager);
diff --git a/src/xercesc/util/Transcoders/Uniconv390/uniconv.cpp b/src/xercesc/util/Transcoders/Uniconv390/uniconv.cpp
index ebf8bbe62289ebe8e46a5c150ba0eb49d00c680d..898dca4ffe20bf8adc0465853cb15d6e275f8c94 100644
--- a/src/xercesc/util/Transcoders/Uniconv390/uniconv.cpp
+++ b/src/xercesc/util/Transcoders/Uniconv390/uniconv.cpp
@@ -23,7 +23,7 @@
 #include <string.h>
 #include <errno.h>
 #include <ctype.h>
-#include <cunhc.h>
+#include <cunhc.h>           
 #include "ccsid.h"
 #include "uniconv.h"
 
@@ -139,8 +139,14 @@ uniconv_t uniconv_open(const char *destenc, const char *srcenc) {
    tmpp->DDA_Buf_Len=DDA_NEEDED;
    // This flag tells the services to automatically refresh the handle if it
    // becomes invalid.
-   tmpp->Flag1|=CUNBCPRM_REFRESH_AT_INV_HANDLE_START;
-   tmpp->Flag1|=CUNBCPRM_SUB_ACTION_SUBSTITUTE;
+
+// Use next two lines of code on old z/OS levels where Flag1 is is char field
+// tmpp->Flag1|=CUNBCPRM_REFRESH_AT_INV_HANDLE_START;
+// tmpp->Flag1|=CUNBCPRM_SUB_ACTION_SUBSTITUTE;
+
+// Use next two lines of code on later z/OS levels where Flag1 is bit field
+   tmpp->Flag1.Inv_Handle = 1;
+   tmpp->Flag1.Sub_Action = 1;
 
    /* Determine which technique to use */
    if ( (srcis390) || (destis390) )
@@ -266,7 +272,12 @@ void * handle_area;
    tmpp->DDA_Buf_Len=CUNBAPRM_DDA_REQ;
    // This flag tells the services to automatically refresh the handle if it
    // becomes invalid.
-   tmpp->Flag1|=CUNBAPRM_REFRESH_AT_INV_HANDLE_START;
+
+// Use next line of code on old z/OS levels where Flag1 is char field
+// tmpp->Flag1|=CUNBAPRM_REFRESH_AT_INV_HANDLE_START;
+
+// Use next line of code on later z/OS levels where Flag1 is bit field
+   tmpp->Flag1.Inv_Handle = 1;
 
    unichar_t inchar = 0x61;
    unichar_t outchar;