diff --git a/src/xercesc/validators/schema/SchemaGrammar.hpp b/src/xercesc/validators/schema/SchemaGrammar.hpp
index ca4e56f81e72fc3d1ce5593f79db6965b34eebd4..95bd487b01d2a87f558666404bd935b1873ea4fd 100644
--- a/src/xercesc/validators/schema/SchemaGrammar.hpp
+++ b/src/xercesc/validators/schema/SchemaGrammar.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2003/11/14 22:35:09  neilg
+ * changes in support of second phase of XSModel implementation; thanks to David Cargill
+ *
  * Revision 1.12  2003/11/12 20:35:31  peiyongz
  * Stateless Grammar: ValidationContext
  *
@@ -280,6 +283,7 @@ public:
     //  Getter methods
     // -----------------------------------------------------------------------
     RefHash3KeysIdPoolEnumerator<SchemaElementDecl> getElemEnumerator() const;
+    NameIdPoolEnumerator<XMLNotationDecl> getNotationEnumerator() const;
     RefHashTableOf<XMLAttDef>* getAttributeDeclRegistry() const;
     RefHashTableOf<ComplexTypeInfo>* getComplexTypeRegistry() const;
     RefHashTableOf<XercesGroupInfo>* getGroupInfoRegistry() const;
@@ -450,6 +454,12 @@ SchemaGrammar::getElemEnumerator() const
     return RefHash3KeysIdPoolEnumerator<SchemaElementDecl>(fElemDeclPool);
 }
 
+inline NameIdPoolEnumerator<XMLNotationDecl>
+SchemaGrammar::getNotationEnumerator() const
+{
+    return NameIdPoolEnumerator<XMLNotationDecl>(fNotationDeclPool);
+}
+
 inline RefHashTableOf<XMLAttDef>* SchemaGrammar::getAttributeDeclRegistry() const {
 
     return fAttributeDeclRegistry;
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index 9946797b2adcc7dfe2ca4980b7d46c4dca48e683..6873c96031d3f0a1aba20fb86d4e2bdf6fb040e8 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -4095,9 +4095,7 @@ void TraverseSchema::traverseKey(const DOMElement* const icElem,
     if (!fIdentityConstraintNames) {
         fIdentityConstraintNames = new (fMemoryManager) RefHash2KeysTableOf<IdentityConstraint>(29, (bool) false, fMemoryManager);
     }
-
-    if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
-
+    else if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
         reportSchemaError(icElem, XMLUni::fgXMLErrDomain, XMLErrs::IC_DuplicateDecl, name);
         return;
     }
@@ -4120,6 +4118,7 @@ void TraverseSchema::traverseKey(const DOMElement* const icElem,
     // Add key to element declaration
     // -----------------------------------------------------------------------
     elemDecl->addIdentityConstraint(icKey);
+    icKey->setNamespaceURI(fTargetNSURI);
     janKey.orphan();
 }
 
@@ -4156,8 +4155,7 @@ void TraverseSchema::traverseUnique(const DOMElement* const icElem,
     if (!fIdentityConstraintNames) {
         fIdentityConstraintNames = new (fGrammarPoolMemoryManager) RefHash2KeysTableOf<IdentityConstraint>(29, (bool) false, fGrammarPoolMemoryManager);
     }
-
-    if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
+    else if (fIdentityConstraintNames->containsKey(name, fTargetNSURI)) {
 
         reportSchemaError(icElem, XMLUni::fgXMLErrDomain, XMLErrs::IC_DuplicateDecl, name);
         return;
@@ -4181,6 +4179,7 @@ void TraverseSchema::traverseUnique(const DOMElement* const icElem,
     // Add identity cosntraints to element declaration
     // -----------------------------------------------------------------------
     elemDecl->addIdentityConstraint(icUnique);
+    icUnique->setNamespaceURI(fTargetNSURI);
     janUnique.orphan();
 }
 
@@ -4263,6 +4262,7 @@ void TraverseSchema::traverseKeyRef(const DOMElement* const icElem,
     else {
 
         elemDecl->addIdentityConstraint(icKeyRef);
+        icKeyRef->setNamespaceURI(fTargetNSURI);
         janKeyRef.orphan();
     }
 }
diff --git a/src/xercesc/validators/schema/identity/IdentityConstraint.cpp b/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
index 5defe271f23b3437317a8b1c63332f6a68f633f6..de3779163ae04b383f448b0ea05b25be95a25e44 100644
--- a/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
+++ b/src/xercesc/validators/schema/identity/IdentityConstraint.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.9  2003/11/14 22:35:09  neilg
+ * changes in support of second phase of XSModel implementation; thanks to David Cargill
+ *
  * Revision 1.8  2003/11/13 23:21:41  peiyongz
  * initSize
  *
@@ -212,7 +215,7 @@ void IdentityConstraint::serialize(XSerializeEngine& serEng)
         serEng.writeString(fElemName);
 
         serEng<<fSelector;
-
+        serEng<<fNamespaceURI;
         /***
          *
          * Serialize RefVectorOf<IC_Field>* fFields;
@@ -228,7 +231,7 @@ void IdentityConstraint::serialize(XSerializeEngine& serEng)
         serEng.readString(fElemName);
 
         serEng>>fSelector;
-
+        serEng>>fNamespaceURI;
         /***
          *
          * Deserialize RefVectorOf<IC_Field>* fFields;
diff --git a/src/xercesc/validators/schema/identity/IdentityConstraint.hpp b/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
index 5ab59a283e6e703c499f9c6dfe59a2dc6f6dbf17..34b990d56d5361510d76efaa0afe26f953ca29f1 100644
--- a/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
+++ b/src/xercesc/validators/schema/identity/IdentityConstraint.hpp
@@ -113,11 +113,13 @@ public:
     XMLCh*        getIdentityConstraintName() const;
     XMLCh*        getElementName() const;
     IC_Selector*  getSelector() const;
+    int           getNamespaceURI() const;
 
 	// -----------------------------------------------------------------------
     //  Setter methods
     // -----------------------------------------------------------------------
     void setSelector(IC_Selector* const selector);
+    void setNamespaceURI(int uri);
 
 	// -----------------------------------------------------------------------
     //  Access methods
@@ -176,6 +178,7 @@ private:
     IC_Selector*           fSelector;
     RefVectorOf<IC_Field>* fFields;
     MemoryManager*         fMemoryManager;
+    int                    fNamespaceURI;
 };
 
 
@@ -206,6 +209,19 @@ inline IC_Selector* IdentityConstraint::getSelector() const {
     return fSelector;
 }
 
+inline int IdentityConstraint::getNamespaceURI() const
+{
+    return fNamespaceURI;
+}
+
+// ---------------------------------------------------------------------------
+//  IdentityConstraint: Setter methods
+// ---------------------------------------------------------------------------
+inline void IdentityConstraint::setNamespaceURI(int uri)
+{
+    fNamespaceURI = uri;
+}
+
 // ---------------------------------------------------------------------------
 //  IdentityConstraint: Access methods
 // ---------------------------------------------------------------------------