diff --git a/src/xercesc/validators/schema/SchemaInfo.cpp b/src/xercesc/validators/schema/SchemaInfo.cpp
index 02ca32323417193e586e0e4d200e957dab6a841b..e97a884c56b2fee2f5b2c48491f9d97a8f66e434 100644
--- a/src/xercesc/validators/schema/SchemaInfo.cpp
+++ b/src/xercesc/validators/schema/SchemaInfo.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2002/03/19 15:57:12  knoaman
+ * Fix for bug 7074.
+ *
  * Revision 1.2  2002/02/06 22:24:59  knoaman
  * Use IDOM for schema processing.
  *
@@ -121,6 +124,8 @@ SchemaInfo::SchemaInfo(const unsigned short elemAttrDefaultQualified,
     , fImportingInfoList(0)
     , fFailedRedefineList(0)
     , fImportedNSList(0)
+    , fRecursingAnonTypes(0)
+    , fRecursingTypeNames(0)
 {
     fImportingInfoList = new RefVectorOf<SchemaInfo>(4, false);
 }
@@ -142,7 +147,13 @@ SchemaInfo::~SchemaInfo()
     fImportedNSList = 0;
 
     delete fFailedRedefineList;
-    fFailedRedefineList = 0;    
+    fFailedRedefineList = 0;
+
+    delete fRecursingAnonTypes;
+    fRecursingAnonTypes = 0;
+
+    delete fRecursingTypeNames;
+    fRecursingTypeNames = 0;
 }
 
 // ---------------------------------------------------------------------------
diff --git a/src/xercesc/validators/schema/SchemaInfo.hpp b/src/xercesc/validators/schema/SchemaInfo.hpp
index 4d0218ffcba830405b2d5a48a6020b07982122bd..53afc028badd0a34a84c69cfba4e6a76a46b5640 100644
--- a/src/xercesc/validators/schema/SchemaInfo.hpp
+++ b/src/xercesc/validators/schema/SchemaInfo.hpp
@@ -123,6 +123,8 @@ public:
     unsigned int             getNamespaceScopeLevel() const;
     unsigned short           getElemAttrDefaultQualified() const;
     RefVectorEnumerator<SchemaInfo> getImportingListEnumerator() const;
+    ValueVectorOf<const IDOM_Element*>* getRecursingAnonTypes() const;
+    ValueVectorOf<const XMLCh*>*        getRecursingTypeNames() const;
 
 	// -----------------------------------------------------------------------
     //  Setter methods
@@ -147,6 +149,7 @@ public:
     void addFailedRedefine(const IDOM_Element* const anElem);
     bool isImportingNS(const int namespaceURI);
     void addImportedNS(const int namespaceURI);
+    void addRecursingType(const IDOM_Element* const elem, const XMLCh* const name);
 
 private:
     // -----------------------------------------------------------------------
@@ -169,6 +172,8 @@ private:
     RefVectorOf<SchemaInfo>*            fImportingInfoList;
     ValueVectorOf<const IDOM_Element*>* fFailedRedefineList;
     ValueVectorOf<int>*                 fImportedNSList;
+    ValueVectorOf<const IDOM_Element*>* fRecursingAnonTypes;
+    ValueVectorOf<const XMLCh*>*        fRecursingTypeNames;
 };
 
 // ---------------------------------------------------------------------------
@@ -229,6 +234,19 @@ SchemaInfo::getImportingListEnumerator() const {
     return RefVectorEnumerator<SchemaInfo>(fImportingInfoList);
 }
 
+inline ValueVectorOf<const IDOM_Element*>*
+SchemaInfo::getRecursingAnonTypes() const {
+
+    return fRecursingAnonTypes;
+}
+
+
+inline ValueVectorOf<const XMLCh*>*
+SchemaInfo::getRecursingTypeNames() const {
+
+    return fRecursingTypeNames;
+}
+
 // ---------------------------------------------------------------------------
 //  Setter methods
 // ---------------------------------------------------------------------------
@@ -354,6 +372,17 @@ inline bool SchemaInfo::isImportingNS(const int namespaceURI) {
     return (fImportedNSList->containsElement(namespaceURI));
 }
 
+inline void SchemaInfo::addRecursingType(const IDOM_Element* const elem,
+                                         const XMLCh* const name) {
+
+    if (!fRecursingAnonTypes) {
+        fRecursingAnonTypes = new ValueVectorOf<const IDOM_Element*>(8);
+        fRecursingTypeNames = new ValueVectorOf<const XMLCh*>(8);
+    }
+
+    fRecursingAnonTypes->addElement(elem);
+    fRecursingTypeNames->addElement(name);
+}
 
 #endif
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index 0df08ccbc8bdfe72eb0cee0ec9c1577a9c3cf07d..cb912096b1513ddc516a9aa221db876c31f9645e 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -193,7 +193,6 @@ TraverseSchema::TraverseSchema( IDOM_Element* const          schemaRoot
     , fFinalDefault(0)
     , fBlockDefault(0)
     , fScopeCount(0)
-    , fRecursingElemIndex(0)
     , fAnonXSTypeCount(0)
     , fCircularCheckIndex(0)
     , fTargetNSURIString(0)
@@ -233,8 +232,6 @@ TraverseSchema::TraverseSchema( IDOM_Element* const          schemaRoot
     , fIC_NamespaceDepthNS(0)
     , fParser(0)
     , fPreprocessedNodes(0)
-    , fRecursingAnonTypes(0)
-    , fRecursingTypeNames(0)
 {
 
     try {
@@ -1255,6 +1252,9 @@ int TraverseSchema::traverseComplexTypeDecl(const IDOM_Element* const elem,
                     reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidChildFollowingConplexContent);
                 }
             }
+            else if (fCurrentGroupInfo) {
+                typeInfo->setPreprocessed(true);
+            }
             else {
                 // We must have ....
                 // GROUP, ALL, SEQUENCE or CHOICE, followed by optional attributes
@@ -1319,8 +1319,7 @@ int TraverseSchema::traverseComplexTypeDecl(const IDOM_Element* const elem,
   *
   */
 XercesGroupInfo*
-TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem,
-                                  const bool circularAllowed) {
+TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem) {
 
     bool         topLevel = isTopLevelComponent(elem);
     const XMLCh* name = getElementAttValue(elem, SchemaSymbols::fgATT_NAME);
@@ -1360,7 +1359,7 @@ TraverseSchema::traverseGroupDecl(const IDOM_Element* const elem,
             return 0;
         }
 
-        return processGroupRef(elem, ref, circularAllowed);
+        return processGroupRef(elem, ref);
     }
 
     // ------------------------------------------------------------------
@@ -2365,15 +2364,7 @@ QName* TraverseSchema::traverseElementDecl(const IDOM_Element* const elem, bool&
                 if (typeInfo->getPreprocessed()) {
 
                     const XMLCh* typeInfoName = typeInfo->getTypeName();
-                    
-                    if (!fRecursingAnonTypes) {
-                        fRecursingAnonTypes = new ValueVectorOf<const IDOM_Element*>(8);
-                        fRecursingTypeNames = new ValueVectorOf<const XMLCh*>(8);
-                    }
-
-                    fRecursingAnonTypes->addElement(content);
-                    fRecursingTypeNames->addElement(typeInfoName + XMLString::indexOf(typeInfoName, chComma) + 1);
-                    fRecursingElemIndex++;
+                    fSchemaInfo->addRecursingType(content, typeInfoName + XMLString::indexOf(typeInfoName, chComma) + 1);
                 }
             }
 
@@ -3624,6 +3615,9 @@ void TraverseSchema::traverseComplexContentDecl(const XMLCh* const typeName,
         }
     }
 
+    if (fCurrentGroupInfo) // defer processing until later
+        throw TraverseSchema::RecursingElement;
+
     // -----------------------------------------------------------------------
     // Process the content of the derivation
     // -----------------------------------------------------------------------
@@ -4298,16 +4292,20 @@ void TraverseSchema::processChildren(const IDOM_Element* const root) {
     } // for each child node
 
     // Handle recursing elements - if any
-    if (fRecursingElemIndex) {
+    ValueVectorOf<const IDOM_Element*>* recursingAnonTypes = fSchemaInfo->getRecursingAnonTypes();
+
+    if (recursingAnonTypes) {
 
-        for (int i=0; i < fRecursingElemIndex; i++) {
-            traverseComplexTypeDecl(fRecursingAnonTypes->elementAt(i),
-                                    fRecursingTypeNames->elementAt(i));
+        ValueVectorOf<const XMLCh*>* recursingTypeNames = fSchemaInfo->getRecursingTypeNames();
+        unsigned int recurseSize = recursingAnonTypes->size();
+
+        for (unsigned int i=0; i < recurseSize; i++) {
+            traverseComplexTypeDecl(recursingAnonTypes->elementAt(i),
+                                    recursingTypeNames->elementAt(i));
         }
 
-        fRecursingAnonTypes->removeAllElements();
-        fRecursingTypeNames->removeAllElements();
-        fRecursingElemIndex = 0;
+        recursingAnonTypes->removeAllElements();
+        recursingTypeNames->removeAllElements();
     }
 }
 
@@ -4885,8 +4883,6 @@ TraverseSchema::getElementComplexTypeInfo(const XMLCh* const typeStr,
         typeInfo = fComplexTypeRegistry->get(fBuffer.getRawBuffer());
     }
 
-    int saveRecursingIndex = fRecursingElemIndex;
-
     if (!typeInfo) {
 
         if (XMLString::compareString(typeURI, SchemaSymbols::fgURI_SCHEMAFORSCHEMA) != 0 ||
@@ -4902,27 +4898,8 @@ TraverseSchema::getElementComplexTypeInfo(const XMLCh* const typeStr,
         }
     }
 
-    // restore schema information, if necessary
-    if (saveInfo != fSchemaInfo) {
-
-        if (infoType == SchemaInfo::IMPORT) {
-
-            int i = fRecursingElemIndex - 1;
-
-            for (; i >= saveRecursingIndex; i--) {
-
-                const IDOM_Element* elem = fRecursingAnonTypes->elementAt(i);
-                const XMLCh* typeName = fRecursingTypeNames->elementAt(i);
-
-                fRecursingAnonTypes->removeElementAt(i);
-                fRecursingTypeNames->removeElementAt(i);
-                fRecursingElemIndex--;
-                traverseComplexTypeDecl(elem, typeName);
-            }
-        }
-
-        restoreSchemaInfo(saveInfo, infoType);
-    }
+    // restore schema information
+    restoreSchemaInfo(saveInfo, infoType);
 
     return typeInfo;
 }
@@ -5566,7 +5543,7 @@ void TraverseSchema::processComplexContent(const XMLCh* const typeName,
 
         if (!XMLString::compareString(childName, SchemaSymbols::fgELT_GROUP)) {
 
-            XercesGroupInfo* grpInfo = traverseGroupDecl(childElem, true);
+            XercesGroupInfo* grpInfo = traverseGroupDecl(childElem);
 
             if (grpInfo) {
 
@@ -6556,8 +6533,7 @@ void TraverseSchema::checkEnumerationRequiredNotation(const XMLCh* const name,
 }
 
 XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem,
-                                                 const XMLCh* const refName,
-                                                 const bool circularAllowed) {
+                                                 const XMLCh* const refName) {
 
     if (XUtil::getFirstChildElement(elem) != 0) {
         reportSchemaError(XMLUni::fgValidityDomain, XMLValid::NoContentForRef, SchemaSymbols::fgELT_GROUP);
@@ -6575,13 +6551,8 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem,
 	
     if (fCurrentGroupStack->containsElement(nameIndex)) {
 
-        if (circularAllowed) {
-            throw TraverseSchema::RecursingElement;
-        }
-        else {
-            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NoCircularDefinition, localPart);
-            return 0;
-        }
+        reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NoCircularDefinition, localPart);
+        return 0;
     }
 
     XercesGroupInfo*     groupInfo = 0;
@@ -6637,7 +6608,6 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem,
 
         if (groupElem != 0) {
 
-            int saveRecursingIndex = fRecursingElemIndex;
             groupInfo = traverseGroupDecl(groupElem);
 
             if (groupInfo && fCurrentGroupInfo
@@ -6645,30 +6615,8 @@ XercesGroupInfo* TraverseSchema::processGroupRef(const IDOM_Element* const elem,
                 copyGroupElements(groupInfo, fCurrentGroupInfo, 0);
             }
 
-            // restore schema information, if necessary
-            if (saveInfo != fSchemaInfo) {
-
-                if (infoType == SchemaInfo::IMPORT) {
-
-                    // --------------------------------------------------
-                    // Handle recursing elements
-                    // --------------------------------------------------
-                    int i = fRecursingElemIndex - 1;
-
-                    for (; i >= saveRecursingIndex; i--) {
-
-                        const IDOM_Element* elem = fRecursingAnonTypes->elementAt(i);
-                        const XMLCh* typeName = fRecursingTypeNames->elementAt(i);
-
-                        fRecursingAnonTypes->removeElementAt(i);
-                        fRecursingTypeNames->removeElementAt(i);
-                        fRecursingElemIndex--;
-                        traverseComplexTypeDecl(elem, typeName);
-                    }
-                }
-
-                restoreSchemaInfo(saveInfo, infoType);
-            }
+            // restore schema information
+            restoreSchemaInfo(saveInfo, infoType);
 
             return groupInfo;
         }
@@ -8787,8 +8735,6 @@ void TraverseSchema::cleanUp() {
     delete fIC_NamespaceDepthNS;
     delete fIC_NodeListNS;
     delete fPreprocessedNodes;
-    delete fRecursingTypeNames;
-    delete fRecursingAnonTypes;
     delete fParser;
 }
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.hpp b/src/xercesc/validators/schema/TraverseSchema.hpp
index bb8907df4fc9e20a93c97b5dab00d102fb1fb5ee..d51c17e3093985fcdfef7ceace14c98417524cd5 100644
--- a/src/xercesc/validators/schema/TraverseSchema.hpp
+++ b/src/xercesc/validators/schema/TraverseSchema.hpp
@@ -206,8 +206,7 @@ private:
                                                const int modelGroupType);
     ContentSpecNode*    traverseAny(const IDOM_Element* const anyDecl);
     ContentSpecNode*    traverseAll(const IDOM_Element* const allElem);
-    XercesGroupInfo*    traverseGroupDecl(const IDOM_Element* const childElem,
-                                          const bool circularAllowed = false);
+    XercesGroupInfo*    traverseGroupDecl(const IDOM_Element* const childElem);
     XercesAttGroupInfo* traverseAttributeGroupDecl(const IDOM_Element* const elem,
                                                    ComplexTypeInfo* const typeInfo);
     XercesAttGroupInfo* traverseAttributeGroupDeclNS(const XMLCh* const uriStr,
@@ -353,8 +352,7 @@ private:
       * Process a 'ref' on a group
       */
     XercesGroupInfo* processGroupRef(const IDOM_Element* const elem,
-                                     const XMLCh* const refName,
-                                     const bool circularAllowed);
+                                     const XMLCh* const refName);
 
     /**
       * Process a 'ref' on a attributeGroup
@@ -786,7 +784,6 @@ private:
     int                                           fFinalDefault;
     int                                           fBlockDefault;
     int                                           fScopeCount;
-    int                                           fRecursingElemIndex;
     unsigned int                                  fAnonXSTypeCount;
     unsigned int                                  fCircularCheckIndex;
     const XMLCh*                                  fTargetNSURIString;
@@ -828,8 +825,6 @@ private:
     RefHashTableOf<ValueVectorOf<unsigned int> >* fIC_NamespaceDepthNS;
     IDOMParser*                                   fParser;
     RefHashTableOf<SchemaInfo>*                   fPreprocessedNodes;
-    ValueVectorOf<const IDOM_Element*>*           fRecursingAnonTypes;
-    ValueVectorOf<const XMLCh*>*                  fRecursingTypeNames;
 
     friend class GeneralAttributeCheck;
 };