diff --git a/src/xercesc/internal/XSObjectFactory.cpp b/src/xercesc/internal/XSObjectFactory.cpp
index 18c9b8a1eca80925d4158c7484d222bfe4e79808..44fed0e28ce0eab96f97808d0e89eafb33463bd3 100644
--- a/src/xercesc/internal/XSObjectFactory.cpp
+++ b/src/xercesc/internal/XSObjectFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/11/23 16:21:40  knoaman
+ * PSVI: create local elements of complex types
+ *
  * Revision 1.2  2003/11/21 22:34:46  neilg
  * More schema component model implementation, thanks to David Cargill.
  * In particular, this cleans up and completes the XSModel, XSNamespaceItem,
@@ -342,7 +345,8 @@ XSObjectFactory::addOrFind(DatatypeValidator* const validator,
 
 XSElementDeclaration*
 XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
-                           XSModel* const xsModel)
+                           XSModel* const xsModel,
+                           XSComplexTypeDefinition* enclosingTypeDef)
 {
     XSElementDeclaration* xsObj = (XSElementDeclaration*) getObjectFromMap(elemDecl, xsModel);
     if (!xsObj)
@@ -391,6 +395,13 @@ XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
             }
         }
 
+        XSConstants::SCOPE elemScope = XSConstants::SCOPE_ABSENT;
+
+        if (enclosingTypeDef)
+            elemScope = XSConstants::SCOPE_LOCAL;
+        else if (elemDecl->getEnclosingScope() == Grammar::TOP_LEVEL_SCOPE)
+            elemScope = XSConstants::SCOPE_GLOBAL;
+
         xsObj = new (fMemoryManager) XSElementDeclaration
         (
             elemDecl
@@ -399,6 +410,8 @@ XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
             , getAnnotationFromModel(xsModel, elemDecl)
             , icMap
             , xsModel
+            , elemScope
+            , enclosingTypeDef
             , fMemoryManager
         );
         putObjectInMap(elemDecl, xsObj, xsModel);
@@ -467,8 +480,15 @@ XSObjectFactory::addOrFind(ComplexTypeInfo* const typeInfo,
         );
         putObjectInMap(typeInfo, xsObj, xsModel);
 
-        // REVISIT
-        // process elements
+        // process local elements
+        unsigned int elemCount = typeInfo->elementCount();
+        for (unsigned int j=0; j<elemCount; j++)
+        {
+            SchemaElementDecl* elemDecl = typeInfo->elementAt(j);
+
+            if (elemDecl->getEnclosingScope() == typeInfo->getScopeDefined())
+                addOrFind(elemDecl, xsModel, xsObj);
+        }
     }
 
     return xsObj;
diff --git a/src/xercesc/internal/XSObjectFactory.hpp b/src/xercesc/internal/XSObjectFactory.hpp
index 67f9e9621d21d4911c5d425aba805253efad9dec..fd305dbe80bc3af5f532ad31eaee4a72c959d29c 100644
--- a/src/xercesc/internal/XSObjectFactory.hpp
+++ b/src/xercesc/internal/XSObjectFactory.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.2  2003/11/23 16:21:40  knoaman
+ * PSVI: create local elements of complex types
+ *
  * Revision 1.1  2003/11/21 17:11:24  knoaman
  * Initial revision
  *
@@ -139,6 +142,7 @@ private:
     (
         SchemaElementDecl* const elemDecl
         , XSModel* const xsModel
+        , XSComplexTypeDefinition* const enclosingTypeDef = 0
     );
 
     XSComplexTypeDefinition* addOrFind