diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp
index 705f433ef051c0d68625b6224ccda1b5025fbc9d..c1c62eab1b9783e6105d9bc4a757686503f0880f 100644
--- a/src/xercesc/dom/deprecated/DOMParser.cpp
+++ b/src/xercesc/dom/deprecated/DOMParser.cpp
@@ -546,9 +546,10 @@ void DOMParser::endEntityReference(const XMLEntityDecl& entDecl)
 }
 
 
-void DOMParser::endElement( const   XMLElementDecl&     elemDecl
+void DOMParser::endElement( const   XMLElementDecl&    elemDecl
                            , const unsigned int        urlId
-                           , const bool                isRoot)
+                           , const bool                isRoot
+                           , const XMLCh* const        elemPrefix)
 {
     fCurrentNode   = fCurrentParent;
     fCurrentParent = fNodeStack->pop();
@@ -626,11 +627,19 @@ void DOMParser::startElement(const  XMLElementDecl&         elemDecl
     if (fScanner -> getDoNamespaces()) {    //DOM Level 2, doNamespaces on
         XMLBuffer buf;
         DOMString namespaceURI = 0;
+        DOMString elemQName = 0;
         if (urlId != fScanner->getEmptyNamespaceId()) {  //TagName has a prefix
             fScanner->getURIText(urlId, buf);   //get namespaceURI
             namespaceURI = DOMString(buf.getRawBuffer());
+
+            if (elemPrefix && *elemPrefix) {
+                elemQName.appendData(elemPrefix);
+                elemQName.appendData(chColon);
+            }
         }
-        elem = fDocument.createElementNS(namespaceURI, elemDecl.getFullName());
+        elemQName.appendData(elemDecl.getBaseName());
+
+        elem = fDocument.createElementNS(namespaceURI, elemQName);
         ElementImpl *elemImpl = (ElementImpl *) elem.fImpl;
         for (unsigned int index = 0; index < attrCount; ++index) {
             static const XMLCh XMLNS[] = {
@@ -692,7 +701,7 @@ void DOMParser::startElement(const  XMLElementDecl&         elemDecl
 
     // If an empty element, do end right now (no endElement() will be called)
     if (isEmpty)
-        endElement(elemDecl, urlId, isRoot);
+        endElement(elemDecl, urlId, isRoot, elemPrefix);
 }
 
 
diff --git a/src/xercesc/dom/deprecated/DOMParser.hpp b/src/xercesc/dom/deprecated/DOMParser.hpp
index 06f7c2605fa9d0f150d2b000655309c55fbfa815..d849a4cc8da03e7f76293f4258c4887bd6e31f03 100644
--- a/src/xercesc/dom/deprecated/DOMParser.hpp
+++ b/src/xercesc/dom/deprecated/DOMParser.hpp
@@ -1092,12 +1092,16 @@ public :
       *                 namespaces setting is switched on.
       * @param isRoot   A flag indicating whether this element was the
       *                 root element.
+      * @param elemPrefix A const pointer to a Unicode string containing
+      *                 the namespace prefix for this element. Applicable
+      *                 only when namespace processing is enabled.
       */
     virtual void endElement
     (
         const   XMLElementDecl& elemDecl
         , const unsigned int    urlId
         , const bool            isRoot
+        , const XMLCh* const    elemPrefix=0
     );
 
     /** Handle and end of entity reference event
diff --git a/src/xercesc/framework/XMLDocumentHandler.hpp b/src/xercesc/framework/XMLDocumentHandler.hpp
index 8295d6e04c6e46e47c10e08df456e01bf678bcfc..9bcdda71fef7e496ca94dd6cf7673a70a352c136 100644
--- a/src/xercesc/framework/XMLDocumentHandler.hpp
+++ b/src/xercesc/framework/XMLDocumentHandler.hpp
@@ -56,6 +56,9 @@
 
  /*
   * $Log$
+  * Revision 1.3  2002/05/28 20:41:11  tng
+  * [Bug 9104] prefixes dissapearing when schema validation turned on.
+  *
   * Revision 1.2  2002/02/20 18:17:01  tng
   * [Bug 5977] Warnings on generating apiDocs.
   *
@@ -202,12 +205,14 @@ public:
       * @param  uriId       The ID of the URI in the URI pool (only valid if
       *                     name spaces is enabled)
       * @param  isRoot      Indicates if this is the root element.
+      * @param  prefixName  The string representing the prefix name
       */
     virtual void endElement
     (
         const   XMLElementDecl& elemDecl
         , const unsigned int    uriId
         , const bool            isRoot
+        , const XMLCh* const    prefixName = 0
     ) = 0;
 
     /** Receive notification when a referenced entity's content ends
diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp
index a387ebcbf65d9e2693f7c0c815d12777de205849..3b0ebbd3baf62f7903fa44b7185143658144aa04 100644
--- a/src/xercesc/internal/XMLScanner.cpp
+++ b/src/xercesc/internal/XMLScanner.cpp
@@ -1708,9 +1708,9 @@ void XMLScanner::scanEndTag(bool& gotData)
 
     unsigned int uriId = fEmptyNamespaceId;
     XMLBufBid bbName(&fBufMgr);
+    XMLBufBid bbPrefix(&fBufMgr);
     if (fDoNamespaces)
     {
-        XMLBufBid bbPrefix(&fBufMgr);
         uriId = resolveQName
         (
             qnameBuf.getRawBuffer()
@@ -1893,6 +1893,7 @@ void XMLScanner::scanEndTag(bool& gotData)
             *topElem->fThisElement
             , uriId
             , isRoot
+            , bbPrefix.getRawBuffer()
         );
     }
 
@@ -3488,6 +3489,7 @@ bool XMLScanner::scanStartTagNS(bool& gotData)
                 *elemDecl
                 , uriId
                 , isRoot
+                , fPrefixBuf.getRawBuffer()
             );
         }
 
diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index ba61e242b02572e3fd0a2d2bd77283b0a9c479b6..5d2c65b84d023621eaae60eed8976a333370303c 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -505,7 +505,8 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl& entDecl)
 
 void AbstractDOMParser::endElement( const   XMLElementDecl&     elemDecl
                            , const unsigned int        urlId
-                           , const bool                isRoot)
+                           , const bool                isRoot
+                           , const XMLCh* const        elemPrefix)
 {
     fCurrentNode   = fCurrentParent;
     fCurrentParent = fNodeStack->pop();
@@ -587,14 +588,24 @@ void AbstractDOMParser::startElement(const  XMLElementDecl&         elemDecl
 
     if (fScanner -> getDoNamespaces()) {    //DOM Level 2, doNamespaces on
 
-        XMLBufBid bbQName(&fBufMgr);
-        XMLBuffer& buf = bbQName.getBuffer();
+        XMLBufBid bbURI(&fBufMgr);
+        XMLBuffer& bufURI = bbURI.getBuffer();
         XMLCh* namespaceURI = 0;
+
+        XMLBufBid elemQName(&fBufMgr);
+
         if (urlId != fScanner->getEmptyNamespaceId()) {  //TagName has a prefix
-            fScanner->getURIText(urlId, buf);   //get namespaceURI
-            namespaceURI = buf.getRawBuffer();
+            fScanner->getURIText(urlId, bufURI);   //get namespaceURI
+            namespaceURI = bufURI.getRawBuffer();
+
+            if (elemPrefix && *elemPrefix) {
+                elemQName.set(elemPrefix);
+                elemQName.append(chColon);
+            }
         }
-        elem = createElementNSNode(namespaceURI, elemDecl.getFullName());
+        elemQName.append(elemDecl.getBaseName());
+
+        elem = createElementNSNode(namespaceURI, elemQName.getRawBuffer());
         DOMElementImpl *elemImpl = (DOMElementImpl *) elem;
         for (unsigned int index = 0; index < attrCount; ++index) {
             static const XMLCh XMLNS[] = {
@@ -606,8 +617,8 @@ void AbstractDOMParser::startElement(const  XMLElementDecl&         elemDecl
             if (!XMLString::compareString(oneAttrib -> getName(), XMLNS))    //for xmlns=...
                 attrURIId = fScanner->getXMLNSNamespaceId();
             if (attrURIId != fScanner->getEmptyNamespaceId()) {  //TagName has a prefix
-                fScanner->getURIText(attrURIId, buf);   //get namespaceURI
-                namespaceURI = buf.getRawBuffer();
+                fScanner->getURIText(attrURIId, bufURI);   //get namespaceURI
+                namespaceURI = bufURI.getRawBuffer();
             }
             //  revisit.  Optimize to init the named node map to the
             //            right size up front.
@@ -667,7 +678,7 @@ void AbstractDOMParser::startElement(const  XMLElementDecl&         elemDecl
 
     // If an empty element, do end right now (no endElement() will be called)
     if (isEmpty)
-        endElement(elemDecl, urlId, isRoot);
+        endElement(elemDecl, urlId, isRoot, elemPrefix);
 }
 
 
diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp
index 83cb88ceaae7bf9f25759cd91e51383f7c6d26c2..60792b7cdc24d0076be6ed5db9cc6f4db727a315 100644
--- a/src/xercesc/parsers/AbstractDOMParser.hpp
+++ b/src/xercesc/parsers/AbstractDOMParser.hpp
@@ -885,12 +885,16 @@ public :
       *                 namespaces setting is switched on.
       * @param isRoot   A flag indicating whether this element was the
       *                 root element.
+      * @param elemPrefix A const pointer to a Unicode string containing
+      *                 the namespace prefix for this element. Applicable
+      *                 only when namespace processing is enabled.
       */
     virtual void endElement
     (
         const   XMLElementDecl& elemDecl
         , const unsigned int    urlId
         , const bool            isRoot
+        , const XMLCh* const    elemPrefix
     );
 
     /** Handle and end of entity reference event
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
index adcb8e215f2b45404b4bda3c37ce7f5f3cea886b..68de9b22a6deaa3bf14bf1348d3e3651c007cb92 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.5  2002/05/28 20:44:14  tng
+ * [Bug 9104] prefixes dissapearing when schema validation turned on.
+ *
  * Revision 1.4  2002/05/27 18:39:21  tng
  * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number.
  *
@@ -772,116 +775,116 @@ startElement(   const   XMLElementDecl&         elemDecl
                 , const bool                    isEmpty
                 , const bool                    isRoot)
 {
-
-	// Bump the element depth counter if not empty
+    // Bump the element depth counter if not empty
     if (!isEmpty)
         fElemDepth++;
 
     if (fDocHandler)
-	{
-	
-		if (getDoNamespaces())
-		{
+    {
+        XMLBufBid elemQName( &fStringBuffers ) ;
+        if (elemPrefix && *elemPrefix) {
+            elemQName.set(elemPrefix);
+            elemQName.append(chColon);
+        }
+        elemQName.append(elemDecl.getBaseName());
+
+        if (getDoNamespaces())
+        {
             unsigned int numPrefix = 0;
-			const XMLCh*   nsString = XMLUni::fgXMLNSString;
-			const XMLCh*   nsPrefix = 0;
-			const XMLCh*   nsURI    = 0;
-			const XMLAttr* tempAttr = 0;
+            const XMLCh*   nsString = XMLUni::fgXMLNSString;
+            const XMLCh*   nsPrefix = 0;
+            const XMLCh*   nsURI    = 0;
+            const XMLAttr* tempAttr = 0;
 
             if (!fnamespacePrefix)
-			{
+            {
                 tempAttrVec->removeAllElements();
-			}
-
-			for (unsigned int i = 0; i < attrCount; i++)
-			{
-				tempAttr = attrList.elementAt(i);
-                  if (XMLString::compareString(tempAttr->getQName(), nsString) == 0)
-					nsURI = tempAttr->getValue();
-                  if (XMLString::compareString(tempAttr->getPrefix(), nsString) == 0)
-				{
-					nsPrefix = tempAttr->getName();
-					nsURI = tempAttr->getValue();
-				}
-				if (!fnamespacePrefix)
-				{
-					if (nsURI == 0)
-						tempAttrVec->addElement((XMLAttr* const)tempAttr);
-				}
-				if (nsURI != 0)
-				{
-					if (nsPrefix == 0)
-						nsPrefix = XMLUni::fgZeroLenString;
-					fDocHandler->startPrefixMapping(nsPrefix, nsURI);
-					
-					XMLBuffer &buf = fStringBuffers.bidOnBuffer()  ;
-					buf.set ( nsPrefix ) ;
-					fPrefixes->push(&buf) ;
-
-					numPrefix++;
-				}
-				nsURI = 0;
-				nsPrefix = 0;	
-			}
-			prefixCounts->push(numPrefix) ;
-			if (!fnamespacePrefix)
-				fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner);
-			else
+            }
+
+            for (unsigned int i = 0; i < attrCount; i++)
+            {
+                tempAttr = attrList.elementAt(i);
+                if (XMLString::compareString(tempAttr->getQName(), nsString) == 0)
+                    nsURI = tempAttr->getValue();
+                if (XMLString::compareString(tempAttr->getPrefix(), nsString) == 0)
+                {
+                    nsPrefix = tempAttr->getName();
+                    nsURI = tempAttr->getValue();
+                }
+                if (!fnamespacePrefix)
+                {
+                    if (nsURI == 0)
+                        tempAttrVec->addElement((XMLAttr* const)tempAttr);
+                }
+                if (nsURI != 0)
+                {
+                    if (nsPrefix == 0)
+                        nsPrefix = XMLUni::fgZeroLenString;
+                    fDocHandler->startPrefixMapping(nsPrefix, nsURI);
+                    XMLBuffer &buf = fStringBuffers.bidOnBuffer();
+                    buf.set ( nsPrefix ) ;
+                    fPrefixes->push(&buf) ;
+                    numPrefix++;
+                }
+                nsURI = 0;
+                nsPrefix = 0;
+            }
+            prefixCounts->push(numPrefix) ;
+            if (!fnamespacePrefix)
+                fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner);
+            else
                 fAttrList.setVector(&attrList, attrCount, fScanner);
 
-			// call startElement() with namespace declarations
-			XMLBufBid URIBufferBid ( &fStringBuffers ) ;
-			XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
+            // call startElement() with namespace declarations
+            XMLBufBid URIBufferBid ( &fStringBuffers ) ;
+            XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
 
-			fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
-			
-			fDocHandler->startElement(URIBuffer.getRawBuffer(),
+            fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
+
+            fDocHandler->startElement(URIBuffer.getRawBuffer(),
 										elemDecl.getBaseName(),
-										elemDecl.getFullName(),
+										elemQName.getRawBuffer(),
 										fAttrList);
-		}
-		else
-		{
-			fAttrList.setVector(&attrList, attrCount, fScanner);
-			fDocHandler->startElement(XMLUni::fgZeroLenString,
+        }
+        else // no namespace
+        {
+            fAttrList.setVector(&attrList, attrCount, fScanner);
+            fDocHandler->startElement(XMLUni::fgZeroLenString,
 										elemDecl.getBaseName(),
 										elemDecl.getFullName(),
 										fAttrList);
-		}
+        }
 
 
         // If its empty, send the end tag event now
         if (isEmpty)
-		{
-
-			// call endPrefixMapping appropriately.
-			if (getDoNamespaces())
-			{
-				XMLBufBid URIBufferBid ( &fStringBuffers ) ;
-				XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
+        {
+            // call endPrefixMapping appropriately.
+            if (getDoNamespaces())
+            {
+                XMLBufBid URIBufferBid ( &fStringBuffers ) ;
+                XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
+                fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
 
-				fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer);
-			
-				fDocHandler->endElement(	URIBuffer.getRawBuffer(),
+                fDocHandler->endElement(	URIBuffer.getRawBuffer(),
 											elemDecl.getBaseName(),
-											elemDecl.getFullName() );
-				unsigned int numPrefix = prefixCounts->pop();
-				for (unsigned int i = 0; i < numPrefix; ++i)
-				{
-					XMLBuffer * buf = fPrefixes->pop() ;
-					fDocHandler->endPrefixMapping( buf->getRawBuffer() );
-					fStringBuffers.releaseBuffer(*buf) ;
-				}
-			}
-			else
-			{
-				fDocHandler->endElement(XMLUni::fgZeroLenString,
-							elemDecl.getBaseName(),
-							elemDecl.getFullName() );
-
-			}
-
-		}
+											elemQName.getRawBuffer());
+
+                unsigned int numPrefix = prefixCounts->pop();
+                for (unsigned int i = 0; i < numPrefix; ++i)
+                {
+                    XMLBuffer * buf = fPrefixes->pop() ;
+                    fDocHandler->endPrefixMapping( buf->getRawBuffer() );
+                    fStringBuffers.releaseBuffer(*buf) ;
+                }
+            }
+            else
+            {
+                fDocHandler->endElement(XMLUni::fgZeroLenString,
+                                elemDecl.getBaseName(),
+                                elemDecl.getFullName());
+            }
+        }
     }
 
     //
@@ -905,46 +908,54 @@ startElement(   const   XMLElementDecl&         elemDecl
 
 void SAX2XMLReaderImpl::endElement( const   XMLElementDecl& elemDecl
                             , const unsigned int    uriId
-                            , const bool            isRoot)
+                            , const bool            isRoot
+                            , const XMLCh* const    elemPrefix)
 {
     // Just map to the SAX document handler
     if (fDocHandler)
-	{
+    {
 
-		// get the prefixes back so that we can call endPrefixMapping()
+        // get the prefixes back so that we can call endPrefixMapping()
         if (getDoNamespaces())
-		{
-			XMLBufBid URIBufferBid ( &fStringBuffers ) ;
-			XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
+        {
+            XMLBufBid URIBufferBid ( &fStringBuffers ) ;
+            XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ;
 
-			fScanner->getURIText(uriId, URIBuffer ) ;
-			fDocHandler->endElement(	URIBuffer.getRawBuffer(),
-										elemDecl.getBaseName(),
-										elemDecl.getFullName() );
-
-			unsigned int numPrefix = prefixCounts->pop();
-			for (unsigned int i = 0; i < numPrefix; i++)
-			{
-				XMLBuffer * buf = fPrefixes->pop() ;
-				fDocHandler->endPrefixMapping( buf->getRawBuffer() );
-				fStringBuffers.releaseBuffer(*buf) ;
-			}
-		}
-		else
-		{
-			fDocHandler->endElement(XMLUni::fgZeroLenString,
+            fScanner->getURIText(uriId, URIBuffer ) ;
+
+            XMLBufBid elemQName( &fStringBuffers ) ;
+            if (elemPrefix && *elemPrefix) {
+                elemQName.set(elemPrefix);
+                elemQName.append(chColon);
+            }
+            elemQName.append(elemDecl.getBaseName());
+
+            fDocHandler->endElement(	URIBuffer.getRawBuffer(),
 										elemDecl.getBaseName(),
-										elemDecl.getFullName() );
-		}
-	
-	}
+										elemQName.getRawBuffer());
+
+            unsigned int numPrefix = prefixCounts->pop();
+            for (unsigned int i = 0; i < numPrefix; i++)
+            {
+                XMLBuffer * buf = fPrefixes->pop() ;
+                fDocHandler->endPrefixMapping( buf->getRawBuffer() );
+                fStringBuffers.releaseBuffer(*buf) ;
+            }
+        }
+        else
+        {
+            fDocHandler->endElement(XMLUni::fgZeroLenString,
+            elemDecl.getBaseName(),
+            elemDecl.getFullName() );
+        }
+    }
 
     //
     //  If there are any installed advanced handlers, then lets call them
     //  with this info.
     //
     for (unsigned int index = 0; index < fAdvDHCount; index++)
-        fAdvDHList[index]->endElement(elemDecl, uriId, isRoot);
+        fAdvDHList[index]->endElement(elemDecl, uriId, isRoot, elemPrefix);
 
     //
     //  Dump the element depth down again. Don't let it underflow in case
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
index 15158ec9b845732806d7fb50c0ab24cf639615ee..c78d7c9066deec0fb6c7da3b9e0af5c3cf8a5533 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2002/05/28 20:44:14  tng
+ * [Bug 9104] prefixes dissapearing when schema validation turned on.
+ *
  * Revision 1.3  2002/05/27 18:39:21  tng
  * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number.
  *
@@ -283,6 +286,9 @@ public :
       *                 namespaces setting is switched on.
       * @param isRoot   A flag indicating whether this element was the
       *                 root element.
+      * @param elemPrefix A const pointer to a Unicode string containing
+      *                   the namespace prefix for this element. Applicable
+      *                   only when namespace processing is enabled.
       * @see DocumentHandler#endElement
       */
     virtual void endElement
@@ -290,6 +296,7 @@ public :
         const   XMLElementDecl& elemDecl
         , const unsigned int    urlId
         , const bool            isRoot
+        , const XMLCh* const    elemPrefix=0
     );
 
     /**
diff --git a/src/xercesc/parsers/SAXParser.cpp b/src/xercesc/parsers/SAXParser.cpp
index 1536840bcef276dddcabf3fe9f0a12bda891b0db..ae450a63b55ab45c0ceef4d5a409579328c3b5a4 100644
--- a/src/xercesc/parsers/SAXParser.cpp
+++ b/src/xercesc/parsers/SAXParser.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2002/05/28 20:44:14  tng
+ * [Bug 9104] prefixes dissapearing when schema validation turned on.
+ *
  * Revision 1.3  2002/05/27 18:39:21  tng
  * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number.
  *
@@ -692,18 +695,31 @@ void SAXParser::endDocument()
 
 void SAXParser::endElement( const   XMLElementDecl& elemDecl
                             , const unsigned int    uriId
-                            , const bool            isRoot)
+                            , const bool            isRoot
+                            , const XMLCh* const    elemPrefix)
 {
     // Just map to the SAX document handler
-    if (fDocHandler)
-        fDocHandler->endElement(elemDecl.getFullName());
+    if (fDocHandler) {
+        if (fScanner->getDoNamespaces()) {
+            XMLBuffer elemQName;
+            if (elemPrefix && *elemPrefix) {
+                elemQName.set(elemPrefix);
+                elemQName.append(chColon);
+            }
+            elemQName.append(elemDecl.getBaseName());
+            fDocHandler->endElement(elemQName.getRawBuffer());
+        }
+        else
+            fDocHandler->endElement(elemDecl.getFullName());
+
+    }
 
     //
     //  If there are any installed advanced handlers, then lets call them
     //  with this info.
     //
     for (unsigned int index = 0; index < fAdvDHCount; index++)
-        fAdvDHList[index]->endElement(elemDecl, uriId, isRoot);
+        fAdvDHList[index]->endElement(elemDecl, uriId, isRoot, elemPrefix);
 
     //
     //  Dump the element depth down again. Don't let it underflow in case
@@ -798,11 +814,27 @@ startElement(   const   XMLElementDecl&         elemDecl
     if (fDocHandler)
     {
         fAttrList.setVector(&attrList, attrCount);
-        fDocHandler->startElement(elemDecl.getFullName(), fAttrList);
+        if (fScanner->getDoNamespaces()) {
+            XMLBuffer elemQName;
+            if (elemPrefix && *elemPrefix) {
+                elemQName.set(elemPrefix);
+                elemQName.append(chColon);
+            }
+            elemQName.append(elemDecl.getBaseName());
 
-        // If its empty, send the end tag event now
-        if (isEmpty)
-            fDocHandler->endElement(elemDecl.getFullName());
+            fDocHandler->startElement(elemQName.getRawBuffer(), fAttrList);
+
+            // If its empty, send the end tag event now
+            if (isEmpty)
+                fDocHandler->endElement(elemQName.getRawBuffer());
+        }
+        else {
+            fDocHandler->startElement(elemDecl.getFullName(), fAttrList);
+
+            // If its empty, send the end tag event now
+            if (isEmpty)
+                fDocHandler->endElement(elemDecl.getFullName());
+        }
     }
 
     //
diff --git a/src/xercesc/parsers/SAXParser.hpp b/src/xercesc/parsers/SAXParser.hpp
index ed6ab733c6300bf07eb689597c4cb29b5b69efa5..205f9a7b01508df665553fe2525db4ce3f15e79b 100644
--- a/src/xercesc/parsers/SAXParser.hpp
+++ b/src/xercesc/parsers/SAXParser.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.4  2002/05/28 20:44:14  tng
+ * [Bug 9104] prefixes dissapearing when schema validation turned on.
+ *
  * Revision 1.3  2002/05/27 18:39:21  tng
  * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number.
  *
@@ -1216,6 +1219,9 @@ public :
       *                 namespaces setting is switched on.
       * @param isRoot   A flag indicating whether this element was the
       *                 root element.
+      * @param elemPrefix A const pointer to a Unicode string containing
+      *                   the namespace prefix for this element. Applicable
+      *                   only when namespace processing is enabled.
       * @see DocumentHandler#endElement
       */
     virtual void endElement
@@ -1223,6 +1229,7 @@ public :
         const   XMLElementDecl& elemDecl
         , const unsigned int    urlId
         , const bool            isRoot
+        , const XMLCh* const    elemPrefix
     );
 
     /**