diff --git a/src/internal/XMLScanner.cpp b/src/internal/XMLScanner.cpp
index 4f57c94d11f69cf31d1863fdf9c963055ded5c80..e0c147ee26e51ca75050092bf97b2f62f7e75a1c 100644
--- a/src/internal/XMLScanner.cpp
+++ b/src/internal/XMLScanner.cpp
@@ -3421,3 +3421,61 @@ XMLScanner::resolveQName(   const   XMLCh* const        qName
     return uriId;
 }
 
+bool XMLScanner::checkXMLDecl(bool startWithAngle) {
+    //
+    // [23] XMLDecl     ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
+    // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')
+    //
+    // [3]  S           ::= (#x20 | #x9 | #xD | #xA)+
+    //
+
+    if (startWithAngle) {
+        if (fReaderMgr.peekString(XMLUni::fgXMLDeclString)) {
+            if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpace)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTab)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLF)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCR))
+            {
+                return true;
+            }
+            else if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpaceU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTabU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLFU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCRU))
+            {
+                //
+                //  Just in case, check for upper case. If found, issue
+                //  an error, but keep going.
+                //
+                emitError(XMLErrs::XMLDeclMustBeLowerCase);
+                return true;
+            }
+        }
+    }
+    else {
+        if (fReaderMgr.peekString(XMLUni::fgXMLString)) {
+            if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpace)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringHTab)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringLF)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringCR))
+            {
+                return true;
+            }
+            else if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpaceU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringHTabU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringLFU)
+               || fReaderMgr.skippedString(XMLUni::fgXMLStringCRU))
+            {
+                //
+                //  Just in case, check for upper case. If found, issue
+                //  an error, but keep going.
+                //
+                emitError(XMLErrs::XMLDeclMustBeLowerCase);
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
diff --git a/src/internal/XMLScanner.hpp b/src/internal/XMLScanner.hpp
index bef1130e9e676e381f55e7f7fd865e2bfddabcad..46dea288dbb988e44867557e697f668a648588cf 100644
--- a/src/internal/XMLScanner.hpp
+++ b/src/internal/XMLScanner.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.27  2001/07/13 16:56:48  tng
+ * ScanId fix.
+ *
  * Revision 1.26  2001/07/12 18:50:17  tng
  * Some performance modification regarding standalone check and xml decl check.
  *
@@ -1124,61 +1127,4 @@ inline void XMLScanner::setDoValidation(const bool validate)
         fValScheme = Val_Never;
 }
 
-inline bool XMLScanner::checkXMLDecl(bool startWithAngle) {
-    //
-    // [23] XMLDecl     ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
-    // [24] VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"')
-    //
-    // [3]  S           ::= (#x20 | #x9 | #xD | #xA)+
-    //
-
-    if (startWithAngle) {
-        if (fReaderMgr.peekString(XMLUni::fgXMLDeclString)) {
-            if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpace)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTab)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLF)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCR))
-            {
-                return true;
-            }
-            else if (fReaderMgr.skippedString(XMLUni::fgXMLDeclStringSpaceU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringHTabU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringLFU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLDeclStringCRU))
-            {
-                //
-                //  Just in case, check for upper case. If found, issue
-                //  an error, but keep going.
-                //
-                emitError(XMLErrs::XMLDeclMustBeLowerCase);
-                return true;
-            }
-        }
-    }
-    else {
-        if (fReaderMgr.peekString(XMLUni::fgXMLString)) {
-            if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpace)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringHTab)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringLF)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringCR))
-            {
-                return true;
-            }
-            else if (fReaderMgr.skippedString(XMLUni::fgXMLStringSpaceU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringHTabU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringLFU)
-               || fReaderMgr.skippedString(XMLUni::fgXMLStringCRU))
-            {
-                //
-                //  Just in case, check for upper case. If found, issue
-                //  an error, but keep going.
-                //
-                emitError(XMLErrs::XMLDeclMustBeLowerCase);
-                return true;
-            }
-        }
-    }
-
-    return false;
-}
 #endif
diff --git a/src/validators/DTD/DTDScanner.cpp b/src/validators/DTD/DTDScanner.cpp
index 6e3440e3b30ff9571c906a675057487f3be16798..2305ea631b1a443a36ea78c27c98ea97b2ddb158 100644
--- a/src/validators/DTD/DTDScanner.cpp
+++ b/src/validators/DTD/DTDScanner.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.18  2001/07/13 16:57:11  tng
+ * ScanId fix.
+ *
  * Revision 1.17  2001/07/12 20:10:18  tng
  * Partial Markup in Parameter Entity is validity constraint and thus should be just error, not fatal error.
  *
@@ -2889,18 +2892,19 @@ bool DTDScanner::scanId(          XMLBuffer&  pubIdToFill
     if (whatKind == IDType_Public)
         return true;
 
-    // Else lets get the system id
-    if (!fReaderMgr->skipPastSpaces())
-    {
-        //
-        //  In order to recover best here we need to see if we don't have
-        //  whitespace because the next thing is a quote or because the next
-        //  thing is some non-quote character.
-        //
-        const XMLCh chPeek = fReaderMgr->peekNextChar();
-        const bool bIsQuote =  ((chPeek == chDoubleQuote)
-                               || (chPeek == chSingleQuote));
+    // check if there is any space follows
+    bool hasSpace = fReaderMgr->skipPastSpaces();
 
+    //
+    //  In order to recover best here we need to see if
+    //  the next thing is a quote or not
+    //
+    const XMLCh chPeek = fReaderMgr->peekNextChar();
+    const bool bIsQuote =  ((chPeek == chDoubleQuote)
+                         || (chPeek == chSingleQuote));
+
+    if (!hasSpace)
+    {
         if (whatKind == IDType_External)
         {
             //
@@ -2931,8 +2935,16 @@ bool DTDScanner::scanId(          XMLBuffer&  pubIdToFill
         }
     }
 
-    if (!scanSystemLiteral(sysIdToFill))
+    if (bIsQuote) {
+        // there is a quote coming, scan the system literal
+        if (!scanSystemLiteral(sysIdToFill))
             return false;
+    }
+    else {
+        // no quote, if expecting exteral id, this is an error
+        if (whatKind == IDType_External)
+            fScanner->emitError(XMLErrs::ExpectedQuotedString);
+    }
 
     return true;
 }