diff --git a/src/xercesc/validators/DTD/DTDScanner.cpp b/src/xercesc/validators/DTD/DTDScanner.cpp
index 91931bfa3ce34b0435b92143b01e0e8d30d562ac..84ba04a5148955e631c4abb6e90d0481a283b21a 100644
--- a/src/xercesc/validators/DTD/DTDScanner.cpp
+++ b/src/xercesc/validators/DTD/DTDScanner.cpp
@@ -56,6 +56,15 @@
 
 /*
  * $Log$
+ * Revision 1.15  2002/11/05 21:40:36  tng
+ * Oasis test fix:
+ * 1.  Should check if content model allow character for CDataSection case
+ * 2. Should check partial markup in entity for INCLUDE and IGNORE scenario
+ * 3. If standalone is yes, reference to entity where its declaration is external is a well-formness fatal error (XML 1.0 Section 4.1)
+ * If standalone is yes, reference to parameter entity where is declaration is external is a validity constraint (XML 1.0 Section 2.9)
+ * 4.  XML 1.0 Section 2.8 Partial markup in parameter entity reference.
+ * If it is a complete declaration, partial markup is a fatal error.
+ *
  * Revision 1.14  2002/11/04 14:50:40  tng
  * C++ Namespace Support.
  *
@@ -360,11 +369,12 @@ bool DTDScanner::expandPERef( const   bool    scanExternal
     }
 
     //
+    // XML 1.0 Section 2.9
     //  If we are a standalone document, then it has to have been declared
     //  in the internal subset. Keep going though.
     //
     if (fScanner->getDoValidation() && fScanner->getStandalone() && !decl->getDeclaredInIntSubset())
-        fScanner->getValidator()->emitError(XMLValid::IllegalRefInStandalone, bbName.getRawBuffer());
+        fScanner->getValidator()->emitError(XMLValid::VC_IllegalRefInStandalone, bbName.getRawBuffer());
 
     //
     //  Okee dokee, we found it. So create either a memory stream with
@@ -1975,11 +1985,12 @@ DTDScanner::scanEntityRef(XMLCh& firstCh, XMLCh& secondCh, bool& escaped)
 
 
     //
+    // XML 1.0 Section 4.1
     //  If we are a standalone document, then it has to have been declared
-    //  in the internal subset. Keep going though.
+    //  in the internal subset.
     //
-    if (fScanner->getDoValidation() && fScanner->getStandalone() && !decl->getDeclaredInIntSubset())
-        fScanner->getValidator()->emitError(XMLValid::IllegalRefInStandalone, bbName.getRawBuffer());
+    if (fScanner->getStandalone() && !decl->getDeclaredInIntSubset())
+        fScanner->emitError(XMLErrs::IllegalRefInStandalone, bbName.getRawBuffer());
 
     //
     //  If its a special char reference, then its escaped and we can return
@@ -2502,7 +2513,9 @@ void DTDScanner::scanExtSubsetDecl(const bool inIncludeSect)
             if (nextCh == chOpenAngle)
             {
                 // Get the reader we started this on
+                // XML 1.0 P28a Well-formedness constraint: PE Between Declarations
                 const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
+                bool wasInPE = (fReaderMgr->getCurrentReader()->getType() == XMLReader::Type_PE);
 
                 //
                 //  Now scan the markup. Set the flag so that we will know that
@@ -2517,8 +2530,12 @@ void DTDScanner::scanExtSubsetDecl(const bool inIncludeSect)
                 //  And see if we got back to the same level. If not, then its
                 //  a partial markup error.
                 //
-                if (fReaderMgr->getCurrentReaderNum() != orgReader && fScanner->getDoValidation())
-                    fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+                if (fReaderMgr->getCurrentReaderNum() != orgReader){
+                    if (wasInPE)
+                        fScanner->emitError(XMLErrs::PEBetweenDecl);
+                    else if (fScanner->getDoValidation())
+                        fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+                }
 
             }
              else if (XMLReader::isWhitespace(nextCh))
@@ -2902,16 +2919,22 @@ bool DTDScanner::scanInternalSubset()
         }
          else if (nextCh == chOpenAngle)
         {
-            // Remember this reader before we start the scan
+            // Remember this reader before we start the scan, for checking
+            // XML 1.0 P28a Well-formedness constraint: PE Between Declarations
             const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
+            bool wasInPE = (fReaderMgr->getCurrentReader()->getType() == XMLReader::Type_PE);
 
             // And scan this markup
             fReaderMgr->getNextChar();
             scanMarkupDecl(false);
 
             // If we did not get back to entry level, then partial markup
-            if (fReaderMgr->getCurrentReaderNum() != orgReader && fScanner->getDoValidation())
-                fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+            if (fReaderMgr->getCurrentReaderNum() != orgReader) {
+                if (wasInPE)
+                    fScanner->emitError(XMLErrs::PEBetweenDecl);
+                else if (fScanner->getDoValidation())
+                    fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+            }
         }
          else if (XMLReader::isWhitespace(nextCh))
         {
@@ -3033,6 +3056,9 @@ void DTDScanner::scanMarkupDecl(const bool parseTextDecl)
                 if (!fReaderMgr->skippedChar(chOpenSquare))
                     fScanner->emitError(XMLErrs::ExpectedINCLUDEBracket);
 
+                // Get the reader we started this on
+                const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
+
                 checkForPERef(false, false, true);
 
                 //
@@ -3040,6 +3066,14 @@ void DTDScanner::scanMarkupDecl(const bool parseTextDecl)
                 //  in an include section.
                 //
                 scanExtSubsetDecl(true);
+
+                //
+                //  And see if we got back to the same level. If not, then its
+                //  a partial markup error.
+                //
+                if (fReaderMgr->getCurrentReaderNum() != orgReader && fScanner->getDoValidation())
+                    fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+
             }
              else if (fReaderMgr->skippedString(XMLUni::fgIgnoreString))
             {
@@ -3049,8 +3083,19 @@ void DTDScanner::scanMarkupDecl(const bool parseTextDecl)
                 if (!fReaderMgr->skippedChar(chOpenSquare))
                     fScanner->emitError(XMLErrs::ExpectedINCLUDEBracket);
 
+                // Get the reader we started this on
+                const unsigned int orgReader = fReaderMgr->getCurrentReaderNum();
+
                 // And scan over the ignored part
                 scanIgnoredSection();
+
+                //
+                //  And see if we got back to the same level. If not, then its
+                //  a partial markup error.
+                //
+                if (fReaderMgr->getCurrentReaderNum() != orgReader && fScanner->getDoValidation())
+                    fScanner->getValidator()->emitError(XMLValid::PartialMarkupInPE);
+
             }
              else
             {