diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
index cbc15858c96a71741d84ae5589227f501773f0c2..341d6ded76c8de779b15f648e734a63e1a08ba0d 100644
--- a/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
+++ b/src/xercesc/validators/schema/GeneralAttributeCheck.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.16  2003/11/12 20:35:31  peiyongz
+ * Stateless Grammar: ValidationContext
+ *
  * Revision 1.15  2003/10/20 15:57:22  knoaman
  * Fix multithreading problem.
  *
@@ -225,7 +228,7 @@ DatatypeValidator*                GeneralAttributeCheck::fAnyURIDV = 0;
 // ---------------------------------------------------------------------------
 GeneralAttributeCheck::GeneralAttributeCheck(MemoryManager* const manager)
     : fMemoryManager(manager)
-    , fIDRefList(0)
+    , fValidationContext(0)
     , fIDValidator(manager)
 {
     mapElements();
@@ -417,7 +420,7 @@ GeneralAttributeCheck::checkAttributes(const DOMElement* const elem,
                     const XMLCh* attrVal = attribute->getNodeValue();
 
                     try {
-                        dv->validate(attrVal);
+                        dv->validate(attrVal, fValidationContext);
                     }
                     catch(const XMLException& excep) {
                         schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
@@ -550,17 +553,16 @@ void GeneralAttributeCheck::validate(const DOMElement* const elem,
         dv = fAnyURIDV;
         break;
     case DV_ID:
-        if (fIDRefList) {
-
+        if (fValidationContext)
+        {
             dv = &fIDValidator;
-            ((IDDatatypeValidator*) dv)->setIDRefList(fIDRefList);
         }
         break;
     }
 
     if (dv) {
         try {
-            dv->validate(attValue);
+            dv->validate(attValue, fValidationContext);
         }
         catch(const XMLException& excep) {
             schema->reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
diff --git a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
index 25c5ff486366e46ac0367102d5f50b80df4fe3d0..a1b320214c282d248732e4d0c3c75e368059ca8b 100644
--- a/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
+++ b/src/xercesc/validators/schema/GeneralAttributeCheck.hpp
@@ -72,6 +72,7 @@
 #include <xercesc/util/RefHashTableOf.hpp>
 #include <xercesc/util/ValueHashTableOf.hpp>
 #include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
+#include <xercesc/framework/ValidationContext.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -228,8 +229,12 @@ public:
     // -----------------------------------------------------------------------
     //  Setter methods
     // -----------------------------------------------------------------------
+
+    //deprecated
     void setIDRefList(RefHashTableOf<XMLRefInfo>* const refList);
 
+    inline void setValidationContext(ValidationContext* const);
+
     // -----------------------------------------------------------------------
     //  Validation methods
     // -----------------------------------------------------------------------
@@ -284,7 +289,7 @@ private:
     static unsigned short                    fgElemAttTable[E_Count][A_Count];
     static const XMLCh*                      fAttNames[A_Count];
     MemoryManager*                           fMemoryManager;
-    RefHashTableOf<XMLRefInfo>*              fIDRefList;
+    ValidationContext*                       fValidationContext;
     IDDatatypeValidator                      fIDValidator;
 };
 
@@ -301,10 +306,15 @@ GeneralAttributeCheck::getFacetId(const XMLCh* const facetName) {
 // ---------------------------------------------------------------------------
 //  GeneralAttributeCheck: Setter methods
 // ---------------------------------------------------------------------------
+inline void GeneralAttributeCheck::setValidationContext(ValidationContext* const newValidationContext)
+{
+    fValidationContext = newValidationContext;
+}
+
 inline void
 GeneralAttributeCheck::setIDRefList(RefHashTableOf<XMLRefInfo>* const refList) {
 
-    fIDRefList = refList;
+    fValidationContext->setIdRefList(refList);
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/validators/schema/SchemaGrammar.cpp b/src/xercesc/validators/schema/SchemaGrammar.cpp
index 11e080814348927fe37a2ea098dfbacf3c80c57d..5b6bb71637ef795fda87971b3475d41810074b88 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.cpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.17  2003/11/12 20:35:31  peiyongz
+ * Stateless Grammar: ValidationContext
+ *
  * Revision 1.16  2003/11/11 22:48:13  knoaman
  * Serialization of XSAnnotation.
  *
@@ -156,6 +159,7 @@
 #include <xercesc/framework/psvi/XSAnnotation.hpp>
 
 #include <xercesc/internal/XTemplateSerializer.hpp>
+#include <xercesc/internal/ValidationContextImpl.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -174,7 +178,7 @@ SchemaGrammar::SchemaGrammar(MemoryManager* const manager) :
     , fAttGroupInfoRegistry(0)
     , fNamespaceScope(0)
     , fValidSubstitutionGroups(0)
-    , fIDRefList(0)
+    , fValidationContext(0)
     , fMemoryManager(manager)
     , fValidated(false)
     , fDatatypeRegistry(manager)
@@ -195,7 +199,7 @@ SchemaGrammar::SchemaGrammar(MemoryManager* const manager) :
         // fElemNonDeclPool = new (fMemoryManager) RefHash3KeysIdPool<SchemaElementDecl>(29, true, 128, fMemoryManager);
         fGroupElemDeclPool = new (fMemoryManager) RefHash3KeysIdPool<SchemaElementDecl>(109, false, 128, fMemoryManager);
         fNotationDeclPool = new (fMemoryManager) NameIdPool<XMLNotationDecl>(109, 128, fMemoryManager);
-        fIDRefList = new (fMemoryManager) RefHashTableOf<XMLRefInfo>(29, fMemoryManager);
+        fValidationContext = new (fMemoryManager) ValidationContextImpl(fMemoryManager);
         fDatatypeRegistry.expandRegistryToFullSchemaSet();
 
         //REVISIT: use grammarPool to create
@@ -327,7 +331,7 @@ void SchemaGrammar::cleanUp()
     delete fAttGroupInfoRegistry;
     delete fNamespaceScope;
     delete fValidSubstitutionGroups;
-    delete fIDRefList;
+    delete fValidationContext;
     delete fGramDesc;
     delete fAnnotations;
 }
@@ -373,7 +377,8 @@ void SchemaGrammar::serialize(XSerializeEngine& serEng)
 {
 
     /***
-     * don't serialize NamespaceScope* fNamespaceScope;
+     * don't serialize NamespaceScope*    fNamespaceScope;
+     *                 ValidationContext* fValidationContext;
      ***/
 
     Grammar::serialize(serEng);
@@ -414,8 +419,6 @@ void SchemaGrammar::serialize(XSerializeEngine& serEng)
         XTemplateSerializer::storeObject(fComplexTypeRegistry, serEng);
         XTemplateSerializer::storeObject(fGroupInfoRegistry, serEng);
         XTemplateSerializer::storeObject(fAttGroupInfoRegistry, serEng);
-        //fIDRefList todo: tobe removed
-        XTemplateSerializer::storeObject(fIDRefList, serEng);
        
         /***
          * Serialize RefHash2KeysTableOf<ElemVector>*       fValidSubstitutionGroups;
@@ -467,8 +470,6 @@ void SchemaGrammar::serialize(XSerializeEngine& serEng)
         XTemplateSerializer::loadObject(&fComplexTypeRegistry, 29, true, serEng);
         XTemplateSerializer::loadObject(&fGroupInfoRegistry, 29, true, serEng);
         XTemplateSerializer::loadObject(&fAttGroupInfoRegistry, 29, true, serEng);
-        //todo: fIDRefList to be removed
-        XTemplateSerializer::loadObject(&fIDRefList, 29, true, serEng);
        
         /***
          * Deserialize RefHash2KeysTableOf<ElemVector>*       fValidSubstitutionGroups;
diff --git a/src/xercesc/validators/schema/SchemaGrammar.hpp b/src/xercesc/validators/schema/SchemaGrammar.hpp
index f7ccb3f9f1e8b5ff209b4c9f1028d8e5fadc06dd..ca4e56f81e72fc3d1ce5593f79db6965b34eebd4 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.hpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.12  2003/11/12 20:35:31  peiyongz
+ * Stateless Grammar: ValidationContext
+ *
  * Revision 1.11  2003/11/06 19:28:11  knoaman
  * PSVI support for annotations.
  *
@@ -146,6 +149,7 @@
 #include <xercesc/validators/datatype/IDDatatypeValidator.hpp>
 #include <xercesc/validators/datatype/DatatypeValidatorFactory.hpp>
 #include <xercesc/framework/XMLSchemaDescription.hpp>
+#include <xercesc/framework/ValidationContext.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -283,8 +287,12 @@ public:
     DatatypeValidatorFactory* getDatatypeRegistry();
     NamespaceScope* getNamespaceScope() const;
     RefHash2KeysTableOf<ElemVector>* getValidSubstitutionGroups() const;
+
+    //deprecated
     RefHashTableOf<XMLRefInfo>* getIDRefList() const;
 
+    ValidationContext*          getValidationContext() const;
+
     // -----------------------------------------------------------------------
     //  Setter methods
     // -----------------------------------------------------------------------
@@ -424,7 +432,7 @@ private:
     RefHashTableOf<XercesAttGroupInfo>*    fAttGroupInfoRegistry;
     NamespaceScope*                        fNamespaceScope;
     RefHash2KeysTableOf<ElemVector>*       fValidSubstitutionGroups;
-    RefHashTableOf<XMLRefInfo>*            fIDRefList;
+    ValidationContext*                     fValidationContext;
     MemoryManager*                         fMemoryManager;
     bool                                   fValidated;
     DatatypeValidatorFactory               fDatatypeRegistry;
@@ -483,7 +491,12 @@ SchemaGrammar::getValidSubstitutionGroups() const {
 
 inline RefHashTableOf<XMLRefInfo>* SchemaGrammar::getIDRefList() const {
 
-    return fIDRefList;
+    return fValidationContext->getIdRefList();
+}
+
+inline ValidationContext* SchemaGrammar::getValidationContext() const {
+
+    return fValidationContext;
 }
 
 inline XMLGrammarDescription* SchemaGrammar::getGrammarDescription() const
diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index 029142633e0106130be487641bf635bea726ed76..be025613c882a59e1447a1c4e1234ac7080ade54 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.42  2003/11/12 20:35:31  peiyongz
+ * Stateless Grammar: ValidationContext
+ *
  * Revision 1.41  2003/11/10 21:56:54  neilg
  * make internal code use the new, stateless, method of traversing attribute lists
  *
@@ -421,68 +424,7 @@ int SchemaValidator::checkContent (XMLElementDecl* const elemDecl
 
                     DatatypeValidator::ValidatorType eleDefDVType = fCurrentDatatypeValidator->getType();
 
-                    // set up the entitydeclpool in ENTITYDatatypeValidator
-                    // and the idreflist in ID/IDREFDatatypeValidator
-                    if (eleDefDVType == DatatypeValidator::List) {
-                        DatatypeValidator* itemDTV = ((ListDatatypeValidator*)fCurrentDatatypeValidator)->getItemTypeDTV();
-                        DatatypeValidator::ValidatorType itemDTVType = itemDTV->getType();
-                        if (itemDTVType == DatatypeValidator::ENTITY)
-                            ((ENTITYDatatypeValidator*)itemDTV)->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                        else if (itemDTVType == DatatypeValidator::ID)
-                            ((IDDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
-                        else if (itemDTVType == DatatypeValidator::IDREF) {
-                            ((IDREFDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
-                        }
-                        else if (itemDTVType == DatatypeValidator::Union) {
-                            RefVectorOf<DatatypeValidator>* memberDTV = ((UnionDatatypeValidator*)itemDTV)->getMemberTypeValidators();
-                            unsigned int memberTypeNumber = memberDTV->size();
-                            for ( unsigned int memberIndex = 0; memberIndex < memberTypeNumber; ++memberIndex)
-                            {
-                                DatatypeValidator::ValidatorType memberDTVType = memberDTV->elementAt(memberIndex)->getType();
-                                if (memberDTVType == DatatypeValidator::ENTITY)
-                                    ((ENTITYDatatypeValidator*)memberDTV->elementAt(memberIndex))->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                                else if (memberDTVType == DatatypeValidator::ID)
-                                    ((IDDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
-                                else if (memberDTVType == DatatypeValidator::IDREF) {
-                                    ((IDREFDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
-                                }
-                            }
-                        }
-                    }
-                    else if (eleDefDVType == DatatypeValidator::Union) {
-                        RefVectorOf<DatatypeValidator>* memberDTV = ((UnionDatatypeValidator*)fCurrentDatatypeValidator)->getMemberTypeValidators();
-                        unsigned int memberTypeNumber = memberDTV->size();
-                        for ( unsigned int memberIndex = 0; memberIndex < memberTypeNumber; ++memberIndex)
-                        {
-                            DatatypeValidator::ValidatorType memberDTVType = memberDTV->elementAt(memberIndex)->getType();
-                            if (memberDTVType == DatatypeValidator::ENTITY)
-                                ((ENTITYDatatypeValidator*)memberDTV->elementAt(memberIndex))->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                            else if (memberDTVType == DatatypeValidator::ID)
-                                ((IDDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
-                            else if (memberDTVType == DatatypeValidator::IDREF) {
-                                ((IDREFDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
-                            }
-                            else if (memberDTVType == DatatypeValidator::List) {
-                                DatatypeValidator* itemDTV = ((ListDatatypeValidator*)memberDTV->elementAt(memberIndex))->getItemTypeDTV();
-                                DatatypeValidator::ValidatorType itemDTVType = itemDTV->getType();
-                                if (itemDTVType == DatatypeValidator::ENTITY)
-                                    ((ENTITYDatatypeValidator*)itemDTV)->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                                else if (itemDTVType == DatatypeValidator::ID)
-                                    ((IDDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
-                                else if (itemDTVType == DatatypeValidator::IDREF) {
-                                    ((IDREFDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
-                                }
-                            }
-                        }
-                    }
-                    else if (eleDefDVType == DatatypeValidator::ENTITY)
-                        ((ENTITYDatatypeValidator*)fCurrentDatatypeValidator)->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                    else if (eleDefDVType == DatatypeValidator::ID)
-                        ((IDDatatypeValidator*)fCurrentDatatypeValidator)->setIDRefList(getScanner()->getIDRefList());
-                    else if (eleDefDVType == DatatypeValidator::IDREF) {
-                        ((IDREFDatatypeValidator*)fCurrentDatatypeValidator)->setIDRefList(getScanner()->getIDRefList());
-                    }
-                    else if (eleDefDVType == DatatypeValidator::NOTATION)
+                    if (eleDefDVType == DatatypeValidator::NOTATION)
                     {
                         // if notation, need to bind URI to notation first
                         if (!fNotationBuf)
@@ -524,7 +466,8 @@ int SchemaValidator::checkContent (XMLElementDecl* const elemDecl
                             // complex type (if any)
                             if ((fCurrentDatatypeValidator != ((SchemaElementDecl*)elemDecl)->getDatatypeValidator())
                                     && (!fTypeStack->peek() || (fCurrentDatatypeValidator != fTypeStack->peek()->getDatatypeValidator())))
-                                fCurrentDatatypeValidator->validate(elemDefaultValue);
+                                fCurrentDatatypeValidator->validate(elemDefaultValue
+                                                                  , getScanner()->getValidationContext());
 
                         }
                         else {
@@ -543,21 +486,24 @@ int SchemaValidator::checkContent (XMLElementDecl* const elemDecl
                                 valid = false;
                             }
                             else
-                                fCurrentDatatypeValidator->validate(value);
+                                fCurrentDatatypeValidator->validate(value
+                                                                  , getScanner()->getValidationContext());
                         }
                     }
                     else {
                         // no default value, then check nillable
                         if (XMLString::equals(value, XMLUni::fgZeroLenString)) {
                             if ((((SchemaElementDecl*)elemDecl)->getMiscFlags() & SchemaSymbols::XSD_NILLABLE) == 0)
-                                fCurrentDatatypeValidator->validate(value);
+                                fCurrentDatatypeValidator->validate(value
+                                                                  , getScanner()->getValidationContext());
                         }
                         else if (fNil) {
                             emitError(XMLValid::NilAttrNotEmpty, elemDecl->getFullName());
                             valid = false;
                         }
                         else
-                            fCurrentDatatypeValidator->validate(value);
+                            fCurrentDatatypeValidator->validate(value
+                                                              , getScanner()->getValidationContext());
                     }
                 }
             }
@@ -635,6 +581,9 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
                                        , const XMLElementDecl* elemDecl)
 {
 
+    //turn on IdRefList checking
+    getScanner()->getValidationContext()->toCheckIdRefList(true);
+
     //
     //  Get quick refs to lot of the stuff in the passed objects in
     //  order to simplify the code below, which will reference them very
@@ -688,18 +637,14 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
             if (attDefDVType == DatatypeValidator::List) {
                 DatatypeValidator* itemDTV = ((ListDatatypeValidator*)attDefDV)->getItemTypeDTV();
                 DatatypeValidator::ValidatorType itemDTVType = itemDTV->getType();
-                if (itemDTVType == DatatypeValidator::ENTITY)
-                    ((ENTITYDatatypeValidator*)itemDTV)->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                else if (itemDTVType == DatatypeValidator::ID) {
-                    ((IDDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
+                if (itemDTVType == DatatypeValidator::ID) {
                     thisIsAnId = true;
                 }
                 else if (itemDTVType == DatatypeValidator::IDREF) {
                     // if in prevalidatoin, do not add attDef to IDREFList
                     if (preValidation)
-                        ((IDREFDatatypeValidator*)itemDTV)->setIDRefList(0);
-                    else
-                        ((IDREFDatatypeValidator*)itemDTV)->setIDRefList(getScanner()->getIDRefList());
+                        //todo: when to setIdRefList back to non-null
+                        getScanner()->getValidationContext()->toCheckIdRefList(false);
                 }
             }
             else if (attDefDVType == DatatypeValidator::Union) {
@@ -708,33 +653,24 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
                 for ( unsigned int memberIndex = 0; memberIndex < memberTypeNumber; ++memberIndex)
                 {
                     DatatypeValidator::ValidatorType memberDTVType = memberDTV->elementAt(memberIndex)->getType();
-                    if (memberDTVType == DatatypeValidator::ENTITY)
-                        ((ENTITYDatatypeValidator*)memberDTV->elementAt(memberIndex))->setEntityDeclPool(getScanner()->getEntityDeclPool());
-                    else if (memberDTVType == DatatypeValidator::ID) {
-                        ((IDDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
+                    if (memberDTVType == DatatypeValidator::ID) {
                         thisIsAnId = true;
                     }
                     else if (memberDTVType == DatatypeValidator::IDREF) {
                         // if in prevalidatoin, do not add attDef to IDREFList
                         if (preValidation)
-                            ((IDREFDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(0);
-                        else
-                            ((IDREFDatatypeValidator*)memberDTV->elementAt(memberIndex))->setIDRefList(getScanner()->getIDRefList());
+                            getScanner()->getValidationContext()->toCheckIdRefList(false);
+
                     }
                 }
             }
-            else if (attDefDVType == DatatypeValidator::ENTITY)
-                ((ENTITYDatatypeValidator*)attDefDV)->setEntityDeclPool(getScanner()->getEntityDeclPool());
             else if (attDefDVType == DatatypeValidator::ID) {
-                ((IDDatatypeValidator*)attDefDV)->setIDRefList(getScanner()->getIDRefList());
                 thisIsAnId = true;
             }
             else if (attDefDVType == DatatypeValidator::IDREF) {
                 // if in prevalidatoin, do not add attDef to IDREFList
                 if (preValidation)
-                    ((IDREFDatatypeValidator*)attDefDV)->setIDRefList(0);
-                else
-                    ((IDREFDatatypeValidator*)attDefDV)->setIDRefList(getScanner()->getIDRefList());
+                    getScanner()->getValidationContext()->toCheckIdRefList(false);
             }
 
             // now validate the attribute value
@@ -756,7 +692,8 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
                 notationBuf.append(chColon);
                 notationBuf.append(&attrValue[colonPos + 1]);
 
-                attDefDV->validate(notationBuf.getRawBuffer());
+                attDefDV->validate(notationBuf.getRawBuffer()
+                                 , getScanner()->getValidationContext());
             }
             else {
                 if (thisIsAnId) {
@@ -771,7 +708,8 @@ void SchemaValidator::validateAttrValue (const XMLAttDef*      attDef
                     else
                         fSeenId = true;
                 }
-                attDefDV->validate(attrValue);
+                attDefDV->validate(attrValue
+                                 , getScanner()->getValidationContext());
             }
         }
         catch (XMLException& idve) {
@@ -1088,6 +1026,7 @@ void SchemaValidator::preContentValidation(bool reuseGrammar,
             if (curElem.hasAttDefs()) {
                 XMLAttDefList& attDefList = curElem.getAttDefList();
                 bool seenId = false;
+
                 for(unsigned int i=0; i<attDefList.getAttDefCount(); i++)
                 {
                     const XMLAttDef& curAttDef = attDefList.getAttDef(i);
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index bd66a1e84cb41b5b1db38705261b97c30fe9b647..7864b1b7fdfed4af557d7da12d34ba3dbdb7a953 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -392,7 +392,7 @@ void TraverseSchema::preprocessSchema(DOMElement* const schemaRoot,
     gramDesc->setTargetNamespace(fTargetNSURIString);
 
     fGrammarResolver->putGrammar(fSchemaGrammar);
-    fAttributeCheck.setIDRefList(fSchemaGrammar->getIDRefList());
+    fAttributeCheck.setValidationContext(fSchemaGrammar->getValidationContext());
 
     // Save current schema info
     SchemaInfo* currInfo = new (fMemoryManager) SchemaInfo(0, 0, 0, fTargetNSURI, fScopeCount,
@@ -1819,7 +1819,8 @@ TraverseSchema::traverseAny(const DOMElement* const elem) {
                 }
                 else {
                     try {
-                        anyURIDV->validate(tokenElem);
+                        anyURIDV->validate(tokenElem
+                                         , fSchemaGrammar->getValidationContext());
                     }
                     catch(const XMLException& excep) {
                         reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
@@ -2232,7 +2233,8 @@ void TraverseSchema::traverseAttributeDecl(const DOMElement* const elem,
     if (attType == XMLAttDef::Simple && dv && valueToCheck) {
 
         try {
-            dv->validate(valueToCheck);
+            dv->validate(valueToCheck
+                      , fSchemaGrammar->getValidationContext());
         }
         catch (const XMLException& excep) {
             reportSchemaError(elem, XMLUni::fgValidityDomain, XMLValid::DisplayErrorMessage, excep.getMessage());
@@ -2707,10 +2709,12 @@ QName* TraverseSchema::traverseElementDecl(const DOMElement* const elem,
 
         try {
             if(validator == 0) { // in this case validate according to xs:string
-                fDatatypeRegistry->getDatatypeValidator(SchemaSymbols::fgDT_STRING)->validate(deflt);
+                fDatatypeRegistry->getDatatypeValidator(SchemaSymbols::fgDT_STRING)->validate(deflt
+                                                                                            , fSchemaGrammar->getValidationContext());                    
             } else {
-                validator->validate(deflt);
-            }
+                validator->validate(deflt
+                                  , fSchemaGrammar->getValidationContext());
+             }
         }
         catch (const XMLException& excep) {
             reportSchemaError(elem, XMLUni::fgValidityDomain, XMLValid::DisplayErrorMessage, excep.getMessage());
@@ -4022,7 +4026,8 @@ SchemaAttDef* TraverseSchema::traverseAnyAttribute(const DOMElement* const elem)
             else {
 
                 try {
-                    anyURIDV->validate(token);
+                    anyURIDV->validate(token
+                                     , fSchemaGrammar->getValidationContext());
                 }
                 catch(const XMLException& excep) {
                     reportSchemaError(elem, XMLUni::fgXMLErrDomain, XMLErrs::DisplayErrorMessage, excep.getMessage());
@@ -5793,7 +5798,8 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem,
                     }
                     else {
                         try {
-                            attDV->validate(valueConstraint);
+                            attDV->validate(valueConstraint
+                                          , fSchemaGrammar->getValidationContext());
                         }
                         catch(const XMLException& excep) {
                             reportSchemaError(elem, XMLUni::fgValidityDomain, XMLValid::DisplayErrorMessage, excep.getMessage());
@@ -6701,7 +6707,8 @@ void TraverseSchema::restoreSchemaInfo(SchemaInfo* const toRestore,
         fComplexTypeRegistry = fSchemaGrammar->getComplexTypeRegistry();
         fValidSubstitutionGroups = fSchemaGrammar->getValidSubstitutionGroups();
         fNamespaceScope = fSchemaGrammar->getNamespaceScope();
-        fAttributeCheck.setIDRefList(fSchemaGrammar->getIDRefList());
+        fAttributeCheck.setValidationContext(fSchemaGrammar->getValidationContext());
+
     }
 
     fSchemaInfo = toRestore;