diff --git a/samples/PParse/PParse.cpp b/samples/PParse/PParse.cpp
index d0a6c5e1cdfa9755c1c2eab3b6c26ec02ee75df3..e9b1341b1bcb2cfb537b948fc1a86f3c61d99590 100644
--- a/samples/PParse/PParse.cpp
+++ b/samples/PParse/PParse.cpp
@@ -56,6 +56,11 @@
 
 /*
  * $Log$
+ * Revision 1.11  2001/10/19 18:52:04  tng
+ * Since PParse can take any XML file as input file, it shouldn't hardcode to expect 16 elements.
+ * Change it to work similar to SAXCount which just prints the number of elements, characters, attributes ... etc.
+ * And other modification for consistent help display and return code across samples.
+ *
  * Revision 1.10  2001/08/01 19:11:01  tng
  * Add full schema constraint checking flag to the samples and the parser.
  *
@@ -160,20 +165,21 @@ static SAXParser::ValSchemes    valScheme       = SAXParser::Val_Auto;
 // ---------------------------------------------------------------------------
 static void usage()
 {
-    cout <<  "\nUsage: PParse [options] <file>\n\n"
-         <<  "This sample program demonstrates the progressive parse capabilities of\n"
-	     <<  "the parser system. It allows you to do a scanFirst() call followed by\n"
-         <<  "a loop which calls scanNext(). You can drop out when you've found what\n"
-         <<  "ever it is you want. In our little test, our event handler looks for\n"
-         <<  "16 new elements then sets a flag to indicate its found what it wants.\n"
-         <<  "At that point, our progressive parse loop exits.\n\n"
-         <<  "Options:\n"
-         <<  "      -v=xxx        - Validation scheme [always | never | auto*]\n"
-         <<  "      -n            - Enable namespace processing [default is off]\n"
-         <<  "      -s            - Enable schema processing [default is off]\n"
-         <<  "      -f            - Enable full schema constraint checking [default is off]\n"
-         <<  "      -?            - Show this help (must be the only parameter)\n\n"
-         <<  "  * = Default if not provided explicitly\n"
+    cout << "\nUsage:\n"
+            "    PParse [options] <XML file>\n\n"
+            "This program demonstrates the progressive parse capabilities of\n"
+	         "the parser system. It allows you to do a scanFirst() call followed by\n"
+            "a loop which calls scanNext(). You can drop out when you've found what\n"
+            "ever it is you want. In our little test, our event handler looks for\n"
+            "16 new elements then sets a flag to indicate its found what it wants.\n"
+            "At that point, our progressive parse loop exits.\n\n"
+            "Options:\n"
+            "      -v=xxx        - Validation scheme [always | never | auto*].\n"
+            "      -n            - Enable namespace processing [default is off].\n"
+            "      -s            - Enable schema processing [default is off].\n"
+            "      -f            - Enable full schema constraint checking [default is off].\n"
+            "      -?            - Show this help.\n\n"
+            "  * = Default if not provided explicitly.\n"
          <<  endl;
 }
 
@@ -197,21 +203,14 @@ int main(int argC, char* argV[])
          return 1;
     }
 
-
     // Check command line and extract arguments.
     if (argC < 2)
     {
         usage();
+        XMLPlatformUtils::Terminate();
         return 1;
     }
 
-    // Watch for special case help request
-    if (!strcmp(argV[1], "-?"))
-    {
-        usage();
-        return 2;
-    }
-
     // See if non validating dom parser configuration is requested.
     int parmInd;
     for (parmInd = 1; parmInd < argC; parmInd++)
@@ -220,8 +219,15 @@ int main(int argC, char* argV[])
         if (argV[parmInd][0] != '-')
             break;
 
-        if (!strncmp(argV[parmInd], "-v=", 3)
-        ||  !strncmp(argV[parmInd], "-V=", 3))
+        // Watch for special case help request
+        if (!strcmp(argV[parmInd], "-?"))
+        {
+            usage();
+            XMLPlatformUtils::Terminate();
+            return 2;
+        }
+         else if (!strncmp(argV[parmInd], "-v=", 3)
+              ||  !strncmp(argV[parmInd], "-V=", 3))
         {
             const char* const parm = &argV[parmInd][3];
 
@@ -234,6 +240,7 @@ int main(int argC, char* argV[])
             else
             {
                 cerr << "Unknown -v= value: " << parm << endl;
+                XMLPlatformUtils::Terminate();
                 return 2;
             }
         }
@@ -252,10 +259,10 @@ int main(int argC, char* argV[])
         {
             schemaFullChecking = true;
         }
-         else
+        else
         {
-            usage();
-            return 1;
+            cerr << "Unknown option '" << argV[parmInd]
+                << "', ignoring it\n" << endl;
         }
     }
 
@@ -266,10 +273,11 @@ int main(int argC, char* argV[])
     if (parmInd + 1 != argC)
     {
         usage();
+        XMLPlatformUtils::Terminate();
         return 1;
     }
     xmlFile = argV[parmInd];
-
+    int errorCount = 0;
 
     //
     //  Create a SAX parser object to use and create our SAX event handlers
@@ -289,14 +297,17 @@ int main(int argC, char* argV[])
     //  loop, we look and see if the handler has found what its looking
     //  for. When it does, we fall out then.
     //
+    unsigned long duration;
     try
     {
         // Create a progressive scan token
         XMLPScanToken token;
 
+        const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
         if (!parser.parseFirst(xmlFile, token))
         {
             cerr << "scanFirst() failed\n" << endl;
+            XMLPlatformUtils::Terminate();
             return 1;
         }
 
@@ -305,9 +316,13 @@ int main(int argC, char* argV[])
         //  or hit the end.
         //
         bool gotMore = true;
-        while (gotMore && !handler.getDone())
+        while (gotMore && !parser.getErrorCount())
             gotMore = parser.parseNext(token);
 
+        const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
+        duration = endMillis - startMillis;
+
+        errorCount = parser.getErrorCount();
         //
         //  Reset the parser. In this simple progrma, since we just exit
         //  now, its not technically required. But, in programs which
@@ -324,17 +339,25 @@ int main(int argC, char* argV[])
              << "Exception message is: \n"
              << StrX(toCatch.getMessage())
              << "\n" << endl;
-        return -1;
+        XMLPlatformUtils::Terminate();
+        return 4;
     }
 
-    if (handler.getDone())
-        cout << "Got the required 16 elements\n" << endl;
-    else
-        cout << "Did not get the required 16 elements\n" << endl;
+
+    if (!errorCount) {
+        cout << xmlFile << ": " << duration << " ms ("
+            << handler.getElementCount() << " elems, "
+            << handler.getAttrCount() << " attrs, "
+            << handler.getSpaceCount() << " spaces, "
+            << handler.getCharacterCount() << " chars)" << endl;
+    }
 
     // And call the termination method
     XMLPlatformUtils::Terminate();
 
-    return 0;
+    if (errorCount > 0)
+        return 4;
+    else
+        return 0;
 }
 
diff --git a/samples/PParse/PParseHandlers.cpp b/samples/PParse/PParseHandlers.cpp
index a153218a10a412346558860f02a857d8f8d9ce66..7de1956a20e34cafb84c80b6c1814c4dcdcf8b8d 100644
--- a/samples/PParse/PParseHandlers.cpp
+++ b/samples/PParse/PParseHandlers.cpp
@@ -1,37 +1,37 @@
 /*
  * The Apache Software License, Version 1.1
- * 
- * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  * reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- * 
+ *    notice, this list of conditions and the following disclaimer.
+ *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
- * 
+ *
  * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
+ *    if any, must include the following acknowledgment:
  *       "This product includes software developed by the
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowledgment may appear in the software itself,
  *    if and wherever such third-party acknowledgments normally appear.
- * 
+ *
  * 4. The names "Xerces" and "Apache Software Foundation" must
  *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
+ *    software without prior written permission. For written
  *    permission, please contact apache\@apache.org.
- * 
+ *
  * 5. Products derived from this software may not be called "Apache",
  *    nor may "Apache" appear in their name, without prior written
  *    permission of the Apache Software Foundation.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -45,7 +45,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
- * 
+ *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Apache Software Foundation, and was
  * originally based on software copyright (c) 1999, International
@@ -74,8 +74,10 @@
 // ---------------------------------------------------------------------------
 PParseHandlers::PParseHandlers() :
 
-    fCount(0)
-    , fDone(false)
+    fElementCount(0)
+    , fAttrCount(0)
+    , fCharacterCount(0)
+    , fSpaceCount(0)
 {
 }
 
@@ -87,12 +89,31 @@ PParseHandlers::~PParseHandlers()
 // ---------------------------------------------------------------------------
 //  PParseHandlers: Overrides of the SAX DocumentHandler interface
 // ---------------------------------------------------------------------------
-void PParseHandlers::startElement(  const   XMLCh* const    name
+void PParseHandlers::startElement(const   XMLCh* const    name
                                     ,       AttributeList&  attributes)
 {
-    // Bump up the count of elements, and set done if we hit 16
-    fCount++;
-    fDone = (fCount == 16);
+    fElementCount++;
+    fAttrCount += attributes.getLength();
+}
+
+void PParseHandlers::characters(  const   XMLCh* const    chars
+								    , const unsigned int    length)
+{
+    fCharacterCount += length;
+}
+
+void PParseHandlers::ignorableWhitespace( const   XMLCh* const chars
+										    , const unsigned int length)
+{
+    fSpaceCount += length;
+}
+
+void PParseHandlers::resetDocument()
+{
+    fAttrCount = 0;
+    fCharacterCount = 0;
+    fElementCount = 0;
+    fSpaceCount = 0;
 }
 
 
diff --git a/samples/PParse/PParseHandlers.hpp b/samples/PParse/PParseHandlers.hpp
index 8c1b0dce8f589d5a1d95f2bc5b239d14875af8d6..6cdea1110d1650c824fa11d3e867e2db069c96ff 100644
--- a/samples/PParse/PParseHandlers.hpp
+++ b/samples/PParse/PParseHandlers.hpp
@@ -1,37 +1,37 @@
 /*
  * The Apache Software License, Version 1.1
- * 
- * Copyright (c) 1999-2000 The Apache Software Foundation.  All rights
+ *
+ * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  * reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer. 
- * 
+ *    notice, this list of conditions and the following disclaimer.
+ *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
- * 
+ *
  * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:  
+ *    if any, must include the following acknowledgment:
  *       "This product includes software developed by the
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowledgment may appear in the software itself,
  *    if and wherever such third-party acknowledgments normally appear.
- * 
+ *
  * 4. The names "Xerces" and "Apache Software Foundation" must
  *    not be used to endorse or promote products derived from this
- *    software without prior written permission. For written 
+ *    software without prior written permission. For written
  *    permission, please contact apache\@apache.org.
- * 
+ *
  * 5. Products derived from this software may not be called "Apache",
  *    nor may "Apache" appear in their name, without prior written
  *    permission of the Apache Software Foundation.
- * 
+ *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -45,7 +45,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
- * 
+ *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Apache Software Foundation, and was
  * originally based on software copyright (c) 1999, International
@@ -56,6 +56,11 @@
 
 /*
  * $Log$
+ * Revision 1.4  2001/10/19 18:52:04  tng
+ * Since PParse can take any XML file as input file, it shouldn't hardcode to expect 16 elements.
+ * Change it to work similar to SAXCount which just prints the number of elements, characters, attributes ... etc.
+ * And other modification for consistent help display and return code across samples.
+ *
  * Revision 1.3  2000/03/02 19:53:44  roddey
  * This checkin includes many changes done while waiting for the
  * 1.1.0 code to be finished. I can't list them all here, but a list is
@@ -84,12 +89,42 @@ public :
     PParseHandlers();
     ~PParseHandlers();
 
+    // -----------------------------------------------------------------------
+    //  Getter methods
+    // -----------------------------------------------------------------------
+    unsigned int getElementCount() const
+    {
+        return fElementCount;
+    }
+
+    unsigned int getAttrCount() const
+    {
+        return fAttrCount;
+    }
+
+    unsigned int getCharacterCount() const
+    {
+        return fCharacterCount;
+    }
+
+    bool getSawErrors() const
+    {
+        return fSawErrors;
+    }
+
+    unsigned int getSpaceCount() const
+    {
+        return fSpaceCount;
+    }
+
 
     // -----------------------------------------------------------------------
-    //  Implementations of the SAX DocumentHandler interface
+    //  Handlers for the SAX DocumentHandler interface
     // -----------------------------------------------------------------------
     void startElement(const XMLCh* const name, AttributeList& attributes);
-
+    void characters(const XMLCh* const chars, const unsigned int length);
+    void ignorableWhitespace(const XMLCh* const chars, const unsigned int length);
+    void resetDocument();
 
 
     // -----------------------------------------------------------------------
@@ -100,29 +135,25 @@ public :
     void fatalError(const SAXParseException& exception);
 
 
-    // -----------------------------------------------------------------------
-    //  Getter methods
-    // -----------------------------------------------------------------------
-    bool getDone() const;
-
-
-private :
+    private:
     // -----------------------------------------------------------------------
     //  Private data members
     //
-    //  fCount
-    //      This is a counter that we use to count elements. When it hits
-    //      16, we set our done flag.
+    //  fAttrCount
+    //  fCharacterCount
+    //  fElementCount
+    //  fSpaceCount
+    //      These are just counters that are run upwards based on the input
+    //      from the document handlers.
     //
-    //  fDone
-    //      This flag is set once we find what we are looking for.
+    //  fSawErrors
+    //      This is set by the error handlers, and is queryable later to
+    //      see if any errors occured.
     // -----------------------------------------------------------------------
-    unsigned int    fCount;
-    bool            fDone;
+    unsigned int    fAttrCount;
+    unsigned int    fCharacterCount;
+    unsigned int    fElementCount;
+    unsigned int    fSpaceCount;
+    bool            fSawErrors;
 };
 
-
-inline bool PParseHandlers::getDone() const
-{
-    return fDone;
-}