diff --git a/src/xercesc/internal/DGXMLScanner.cpp b/src/xercesc/internal/DGXMLScanner.cpp
index d8bf17cf871fa9dc3fe2869ece6a473278581e7a..4856de95aca43e2ddd6457c73846c94a250ea51c 100644
--- a/src/xercesc/internal/DGXMLScanner.cpp
+++ b/src/xercesc/internal/DGXMLScanner.cpp
@@ -977,7 +977,8 @@ void DGXMLScanner::scanDocTypeDecl()
 
                 XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
                 fGrammarResolver->orphanGrammar(gramDesc);
-                fGrammarResolver->putGrammar(sysIdStr, fGrammar);
+                gramDesc->setRootName(sysIdStr);
+                fGrammarResolver->putGrammar(gramDesc, fGrammar);
             }
 
             //  In order to make the processing work consistently, we have to
@@ -1679,7 +1680,8 @@ Grammar* DGXMLScanner::loadDTDGrammar(const InputSource& src,
         fValidator->reset();
 
     fDTDGrammar = fGrammarResolver->getGrammarPool()->createDTDGrammar();   
-    fGrammarResolver->putGrammar(XMLUni::fgDTDEntityString, fDTDGrammar);
+    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
+    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
     fGrammar = fDTDGrammar;
     fValidator->setGrammar(fGrammar);
 
@@ -1702,7 +1704,8 @@ Grammar* DGXMLScanner::loadDTDGrammar(const InputSource& src,
 
         XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
         fGrammarResolver->orphanGrammar(gramDesc);
-        fGrammarResolver->putGrammar(sysIdStr, fGrammar);
+        gramDesc->setRootName(sysIdStr);
+        fGrammarResolver->putGrammar(gramDesc, fGrammar);
     }
 
     //  Handle the creation of the XML reader object for this input source.
@@ -2034,7 +2037,8 @@ void DGXMLScanner::scanReset(const InputSource& src)
     fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
 
     fDTDGrammar = fGrammarResolver->getGrammarPool()->createDTDGrammar();
-    fGrammarResolver->putGrammar(XMLUni::fgDTDEntityString, fDTDGrammar);
+    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
+    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
     fGrammar = fDTDGrammar;
     fRootGrammar = 0;
     fValidator->setGrammar(fGrammar);
diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp
index 407d125c3236aa86fc444f75001eaa9248b7f5ca..5d6812682c6dc38ea589af43ac3c28a50d516068 100644
--- a/src/xercesc/internal/IGXMLScanner.cpp
+++ b/src/xercesc/internal/IGXMLScanner.cpp
@@ -1383,7 +1383,8 @@ void IGXMLScanner::scanDocTypeDecl()
 
                 XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
                 fGrammarResolver->orphanGrammar(gramDesc);
-                fGrammarResolver->putGrammar(sysIdStr, fGrammar);
+                gramDesc->setRootName(sysIdStr);
+                fGrammarResolver->putGrammar(gramDesc, fGrammar);
             }
 
             //  In order to make the processing work consistently, we have to
@@ -2849,7 +2850,8 @@ Grammar* IGXMLScanner::loadDTDGrammar(const InputSource& src,
     }
 
     fDTDGrammar = fGrammarResolver->getGrammarPool()->createDTDGrammar();
-    fGrammarResolver->putGrammar(XMLUni::fgDTDEntityString, fDTDGrammar);
+    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
+    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
     fGrammar = fDTDGrammar;
     fGrammarType = fGrammar->getGrammarType();
     fValidator->setGrammar(fGrammar);
@@ -2873,7 +2875,8 @@ Grammar* IGXMLScanner::loadDTDGrammar(const InputSource& src,
 
         XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
         fGrammarResolver->orphanGrammar(gramDesc);
-        fGrammarResolver->putGrammar(sysIdStr, fGrammar);
+        gramDesc->setRootName(sysIdStr);
+        fGrammarResolver->putGrammar(gramDesc, fGrammar);
     }
 
     //  Handle the creation of the XML reader object for this input source.
diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index ea921524ff060e6ef46bdde89dd30d8edb5a3a40..ea01a084ab0bd98a2170baaf81988383fbf45c93 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -78,6 +78,7 @@
 #include <xercesc/framework/XMLPScanToken.hpp>
 #include <xercesc/framework/XMLRefInfo.hpp>
 #include <xercesc/framework/XMLGrammarPool.hpp>
+#include <xercesc/framework/XMLDTDDescription.hpp>
 #include <xercesc/validators/common/ContentLeafNameTypeVector.hpp>
 #include <xercesc/validators/DTD/DTDGrammar.hpp>
 #include <xercesc/validators/DTD/DTDValidator.hpp>
@@ -866,7 +867,8 @@ void IGXMLScanner::scanReset(const InputSource& src)
     fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
 
     fDTDGrammar = fGrammarResolver->getGrammarPool()->createDTDGrammar();
-    fGrammarResolver->putGrammar(XMLUni::fgDTDEntityString, fDTDGrammar);
+    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
+    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
     fGrammar = fDTDGrammar;
     fGrammarType = fGrammar->getGrammarType();
     fRootGrammar = 0;