diff --git a/src/xercesc/util/regx/RangeToken.cpp b/src/xercesc/util/regx/RangeToken.cpp
index f2bc7e00c4f7633ab544eb57c66a50d2221ab32c..6e0880a292d74aa79c0f6c6f05869fc0141e5a4c 100644
--- a/src/xercesc/util/regx/RangeToken.cpp
+++ b/src/xercesc/util/regx/RangeToken.cpp
@@ -72,6 +72,12 @@ RangeToken::RangeToken(const Token::tokType tkType,
 
 RangeToken::~RangeToken() {
 
+    // TODO(dbertoni) This is a temporary hack until we can change the ABI.
+    // See Jira issue XERCESC-1866 for more details.
+    if (fCaseIToken && fCaseIToken->fCaseIToken == this)
+    {
+        fCaseIToken->fCaseIToken = 0;
+    }
     fMemoryManager->deallocate(fMap);//delete [] fMap;
     fMemoryManager->deallocate(fRanges);//delete[] fRanges;
 }
@@ -286,6 +292,12 @@ RangeToken* RangeToken::getCaseInsensitiveToken(TokenFactory* const tokFactory)
         lwrToken->createMap();
 
         fCaseIToken = lwrToken;
+        // TODO(dbertoni) This is a temporary hack until we can change the ABI.
+        // See Jira issue XERCESC-1866 for more details.
+        // Overload the fCaseIToken data member to be the case-insensitive token
+        // that's caching the case-insensitive one.  We need this because tokens
+        // have varying lifetimes.
+        fCaseIToken->setCaseInsensitiveToken(this);
     }
 
     return fCaseIToken;