diff --git a/src/xercesc/framework/psvi/PSVIHandler.hpp b/src/xercesc/framework/psvi/PSVIHandler.hpp
index cf02bec99c0a8f45fc2ed7ad08704db3e96406c0..54a7218c5749154f291b801df928bcf566921bd6 100755
--- a/src/xercesc/framework/psvi/PSVIHandler.hpp
+++ b/src/xercesc/framework/psvi/PSVIHandler.hpp
@@ -16,6 +16,9 @@
 
  /*
   * $Log$
+  * Revision 1.8  2004/09/21 16:09:37  peiyongz
+  * Handle partial PSVIElement
+  *
   * Revision 1.7  2004/09/08 13:56:07  peiyongz
   * Apache License Version 2.0
   *
@@ -86,6 +89,13 @@ public:
         ,       PSVIElement *           elementInfo
     ) = 0;
 
+    virtual void handlePartialElementPSVI
+    (
+        const   XMLCh* const            localName 
+        , const XMLCh* const            uri
+        ,       PSVIElement *           elementInfo
+    ) = 0;
+
     /**
       * Enables PSVI information about attributes to be passed back to the
       * application.  This callback will be made on *all*
diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp
index c46360dc43894684165d76e8111dd3bdeb298268..2470eed9980b471bc3f8b2f2e1edceb2986f4b7b 100644
--- a/src/xercesc/internal/IGXMLScanner.cpp
+++ b/src/xercesc/internal/IGXMLScanner.cpp
@@ -2899,6 +2899,59 @@ bool IGXMLScanner::scanStartTagNS(bool& gotData)
     }
     else if (fGrammarType == Grammar::SchemaGrammarType) 
     {   
+        // send a partial element psvi
+        if (fPSVIHandler)
+        {
+
+            ComplexTypeInfo*   curTypeInfo = 0;
+            DatatypeValidator* curDV = 0;
+            XSTypeDefinition*  typeDef = 0;
+        
+            if (fValidate && elemDecl->isDeclared())
+            {
+                curTypeInfo = ((SchemaValidator*) fValidator)->getCurrentTypeInfo();
+                    
+                if (curTypeInfo)
+                {
+                    typeDef = (XSTypeDefinition*) fModel->getXSObject(curTypeInfo);       
+                }
+                else
+                {
+                    curDV = ((SchemaValidator*) fValidator)->getCurrentDatatypeValidator();
+
+                    if (curDV)
+                    {
+                        typeDef = (XSTypeDefinition*) fModel->getXSObject(curDV);
+                    }
+                }
+            }
+                       
+            fPSVIElement->reset
+                (
+                  PSVIElement::VALIDITY_NOTKNOWN 
+                , PSVIElement::VALIDATION_NONE   
+                , fRootElemName                  
+                , ((SchemaValidator*) fValidator)->getIsElemSpecified() 
+                , (elemDecl->isDeclared()) ? (XSElementDeclaration*) fModel->getXSObject(elemDecl) : 0
+                , typeDef 
+                , 0 //memberType
+                , fModel 
+                , ((SchemaElementDecl*)elemDecl)->getDefaultValue()  
+                , 0                                                  
+                , 0                                                  
+                , 0                                                  
+                );
+
+
+            fPSVIHandler->handlePartialElementPSVI
+                (
+                  elemDecl->getBaseName()
+                , fURIStringPool->getValueForId(elemDecl->getURI())
+                , fPSVIElement
+                );
+
+        }
+
         // not empty
         fErrorStack->push(fPSVIElemContext.fErrorOccurred);
     }
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index d624f7ae2fca8900cbd319aa2944563361d85cd7..6dd7adaa7a3e84c54cf765325584d1a01ca1ecc4 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -1758,7 +1758,63 @@ bool SGXMLScanner::scanStartTag(bool& gotData)
         }
     }
     else    // not empty
+    {
+
+        // send a partial element psvi
+        if (fPSVIHandler)
+        {
+
+            ComplexTypeInfo*   curTypeInfo = 0;
+            DatatypeValidator* curDV = 0;
+            XSTypeDefinition*  typeDef = 0;
+        
+            if (fValidate && elemDecl->isDeclared())
+            {
+                curTypeInfo = ((SchemaValidator*) fValidator)->getCurrentTypeInfo();
+                    
+                if (curTypeInfo)
+                {
+                    typeDef = (XSTypeDefinition*) fModel->getXSObject(curTypeInfo);       
+                }
+                else
+                {
+                    curDV = ((SchemaValidator*) fValidator)->getCurrentDatatypeValidator();
+
+                    if (curDV)
+                    {
+                        typeDef = (XSTypeDefinition*) fModel->getXSObject(curDV);
+                    }
+                }
+            }
+                       
+            fPSVIElement->reset
+                (
+                  PSVIElement::VALIDITY_NOTKNOWN 
+                , PSVIElement::VALIDATION_NONE   
+                , fRootElemName                  
+                , ((SchemaValidator*) fValidator)->getIsElemSpecified() 
+                , (elemDecl->isDeclared()) ? (XSElementDeclaration*) fModel->getXSObject(elemDecl) : 0
+                , typeDef 
+                , 0 //memberType
+                , fModel 
+                , ((SchemaElementDecl*)elemDecl)->getDefaultValue()  
+                , 0                                                  
+                , 0                                                  
+                , 0                                                  
+                );
+
+
+            fPSVIHandler->handlePartialElementPSVI
+                (
+                  elemDecl->getBaseName()
+                , fURIStringPool->getValueForId(elemDecl->getURI())
+                , fPSVIElement
+                );
+
+        }
+
         fErrorStack->push(fPSVIElemContext.fErrorOccurred);
+    }
 
     return true;
 }
diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index 16439a83e68c252afb7c50a11d7408a81d50267a..9bbcf45bc91eaaf27225270f14ab0bc4c6d3d928 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -607,6 +607,14 @@ void AbstractDOMParser::handleElementPSVI(const XMLCh* const            localNam
         fPSVIHandler->handleElementPSVI(localName, uri, elementInfo);
 }
 
+void AbstractDOMParser::handlePartialElementPSVI(const XMLCh* const            localName 
+                                               , const XMLCh* const            uri
+                                               ,       PSVIElement *           elementInfo)
+{
+    if(fPSVIHandler)
+        fPSVIHandler->handlePartialElementPSVI(localName, uri, elementInfo);
+}
+
 void AbstractDOMParser::handleAttributesPSVI( const XMLCh* const            localName 
                                             , const XMLCh* const            uri
                                             ,       PSVIAttributeList *     psviAttributes)
diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp
index 13faea31746030e5b824902c22b00f173577215b..f22f1496a75cc5a575cd93a4223b344d4f1eb588 100644
--- a/src/xercesc/parsers/AbstractDOMParser.hpp
+++ b/src/xercesc/parsers/AbstractDOMParser.hpp
@@ -990,6 +990,13 @@ public :
         , const XMLCh* const            uri
         ,       PSVIElement *           elementInfo
     );
+
+    virtual void handlePartialElementPSVI
+    (
+        const   XMLCh* const            localName 
+        , const XMLCh* const            uri
+        ,       PSVIElement *           elementInfo
+    );
     /**
       * Enables PSVI information about attributes to be passed back to the
       * application.  This callback will be made on *all*