diff --git a/src/xercesc/framework/psvi/XSSimpleTypeDefinition.cpp b/src/xercesc/framework/psvi/XSSimpleTypeDefinition.cpp
index f54b7d89acc03cdc3fc60cc35eceb7ffbebc1422..7d971ab18182dd5bc7be8144dc6404ce94a23323 100644
--- a/src/xercesc/framework/psvi/XSSimpleTypeDefinition.cpp
+++ b/src/xercesc/framework/psvi/XSSimpleTypeDefinition.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.6  2003/11/24 15:45:36  knoaman
+ * PSVI: finish construction of XSSimpleTypeDefinition
+ *
  * Revision 1.5  2003/11/21 17:34:04  knoaman
  * PSVI update
  *
@@ -102,20 +105,27 @@ static bool XSSimpleTypeDefinitionTestFlag(int flag)
 // ---------------------------------------------------------------------------
 //  XSSimpleTypeDefinition: Constructors and Destructors
 // ---------------------------------------------------------------------------
-XSSimpleTypeDefinition::XSSimpleTypeDefinition(DatatypeValidator* const datatypeValidator,
-                                               XSAnnotation* const      headAnnot,
-                                               XSModel* const           xsModel,
-                                               MemoryManager* const     manager)
-    : XSTypeDefinition(SIMPLE_TYPE, 0, xsModel, manager)
+XSSimpleTypeDefinition::XSSimpleTypeDefinition
+(
+    DatatypeValidator* const            datatypeValidator
+    , VARIETY                           stVariety
+    , XSTypeDefinition* const           xsBaseType
+    , XSSimpleTypeDefinition* const     primitiveOrItemType
+    , XSSimpleTypeDefinitionList* const memberTypes
+    , XSAnnotation*                     headAnnot
+    , XSModel* const                    xsModel
+    , MemoryManager* const              manager
+)
+    : XSTypeDefinition(SIMPLE_TYPE, xsBaseType, xsModel, manager)
     , fDefinedFacets(0)
     , fFixedFacets(0)
-    , fVariety(VARIETY_ABSENT)
+    , fVariety(stVariety)
     , fDatatypeValidator(datatypeValidator)
     , fXSFacetList(0)
     , fXSMultiValueFacetList(0)
     , fPatternList(0)
-    , fPrimitiveOrItemType(0)
-    , fMemberTypes(0)
+    , fPrimitiveOrItemType(primitiveOrItemType)
+    , fMemberTypes(memberTypes)
     , fXSAnnotationList(0)
 {
     if (int finalset = fDatatypeValidator->getFinalSet()) 
@@ -271,197 +281,23 @@ bool XSSimpleTypeDefinition::derivedFromType(const XSTypeDefinition * const ance
 }
 
 // ---------------------------------------------------------------------------
-//  XSSimpleTypeDefinition: initialization methods
+//  XSSimpleTypeDefinition: helper methods
 // ---------------------------------------------------------------------------
-void XSSimpleTypeDefinition::construct()
+void XSSimpleTypeDefinition::setFacetInfo
+(
+    int                            definedFacets
+    , int                          fixedFacets
+    , XSFacetList* const           xsFacetList
+    , XSMultiValueFacetList* const xsMultiValueFacetList
+    , StringList* const            patternList
+)
 {
-    //REVISIT
-/*    // compute fBaseType
-    if (fDatatypeValidator->getBaseValidator())
-        fBaseType = PSVIUtil::addOrFind(fDatatypeValidator->getBaseValidator(), fXSModel, fMemoryManager);
-    
-    //REVISIT: the getFixed method is protected so added friend XSSimpleTypeDefinition
-    //         to DatatypeValidator class... 
-    if (fDatatypeValidator->getType() == DatatypeValidator::Union)
-    {
-        fVariety = VARIETY_UNION;
-        RefVectorOf<DatatypeValidator>* memberTypeValidators = ((UnionDatatypeValidator*)fDatatypeValidator)->getMemberTypeValidators();
-        unsigned int size = memberTypeValidators->size();
-        if (size)
-        {
-            fMemberTypes = new (fMemoryManager) RefVectorOf<XSSimpleTypeDefinition>(size, false, fMemoryManager);
-            for (unsigned int i=0; i<size; i++)
-            {
-                fMemberTypes->addElement(
-                    PSVIUtil::addOrFind(memberTypeValidators->elementAt(i), fXSModel, fMemoryManager)
-                );
-            }
-        }
-    } 
-    else if (fDatatypeValidator->getType() == DatatypeValidator::List)
-    {
-        fVariety = VARIETY_LIST;
-
-        DatatypeValidator* dv = fDatatypeValidator->getBaseValidator();
-        while (dv->getType() == DatatypeValidator::List)
-        {
-            PSVIUtil::addOrFind(dv, fXSModel, fMemoryManager);
-            dv = dv->getBaseValidator();
-        }
-        fPrimitiveOrItemType = PSVIUtil::addOrFind(dv, fXSModel, fMemoryManager);
-    }
-    else
-    {
-        // REVISIT: assume ATOMIC but what about VARIETY_ABSENT?
-        fVariety = VARIETY_ATOMIC;
-        
-        DatatypeValidator* dv = fDatatypeValidator->getBaseValidator();
-        while (dv)
-        {
-            fPrimitiveOrItemType = PSVIUtil::addOrFind(dv, fXSModel, fMemoryManager);
-            dv = dv->getBaseValidator();
-        }
-    }
-
-    if (fDatatypeValidator->getFacetsDefined())
-        processFacets();*/
-}
-
-void XSSimpleTypeDefinition::processFacets()
-{
-    // REVISIT
-/*    bool isFixed = false;
-    int facetsDefined = fDatatypeValidator->getFacetsDefined();
-
-    fFixedFacets = fDatatypeValidator->getFixed();
-
-    // NOTE: XSMultiValueFacetList is not owned by XSModel!
-    if ((facetsDefined & DatatypeValidator::FACET_PATTERN)
-        || (facetsDefined & DatatypeValidator::FACET_ENUMERATION))
-        fXSMultiValueFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, true, fMemoryManager);
-
-    if (facetsDefined & DatatypeValidator::FACET_ENUMERATION)
-    {
-        RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*)
-            fDatatypeValidator->getEnumString();
-        isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_ENUMERATION);
-
-        // NOTE: Don't need to add multivaluefacet to "ObjectMap -> getObjectFromMap/putObjectInMap);
-        fXSMultiValueFacetList->addElement(
-            new (fMemoryManager) XSMultiValueFacet(
-                FACET_ENUMERATION , enumList , isFixed
-                , PSVIUtil::getAnnotationFromModel(fXSModel, enumList)
-                , fXSModel, fMemoryManager)
-        );
-        fDefinedFacets |= FACET_ENUMERATION;
-        if (isFixed)
-            fFixedFacets |= FACET_ENUMERATION;
-    }
-
-    RefHashTableOf<KVStringPair>* facets = fDatatypeValidator->getFacets();
-    if (!facets)
-        return;
-
-    // NOTE: XSFacetList is not owned by XSModel!
-    fXSFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(10, true, fMemoryManager);
-
-    // NOTE: Don't need to add facet to "ObjectMap -> getObjectFromMap/putObjectInMap);
-    RefHashTableOfEnumerator<KVStringPair> e(facets);
-    while (e.hasMoreElements())
-    {
-        KVStringPair& pair = e.nextElement();
-        XMLCh* key = pair.getKey();
-        FACET facetType = FACET_NONE;
-        XSAnnotation* annot = PSVIUtil::getAnnotationFromModel(fXSModel, &pair);
-
-        if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))
-        {
-            facetType = FACET_MAXINCLUSIVE;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MAXINCLUSIVE);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXEXCLUSIVE))
-        {
-            facetType = FACET_MAXEXCLUSIVE;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MAXEXCLUSIVE);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_MININCLUSIVE))
-        {            
-            facetType = FACET_MININCLUSIVE;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MININCLUSIVE);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_MINEXCLUSIVE))
-        {
-            facetType = FACET_MINEXCLUSIVE;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MINEXCLUSIVE);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_LENGTH))
-        {
-            facetType = FACET_LENGTH;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_LENGTH);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_MINLENGTH))
-        {
-            facetType = FACET_MINLENGTH;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MINLENGTH);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXLENGTH))
-        {
-            facetType = FACET_MAXLENGTH;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_MAXLENGTH);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_TOTALDIGITS))
-        {
-            facetType = FACET_TOTALDIGITS;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_TOTALDIGITS);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_FRACTIONDIGITS))
-        {
-            facetType = FACET_FRACTIONDIGITS;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_FRACTIONDIGITS);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_WHITESPACE))
-        {
-            facetType = FACET_WHITESPACE;
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_WHITESPACE);
-        }
-        else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
-        {
-            XMLStringTokenizer tokenizer(fDatatypeValidator->getPattern(), &chPipe, fMemoryManager);
-            fPatternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>(tokenizer.countTokens(), true, fMemoryManager);
-                
-            while (tokenizer.hasMoreTokens())
-                fPatternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager));
-
-            isFixed = XSSimpleTypeDefinitionTestFlag(fFixedFacets & DatatypeValidator::FACET_PATTERN);
-            // NOTE: Don't need to add multivaluefacet to "ObjectMap -> getObjectFromMap/putObjectInMap);
-            fXSMultiValueFacetList->addElement(
-                new (fMemoryManager) XSMultiValueFacet(
-                    FACET_PATTERN, fPatternList, isFixed, annot, fXSModel, fMemoryManager)
-	        );
-            fDefinedFacets |= FACET_PATTERN;
-            if (isFixed) 
-                fFixedFacets |= FACET_PATTERN;
-            continue;
-        }
-        else
-        {
-            // REVISIT: hmm... what about XSSimpleTypeDefinition::FACET_NONE
-            // don't think I need to create an empty Facet?
-            continue;
-        }
-
-        fXSFacetList->addElement(
-            new (fMemoryManager) XSFacet(
-                facetType, pair.getValue(), isFixed, annot, fXSModel, fMemoryManager)
-        );
-
-        fDefinedFacets |= facetType;
-        if (isFixed) 
-            fFixedFacets |= facetType;
-    }*/
+    fDefinedFacets = definedFacets;
+    fFixedFacets = fixedFacets;
+    fXSFacetList = xsFacetList;
+    fXSMultiValueFacetList = xsMultiValueFacetList;
+    fPatternList = patternList;
 }
 
 
 XERCES_CPP_NAMESPACE_END
-
-
diff --git a/src/xercesc/framework/psvi/XSSimpleTypeDefinition.hpp b/src/xercesc/framework/psvi/XSSimpleTypeDefinition.hpp
index 582a0ee09fed12ebef253f9cbe48915161f67e00..325340a65fb1ea6cc7a16073c3de6af4d0ebe1b0 100644
--- a/src/xercesc/framework/psvi/XSSimpleTypeDefinition.hpp
+++ b/src/xercesc/framework/psvi/XSSimpleTypeDefinition.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.7  2003/11/24 15:45:36  knoaman
+ * PSVI: finish construction of XSSimpleTypeDefinition
+ *
  * Revision 1.6  2003/11/21 17:34:04  knoaman
  * PSVI update
  *
@@ -209,10 +212,14 @@ public:
       */
     XSSimpleTypeDefinition
     (
-        DatatypeValidator* const datatypeValidator
-        , XSAnnotation*          headAnnot
-        , XSModel* const         xsModel
-        , MemoryManager* const   manager = XMLPlatformUtils::fgMemoryManager
+        DatatypeValidator* const            datatypeValidator
+        , VARIETY                           stVariety
+        , XSTypeDefinition* const           xsBaseType
+        , XSSimpleTypeDefinition* const     primitiveOrItemType
+        , XSSimpleTypeDefinitionList* const memberTypes
+        , XSAnnotation*                     headAnnot
+        , XSModel* const                    xsModel
+        , MemoryManager* const              manager = XMLPlatformUtils::fgMemoryManager
     );
 
     //@};
@@ -257,7 +264,7 @@ public:
      * [facets]: get all facets defined on this type. The value is a bit 
      * combination of FACET_XXX constants of all defined facets. 
      */
-    short getDefinedFacets() const;
+    int getDefinedFacets() const;
 
     /**
      * Convenience method. [Facets]: check whether a facet is defined on this 
@@ -270,7 +277,7 @@ public:
     /**
      * [facets]: get all facets defined and fixed on this type.
      */
-    short getFixedFacets() const;
+    int getFixedFacets() const;
 
     /**
      * Convenience method. [Facets]: check whether a facet is defined and 
@@ -391,10 +398,6 @@ public:
 
     //@{
 
-    /**
-     * Complete the construction of the <code>XSComplexTypeDeclaration</code>.
-     */
-    void construct();
 
     //@}
 
@@ -409,15 +412,24 @@ private:
     /**
       * Helper method for construct
       */
-    void processFacets();
+    void setFacetInfo
+    (
+        int                            definedFacets
+        , int                          fixedFacets
+        , XSFacetList* const           xsFacetList
+        , XSMultiValueFacetList* const xsMultiValueFacetList
+        , StringList* const            patternList
+    );
+
+    friend class XSObjectFactory;
 
 protected:
 
     // -----------------------------------------------------------------------
     //  data members
     // -----------------------------------------------------------------------
-    short                       fDefinedFacets;
-    short                       fFixedFacets;
+    int                         fDefinedFacets;
+    int                         fFixedFacets;
     VARIETY                     fVariety;
     DatatypeValidator*          fDatatypeValidator;
     XSFacetList*                fXSFacetList;
@@ -454,12 +466,12 @@ inline XSSimpleTypeDefinitionList* XSSimpleTypeDefinition::getMemberTypes() cons
     return fMemberTypes;
 }
 
-inline short XSSimpleTypeDefinition::getDefinedFacets() const
+inline int XSSimpleTypeDefinition::getDefinedFacets() const
 {
     return fDefinedFacets;
 }
 
-inline short XSSimpleTypeDefinition::getFixedFacets() const
+inline int XSSimpleTypeDefinition::getFixedFacets() const
 {
     return fFixedFacets;
 }
diff --git a/src/xercesc/internal/XSObjectFactory.cpp b/src/xercesc/internal/XSObjectFactory.cpp
index 996547ca6cdf2679756419a08e12b34914702efb..18c2e2d0457fec2debaefc232319ae51b4f7e217 100644
--- a/src/xercesc/internal/XSObjectFactory.cpp
+++ b/src/xercesc/internal/XSObjectFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2003/11/24 15:45:36  knoaman
+ * PSVI: finish construction of XSSimpleTypeDefinition
+ *
  * Revision 1.4  2003/11/23 16:49:26  knoaman
  * PSVI: create local elements of groups
  *
@@ -91,6 +94,8 @@
 #include <xercesc/framework/psvi/XSAttributeUse.hpp>
 #include <xercesc/framework/psvi/XSAttributeDeclaration.hpp>
 #include <xercesc/framework/psvi/XSNotationDeclaration.hpp>
+#include <xercesc/framework/psvi/XSFacet.hpp>
+#include <xercesc/framework/psvi/XSMultiValueFacet.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
 #include <xercesc/validators/datatype/DatatypeValidator.hpp>
 #include <xercesc/validators/schema/SchemaAttDefList.hpp>
@@ -101,6 +106,7 @@
 #include <xercesc/validators/schema/identity/IC_KeyRef.hpp>
 #include <xercesc/validators/schema/identity/XercesXPath.hpp>
 #include <xercesc/util/HashPtr.hpp>
+#include <xercesc/util/XMLStringTokenizer.hpp>
 
 XERCES_CPP_NAMESPACE_BEGIN
 
@@ -340,7 +346,68 @@ XSObjectFactory::addOrFind(DatatypeValidator* const validator,
 
     if (!xsObj)
     {
-        //REVISIT
+        XSSimpleTypeDefinition* baseType = 0;
+        XSSimpleTypeDefinitionList* memberTypes = 0;
+        XSSimpleTypeDefinition* primitiveOrItemType = 0;
+        XSSimpleTypeDefinition::VARIETY typeVariety = XSSimpleTypeDefinition::VARIETY_ATOMIC;
+
+        // compute fBaseType
+        DatatypeValidator* baseDV = validator->getBaseValidator();
+        if (baseDV)
+            baseType = addOrFind(baseDV, xsModel);
+    
+        //REVISIT: the getFixed method is protected so added friend XSObjectFactory
+        //         to DatatypeValidator class... 
+        DatatypeValidator::ValidatorType dvType = validator->getType();
+        if (dvType == DatatypeValidator::Union)
+        {
+            typeVariety = XSSimpleTypeDefinition::VARIETY_UNION;
+            RefVectorOf<DatatypeValidator>* membersDV = ((UnionDatatypeValidator*)validator)->getMemberTypeValidators();
+            unsigned int size = membersDV->size();
+            if (size)
+            {
+                memberTypes = new (fMemoryManager) RefVectorOf<XSSimpleTypeDefinition>(size, false, fMemoryManager);
+                for (unsigned int i=0; i<size; i++)
+                    memberTypes->addElement(addOrFind(membersDV->elementAt(i), xsModel));
+            }
+        } 
+        else if (dvType == DatatypeValidator::List)
+        {
+            typeVariety = XSSimpleTypeDefinition::VARIETY_LIST;
+
+            while (baseDV->getType() == DatatypeValidator::List)
+            {
+                addOrFind(baseDV, xsModel);
+                baseDV = baseDV->getBaseValidator();
+            }
+            primitiveOrItemType = addOrFind(baseDV, xsModel);
+        }
+        else
+        {
+            // REVISIT: assume ATOMIC but what about VARIETY_ABSENT?
+            while (baseDV)
+            {
+                primitiveOrItemType = addOrFind(baseDV, xsModel);
+                baseDV = baseDV->getBaseValidator();
+            }
+        }
+
+        xsObj = new (fMemoryManager) XSSimpleTypeDefinition
+        (
+            validator
+            , typeVariety
+            , baseType
+            , primitiveOrItemType
+            , memberTypes
+            , getAnnotationFromModel(xsModel, validator)
+            , xsModel
+            , fMemoryManager
+        );
+        putObjectInMap(validator, xsObj, xsModel);
+
+        // process facets
+        if (validator->getFacetsDefined())
+            processFacets(validator, xsModel, xsObj);
     }
 
     return xsObj;
@@ -708,4 +775,145 @@ void XSObjectFactory::putObjectInMap(void* key, XSObject* const object, XSModel*
 }
 
 
+void XSObjectFactory::processFacets(DatatypeValidator* const dv,
+                                    XSModel* const xsModel,
+                                    XSSimpleTypeDefinition* const xsST)
+{
+    // NOTE: XSMultiValueFacetList is not owned by XSModel!
+    // NOTE: XSFacetList is not owned by XSModel!
+    int definedFacets = 0;
+    int fixedFacets = 0;
+    XSFacetList* xsFacetList = 0;
+    XSMultiValueFacetList* xsMultiFacetList = 0;
+    StringList* patternList = 0;
+    bool isFixed = false;
+    int dvFacetsDefined = dv->getFacetsDefined();
+    int dvFixedFacets = dv->getFixed();
+
+    if ((dvFacetsDefined & DatatypeValidator::FACET_PATTERN)
+        || (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION))
+        xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, true, fMemoryManager);
+
+    if (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION)
+    {
+        RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*) dv->getEnumString();
+        isFixed = ((dvFixedFacets & DatatypeValidator::FACET_ENUMERATION) != 0);
+
+        // NOTE: Don't need to add multivaluefacet to "ObjectMap -> getObjectFromMap/putObjectInMap);
+        xsMultiFacetList->addElement(
+            new (fMemoryManager) XSMultiValueFacet(
+                XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed
+                , getAnnotationFromModel(xsModel, enumList)
+                , xsModel, fMemoryManager)
+        );
+        definedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
+        if (isFixed)
+            fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
+    }
+
+    RefHashTableOf<KVStringPair>* facets = dv->getFacets();
+    if (facets)
+    {
+        xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(10, true, fMemoryManager);
+
+        // NOTE: Don't need to add facet to "ObjectMap -> getObjectFromMap/putObjectInMap);
+        RefHashTableOfEnumerator<KVStringPair> e(facets);
+        while (e.hasMoreElements())
+        {
+            KVStringPair& pair = e.nextElement();
+            XMLCh* key = pair.getKey();
+            XSSimpleTypeDefinition::FACET facetType = XSSimpleTypeDefinition::FACET_NONE;
+            XSAnnotation* annot = getAnnotationFromModel(xsModel, &pair);
+
+            if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MAXINCLUSIVE;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXINCLUSIVE) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXEXCLUSIVE))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MAXEXCLUSIVE;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXEXCLUSIVE) !=0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_MININCLUSIVE))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MININCLUSIVE;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MININCLUSIVE) !=0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_MINEXCLUSIVE))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MINEXCLUSIVE;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINEXCLUSIVE) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_LENGTH))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_LENGTH;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_LENGTH) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_MINLENGTH))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MINLENGTH;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MINLENGTH) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_MAXLENGTH))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_MAXLENGTH;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_MAXLENGTH) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_TOTALDIGITS))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_TOTALDIGITS;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_TOTALDIGITS) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_FRACTIONDIGITS))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_FRACTIONDIGITS;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_FRACTIONDIGITS) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_WHITESPACE))
+            {
+                facetType = XSSimpleTypeDefinition::FACET_WHITESPACE;
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_WHITESPACE) != 0);
+            }
+            else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
+            {
+                XMLStringTokenizer tokenizer(dv->getPattern(), &chPipe, fMemoryManager);
+                patternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>(tokenizer.countTokens(), true, fMemoryManager);
+                
+                while (tokenizer.hasMoreTokens())
+                    patternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager));
+
+                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_PATTERN) != 0);
+                // NOTE: Don't need to add multivaluefacet to "ObjectMap -> getObjectFromMap/putObjectInMap);
+                xsMultiFacetList->addElement(
+                    new (fMemoryManager) XSMultiValueFacet(
+                        XSSimpleTypeDefinition::FACET_PATTERN, patternList
+                        , isFixed, annot, xsModel, fMemoryManager)
+	            );
+                definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
+                if (isFixed) 
+                    fixedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
+                continue;
+            }
+            else
+            {
+                // REVISIT: hmm... what about XSSimpleTypeDefinition::FACET_NONE
+                // don't think I need to create an empty Facet?
+                continue;
+            }
+
+            xsFacetList->addElement(
+                new (fMemoryManager) XSFacet(
+                    facetType, pair.getValue(), isFixed, annot, xsModel, fMemoryManager)
+            );
+
+            definedFacets |= facetType;
+            if (isFixed) 
+                fixedFacets |= facetType;
+        }
+    }
+
+    xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, patternList);
+}
+
 XERCES_CPP_NAMESPACE_END
diff --git a/src/xercesc/internal/XSObjectFactory.hpp b/src/xercesc/internal/XSObjectFactory.hpp
index fd305dbe80bc3af5f532ad31eaee4a72c959d29c..51bf2312d9d177574695473ff992019795bf28ce 100644
--- a/src/xercesc/internal/XSObjectFactory.hpp
+++ b/src/xercesc/internal/XSObjectFactory.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/11/24 15:45:36  knoaman
+ * PSVI: finish construction of XSSimpleTypeDefinition
+ *
  * Revision 1.2  2003/11/23 16:21:40  knoaman
  * PSVI: create local elements of complex types
  *
@@ -242,6 +245,13 @@ private:
         , XSModel* const xsModel
     );
 
+    void processFacets
+    (
+        DatatypeValidator* const dv
+        , XSModel* const xsModel
+        , XSSimpleTypeDefinition* const xsST
+    );
+
     // make XSModel our friend
     friend class XSModel;
 
diff --git a/src/xercesc/validators/datatype/DatatypeValidator.hpp b/src/xercesc/validators/datatype/DatatypeValidator.hpp
index 4134adc699354f13d5ed0dba345ce40a8eecde54..33a21aab8eff7e4bc193ecc19e0f9cc2b5ae1a0f 100644
--- a/src/xercesc/validators/datatype/DatatypeValidator.hpp
+++ b/src/xercesc/validators/datatype/DatatypeValidator.hpp
@@ -400,7 +400,7 @@ protected:
 
 
 	friend class DatatypeValidatorFactory;
-    friend class XSSimpleTypeDefinition;
+    friend class XSObjectFactory;
 
     /**
       * facetDefined