diff --git a/src/xercesc/framework/psvi/XSAttributeUse.cpp b/src/xercesc/framework/psvi/XSAttributeUse.cpp
index e7a9ab9b5fbf81de0b42978b19b2599cbe7904a9..0346bdf3d382cc78531b43052d9b93462caa4dba 100644
--- a/src/xercesc/framework/psvi/XSAttributeUse.cpp
+++ b/src/xercesc/framework/psvi/XSAttributeUse.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/12/17 20:50:34  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.5  2003/11/21 17:19:30  knoaman
  * PSVI update.
  *
@@ -77,7 +80,6 @@
  */
 
 #include <xercesc/framework/psvi/XSAttributeUse.hpp>
-#include <xercesc/framework/psvi/XSAttributeDeclaration.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -88,6 +90,9 @@ XSAttributeUse::XSAttributeUse(XSAttributeDeclaration* const xsAttDecl,
                                XSModel* const xsModel,
                                MemoryManager* const manager)
     : XSObject(XSConstants::ATTRIBUTE_USE, xsModel, manager)
+    , fRequired(false)
+    , fConstraintType(XSConstants::VC_NONE)
+    , fConstraintValue(0)
     , fXSAttributeDeclaration(xsAttDecl)
 {
 }
@@ -97,25 +102,18 @@ XSAttributeUse::~XSAttributeUse()
 {
     // don't delete fXSAttributeDeclaration - deleted by XSModel
 }
-// XSAttributeUse methods
 
 
 // ---------------------------------------------------------------------------
-//  XSAttributeUse: access methods
+//  XSAttributeUse: helper methods
 // ---------------------------------------------------------------------------
-bool XSAttributeUse::getRequired() const
-{
-    return fXSAttributeDeclaration->getRequired();
-}
-
-XSConstants::VALUE_CONSTRAINT XSAttributeUse::getConstraintType() const
-{
-    return fXSAttributeDeclaration->getConstraintType();
-}
-
-const XMLCh *XSAttributeUse::getConstraintValue()
+void XSAttributeUse::set(const bool isRequired,
+                         XSConstants::VALUE_CONSTRAINT constraintType,
+                         const XMLCh* const constraintValue)
 {
-    return fXSAttributeDeclaration->getConstraintValue();
+    fRequired = isRequired;
+    fConstraintType = constraintType;
+    fConstraintValue = constraintValue;
 }
 
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/framework/psvi/XSAttributeUse.hpp b/src/xercesc/framework/psvi/XSAttributeUse.hpp
index 1b6ee04f2adc9ec00de8c9da5a732456f704352c..6cf7ddc8ee7ecf377597ffb75255ca6697dc39ab 100644
--- a/src/xercesc/framework/psvi/XSAttributeUse.hpp
+++ b/src/xercesc/framework/psvi/XSAttributeUse.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/12/17 20:50:34  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.5  2003/11/21 17:19:30  knoaman
  * PSVI update.
  *
@@ -160,6 +163,16 @@ public:
 
 private:
 
+    // set data
+    void set
+    (
+        const bool isRequired
+        , XSConstants::VALUE_CONSTRAINT constraintType
+        , const XMLCh* const constraintValue
+    );
+
+    friend class XSObjectFactory;
+    
     // -----------------------------------------------------------------------
     //  Unimplemented constructors and operators
     // -----------------------------------------------------------------------
@@ -171,7 +184,10 @@ protected:
     // -----------------------------------------------------------------------
     //  data members
     // -----------------------------------------------------------------------
-    XSAttributeDeclaration* fXSAttributeDeclaration;
+    bool                          fRequired;
+    XSConstants::VALUE_CONSTRAINT fConstraintType;   
+    const XMLCh*                  fConstraintValue;
+    XSAttributeDeclaration*       fXSAttributeDeclaration;
 };
 
 inline XSAttributeDeclaration *XSAttributeUse::getAttrDeclaration() const
@@ -179,6 +195,20 @@ inline XSAttributeDeclaration *XSAttributeUse::getAttrDeclaration() const
     return fXSAttributeDeclaration;
 }
 
+inline bool XSAttributeUse::getRequired() const
+{
+    return fRequired;
+}
+
+inline XSConstants::VALUE_CONSTRAINT XSAttributeUse::getConstraintType() const
+{
+    return fConstraintType;
+}
+
+const inline XMLCh *XSAttributeUse::getConstraintValue()
+{
+    return fConstraintValue;
+}
 
 XERCES_CPP_NAMESPACE_END
 
diff --git a/src/xercesc/internal/XSObjectFactory.cpp b/src/xercesc/internal/XSObjectFactory.cpp
index cb44934adf2a149eb60d3fddd63b669f11ebfe65..cd682b1edafcde1774a1110e3360f827c6d01876 100644
--- a/src/xercesc/internal/XSObjectFactory.cpp
+++ b/src/xercesc/internal/XSObjectFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.12  2003/12/17 20:50:35  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.11  2003/12/17 19:58:25  knoaman
  * Check for NULL when building XSParticle
  *
@@ -580,10 +583,17 @@ XSObjectFactory::addOrFind(ComplexTypeInfo* const typeInfo,
             SchemaAttDefList& attDefList = (SchemaAttDefList&) typeInfo->getAttDefList();
             for(unsigned int i=0; i<attCount; i++)
             {
+                XSAttributeDeclaration* xsAttDecl = 0;
                 SchemaAttDef& attDef = (SchemaAttDef&) attDefList.getAttDef(i);
-                XSAttributeDeclaration* xsAttDecl = addOrFind(&attDef, xsModel);
+
+                if (attDef.getBaseAttDecl())
+                    xsAttDecl = addOrFind(attDef.getBaseAttDecl(), xsModel);
+                else
+                    xsAttDecl = addOrFind(&attDef, xsModel);
+
                 XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel);
                 xsAttList->addElement(attUse);
+                processAttUse(&attDef, attUse);
             }
         }
 
@@ -678,10 +688,14 @@ XSWildcard*
 XSObjectFactory::createXSWildcard(SchemaAttDef* const attDef,
                                   XSModel* const xsModel)
 {
+    XSAnnotation* annot = (attDef->getBaseAttDecl())
+        ? getAnnotationFromModel(xsModel, attDef->getBaseAttDecl())
+        : getAnnotationFromModel(xsModel, attDef);
+
     XSWildcard* xsWildcard = new (fMemoryManager) XSWildcard
     (
         attDef
-        , getAnnotationFromModel(xsModel, attDef)
+        , annot
         , xsModel
         , fMemoryManager
     );
@@ -750,11 +764,19 @@ XSObjectFactory::createXSAttGroupDefinition(XercesAttGroupInfo* const attGroupIn
         xsAttList = new (fMemoryManager) RefVectorOf<XSAttributeUse>(attCount, false, fMemoryManager);
         for (unsigned int i=0; i < attCount; i++) 
         {
-            XSAttributeDeclaration* xsAttDecl = addOrFind(attGroupInfo->attributeAt(i), xsModel);
+            SchemaAttDef* attDef = attGroupInfo->attributeAt(i);
+            XSAttributeDeclaration* xsAttDecl = 0;
+
+            if (attDef->getBaseAttDecl())
+                xsAttDecl = addOrFind(attDef->getBaseAttDecl(), xsModel);
+            else
+                xsAttDecl = addOrFind(attDef, xsModel);
+
             if (xsAttDecl) // just for sanity
             {
-				XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel);
+                XSAttributeUse* attUse = createXSAttributeUse(xsAttDecl, xsModel);
                 xsAttList->addElement(attUse);
+                processAttUse(attDef, attUse);
             }
         }
     }
@@ -953,4 +975,27 @@ void XSObjectFactory::processFacets(DatatypeValidator* const dv,
     xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, patternList);
 }
 
+void XSObjectFactory::processAttUse(SchemaAttDef* const attDef,
+                                    XSAttributeUse* const xsAttUse)
+{
+    bool isRequired = false;
+    XSConstants::VALUE_CONSTRAINT constraintType = XSConstants::VC_NONE;
+    
+    if (attDef->getDefaultType() & XMLAttDef::Default)
+    {
+        constraintType = XSConstants::VC_DEFAULT;
+    }
+    else if (attDef->getDefaultType() & XMLAttDef::Fixed ||
+             attDef->getDefaultType() & XMLAttDef::Required_And_Fixed)
+    {
+        constraintType = XSConstants::VC_FIXED;
+    }
+
+    if (attDef->getDefaultType() == XMLAttDef::Required ||
+        attDef->getDefaultType() == XMLAttDef::Required_And_Fixed)
+        isRequired = true;
+
+    xsAttUse->set(isRequired, constraintType, attDef->getValue());
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/internal/XSObjectFactory.hpp b/src/xercesc/internal/XSObjectFactory.hpp
index f1488550e0d208b6431b7231e3e73b34f961d49c..26da5a003718ae3cc4909f07ae296c85a422d133 100644
--- a/src/xercesc/internal/XSObjectFactory.hpp
+++ b/src/xercesc/internal/XSObjectFactory.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/12/17 20:50:35  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.4  2003/11/25 18:11:54  knoaman
  * Make XSObjectFactory inherit from XMemory. Thanks to David Cargill.
  *
@@ -255,6 +258,12 @@ private:
         , XSSimpleTypeDefinition* const xsST
     );
 
+    void processAttUse
+    (
+        SchemaAttDef* const attDef
+        , XSAttributeUse* const xsAttUse
+    );
+
     // make XSModel our friend
     friend class XSModel;
 
diff --git a/src/xercesc/validators/schema/SchemaAttDef.cpp b/src/xercesc/validators/schema/SchemaAttDef.cpp
index cbbbd136f4a6157c8abbccf368d240a787163abc..e6b4eaa817fc92891eecd0c536ddb3e0ffe2b824 100644
--- a/src/xercesc/validators/schema/SchemaAttDef.cpp
+++ b/src/xercesc/validators/schema/SchemaAttDef.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.11  2003/12/17 20:50:35  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.10  2003/11/25 18:15:00  knoaman
  * Serialize enclosing complex type. Thanks to David Cargill.
  *
@@ -135,6 +138,7 @@ SchemaAttDef::SchemaAttDef(MemoryManager* const manager) :
     , fValidity(PSVIDefs::UNKNOWN)
     , fValidation(PSVIDefs::NONE)
     , fEnclosingCT(0)
+    , fBaseAttDecl(0)
 {
 }
 
@@ -153,6 +157,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const           prefix
     , fValidity(PSVIDefs::UNKNOWN)
     , fValidation(PSVIDefs::NONE)
     , fEnclosingCT(0)
+    , fBaseAttDecl(0)
 {
     fAttName = new (manager) QName(prefix, localPart, uriId, manager);
 }
@@ -175,6 +180,7 @@ SchemaAttDef::SchemaAttDef( const XMLCh* const           prefix
     , fValidity(PSVIDefs::UNKNOWN)
     , fValidation(PSVIDefs::NONE)
     , fEnclosingCT(0)
+    , fBaseAttDecl(0)
 {
     fAttName = new (manager) QName(prefix, localPart, uriId, manager);
 }
@@ -193,6 +199,7 @@ SchemaAttDef::SchemaAttDef(const SchemaAttDef* other) :
     , fValidity(other->fValidity)
     , fValidation(other->fValidation)
     , fEnclosingCT(other->fEnclosingCT)
+    , fBaseAttDecl(other->fBaseAttDecl)
 {
     QName* otherName = other->getAttName();
     fAttName = new (getMemoryManager()) QName(otherName->getPrefix(),
@@ -248,6 +255,7 @@ void SchemaAttDef::serialize(XSerializeEngine& serEng)
         serEng<<(int)fValidity;
         serEng<<(int)fValidation;
         serEng<<fEnclosingCT;
+        serEng<<fBaseAttDecl;
     }
     else
     {
@@ -271,6 +279,7 @@ void SchemaAttDef::serialize(XSerializeEngine& serEng)
         fValidation = (PSVIDefs::Validation)i;
         
         serEng>>fEnclosingCT;
+        serEng>>fBaseAttDecl;
     }
 }
 
diff --git a/src/xercesc/validators/schema/SchemaAttDef.hpp b/src/xercesc/validators/schema/SchemaAttDef.hpp
index d4f552fa0575be2c9ff070eee411d1801a29e6de..b4d82990d3840588e929946f27355a5788e5f8a6 100644
--- a/src/xercesc/validators/schema/SchemaAttDef.hpp
+++ b/src/xercesc/validators/schema/SchemaAttDef.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.10  2003/12/17 20:50:35  knoaman
+ * PSVI: fix for annotation of attributes in attributeGroup/derived types
+ *
  * Revision 1.9  2003/11/24 05:13:41  neilg
  * update method documentation
  *
@@ -262,6 +265,8 @@ public :
     DatatypeValidator* getDatatypeValidator() const;
     ValueVectorOf<unsigned int>* getNamespaceList() const;
     ComplexTypeInfo* getEnclosingCT() const;
+    const SchemaAttDef* getBaseAttDecl() const;
+    SchemaAttDef* getBaseAttDecl();
 
     // -----------------------------------------------------------------------
     //  Setter methods
@@ -275,6 +280,8 @@ public :
     );
     void setDatatypeValidator(DatatypeValidator* newDatatypeValidator);
     void setAnyDatatypeValidator(DatatypeValidator* newDatatypeValidator);
+    void setBaseAttDecl(SchemaAttDef* const attDef);
+
     /*
      * @deprecated
      */
@@ -327,6 +334,13 @@ private :
     //  fValidation
     //      The type of validation that happened to this attr
     //
+    //  fBaseAttDecl
+    //      The base attribute declaration that this attribute is based on
+    //      NOTE: we do not have a notion of attribute use, so in the case
+    //      of ref'd attributes and inherited attributes, we make a copy
+    //      of the actual attribute declaration. The fBaseAttDecl stores that
+    //      declaration, and will be helpful when we build the XSModel (i.e
+    //      easy access the XSAnnotation object).
     // -----------------------------------------------------------------------
     unsigned int                 fElemId;
     QName*                       fAttName;
@@ -337,6 +351,7 @@ private :
     PSVIDefs::Validity           fValidity;
     PSVIDefs::Validation         fValidation;
     ComplexTypeInfo*             fEnclosingCT;
+    SchemaAttDef*                fBaseAttDecl;
 };
 
 
@@ -474,6 +489,16 @@ inline ComplexTypeInfo* SchemaAttDef::getEnclosingCT() const
     return fEnclosingCT;
 }
 
+inline SchemaAttDef* SchemaAttDef::getBaseAttDecl()
+{
+    return fBaseAttDecl;
+}
+
+inline const SchemaAttDef* SchemaAttDef::getBaseAttDecl() const
+{
+    return fBaseAttDecl;
+}
+
 // ---------------------------------------------------------------------------
 //  SchemaAttDef: Setter methods
 // ---------------------------------------------------------------------------
@@ -536,6 +561,11 @@ inline void SchemaAttDef::setEnclosingCT(ComplexTypeInfo* complexTypeInfo)
     fEnclosingCT = complexTypeInfo;
 }
 
+inline void SchemaAttDef::setBaseAttDecl(SchemaAttDef* const attDef)
+{
+    fBaseAttDecl = attDef;
+}
+
 XERCES_CPP_NAMESPACE_END
 
 #endif
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index 606846c9f6ba8910befbb87536f96bb239f36df0..84ef5d643981822185620614d77d0cf93ca90d04 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -5543,6 +5543,8 @@ void TraverseSchema::processAttributeDeclRef(const DOMElement* const elem,
                                             refAttDefType,
                                             0, fGrammarPoolMemoryManager);
 
+    attDef->setBaseAttDecl(refAttDef);
+
     if (refAttDefType == XMLAttDef::Fixed) {
         if (required && !invalidAttUse) {
             attDef->setDefaultType(XMLAttDef::Required_And_Fixed);
@@ -6399,6 +6401,11 @@ void TraverseSchema::processAttributes(const DOMElement* const elem,
 
                 newAttDef->setDatatypeValidator(attDef.getDatatypeValidator());
                 typeInfo->addAttDef(newAttDef);
+
+                if (attDef.getBaseAttDecl())
+                    newAttDef->setBaseAttDecl(attDef.getBaseAttDecl());
+                else
+                    newAttDef->setBaseAttDecl(&attDef);
             }
         }
     }
@@ -7069,7 +7076,11 @@ void TraverseSchema::copyAttGroupAttributes(const DOMElement* const elem,
                 typeInfo->setAttWithTypeId(true);
             }
 
-            typeInfo->addAttDef(new (fGrammarPoolMemoryManager) SchemaAttDef(attDef));
+            SchemaAttDef* clonedAttDef = new (fGrammarPoolMemoryManager) SchemaAttDef(attDef);
+            typeInfo->addAttDef(clonedAttDef);
+
+            if (!clonedAttDef->getBaseAttDecl())
+                clonedAttDef->setBaseAttDecl(attDef);
 
             if (toAttGroup) {
                 toAttGroup->addAttDef(attDef, true);
diff --git a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
index 838694b20037a42ebf71c1420bca38a24e0f1e0e..ff96bd560133ba1d8fdabbb3ac7652ce1e65a984 100644
--- a/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
+++ b/src/xercesc/validators/schema/XercesAttGroupInfo.hpp
@@ -244,7 +244,12 @@ inline void XercesAttGroupInfo::addAttDef(SchemaAttDef* const toAdd,
     }
 
     if (toClone) {
-        fAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd));
+        SchemaAttDef* clonedAttDef = new (fMemoryManager) SchemaAttDef(toAdd);
+
+        if (!clonedAttDef->getBaseAttDecl())
+            clonedAttDef->setBaseAttDecl(toAdd);
+
+        fAttributes->addElement(clonedAttDef);
     }
     else {
         fAttributes->addElement(toAdd);
@@ -259,7 +264,12 @@ inline void XercesAttGroupInfo::addAnyAttDef(SchemaAttDef* const toAdd,
     }
 
     if (toClone) {
-        fAnyAttributes->addElement(new (fMemoryManager) SchemaAttDef(toAdd));
+        SchemaAttDef* clonedAttDef = new (fMemoryManager) SchemaAttDef(toAdd);
+
+        if (!clonedAttDef->getBaseAttDecl())
+            clonedAttDef->setBaseAttDecl(toAdd);
+
+        fAnyAttributes->addElement(clonedAttDef);
     }
     else {
         fAnyAttributes->addElement(toAdd);