diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index 8866856744a543b1666f81d869d362029674dbcd..880afc0806097d055653c45be975b4c483f11c03 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -141,7 +141,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
         return 0;
 
     // PSVI handling
-    if(fGrammarType == Grammar::SchemaGrammarType && getPSVIHandler())
+    if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType )
         fPSVIAttrList->reset();
     PSVIItem::VALIDITY_STATE attrValid = PSVIItem::VALIDITY_VALID;
     PSVIItem::ASSESSMENT_TYPE attrAssessed = PSVIItem::VALIDATION_FULL;
@@ -271,7 +271,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 );
                                 if(fGrammarType == Grammar::SchemaGrammarType) {
                                     ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
-                                    if (getPSVIHandler())
+                                    if(getPSVIHandler() )
                                     {
                                         attrValid = PSVIItem::VALIDITY_INVALID;
                                     }                                
@@ -292,7 +292,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                                 );
                                 if(fGrammarType == Grammar::SchemaGrammarType) {
                                     ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
-                                    if (getPSVIHandler())
+                                    if(getPSVIHandler() )
                                     {
                                         attrValid = PSVIItem::VALIDITY_INVALID;
                                     }
@@ -387,7 +387,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                     ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::VALID);
                 ((SchemaAttDef *)(attDef))->setValidationAttempted(PSVIDefs::FULL);
             }
-            if(getPSVIHandler())
+            if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType )
             {
                 // if we've found either an attDef or an attDefForWildCard,
                 // then we're doing full validation and it may still be valid.
@@ -534,7 +534,8 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                             , elemDecl
                         );
                         attrValidator = ((SchemaValidator*)fValidator)->getMostRecentAttrValidator();
-                        if(getPSVIHandler() && ((SchemaValidator *)fValidator)->getErrorOccurred())
+                        if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType
+                                && ((SchemaValidator *)fValidator)->getErrorOccurred())
                             attrValid = PSVIItem::VALIDITY_INVALID;
                     }
                     else if(fGrammarType == Grammar::SchemaGrammarType)
@@ -559,7 +560,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
             }
 
             // now fill in the PSVIAttributes entry for this attribute:
-	        if(getPSVIHandler())
+            if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType)
 	        {
 	            SchemaAttDef *actualAttDef = 0;
 	            if(attDef)
@@ -617,7 +618,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
             if((uriId == fXMLNSNamespaceId)
                   || XMLString::equals(getURIText(uriId), SchemaSymbols::fgURI_XSI))
                 attrValidator = DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYURI);
-            if(getPSVIHandler())
+            if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType)
             {
 	            PSVIAttribute *toFill = fPSVIAttrList->getPSVIAttributeToFill(); 
 	            XSSimpleTypeDefinition *validatingType = (attrValidator)
@@ -803,7 +804,7 @@ IGXMLScanner::buildAttList(const  RefVectorOf<KVStringPair>&  providedAttrs
                     // Indicate it was not explicitly specified and bump count
                     curAtt->setSpecified(false);
                     retCount++;
-                    if(getPSVIHandler())
+                    if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType)
                     {
                         PSVIAttribute *defAttrToFill = fPSVIAttrList->getPSVIAttributeToFill();
                         XSAttributeDeclaration *defAttrDecl = (XSAttributeDeclaration *)fModel->getXSObject((void *)curDef);
@@ -964,11 +965,9 @@ bool IGXMLScanner::normalizeAttValue( const   XMLAttDef* const    attDef
                          fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
                          if(fGrammarType == Grammar::SchemaGrammarType && attDef) {
                              ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
-                            if (getPSVIHandler())
-                            {
-                                // REVISIT:                                   
-                                // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID); 
-                            }
+                            // note that schema attributes won't be
+                            // subject to this constraint (standalone only relates
+                            // to DTD's)
                          }
 
                     }
@@ -1011,11 +1010,7 @@ bool IGXMLScanner::normalizeAttValue( const   XMLAttDef* const    attDef
                             fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
                             if(fGrammarType == Grammar::SchemaGrammarType && attDef) {
                                 ((SchemaAttDef *)(attDef))->setValidity(PSVIDefs::INVALID);
-                                if (getPSVIHandler())
-                                {
-                                    // REVISIT:                                   
-                                    // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID);                   
-                                }
+                                // only relates to DTD attributes
                             }
                         }
                     }
@@ -1830,6 +1825,9 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             fValidator->setGrammar(fGrammar);
         }
     }
+    // fModel may need updating:
+    if(getPSVIHandler() && fGrammarType == Grammar::SchemaGrammarType)
+        fModel = fGrammarResolver->getXSModel();
 }
 
 InputSource* IGXMLScanner::resolveSystemId(const XMLCh* const sysId)
@@ -1976,6 +1974,8 @@ Grammar* IGXMLScanner::loadXMLSchemaGrammar(const InputSource& src,
             if (toCache) {
                 fGrammarResolver->cacheGrammars();
             }
+            if(getPSVIHandler())
+                fModel = fGrammarResolver->getXSModel();
 
             return grammar;
         }
@@ -2280,11 +2280,7 @@ bool IGXMLScanner::scanAttValue(  const   XMLAttDef* const    attDef
 
                             if(fGrammarType == Grammar::SchemaGrammarType) {
                                 ((SchemaAttDef *)attDef)->setValidity(PSVIDefs::INVALID);
-                                if (getPSVIHandler())
-                                {
-                                    // REVISIT:                                   
-                                    // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID);
-                                }
+                                // only relates to DTD validation
                              }
                         }
                         nextCh = chSpace;
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 66ee4b8b8dc31d8c24e313f61f4586e8e0b045b5..0d459c3525a15470718e7b15d8db24262f07ba54 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -3656,6 +3656,10 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             fValidator->setGrammar(fGrammar);
         }
     }
+    // update fModel; rely on the grammar resolver to do this
+    // efficiently
+    if(getPSVIHandler())
+        fModel = fGrammarResolver->getXSModel();
 }
 
 InputSource* SGXMLScanner::resolveSystemId(const XMLCh* const sysId)
@@ -3795,6 +3799,9 @@ Grammar* SGXMLScanner::loadXMLSchemaGrammar(const InputSource& src,
                 fGrammarResolver->cacheGrammars();
             }
 
+            if(getPSVIHandler())
+                fModel = fGrammarResolver->getXSModel();
+
             return grammar;
         }
     }