diff --git a/src/xercesc/internal/DGXMLScanner.cpp b/src/xercesc/internal/DGXMLScanner.cpp
index c1952dc80d7abcc6bc7fdd02c7620726b65e3ea6..fb3fabbc38895e2dc2bf0bca49d47cb5e086f510 100644
--- a/src/xercesc/internal/DGXMLScanner.cpp
+++ b/src/xercesc/internal/DGXMLScanner.cpp
@@ -923,9 +923,7 @@ void DGXMLScanner::scanDocTypeDecl()
         {
             InputSource* sysIdSrc = resolveSystemId(sysId);
             Janitor<InputSource> janSysIdSrc(sysIdSrc);
-            XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(sysIdSrc->getSystemId());
-            Janitor<XMLDTDDescription> janName(gramDesc);
-            Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+            Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId());
 
             if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) {
 
@@ -981,10 +979,9 @@ void DGXMLScanner::scanDocTypeDecl()
                 unsigned int stringId = fGrammarResolver->getStringPool()->addOrFind(srcUsed->getSystemId());
                 const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(stringId);
 
-                XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-                fGrammarResolver->orphanGrammar(gramDesc);
-                gramDesc->setRootName(sysIdStr);
-                fGrammarResolver->putGrammar(gramDesc, fGrammar);
+                fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString);
+                ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr);
+                fGrammarResolver->putGrammar(fGrammar);
             }
 
             //  In order to make the processing work consistently, we have to
@@ -1686,8 +1683,7 @@ Grammar* DGXMLScanner::loadDTDGrammar(const InputSource& src,
         fValidator->reset();
 
     fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager);
-    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
+    fGrammarResolver->putGrammar(fDTDGrammar);
     fGrammar = fDTDGrammar;
     fValidator->setGrammar(fGrammar);
 
@@ -1708,10 +1704,9 @@ Grammar* DGXMLScanner::loadDTDGrammar(const InputSource& src,
         unsigned int sysId = fGrammarResolver->getStringPool()->addOrFind(src.getSystemId());
         const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(sysId);
 
-        XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-        fGrammarResolver->orphanGrammar(gramDesc);
-        gramDesc->setRootName(sysIdStr);
-        fGrammarResolver->putGrammar(gramDesc, fGrammar);
+        fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString);
+        ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr);
+        fGrammarResolver->putGrammar(fGrammar);
     }
 
     //  Handle the creation of the XML reader object for this input source.
@@ -2044,8 +2039,7 @@ void DGXMLScanner::scanReset(const InputSource& src)
     fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
 
     fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager);
-    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
+    fGrammarResolver->putGrammar(fDTDGrammar);
     fGrammar = fDTDGrammar;
     fRootGrammar = 0;
     fValidator->setGrammar(fGrammar);
@@ -2291,7 +2285,7 @@ void DGXMLScanner::scanAttrListforNameSpaces(RefVectorOf<XMLAttr>* theAttrList,
 		
         // check for duplicate namespace attributes:
         // by checking for qualified names with the same local part and with prefixes 
-        // which have been bound to namespace names that are identical. 
+        // which have been bound to namespace names that are identical.         
         XMLAttr* loopAttr;
         for (int attrIndex=0; attrIndex < index; attrIndex++) {
             loopAttr = theAttrList->elementAt(attrIndex);
@@ -2304,7 +2298,7 @@ void DGXMLScanner::scanAttrListforNameSpaces(RefVectorOf<XMLAttr>* theAttrList,
                     , elemDecl->getFullName()
                 );
             }
-        }  
+        }                 
     }
 }
 
diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp
index 4401eb8f06e501a4a74f26a1d063661787ae348c..cfeddbd5bda57c99ddc3e3ac6c298c43ef675539 100644
--- a/src/xercesc/internal/IGXMLScanner.cpp
+++ b/src/xercesc/internal/IGXMLScanner.cpp
@@ -1328,9 +1328,7 @@ void IGXMLScanner::scanDocTypeDecl()
         {
             InputSource* sysIdSrc = resolveSystemId(sysId);
             Janitor<InputSource> janSysIdSrc(sysIdSrc);
-            XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(sysIdSrc->getSystemId());
-            Janitor<XMLDTDDescription> janName(gramDesc);
-            Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+            Grammar* grammar = fGrammarResolver->getGrammar(sysIdSrc->getSystemId());
 
             if (grammar && grammar->getGrammarType() == Grammar::DTDGrammarType) {
 
@@ -1386,10 +1384,9 @@ void IGXMLScanner::scanDocTypeDecl()
                 unsigned int stringId = fGrammarResolver->getStringPool()->addOrFind(srcUsed->getSystemId());
                 const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(stringId);
 
-                XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-                fGrammarResolver->orphanGrammar(gramDesc);
-                gramDesc->setRootName(sysIdStr);
-                fGrammarResolver->putGrammar(gramDesc, fGrammar);
+                fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString);
+                ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr);
+                fGrammarResolver->putGrammar(fGrammar);
             }
 
             //  In order to make the processing work consistently, we have to
@@ -2855,8 +2852,7 @@ Grammar* IGXMLScanner::loadDTDGrammar(const InputSource& src,
     }
 
     fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager);
-    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
+    fGrammarResolver->putGrammar(fDTDGrammar);
     fGrammar = fDTDGrammar;
     fGrammarType = fGrammar->getGrammarType();
     fValidator->setGrammar(fGrammar);
@@ -2877,11 +2873,10 @@ Grammar* IGXMLScanner::loadDTDGrammar(const InputSource& src,
 
         unsigned int sysId = fGrammarResolver->getStringPool()->addOrFind(src.getSystemId());
         const XMLCh* sysIdStr = fGrammarResolver->getStringPool()->getValueForId(sysId);
-
-        XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-        fGrammarResolver->orphanGrammar(gramDesc);
-        gramDesc->setRootName(sysIdStr);
-        fGrammarResolver->putGrammar(gramDesc, fGrammar);
+              
+        fGrammarResolver->orphanGrammar(XMLUni::fgDTDEntityString);
+        ((XMLDTDDescription*) (fGrammar->getGrammarDescription()))->setRootName(sysIdStr);
+        fGrammarResolver->putGrammar(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 e61969cc5aa33168eaa6023a533f597b16e1c930..23563d48dd7e52f4244d2cca48922d339bc9e473 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -217,9 +217,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                         //if schema, see if we should lax or skip the validation of this attribute
                         if (anyAttributeValidation(attWildCard, uriId, skipThisOne, laxThisOne)) {
 
-                            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(getURIText(uriId));
-                            Janitor<XMLSchemaDescription> janName(gramDesc);
-                            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+                            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(getURIText(uriId));
                             if (sGrammar && sGrammar->getGrammarType() == Grammar::SchemaGrammarType) {
                                 RefHashTableOf<XMLAttDef>* attRegistry = sGrammar->getAttributeDeclRegistry();
                                 if (attRegistry) {
@@ -457,7 +455,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
         //  to the handler. We reuse its existing elements but expand it as
         //  required.
         XMLAttr* curAttr;
-
+        
         // check for duplicate namespace attributes:
         // by checking for qualified names with the same local part and with prefixes 
         // which have been bound to namespace names that are identical. 
@@ -475,7 +473,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                 }
             }  
         }
-
+        
         if (retCount >= curAttListSize)
         {
             curAttr = new (fMemoryManager) XMLAttr
@@ -889,8 +887,7 @@ void IGXMLScanner::scanReset(const InputSource& src)
     fGrammarResolver->useCachedGrammarInParse(fUseCachedGrammar);
 
     fDTDGrammar = new (fGrammarPoolMemoryManager) DTDGrammar(fGrammarPoolMemoryManager);
-    XMLDTDDescription* gramDesc = fGrammarResolver->getGrammarPool()->createDTDDescription(XMLUni::fgDTDEntityString);
-    fGrammarResolver->putGrammar(gramDesc, fDTDGrammar);
+    fGrammarResolver->putGrammar(fDTDGrammar);
     fGrammar = fDTDGrammar;
     fGrammarType = fGrammar->getGrammarType();
     fRootGrammar = 0;
@@ -1316,9 +1313,7 @@ void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
 
 void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) {
 
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uri);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* grammar = fGrammarResolver->getGrammar(uri);
 
     if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
         XSDDOMParser parser(0, fMemoryManager, 0);
@@ -1420,9 +1415,7 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
                         fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri);
                     }
 
-                    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newUri);
-                    Janitor<XMLSchemaDescription> janName(gramDesc);
-                    grammar = fGrammarResolver->getGrammar(gramDesc);
+                    grammar = fGrammarResolver->getGrammar(newUri);
                 }
 
                 if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
@@ -1447,6 +1440,10 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
                     }
 
                     grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);
+                    XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription();
+                    gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+                    gramDesc->setLocationHints(srcToFill->getSystemId());
+
                     TraverseSchema traverseSchema
                     (
                         root
@@ -1617,7 +1614,11 @@ Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src,
         DOMElement* root = document->getDocumentElement();// This is what we pass to TraverserSchema
         if (root != 0)
         {
-            SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);
+            SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);                   
+            XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription();
+            gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+            gramDesc->setLocationHints(src.getSystemId());
+
             TraverseSchema traverseSchema
             (
                 root
@@ -2627,9 +2628,7 @@ IGXMLScanner::scanEntityRef(  const   bool    inAttVal
 
 bool IGXMLScanner::switchGrammar(const XMLCh* const newGrammarNameSpace)
 {
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newGrammarNameSpace);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* tempGrammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* tempGrammar = fGrammarResolver->getGrammar(newGrammarNameSpace);
 
     if (!tempGrammar) {
         // This is a case where namespaces is on with a DTD grammar.
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 2055ae9e88c292c87828ae98ab4382b1bc226c43..551f2fe9361cec7d92eddd301accd23629d1acd0 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -2055,9 +2055,7 @@ SGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                         //if schema, see if we should lax or skip the validation of this attribute
                         if (anyAttributeValidation(attWildCard, uriId, skipThisOne, laxThisOne)) {
 
-                            XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(getURIText(uriId));
-                            Janitor<XMLSchemaDescription> janName(gramDesc);
-                            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(gramDesc);
+                            SchemaGrammar* sGrammar = (SchemaGrammar*) fGrammarResolver->getGrammar(getURIText(uriId));
                             if (sGrammar && sGrammar->getGrammarType() == Grammar::SchemaGrammarType) {
                                 RefHashTableOf<XMLAttDef>* attRegistry = sGrammar->getAttributeDeclRegistry();
                                 if (attRegistry) {
@@ -3064,9 +3062,7 @@ void SGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
 
 void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) {
 
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(uri);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* grammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* grammar = fGrammarResolver->getGrammar(uri);
 
     if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
         XSDDOMParser parser(0, fMemoryManager, 0);
@@ -3168,9 +3164,7 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
                         fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri);
                     }
 
-                    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newUri);
-                    Janitor<XMLSchemaDescription> janName(gramDesc);
-                    grammar = fGrammarResolver->getGrammar(gramDesc);
+                    grammar = fGrammarResolver->getGrammar(newUri);
                 }
 
                 if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
@@ -3183,6 +3177,9 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
                     }
 
                     grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);
+                    XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription();
+                    gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+                    gramDesc->setLocationHints(srcToFill->getSystemId());
 
                     TraverseSchema traverseSchema
                     (
@@ -3336,6 +3333,10 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src,
         if (root != 0)
         {
             SchemaGrammar* grammar = new (fGrammarPoolMemoryManager) SchemaGrammar(fGrammarPoolMemoryManager);
+            XMLSchemaDescription* gramDesc = (XMLSchemaDescription*) grammar->getGrammarDescription();
+            gramDesc->setContextType(XMLSchemaDescription::CONTEXT_PREPARSE);
+            gramDesc->setLocationHints(src.getSystemId());
+
             TraverseSchema traverseSchema
             (
                 root
@@ -3989,9 +3990,7 @@ SGXMLScanner::scanEntityRef(  const   bool    inAttVal
 
 bool SGXMLScanner::switchGrammar(const XMLCh* const newGrammarNameSpace)
 {
-    XMLSchemaDescription* gramDesc = fGrammarResolver->getGrammarPool()->createSchemaDescription(newGrammarNameSpace);
-    Janitor<XMLSchemaDescription> janName(gramDesc);
-    Grammar* tempGrammar = fGrammarResolver->getGrammar(gramDesc);
+    Grammar* tempGrammar = fGrammarResolver->getGrammar(newGrammarNameSpace);
 
     if (!tempGrammar) {
         tempGrammar = fSchemaGrammar;
diff --git a/src/xercesc/internal/XMLGrammarPoolImpl.cpp b/src/xercesc/internal/XMLGrammarPoolImpl.cpp
index eecf5430a314cd92a3bbfa2116ff45de7958b778..4a9eb663924b02fd5242bc10b452f882e74b346a 100644
--- a/src/xercesc/internal/XMLGrammarPoolImpl.cpp
+++ b/src/xercesc/internal/XMLGrammarPoolImpl.cpp
@@ -56,6 +56,11 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/07/31 17:05:03  peiyongz
+ * Grammar embed Grammar Description
+ * using getGrammar(URI)
+ * update GrammarDescription info
+ *
  * Revision 1.2  2003/06/20 22:19:30  peiyongz
  * Stateless Grammar Pool :: Part I
  *
@@ -90,26 +95,25 @@ XMLGrammarPoolImpl::XMLGrammarPoolImpl(MemoryManager* const memMgr)
 :XMLGrammarPool(memMgr)
 ,fGrammarRegistry(0)
 {
-    fGrammarRegistry = new (memMgr) RefHashTableOf<GrammarEntry>(29, true, memMgr);
+    fGrammarRegistry = new (memMgr) RefHashTableOf<Grammar>(29, true, memMgr);
 }
 
 // -----------------------------------------------------------------------
 // Implementation of Grammar Pool Interface 
 // -----------------------------------------------------------------------
-void XMLGrammarPoolImpl::cacheGrammar(XMLGrammarDescription* const gramDesc
-                                    , Grammar* const               gramToCache )
+void XMLGrammarPoolImpl::cacheGrammar(Grammar* const               gramToCache )
 {
-    if (!gramDesc || !gramToCache )
+    if (!gramToCache )
         return;
 
-    const XMLCh* grammarKey = gramDesc->getGrammarKey();
+    const XMLCh* grammarKey = gramToCache->getGrammarDescription()->getGrammarKey();
 
     if (fGrammarRegistry->containsKey(grammarKey)) 
     {
         ThrowXML(RuntimeException, XMLExcepts::GC_ExistingGrammar);
     }
 
-    fGrammarRegistry->put((void*) grammarKey, new (getMemoryManager()) GrammarEntry(gramDesc, gramToCache)); 
+    fGrammarRegistry->put((void*) grammarKey, gramToCache); 
 
 }
 
@@ -118,32 +122,16 @@ Grammar* XMLGrammarPoolImpl::retrieveGrammar(XMLGrammarDescription* const gramDe
     if (!gramDesc)
         return 0;
 
-    GrammarEntry* gramEntry = fGrammarRegistry->get(gramDesc->getGrammarKey());
+    /***
+     * This implementation simply use GrammarKey
+     */
+    return fGrammarRegistry->get(gramDesc->getGrammarKey());
     
-    if (!gramEntry)
-        return 0;
-
-    return gramEntry->getGrammar();
 }
 
-Grammar* XMLGrammarPoolImpl::orphanGrammar(XMLGrammarDescription* const gramDesc)
+Grammar* XMLGrammarPoolImpl::orphanGrammar(const XMLCh* const nameSpaceKey)
 {
-    if (!gramDesc)
-        return 0;
-
-    GrammarEntry* gramEntry = fGrammarRegistry->orphanKey(gramDesc->getGrammarKey()); 
-
-    if (!gramEntry)
-        return 0;
-
-    /***
-     * Delete the grammarEntry but don't delete the grammar
-     */
-    Grammar* theGram = gramEntry->getGrammar();
-    gramEntry->nullGrammar();
-    delete gramEntry;
-
-    return theGram;
+    return fGrammarRegistry->orphanKey(nameSpaceKey); 
 }
 
 void XMLGrammarPoolImpl::clear()
@@ -184,30 +172,4 @@ XMLSchemaDescription* XMLGrammarPoolImpl::createSchemaDescription(const XMLCh* c
 	return new (getMemoryManager()) XMLSchemaDescriptionImpl(targetNamespace, getMemoryManager()); 
 }
 
-// ---------------------------------------------------------------------------
-//  GrammarEntry: constructor and destructor
-// ---------------------------------------------------------------------------
-GrammarEntry::GrammarEntry(XMLGrammarDescription* const  gramDesc
-                         , Grammar* const                grammar)
-:fDescription(gramDesc)
-,fGrammar(grammar)
-{
-}
-
-/**
- *
- * A GrammarEntry is desctructed in two ways
- *    . from clear(), we need to destroy the GrammarDescription and Grammar
- *    . from orphanGrammar()
- *
- */
-GrammarEntry::~GrammarEntry()
-{
-    if (fDescription)
-        delete fDescription;
-
-    if (fGrammar)
-        delete fGrammar;
-}
-
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/internal/XMLGrammarPoolImpl.hpp b/src/xercesc/internal/XMLGrammarPoolImpl.hpp
index 29b98910c04445cab1f3ba1ae09b32ac4c5461e8..668e7dad90e6691e58caa6a4adb44244a46b1902 100644
--- a/src/xercesc/internal/XMLGrammarPoolImpl.hpp
+++ b/src/xercesc/internal/XMLGrammarPoolImpl.hpp
@@ -56,6 +56,11 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/07/31 17:05:03  peiyongz
+ * Grammar embed Grammar Description
+ * using getGrammar(URI)
+ * update GrammarDescription info
+ *
  * Revision 1.2  2003/06/23 21:06:21  peiyongz
  * to solve unresolved symbol on Solaris
  *
@@ -74,8 +79,6 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
-class GrammarEntry;
-
 class XMLUTIL_EXPORT XMLGrammarPoolImpl : public XMLGrammarPool
 {
 public :
@@ -97,12 +100,10 @@ public :
     /**
       * cacheGrammar
       *
-      * @param gramDesc:    the grammar description
       * @param gramToCache: the Grammar to be cached in the grammar pool
 	  *
       */
-    virtual void           cacheGrammar(XMLGrammarDescription* const gramDesc 
-                                      , Grammar* const               gramToCache);
+    virtual void           cacheGrammar(Grammar* const               gramToCache);
     
 
     /**
@@ -120,11 +121,10 @@ public :
       *
 	  * grammar removed from the grammar pool and owned by the caller
       *
-      * @param gramDesc: the Grammar Description used to search for grammar
-	  *                  cached in the grammar pool
+      * @param nameSpaceKey: Key sed to search for grammar in the grammar pool
 	  *
       */
-    virtual Grammar*       orphanGrammar(XMLGrammarDescription* const);  
+    virtual Grammar*       orphanGrammar(const XMLCh* const nameSpaceKey);  
 
     /**
       * clear
@@ -196,56 +196,10 @@ private:
 	//    container
     //
     // -----------------------------------------------------------------------
-    RefHashTableOf<GrammarEntry>* fGrammarRegistry; 
+    RefHashTableOf<Grammar>* fGrammarRegistry; 
 
 };
 
-/**
- * Helper class, ought to be nested class
- */
-class GrammarEntry : public XMemory
-{
-public:
-    GrammarEntry(XMLGrammarDescription* const  gramDesc
-               , Grammar* const                grammar);
-
-    ~GrammarEntry();
-
-    inline XMLGrammarDescription*      getDescription() const;
-
-    inline Grammar*                    getGrammar() const;
-
-    inline void                        nullGrammar();
-
-    inline void                        nullDescription();
-
-private:
-
-    XMLGrammarDescription*     fDescription;
-    Grammar*                   fGrammar;
-
-};
-
-inline XMLGrammarDescription* GrammarEntry::getDescription() const
-{
-    return fDescription;
-}
-
-inline Grammar* GrammarEntry::getGrammar() const
-{
-    return fGrammar;
-}
-
-inline void GrammarEntry::nullGrammar()
-{
-    fGrammar = 0;
-}
-
-inline void GrammarEntry::nullDescription()
-{
-    fDescription = 0;
-}
-
 XERCES_CPP_NAMESPACE_END
 
 #endif