diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp
index a94f71538303e8fad500c2cda4b2cf47b80786c4..e34b3460f5d5a0145864b60710b35ad6be18fcac 100644
--- a/src/xercesc/internal/IGXMLScanner.cpp
+++ b/src/xercesc/internal/IGXMLScanner.cpp
@@ -1012,6 +1012,9 @@ void IGXMLScanner::scanEndTag(bool& gotData)
         // reset xsi:type ComplexTypeInfo
         if (fGrammarType == Grammar::SchemaGrammarType) {
             ((SchemaElementDecl*)topElem->fThisElement)->setXsiComplexTypeInfo(0);
+            if (!isRoot)
+                ((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->setXsiComplexTypeInfo(
+                     ((SchemaValidator*)fValidator)->getCurrentTypeInfo());
 
             // call matchers and de-activate context
             int oldCount = fMatcherStack->getMatcherCount();
@@ -2422,6 +2425,9 @@ bool IGXMLScanner::scanStartTagNS(bool& gotData)
 
                 // reset xsi:type ComplexTypeInfo
                 ((SchemaElementDecl*)elemDecl)->setXsiComplexTypeInfo(0);
+                if (!isRoot)
+                    ((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->setXsiComplexTypeInfo(
+                         ((SchemaValidator*)fValidator)->getCurrentTypeInfo());
 
                 // call matchers and de-activate context
                 int oldCount = fMatcherStack->getMatcherCount();
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 67db8590f2ad2116a24227de2bce609c92431a69..88894f0f35dc665bd7df5b0981a2427e59015b56 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -958,6 +958,9 @@ void SGXMLScanner::scanEndTag(bool& gotData)
 
         // reset xsi:type ComplexTypeInfo
         ((SchemaElementDecl*)topElem->fThisElement)->setXsiComplexTypeInfo(0);
+        if (!isRoot)
+            ((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->setXsiComplexTypeInfo(
+                 ((SchemaValidator*)fValidator)->getCurrentTypeInfo());
 
         // call matchers and de-activate context
         int oldCount = fMatcherStack->getMatcherCount();
@@ -1532,6 +1535,9 @@ bool SGXMLScanner::scanStartTag(bool& gotData)
 
             // reset xsi:type ComplexTypeInfo
             ((SchemaElementDecl*)elemDecl)->setXsiComplexTypeInfo(0);
+            if (!isRoot)
+                ((SchemaElementDecl*)(fElemStack.topElement()->fThisElement))->setXsiComplexTypeInfo(
+                     ((SchemaValidator*)fValidator)->getCurrentTypeInfo());
 
             // call matchers and de-activate context
             int oldCount = fMatcherStack->getMatcherCount();
diff --git a/src/xercesc/validators/schema/SchemaValidator.hpp b/src/xercesc/validators/schema/SchemaValidator.hpp
index e1d5958590e111ea63ffc794636aacb91db34bb3..14bde75f8cc2a6383008952d55a2ed2f0f55cd01 100644
--- a/src/xercesc/validators/schema/SchemaValidator.hpp
+++ b/src/xercesc/validators/schema/SchemaValidator.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.11  2003/01/09 22:34:54  tng
+ * [Bug 14955] error validating parser.
+ *
  * Revision 1.10  2002/11/07 21:57:37  tng
  * Fix the following Schema Test Failures:
  * 1. Typo when comparing miscFlags with FIXED
@@ -154,20 +157,6 @@ public:
     SchemaValidator(XMLErrorReporter* const errReporter = 0);
     virtual ~SchemaValidator();
 
-    // -----------------------------------------------------------------------
-    //  Setter methods
-    // -----------------------------------------------------------------------
-    void setGrammarResolver(GrammarResolver* grammarResolver);
-
-    void setXsiType(const XMLCh* const        prefix
-      , const XMLCh* const        localPart
-       , const unsigned int        uriId);
-
-    void setNillable(bool isNil);
-    void setErrorReporter(XMLErrorReporter* const errorReporter);
-    void setExitOnFirstFatal(const bool newValue);
-    void setDatatypeBuffer(const XMLCh* const value);
-
     // -----------------------------------------------------------------------
     //  Implementation of the XMLValidator interface
     // -----------------------------------------------------------------------
@@ -224,6 +213,24 @@ public:
     // -----------------------------------------------------------------------
     void normalizeWhiteSpace(DatatypeValidator* dV, const XMLCh* const value, XMLBuffer& toFill);
 
+    // -----------------------------------------------------------------------
+    //  Setter methods
+    // -----------------------------------------------------------------------
+    void setGrammarResolver(GrammarResolver* grammarResolver);
+
+    void setXsiType(const XMLCh* const        prefix
+      , const XMLCh* const        localPart
+       , const unsigned int        uriId);
+
+    void setNillable(bool isNil);
+    void setErrorReporter(XMLErrorReporter* const errorReporter);
+    void setExitOnFirstFatal(const bool newValue);
+    void setDatatypeBuffer(const XMLCh* const value);
+
+    // -----------------------------------------------------------------------
+    //  Getter methods
+    // -----------------------------------------------------------------------
+    ComplexTypeInfo* getCurrentTypeInfo() const;
 
 private:
     // -----------------------------------------------------------------------
@@ -396,6 +403,15 @@ inline void SchemaValidator::setDatatypeBuffer(const XMLCh* const value)
     fDatatypeBuffer.append(value);
 }
 
+// ---------------------------------------------------------------------------
+//  SchemaValidator: Getter methods
+// ---------------------------------------------------------------------------
+inline ComplexTypeInfo* SchemaValidator::getCurrentTypeInfo() const {
+    if (fTypeStack->empty())
+        return 0;
+    return fTypeStack->peek();
+}
+
 // ---------------------------------------------------------------------------
 //  Virtual interface
 // ---------------------------------------------------------------------------