diff --git a/src/internal/XMLScanner2.cpp b/src/internal/XMLScanner2.cpp
index 1e1854849b840c69d096125e5ca28618be6606bc..bd8d5bff9e3a1907e78b1ad474c65a3b8a820162 100644
--- a/src/internal/XMLScanner2.cpp
+++ b/src/internal/XMLScanner2.cpp
@@ -1551,42 +1551,49 @@ void XMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const
             DOM_Element root = document.getDocumentElement();// This is what we pass to TraverserSchema
             if (!root.isNull())
             {
-                //
-                //  Since we have seen a grammar, set our validation flag
-                //  at this point if the validation scheme is auto
-                //
-                if (fValScheme == Val_Auto && !fValidate) {
-                    fValidate = true;
-                    fElemStack.setValidationFlag(fValidate);
+                const XMLCh* newUri = root.getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE).rawBuffer();
+                if (XMLString::compareString(newUri, uri)) {
+                    if (fValidate)
+                        fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri);
+                    grammar = fGrammarResolver->getGrammar(newUri);
                 }
 
-                // we have seen a schema, so set up the fValidator as fSchemaValidator
-                if (!fValidator->handlesSchema())
-                {
-                    if (fValidatorFromUser) {
-                        // the fValidator is from user
-                        ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
-                    }
-                    else {
-                        fValidator = fSchemaValidator;
+                if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) {
+
+                    //
+                    //  Since we have seen a grammar, set our validation flag
+                    //  at this point if the validation scheme is auto
+                    //
+                    if (fValScheme == Val_Auto && !fValidate) {
+                        fValidate = true;
+                        fElemStack.setValidationFlag(fValidate);
                     }
-                }
 
-                if (fValidate && (!uri || !root.getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE).equals(uri)))
-                    fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri);
+                    // we have seen a schema, so set up the fValidator as fSchemaValidator
+                    if (!fValidator->handlesSchema())
+                    {
+                        if (fValidatorFromUser) {
+                            // the fValidator is from user
+                            ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator);
+                        }
+                        else {
+                            fValidator = fSchemaValidator;
+                        }
+                    }
 
-                grammar = new SchemaGrammar();
-                TraverseSchema traverseSchema(root, fURIStringPool, (SchemaGrammar*) grammar, fGrammarResolver, this, fValidator, srcToFill->getSystemId(), fEntityResolver, fErrorHandler);
+                    grammar = new SchemaGrammar();
+                    TraverseSchema traverseSchema(root, fURIStringPool, (SchemaGrammar*) grammar, fGrammarResolver, this, fValidator, srcToFill->getSystemId(), fEntityResolver, fErrorHandler);
 
-                if (fGrammarType == Grammar::DTDGrammarType) {
-                    fGrammar = grammar;
-                    fGrammarType = Grammar::SchemaGrammarType;
-                    fValidator->setGrammar(fGrammar);
-                }
+                    if (fGrammarType == Grammar::DTDGrammarType) {
+                        fGrammar = grammar;
+                        fGrammarType = Grammar::SchemaGrammarType;
+                        fValidator->setGrammar(fGrammar);
+                    }
 
-                if (!fReuseGrammar && fValidate) {
-                    //  validate the Schema scan so far
-                    fValidator->preContentValidation(fReuseGrammar);
+                    if (!fReuseGrammar && fValidate) {
+                        //  validate the Schema scan so far
+                        fValidator->preContentValidation(fReuseGrammar);
+                    }
                 }
             }
         }