diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp
index 888e28423424bdeb25d451f4e9c575563c0462a6..02376626ee1a239d6a8ac69c144da789631e06c5 100644
--- a/src/xercesc/internal/XMLScanner.cpp
+++ b/src/xercesc/internal/XMLScanner.cpp
@@ -3283,6 +3283,9 @@ bool XMLScanner::scanStartTagNS(bool& gotData)
                 );
             }
         }
+
+        if (fGrammarType == Grammar::SchemaGrammarType)
+            ((SchemaElementDecl*)elemDecl)->setXsiComplexTypeInfo(0);
     }
 
     //
diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp
index 871ad48f1cb441c64b87627bebaed87a9aa1e0d3..b49ef45a7c29dd4f49527114d86008be1a9ae674 100644
--- a/src/xercesc/validators/schema/SchemaValidator.cpp
+++ b/src/xercesc/validators/schema/SchemaValidator.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.9  2002/04/19 13:33:23  knoaman
+ * Fix for bug 8236.
+ *
  * Revision 1.8  2002/04/01 20:17:55  peiyongz
  * Bug#7551: Exceptions are caught by value, rather than by reference
  *
@@ -194,12 +197,15 @@ SchemaValidator::SchemaValidator(XMLErrorReporter* const errReporter) :
     , fXsiType(0)
     , fXsiTypeValidator(0)
     , fNil(false)
+    , fTypeStack(0)
 {
+    fTypeStack = new ValueStackOf<ComplexTypeInfo*>(8);
 }
 
 SchemaValidator::~SchemaValidator()
 {
     delete fXsiType;
+    delete fTypeStack;
 }
 
 // ---------------------------------------------------------------------------
@@ -216,6 +222,8 @@ int SchemaValidator::checkContent (XMLElementDecl* const elemDecl
     if (!elemDecl)
         ThrowXML(RuntimeException, XMLExcepts::Val_InvalidElemId);
 
+    ((SchemaElementDecl*) elemDecl)->setXsiComplexTypeInfo(fTypeStack->pop());
+
     //
     //  Get the content spec type of this element. This will tell us what
     //  to do to validate it.
@@ -498,6 +506,9 @@ void SchemaValidator::validateAttrValue (const   XMLAttDef* attDef
 
 void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
 {
+    ComplexTypeInfo* elemTypeInfo = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo();
+    fTypeStack->push(elemTypeInfo);
+
     if (fXsiType) {
         // handle "xsi:type" right here
         unsigned int uri = fXsiType->getURI();
@@ -572,7 +583,8 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
                         ComplexTypeInfo* destType = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo();
                         ComplexTypeInfo* tempType = typeInfo;
                         if (destType) {
-                            while (tempType) {
+
+                            while (tempType) {                                 
                                 if (!XMLString::compareString(tempType->getTypeName(), destType->getTypeName()))
                                     break;
                                 tempType = tempType->getBaseComplexTypeInfo();
@@ -599,8 +611,12 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
                             }
                         }
 
-                        if (!error)
+                        if (!error) {
+
                             ((SchemaElementDecl*)elemDef)->setXsiComplexTypeInfo(typeInfo);
+                            fTypeStack->pop();
+                            fTypeStack->push(typeInfo);
+                        }
                     }
                     else {
                         // typeInfo not found
@@ -640,12 +656,8 @@ void SchemaValidator::validateElement(const   XMLElementDecl*  elemDef)
         // xsi:type was not specified...
         // If the corresponding type is abstract, detect an error
         //
-        ComplexTypeInfo* typeInfo = ((SchemaElementDecl*)elemDef)->getComplexTypeInfo();
-
-        if (typeInfo) {
-            if (typeInfo->getAbstract()) {
-                emitError(XMLValid::NoUseAbstractType, elemDef->getFullName());
-            }
+        if (elemTypeInfo && elemTypeInfo->getAbstract()) {
+            emitError(XMLValid::NoUseAbstractType, elemDef->getFullName());
         }
     }
 
diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp
index 05fe83971bd67b068eea35aa84b4c63b15bfbd08..dbb2216dfb4d6b96da71d97d2b24792482069a48 100644
--- a/src/xercesc/validators/schema/SchemaValidator.hpp
+++ b/src/xercesc/validators/schema/SchemaValidator.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2002/04/19 13:33:23  knoaman
+ * Fix for bug 8236.
+ *
  * Revision 1.3  2002/04/01 15:47:06  knoaman
  * Move Element Consistency checking (ref to global declarations) to SchemaValidator.
  *
@@ -99,6 +102,7 @@
 #include <xercesc/framework/XMLBuffer.hpp>
 #include <xercesc/framework/XMLValidator.hpp>
 #include <xercesc/util/RefVectorOf.hpp>
+#include <xercesc/util/ValueStackOf.hpp>
 #include <xercesc/validators/common/GrammarResolver.hpp>
 #include <xercesc/validators/common/ContentSpecNode.hpp>
 #include <xercesc/validators/datatype/DatatypeValidator.hpp>
@@ -308,6 +312,9 @@ private:
     //
     //  fSchemaErrorReporter
     //      Report schema process errors
+    //
+    //  fTypeStack
+    //      Stack of complex type declarations. 
     // -----------------------------------------------------------------------
     SchemaGrammar* fSchemaGrammar;
     GrammarResolver* fGrammarResolver;
@@ -319,6 +326,7 @@ private:
     XMLBuffer fDatatypeBuffer;
     bool fTrailing;
     XSDErrorReporter fSchemaErrorReporter;
+    ValueStackOf<ComplexTypeInfo*>* fTypeStack;
 };