This commit was manufactured by cvs2svn to create tag 'STRUTS_1_0_1'.

git-svn-id: https://svn.apache.org/repos/asf/struts/tags/STRUTS_1_0_1@48785 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/INSTALL b/INSTALL
index f703d68..b01b1be 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,4 +1,4 @@
-$Id: INSTALL,v 1.6 2001/02/13 17:11:34 husted Exp $
+$Id: INSTALL,v 1.6.2.1 2001/07/21 06:18:33 martinc Exp $
 
                 Struts
                 ======
@@ -17,7 +17,7 @@
 Status of various containers -- as reported by volunteers on the Struts-User list.
 
 * Tomcat 3.1+ Standalone - No additonal steps required.
-* Resin 2.1+ Standalone - No additional steps required.
+* Resin 1.2+ Standalone - No additional steps required.
 * WebLogic 6.0+ - No additional steps required.
 
 * Bluestone Universal Business Server - Additional steps provided below.
@@ -304,8 +304,8 @@
   (such as database passwords) in this file.
 
 
-SILVERSTREAM APPLICATION SERVER 3.7.1
--------------------------------------
+SILVERSTREAM APPLICATION SERVER 3.7.1 AND LATER
+-----------------------------------------------
 
 Start the SilverStream application server. 
 
@@ -344,7 +344,7 @@
       "deploy_war.dtd">
     <warJarOptions>
     <warJar>
-    <warJarName>struts-example.war</warJarName>
+    <warJarName>struts-documentation.war</warJarName>
     <isEnabled>true</isEnabled>
     <urls><el>struts-documentation</el></urls>
     </warJar>
diff --git a/build-webapp.xml b/build-webapp.xml
index 21eacaa..de5983a 100644
--- a/build-webapp.xml
+++ b/build-webapp.xml
@@ -115,7 +115,7 @@
 <property name="webapp.src"            value="src/${webapp.name}" />
 
 <!-- The version number of this particular web application -->
-<property name="webapp.version"        value="1.0" />
+<property name="webapp.version"        value="1.0.1" />
 
 <!-- The name of the web application archive file to be produced -->
 <property name="webapp.war"            value="${webapp.name}.war" />
diff --git a/build.xml b/build.xml
index 4119ea7..2c0a9bc 100755
--- a/build.xml
+++ b/build.xml
@@ -82,7 +82,7 @@
     <property name="project.name" value="jakarta-struts"/>
 
     <!-- Version of the project -->
-    <property name="project.version" value="1.0-b1"/>
+    <property name="project.version" value="1.0.1"/>
 
 
 <!-- ========== Derived Properties ======================================== -->
@@ -144,6 +144,9 @@
         Create directories and copy files for the core struts library
 -->
     <target name="prepare.library" depends="init">
+        <mkdir dir="${build.home}/library/classes/META-INF"/>
+        <copy file="LICENSE"
+            tofile="${build.home}/library/classes/META-INF/LICENSE.txt"/>
         <mkdir dir="${build.home}/library/classes/META-INF/tlds"/>
         <copy file="${conf.share.dir}/struts.tld"
             tofile="${build.home}/library/classes/META-INF/taglib.tld"/>
diff --git a/conf/share/MANIFEST.MF b/conf/share/MANIFEST.MF
index 7667b0f..ad5c2ec 100644
--- a/conf/share/MANIFEST.MF
+++ b/conf/share/MANIFEST.MF
@@ -6,5 +6,5 @@
 Implementation-Title: Struts Framework
 Implementation-Vendor: Apache Software Foundation
 Implementation-Vendor-Id: org.apache
-Implementation-Version: 1.0
+Implementation-Version: 1.0.1
 
diff --git a/conf/share/struts-config_1_0.dtd b/conf/share/struts-config_1_0.dtd
index 78a5f9d..71e8026 100644
--- a/conf/share/struts-config_1_0.dtd
+++ b/conf/share/struts-config_1_0.dtd
@@ -11,7 +11,7 @@
        "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
        "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
 
-     $Id: struts-config_1_0.dtd,v 1.4 2001/05/20 01:46:00 craigmcc Exp $
+     $Id: struts-config_1_0.dtd,v 1.4.2.1 2001/06/02 18:18:25 craigmcc Exp $
 -->
 
 
@@ -96,15 +96,24 @@
      source object (that implements javax.sql.DataSource) which will be
      configured according to the properties and nested elements found here,
      and made available as a servlet context attribute (i.e. application
-     scope bean).  The following attributes are defined:
+     scope bean).  The following attributes are required:
+
+     key             Servlet context attribute key under which this data
+                     source will be stored.  Default is the value specified
+                     by string constant Action.DATA_SOURCE_KEY.
 
      type            Fully qualified Java class name of the implementation
-                     class (must implement javax.sql.DataSource).
+                     class (must implement javax.sql.DataSource).  Default
+                     value is 'org.apache.struts.util.GenericDataSource'.
 
      NOTE:  The following attributes are defined by the default data source
      implementation, and only take effect for that class or subclasses of
      that class.
 
+     WARNING:  The use of these attributes is deprecated.  You should use
+     nested &lt;set-property&gt; elements to configure *all* properties of
+     your data source implementation.
+
      autoCommit      The default auto-commit state for newly created
                      connections.
 
@@ -113,12 +122,8 @@
      driverClass     The Java class name of the JDBC driver to be used.
                      [REQUIRED]
 
-     key             Servlet context attribute key under which this data
-                     source will be stored.  Default is the value specified
-                     by string constant Action.DATA_SOURCE_KEY.
-
      loginTimeout    The maximum number of seconds to wait for a connection
-                     to be created or returned.
+                     to be created or returned.  Default is driver dependent.
 
      maxCount        The maximum number of connections to be created.
 
@@ -136,18 +141,20 @@
 -->
 <!ELEMENT data-source (set-property*)>
 <!ATTLIST data-source    id             ID              #IMPLIED>
-<!ATTLIST data-source    type           %ClassName;     "org.apache.struts.util.GenericDataSource">
-<!ATTLIST data-source    autoCommit     %Boolean;       "true">
-<!ATTLIST data-source    description    CDATA           #IMPLIED>
-<!ATTLIST data-source    driverClass    %ClassName;     #REQUIRED>
 <!ATTLIST data-source    key            %BeanName;      #IMPLIED>
+<!ATTLIST data-source    type           %ClassName;     #IMPLIED>
+<!-- All of the following attributes are deprecated.  Use a nested          -->
+<!-- set-property element to configure data source properties.              -->
+<!ATTLIST data-source    autoCommit     %Boolean;       #IMPLIED>
+<!ATTLIST data-source    description    CDATA           #IMPLIED>
+<!ATTLIST data-source    driverClass    %ClassName;     #IMPLIED>
 <!ATTLIST data-source    loginTimeout   %Integer;       #IMPLIED>
-<!ATTLIST data-source    maxCount       %Integer;       "2">
-<!ATTLIST data-source    minCount       %Integer;       "1">
-<!ATTLIST data-source    password       CDATA           #REQUIRED>
-<!ATTLIST data-source    readOnly       %Boolean;       "false">
-<!ATTLIST data-source    url            CDATA           #REQUIRED>
-<!ATTLIST data-source    user           CDATA           #REQUIRED>
+<!ATTLIST data-source    maxCount       %Integer;       #IMPLIED>
+<!ATTLIST data-source    minCount       %Integer;       #IMPLIED>
+<!ATTLIST data-source    password       CDATA           #IMPLIED>
+<!ATTLIST data-source    readOnly       %Boolean;       #IMPLIED>
+<!ATTLIST data-source    url            CDATA           #IMPLIED>
+<!ATTLIST data-source    user           CDATA           #IMPLIED>
 
 
 <!-- The "form-beans" element is the root of the set of form bean descriptors
diff --git a/doc/index.xml b/doc/index.xml
index 44b5b3e..2cbe3d6 100644
--- a/doc/index.xml
+++ b/doc/index.xml
@@ -3,13 +3,14 @@
 
   <properties>
     <author>Craig R. McClanahan</author>
+    <author>Ted Husted</author>
+    <author>Martin Cooper</author>
     <title>The Struts Framework Project</title>
   </properties>
 
   <body>
 
-
-  <section name="Welcome to Struts" href="Welcome">
+  <section name="Welcome to Struts 1.0.1" href="Welcome">
 
   <p>Welcome to the Struts Framework!  The goal of this project
   is to provide an open source framework useful in building web applications
@@ -42,25 +43,58 @@
 
   </section>
 
+  <section name="Learning About Struts" href="Docs">
+
+  <p>The <a href="userGuide/kickstart.html"><b>Kickstart FAQ</b></a> quickly answers 
+  the most common questions about Struts.</p>
+
+  <p>A concise <a href="userGuide/index.html"><b>Users Guide</b></a> is also provided 
+  with the distribution. The User Guide introduces the Model View Controller 
+  architecture, and how it relates to the major components of Struts. Several Developer 
+  Guides are also provided, to help you get started with the Struts tag extensions and 
+  utility packages.</p>
+
+  <p>For more detail about a specific class or package, the Struts 
+  <a href="api/index.html"><b>Javadocs</b></a>
+  are comprehensive and carefully maintained. It is strongly recommended that 
+  you refer to the <a href="api/index.html">Javadoc</a> 
+  for each class as you begin to use it, to be sure important features and options 
+  are not overlooked. What you don't know, can't help you.</p>
+
+  <p>Of course, the only true documentation is the code itself. If you have any questions 
+  about how Struts actually works, do not hestate to <i>use the source</i>. For the 
+  complete, buildable source code to the entire Struts framework, see the "src" folder in 
+  the <a href="http://jakarta.apache.org/builds/jakarta-struts/release/v1.0.1/src/"><b>Struts 1.0 source distribution</b></a>.</p>
+
+  <p>The Struts <a href="userGuide/resources.html"><b>Resources</b></a> page provides links to 
+  everything else written about  Struts, including books, articles, tutorials, and sample 
+  applications. There are also links to public sites "Powered by Struts". </p>
+
+  </section>
 
   <section name="Acquiring Struts" href="Acquiring">
 
-  <p>A new beta release, <strong>Struts 1.0-beta-2</strong> has been
-  created and made available at
-  <a href="http://jakarta.apache.org/builds/jakarta-struts/release/v1.0-b2">
-  http://jakarta.apache.org/builds/jakarta-struts/release/v1.0-b2</a>.  This
-  release is considered to be of production quality, and only bug fixes will
-  occur between this release and an upcoming <strong>Struts 1.0</strong>
-  final release.</p>
+  <p>The <i>production release</i> of <strong>Struts 1.0.1</strong> is available in
+  in convenient binary distribution and also with complete source code.</p>
 
-  <p>Check the <a href="release-notes-1.0-b2.html">Release Notes</a>
-  for a summary of what new features have been added, and other significant
-  changes, since the Struts 1.0-beta-1 release.</p>
-
-  <hr width="75%"/>
+  <ul>
+  <li><a href="http://jakarta.apache.org/builds/jakarta-struts/release/v1.0.1">
+  <b>Struts 1.0.1 Binary Distribution</b></a></li>
+  <li><a href="http://jakarta.apache.org/builds/jakarta-struts/release/v1.0.1/src">
+  <b>Struts 1.0.1 Source Code Distribution</b></a></li>
+  </ul>
   
-  <p>You can acquire interim binary and source distributions of Struts from the
-  following locations:</p>
+  <p>Check the <a href="release-notes-1.0.1.html">Release Notes</a>
+  for a summary of what new features have been added, and other significant
+  changes, since the Struts 1.0 release.</p>
+
+  </section>
+
+  <section name="Nightly Builds" href="Builds">
+
+  <p>For developers who are helping to develop Struts, or who just want 
+  "the latest bits", the latest development version is made available each 
+  morning. Use at your own risk!</p>
   
   <ul>
   <li>Download the source directly via
@@ -75,7 +109,7 @@
   </ul>
 
   <p>Access to the CVS source repository for Struts is available through both
-  <a href="http://jakarta.apache.org/cvsweb/index.cgi/jakarta-struts/">web
+  <a href="http://cvs.apache.org/viewcvs/jakarta-struts/">web
   browser</a> and
   <a href="http://jakarta.apache.org/getinvolved/cvsindex.html">CVS client</a>
   interfaces.</p>
@@ -109,17 +143,23 @@
   community, including contributing to the future development of Struts.
   Check out the following resources:</p>
   <ul>
-  <li><strong>STRUTS-USER Mailing List</strong> - Subscribe to the
-      <a href="mailto:struts-user-subscribe@jakarta.apache.org">STRUTS-USER</a>
+  <li><strong>STRUTS-USER Mailing List</strong> - Subscribe to this list
+      to communicate with other developers that are using
       mailing list to communicate with other developers that are using
       Struts for their own applications, including questions about the
-      installation of Struts, and the usage of particular Struts features.</li>
-  <li><strong>STRUTS-DEV Mailing List</strong> - Subscribe to the
-      <a href="mailto:struts-dev-subscribe@jakarta.apache.org">STRUTS-DEV</a>
+      installation of Struts, and the usage of particular Struts features.
+      [<a href="mailto:struts-user-subscribe@jakarta.apache.org">Subscribe</a>]
+      [<a href="mailto:struts-user-unsubscribe@jakarta.apache.org">Unsubscribe</a>]
+      </li>
+  <li><strong>STRUTS-DEV Mailing List</strong> - Subscribe to this
       mailing list to communicate with other developers interested in expanding
-      and improving the functionality supported by Struts itself.</li>
+      and improving the functionality supported by Struts itself.
+      [<a href="mailto:struts-dev-subscribe@jakarta.apache.org">Subscribe</a>]
+      [<a href="mailto:struts-dev-unsubscribe@jakarta.apache.org">Unsubscribe</a>]
+      </li>
   <li><strong>Bug Reports and Feature Requests</strong> Use the
-      <a href="#Bugs">Bug Reporting System</a> to submit these reports.</li>
+      <a href="http://nagoya.apache.org/bugzilla/">Bug Reporting System</a>
+      to submit these reports.</li>
   <li><strong>Patches and Modules</strong> - You can contribute patches and
       new modules to Struts by posting them to the STRUTS-DEV mailing list.
       After discussion and acceptance, one of the existing Committers will
diff --git a/doc/installation-jetty.xml b/doc/installation-jetty.xml
new file mode 100644
index 0000000..325ca87
--- /dev/null
+++ b/doc/installation-jetty.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0"?>
+
+<document url="./installation-ip.xml">
+
+<properties>
+  <author>Paul Runyan</author> 
+  <title>The Struts Framework Project - Installation - Jetty</title>
+</properties>
+
+<body>
+<section name="Installing Struts with your servlet container" href="Containers"> 
+
+<h3><a name="jetty">Jetty Java HTTP Servlet Server</a></h3>
+
+<p>
+Jetty is a small, pure-Java, open source HTTP server that supports the
+2.2 Servlet spec and JSP 1.1. Jetty can be downloaded from
+<a href="http://www.mortbay.com/jetty">http://www.mortbay.com/jetty</a>.
+</p>
+
+<p>
+Struts WAR files run nearly straight out of the box when placed
+underneath Jetty's webapps directory. The one additional step needed
+is to add an entry for each WAR file to the Jetty server configuration
+file in order to map the appropriate request paths to the added Struts
+web applications (using "&lt;Call name="addWebApplication"&gt;...").
+</p>
+
+<p>
+So for example, if you have copied the WAR files that come with the
+Struts binary distribution into a subdirectory of the
+"%JETTY_HOME%/webapps" called "%JETTY_HOME%/webapps/struts" so that
+you have:
+</p>
+
+<pre>
+- %JETTY_HOME%/webapps/struts/struts-documentation.war
+- %JETTY_HOME%/webapps/struts/struts-example.war
+- %JETTY_HOME%/webapps/struts/struts-exercise-taglib.war
+- %JETTY_HOME%/webapps/struts/struts-template.war
+- %JETTY_HOME%/webapps/struts/struts-upload.war
+- %JETTY_HOME%/webapps/struts/struts-blank.war
+</pre>
+
+<p>
+And you want to run Jetty using the demo.xml configuration file that
+comes with Jetty, just add the following block to demo.xml, anywhere
+after the Listeners are declared.
+</p>
+
+<pre>
+&lt;!-- Jetty config for Struts BEGIN --&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-documentation/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-documentation.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;false&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-example/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-example.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;true&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-exercise-taglib/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-exercise-taglib.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;false&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-template/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-template.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;true&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-upload/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-upload.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;true&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+  &lt;Call name="addWebApplication"&gt;
+    &lt;Arg&gt;/struts/struts-blank/*&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/webapps/struts/struts-blank.war&lt;/Arg&gt;
+    &lt;Arg&gt;&lt;SystemProperty name="jetty.home"
+        default="."/&gt;/etc/webdefault.xml&lt;/Arg&gt;
+    &lt;Arg type="boolean"&gt;true&lt;/Arg&gt; &lt;!-- if true,
+        expand war in temp dir --&gt;
+  &lt;/Call&gt;
+
+&lt;!-- Jetty config for Struts END --&gt;
+</pre>
+
+<hr/>
+<ul>
+  <li>Author: Paul Runyan</li>
+</ul>
+<hr/>
+<p>Back to <a href="installation.html#Containers">Installation</a></p>
+
+</section> 
+</body>
+</document>
diff --git a/doc/installation-sas.xml b/doc/installation-sas.xml
index d611d98..9839571 100644
--- a/doc/installation-sas.xml
+++ b/doc/installation-sas.xml
@@ -10,7 +10,7 @@
 
 <section name="Installing Struts with your servlet container" href="Containers"> 
 
-<h3><a name="sas371">SilverStream Application Server 3.7.1</a></h3>
+<h3><a name="sas">SilverStream Application Server 3.7.1 and later</a></h3>
 
 <ul>
   <li>Start the SilverStream application server.</li>
@@ -18,22 +18,27 @@
       application. Call the file &quot;<code>struts-example-depl-plan.xml</code>&quot;. 
       You can use the following contents for the file</li>
 </ul>
+
 <hr/>
+
+<p>----- cut here -----</p>
+
 <pre>
------ cut here -----
 &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 &lt;!DOCTYPE warJarOptions PUBLIC
-&quot;-//SilverStream Software, Inc.//DTD J2EE WAR Deployment Plan//EN&quot;
-&quot;deploy_war.dtd&quot;&gt;
+  &quot;-//SilverStream Software, Inc.//DTD J2EE WAR Deployment Plan//EN&quot;
+  &quot;deploy_war.dtd&quot;&gt;
 &lt;warJarOptions&gt;
 &lt;warJar&gt;
-&lt;warJarName&gt;struts-documentation.war&lt;/warJarName&gt;
+&lt;warJarName&gt;struts-example.war&lt;/warJarName&gt;
 &lt;isEnabled&gt;true&lt;/isEnabled&gt;
-&lt;urls&gt;&lt;el&gt;struts-documentation&lt;/el&gt;&lt;/urls&gt;
+&lt;urls&gt;&lt;el&gt;struts-example&lt;/el&gt;&lt;/urls&gt;
 &lt;/warJar&gt;
 &lt;/warJarOptions&gt;
------ cut here -----
 </pre>
+
+<p>----- cut here -----</p>
+
 <hr/>
 
 <p>Create an XML deployment plan for the &quot;<code>struts-documentation.war</code>&quot; 
@@ -50,7 +55,7 @@
   &quot;deploy_war.dtd&quot;&gt;
 &lt;warJarOptions&gt;
 &lt;warJar&gt;
-&lt;warJarName&gt;struts-example.war&lt;/warJarName&gt;
+&lt;warJarName&gt;struts-documentation.war&lt;/warJarName&gt;
 &lt;isEnabled&gt;true&lt;/isEnabled&gt;
 &lt;urls&gt;&lt;el&gt;struts-documentation&lt;/el&gt;&lt;/urls&gt;
 &lt;/warJar&gt;
diff --git a/doc/installation-sas371.xml b/doc/installation-sas371.xml
deleted file mode 100644
index b1f68bd..0000000
--- a/doc/installation-sas371.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0"?>
-<document url="./installation-sas371.xml">
-
-  <properties>
-   <author>John Rousseau</author>
-    <title>The Struts Framework Project - Installation - Silverstream</title>
-  </properties>
-
-  <body>
-
-<section name="Installing Struts with your servlet container" href="Containers"> 
-
-<h3><a name="sas371">SilverStream Application Server 3.7.1</a></h3>
-
-<ul>
-  <li>Start the SilverStream application server.</li>
-  <li>Create an XML deployment plan for the &quot;<code>struts-example.war</code>&quot; 
-      application. Call the file &quot;<code>struts-example-depl-plan.xml</code>&quot;. 
-      You can use the following contents for the file</li>
-</ul>
-
-<hr/>
-
-<p>----- cut here -----</p>
-
-<pre>
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;!DOCTYPE warJarOptions PUBLIC
-  &quot;-//SilverStream Software, Inc.//DTD J2EE WAR Deployment Plan//EN&quot;
-  &quot;deploy_war.dtd&quot;&gt;
-&lt;warJarOptions&gt;
-&lt;warJar&gt;
-&lt;warJarName&gt;struts-example.war&lt;/warJarName&gt;
-&lt;isEnabled&gt;true&lt;/isEnabled&gt;
-&lt;urls&gt;&lt;el&gt;struts-example&lt;/el&gt;&lt;/urls&gt;
-&lt;/warJar&gt;
-&lt;/warJarOptions&gt;
-</pre>
-
-<p>----- cut here -----</p>
-
-<hr/>
-
-<p>Create an XML deployment plan for the &quot;<code>struts-documentation.war</code>&quot; 
-    application. Call the file &quot;struts-documentation-depl-plan.xml&quot;. 
-    You can use the following contents for the file:</p>
-
-<hr/>
-<p>----- cut here -----</p>
-
-<pre>
-&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
-&lt;!DOCTYPE warJarOptions PUBLIC
-  &quot;-//SilverStream Software, Inc.//DTD J2EE WAR Deployment Plan//EN&quot;
-  &quot;deploy_war.dtd&quot;&gt;
-&lt;warJarOptions&gt;
-&lt;warJar&gt;
-&lt;warJarName&gt;struts-example.war&lt;/warJarName&gt;
-&lt;isEnabled&gt;true&lt;/isEnabled&gt;
-&lt;urls&gt;&lt;el&gt;struts-documentation&lt;/el&gt;&lt;/urls&gt;
-&lt;/warJar&gt;
-&lt;/warJarOptions&gt;
-</pre>
-
-<p>----- cut here -----</p>
-<hr/>
-
-<p>Run the following &quot;<code>SilverCmd DeployWAR</code>&quot; commands to 
-   deploy the applications. You can change 'localhost' to whatever server you
-   are deploying to. You can change 'Silvermaster' to whatever
-   database you are deploying to.</p>
-   <ul>
-     <li>SilverCmd DeployWar localhost Silvermaster struts-example.war -f struts-example-depl-plan.xml</li>
-     <li>SilverCmd DeployWar localhost Silvermaster struts-documentation.war -f struts-documentation-depl-plan.xml</li>
-   </ul>
-  <hr/>
-  <ul><li>Author: John Rousseau</li></ul>
-  <hr/>
-  <p>Back to <a href="installation.html#Containers">Installation</a></p>
-</section>
-</body>
-</document>
diff --git a/doc/installation.xml b/doc/installation.xml
index 0c27455..280382b 100644
--- a/doc/installation.xml
+++ b/doc/installation.xml
@@ -130,6 +130,12 @@
     files included in a binary distribution of Struts, as described
     in the following section.</p>
 
+    <p>IMPORTANT NOTE: The <code>struts.jar</code> must be in your classpath when 
+    compiling Struts. The <code>build.xml</code> provided does this automatically. 
+    If you use your development machine to test Struts application locally, be 
+    sure that the <code>stuts.jar</code> is NOT on your classpath when your 
+    container is running.</p>
+
   </section>
 
   <section name="Install A Struts Binary Distribution" href="Installing">
@@ -211,8 +217,8 @@
 &lt;/taglib&gt;
 
 &lt;taglib&gt;
-  &lt;taglib-uri&gt;/WEB-INF/struts-form.tld&lt;/taglib-uri&gt;
-  &lt;taglib-location&gt;/WEB-INF/struts-form.tld&lt;/taglib-location&gt;
+  &lt;taglib-uri&gt;/WEB-INF/struts-html.tld&lt;/taglib-uri&gt;
+  &lt;taglib-location&gt;/WEB-INF/struts-html.tld&lt;/taglib-location&gt;
 &lt;/taglib&gt;
 
 &lt;taglib&gt;
@@ -237,7 +243,7 @@
     </ul>
 
 <pre>&lt;@ taglib uri="/WEB-INF/struts-bean.tld" prefix="struts-bean" %&gt;
-&lt;@ taglib uri="/WEB-INF/struts-form.tld" prefix="struts-form" %&gt;
+&lt;@ taglib uri="/WEB-INF/struts-html.tld" prefix="struts-html" %&gt;
 &lt;@ taglib uri="/WEB-INF/struts-logic.tld" prefix="struts-logic" %&gt;
 &lt;@ taglib uri="/WEB-INF/struts-template.tld" prefix="struts-template" %&gt;
 </pre>
@@ -247,7 +253,16 @@
         to include the <code>struts.jar</code> file (copied earlier) on the
         CLASSPATH that is submitted to the compiler.</li>
     </ul>
-</section> <section name="Installing Struts with your servlet container" href="Containers"> 
+</section>
+
+<section name="Installing Struts with your servlet container" href="Containers"> 
+
+<p><strong>WARNING</strong> - Do <strong>NOT</strong> add
+<code>struts.jar</code> to the classpath of your servlet container in an
+attempt to avoid placing it in the <code>/WEB-INF/lib</code> directory of
+each individual web app!  Doing so will cause problems with
+<code>ClassNotFoundException</code> exceptions.</p>
+
 <p>For most containers, you need only to: </p>
 <ul>
   <li>Copy the WAR files in your Struts <code>/webapp</code> directory to your 
@@ -264,15 +279,17 @@
   object in the Struts-Example application is not compatible with this container.</li>
   <li>iPlanet Web Server - <a href="installation-ip.html">Additional steps required.</a></li>
   <li>iPortal Application Server - <a href="installation-ipas.html">Additional steps required.</a></li>
-  <li>JRUN - <a href="installation-jrun.html">Additional steps required.</a></li>
+  <li>Jetty - <a href="installation-jetty.html">Additional steps required.</a></li>
+  <li>JRun - <a href="installation-jrun.html">Additional steps required.</a></li>
   <li>Orion Application Server - <a href="installation-oas.html">Additional steps 
     required.</a></li>
-  <li>Resin 2.1+ "standalone" - No additional steps required.</li>
-  <li>Silverstream - - <a href="installation-sas.html">Additional steps required.</a></li>
+  <li>Resin 1.2+ "standalone" - No additional steps required.</li>
+  <li>SilverStream 3.7.1 and later - <a href="installation-sas.html">Additional steps required.</a></li>
   <li>Tomcat 3.1 and prior - Not recommended. Use Tomcat 3.2.1 or later.</li>
-  <li>Tomcat 3.2.1+ "standalone" - No additional steps required.</li>
   <li>Tomcat 3.2.1 with Apache - <a href="installation-tc.html">Additional steps 
     required.</a></li>
+  <li>Tomcat 3.2.1+ "standalone" - No additional steps required.</li>
+  <li>Tomcat 4.0 - No additional steps required.</li>
   <li>Weblogic - <a href="installation-wls.html">Additional steps required.</a></li>
   <li>WebLogic 6.0+ - No additional steps required.</li>
   <li>WebSphere - <a href="installation-was352.html">Additional steps required.</a></li>
diff --git a/doc/project.xml b/doc/project.xml
index df695aa..4f6312d 100644
--- a/doc/project.xml
+++ b/doc/project.xml
@@ -5,25 +5,28 @@
 
     <title>Struts Framework</title>
 
-    <menu name="Documentation">
-        <item name="Home"                   href="index.html"/>
-        <item name="Installation"           href="installation.html"/>
-	<item name="User Guide (1.0)"       href="userGuide/index.html"/>
-        <item name="Javadoc"                href="api/index.html"/>
-        <item name="Release Notes (1.0b1)"  href="release-notes-1.0-b1.html"/>
-        <item name="Release Notes (1.0b2)"  href="release-notes-1.0-b2.html"/>
-        <item name="Resources"              href="userGuide/resources.html"/>
-        <item name="TODO List (1.1)"        href="todo-1.1.html"/>
+    <menu name="Welcome">
+        <item name="Home"                    href="index.html"/>
+        <item name="Kickstart FAQ"           href="userGuide/kickstart.html"/> 
+        <item name="User Guide"              href="userGuide/index.html"/>
+        <item name="Resources"               href="userGuide/resources.html"/>
+        <item name="Who We Are"              href="userGuide/volunteers.html"/>
     </menu>
 
-    <menu name="Java Developer Guides">
-        <item name="Digester"
-              href="api/org/apache/struts/digester/package-summary.html#package_description"/>
-        <item name="Utilities"
-              href="api/org/apache/struts/util/package-summary.html#package_description"/>
+    <menu name="Downloads">
+        <item name="Binaries"                href="http://jakarta.apache.org/site/binindex.html"/>
+        <item name="Source Code"             href="http://jakarta.apache.org/site/sourceindex.html"/>
     </menu>
 
-    <menu name="Tag Library Guides">
+    <menu name="Getting Started">
+        <item name="Installation"            href="installation-1.0.html"/>
+        <item name="Release Notes"           href="release-notes-1.0.1.html"/>
+        <item name="Javadoc"                 href="api/index.html"/>
+        <item name="Mailing Lists"           href="http://jakarta.apache.org/site/mail.html"/>
+        <item name="Bug Database"            href="http://jakarta.apache.org/site/bugs.html"/>
+    </menu>
+
+    <menu name="Developer Guides">
         <item name="Bean Tags"
               href="api/org/apache/struts/taglib/bean/package-summary.html#package_description"/>
         <item name="HTML Tags"
@@ -32,18 +35,30 @@
               href="api/org/apache/struts/taglib/logic/package-summary.html#package_description"/>
         <item name="Template Tags"
               href="api/org/apache/struts/taglib/template/package-summary.html#package_description"/>
+        <item name="Digester"
+              href="api/org/apache/struts/digester/package-summary.html#package_description"/>
+        <item name="Utilities"
+              href="api/org/apache/struts/util/package-summary.html#package_description"/>
     </menu>
 
-    <menu name="Tag Library Reference">
-        <item name="Bean Tags"          href="struts-bean.html"/>
-        <item name="HTML Tags"          href="struts-html.html"/>
-        <item name="Logic Tags"         href="struts-logic.html"/>
-        <item name="Template Tags"      href="struts-template.html"/>
+    <menu name="TagLib Documentation">
+        <item name="Bean Tags"
+              href="struts-bean.html"/>
+        <item name="HTML Tags"
+              href="struts-html.html"/>
+        <item name="Logic Tags"
+              href="struts-logic.html"/>
+        <item name="Template Tags"
+              href="struts-template.html"/>
     </menu>
 
-    <menu name="Old Documents">
-        <item name="Tag Library (Old)"  href="tags.html"/>
-        <item name="User's Guide (Old)" href="users_guide.html"/>
+    <menu name="Current Development">
+        <item name="Release Plan (1.0.1)"    href="http://jakarta.apache.org/struts/release-plan-1.0.1.html"/>
+        <item name="Installation (nightly)"  href="http://jakarta.apache.org/struts/installation.html"/>
+        <item name="Release Notes (nightly)" href="http://jakarta.apache.org/struts/release-notes.html"/>
+        <item name="Javadoc (nightly)"       href="http://jakarta.apache.org/struts/api/index.html"/>
+        <item name="Workflow Proposal"       href="http://jakarta.apache.org/struts/proposal-workflow.html"/>
+        <item name="TODO List"               href="http://jakarta.apache.org/struts/todo-1.1.html"/>
     </menu>
 
 </project>
diff --git a/doc/release-notes-1.0-b3.xml b/doc/release-notes-1.0-b3.xml
new file mode 100644
index 0000000..dffe52e
--- /dev/null
+++ b/doc/release-notes-1.0-b3.xml
@@ -0,0 +1,271 @@
+<?xml version="1.0"?>
+<document url="./release-notes-1.0-b3.xml">
+
+  <properties>
+    <author>Craig R. McClanahan</author>
+    <title>Struts Release Notes (Version 1.0-beta-3)</title>
+  </properties>
+
+  <body>
+
+  <section name="Introduction" href="Introduction">
+
+    <p>This document contains the release notes for
+    <strong>Version 1.0-beta-3</strong> of the Struts Framework,
+    and covers changes that have taken place since
+    <a href="release-notes-1.0-b2.html">Version 1.0-beta-2</a>
+    was released.  The following sections cover
+    <a href="#New">New Features</a> and <a href="#Changes">Changes</a>
+    to Struts.</p>
+
+  </section>
+
+
+  <section name="What's Included?" href="Included">
+
+    <p>The binary distribution of this release includes the following
+    files relevant to Struts 1.0:</p>
+    <ul>
+    <li><code>INSTALL</code> - Brief installation instructions.  See
+        the <code>Struts Documentation Application</code>, or online at
+        <a href="http://jakarta.apache.org/struts/">http://jakarta.apache.org/struts/</a>
+        for more information.</li>
+    <li><code>LICENSE</code> - The Apache Software Foundation license that
+        defines the terms under which you can use Struts (and other software
+        licensed by Apache).</li>
+    <li><code>README</code> - A brief introduction to Struts.</li>
+    <li><code>lib/</code> - Directory containing files you will need in
+        your own applications.  The individual files of interest are:
+        <ul>
+        <li><code>struts.jar</code> - JAR file that contains the compiled
+            Java classes for both version 0.5 and 1.0 of Struts.  You must
+            place this file in the <code>/WEB-INF/lib</code> directory of
+            your web application.</li>
+        <li><code>struts-xxxxx.tld</code> - The tag library descriptor files
+            for the Struts 1.0 tag libraries (bean, html, logic, and
+            template).  You must place these files in the <code>/WEB-INF</code>
+            directory of your web application, and reference them with
+            appropriate <code>&lt;taglib&gt;</code> directives in your
+            web.xml file.  <strong>NOTE</strong> - The struts-form.tld
+            file is deprecated; you should use the struts-html.tld file
+            instead.</li>
+        <li><code>jdbc2_0-stdext.jar</code> - The JDBC 2.0 Optional Package
+            API classes (package <code>javax.sql</code>).  You will need to
+            include this file in the <code>/WEB-INF/lib</code> directory
+            of your application, if it is not already made visible to web
+            applications by your servlet container.</li>
+        <li><code>struts-config_1_0.dtd</code> - The document type descriptor
+            (DTD) for the Struts configuration file (which is typically named
+            <code>/WEB-INF/struts-config.xml</code>.  Your configuration file
+            will be validated against an internal copy of this DTD -- this
+            copy is available for reference purposes only.</li>
+        <li><code>web-app_2_2.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.2 specification.
+            This copy is for reference purposes only.</li>
+        <li><code>web-app_2_3.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.3 specification.
+            This copy is for reference purposes only.</li>
+        </ul></li>
+    <li><code>webapps/</code> - Web Application Archive (WAR) files for the
+        web applications that are included with Struts.</li>
+    </ul>
+
+    <p>For backwards compatibility only, the binary distribution also
+    includes the following files that conform to the Struts 0.5 milestone
+    release APIs.  Usage of these files and APIs is deprecated, and they
+    will be removed from releases after Struts 1.0:</p>
+    <ul>
+    <li><code>lib/</code> - Directory containing files you will need in
+        your own applications.  The individual files of interest are:
+        <ul>
+        <li><code>struts.jar</code> - JAR file that contains the compiled
+            Java classes for both version 0.5 and 1.0 of Struts.  You must
+            place this file in the <code>/WEB-INF/lib</code> directory of
+            your web application.</li>
+        <li><code>struts.tld</code> - The tag library descriptor file for
+            the 0.5 version of the Struts tags.  You must place this file
+            in the <code>/WEB-INF</code> directory of your web application,
+            and reference it with appropriate <code>&lt;taglib&gt;</code>
+            directives in your web.xml file.</li>
+        </ul></li>
+    </ul>
+
+  </section>
+
+
+  <section name="What's New?" href="New">
+
+    <p><strong>DEPRECATIONS</strong> - The entire custom tag library
+    that is documented in <code>struts.tld</code> has been deprecated.
+    These tags correspond to the Struts 0.5 functionality that is also
+    deprecated, and have been replaced (and considerably enhanced) in
+    the various individual tag libraries.</p>
+
+    <p><strong>DEPRECATIONS</strong> - The entire custom tag library
+    that is documented in <code>struts-form.tld</code> has been deprecated
+    because this library has been renamed <code>struts-html.tld</code>
+    instead.</p>
+
+    <p><strong>DEPRECATIONS</strong> - Several classes in the
+    <code>org.apache.struts.util</code> package have been marked as
+    deprecated in their entirety, because they will be replaced by
+    versions from the Jakarta Commons project once those packages are
+    released.  These deprecated classes will <strong>not</strong> be
+    removed until a release after Struts 1.1.  In general, the only
+    change required inside user code using these classes will be to
+    update the <code>import</code> statement.  The following classes
+    are involved:</p>
+    <ul>
+    <li>ArrayStack</li>
+    <li>BeanUtils</li>
+    <li>ConvertUtils</li>
+    <li>FastArrayList</li>
+    <li>FastHashMap</li>
+    <li>FastTreeMap</li>
+    <li>GenericConnection</li>
+    <li>GenericDataSource</li>
+    <li>PropertyUtils</li>
+    </ul>
+
+    <p>The following new features have been added to the basic controller
+    framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the utility classes
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    <li><code>GenericDataSource</code> can now be configured with a "ping"
+        type command (via the <code>pingCommand</code> and
+        <code>pingQuery</code> properties) that will be executed before
+        returning a connection from <code>getConnection()</code>.  This
+        can be used to detect stale connections due to timeouts or a
+        database server restart.  If the ping command fails, the corresponding
+        connection will be thrown away, and a new one allocated.</li>
+    </ul>
+
+
+    <p>The following new features have been added to the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    <li>It is now possible to use any object in the values and labels
+        collections for the <code>&lt;html:options&gt;</code> tag.</li>
+    <li>Added the missing <code>tabindex</code> attribute to the
+        <code>&lt;html:radio&gt;</code> tag.</li>
+    <li>On the <code>&lt;html:img&gt;</code>, <code>&lt;html:link&gt;</code>,
+        and <code>&lt;html:rewrite&gt;</code> tags, you can now specify
+        arbitrary object values in the <code>Map</code> used to include
+        dynamic request attributes, as long as the <code>toString()</code>
+        method renders the values appropriately.</li>
+    <li>In all cases where "minimized" attributes were being generated
+        (<code>checked</code>, <code>disabled</code>, <code>multiple</code>,
+        <code>readonly</code>, and <code>selected</code>), the generated
+        attribute has a value (such as <code>selected="true"</code>) for
+        XML syntax compatibility.</li>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-template</em> custom tag library (package
+    <code>org.apache.struts.taglib.template</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the Struts Documentation
+    application (and corresponding contents on the Struts web site):</p>
+    <ul>
+    </ul>
+
+  </section>
+
+
+  <section name="Changes and Bug Fixes" href="Changes">
+
+    <p>The following changes and bug fixes have occurred in the configuration
+    files related to Struts:</p>
+    <ul>
+    <li>The DTD for <code>struts-config.xml</code> files had an incorrect
+        ENTITY declaration for the <code>Location</code> element.</li>
+    <li>The DTD for version 2.3 web application deployment descriptors has
+        been updated to the most recent (Proposed Final Draft 2) version.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the basic
+    controller framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the utilities
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    <li>The <code>FastArrayMap()</code>, <code>FastHashMap()</code>, and
+        <code>FastTreeMap()</code> classes not correctly implement the
+        <code>clone()</code>, <code>equals()</code>, and
+        <code>hashCode()</code> methods consistent with the requirements
+        of the Java standard Collections APIs.</li>
+    <li><code>PropertyUtils</code> can now access public methods defined
+        in nested interfaces.</li>
+    <li>A misleading error message returned by <code>BeanUtils</code>
+        has been corrected.</li>
+    <li>Work around a problem compiling the <code>FastXxxxx</code> classes
+        with the VAJ compiler, because the superclass already includes a
+        private class named <code>Iterator</code>.</li>
+    <li>Remove a JDK 1.3 dependency that prevented compiling
+        <code>BeanUtils</code> under JDK 1.2.</li>
+    <li>Generate "&amp;amp;" instead of "&amp;" in query strings that
+        contain more than one name/value pair.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occured in the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    <li>Restore the ability of the <code>&lt;html:button&gt;</code> tag to
+        retrieve the button text from the nested body content (so that it
+        can be easily internationalized).</li>
+    <li>If the property name used in the <code>labelProperty</code>
+        attribute of an <code>&lt;html:options&gt;</code> tag is invalid,
+        report the correct property name in the error message.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Documentation
+    application (and corresponding contents on the Struts web site) have
+    occurred:</p>
+    <ul>
+    <li>Fix a reference to an old Struts 0.5 tag in one of the User's Guide
+        examples.</li>
+    <li>Fix the stylesheet used to transform XML into HTML documentation so
+        that nested <code>&lt;body&gt;</code> tags are not created.</li>
+    <li>The DTD for Struts configuration files has been refined to highlight
+        the fact that you should use <code>&lt;set-property&gt;</code>
+        elements to configure your data source implementation.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Example Application
+    have occurred:</p>
+    <ul>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Template Example
+    Application have occurred:</p>
+    <ul>
+    </ul> 
+
+  </section>
+
+
+  </body>
+
+</document>
diff --git a/doc/release-notes-1.0.1.xml b/doc/release-notes-1.0.1.xml
new file mode 100644
index 0000000..b96b0ce
--- /dev/null
+++ b/doc/release-notes-1.0.1.xml
@@ -0,0 +1,234 @@
+<?xml version="1.0"?>
+<document url="./release-notes-1.0.1.xml">
+
+  <properties>
+    <author>Craig R. McClanahan</author>
+    <author>Robert Leland</author>
+    <author>Ted Husted</author>
+    <title>Struts Release Notes (Version 1.0.1)</title>
+  </properties>
+
+  <body>
+
+  <section name="Introduction" href="Introduction">
+
+    <p>This document contains the release notes for
+    <strong>Version 1.0.1 </strong> of the Struts Framework,
+    and covers changes that have taken place since
+    <a href="release-notes-1.0.html">Version 1.0</a>
+    was released.  The following sections cover
+    <a href="#New">New Features</a> and <a href="#Changes">Changes</a>
+    to Struts.</p>
+
+    <p>This version is unreleased, but available in the 
+    CVS as the STRUTS_1_0_BRANCH. This version is intended a near-term
+    release to cover bug-fixes only; no new functionality.</p>
+
+  </section>
+
+
+  <section name="What's Included?" href="Included">
+
+    <p>The binary distribution of this release includes the following
+    files relevant to Struts 1.1:</p>
+    <ul>
+    <li><code>INSTALL</code> - Brief installation instructions.  See
+        the <code>Struts Documentation Application</code>, or online at
+        <a href="http://jakarta.apache.org/struts/">http://jakarta.apache.org/struts/</a>
+        for more information.</li>
+    <li><code>LICENSE</code> - The Apache Software Foundation license that
+        defines the terms under which you can use Struts (and other software
+        licensed by Apache).</li>
+    <li><code>README</code> - A brief introduction to Struts.</li>
+    <li><code>lib/</code> - Directory containing files you will need in
+        your own applications.  The individual files of interest are:</li>
+        <ul>
+        <li><code>struts.jar</code> - JAR file that contains the compiled
+            Java classes for version 1.0 of Struts.  You must
+            place this file in the <code>/WEB-INF/lib</code> directory of
+            your web application.</li>
+        <li><code>struts-xxxxx.tld</code> - The tag library descriptor files
+            for the Struts 1.1 tag libraries (bean, html, logic, and
+            template).  You must place these files in the <code>/WEB-INF</code>
+            directory of your web application, and reference them with
+            appropriate <code>&lt;taglib&gt;</code> directives in your
+            web.xml file.</li>
+        <li><code>jdbc2_0-stdext.jar</code> - The JDBC 2.0 Optional Package
+            API classes (package <code>javax.sql</code>).  You will need to
+            include this file in the <code>/WEB-INF/lib</code> directory
+            of your application, if it is not already made visible to web
+            applications by your servlet container.</li>
+        <li><code>struts-config_1_1.dtd</code> - The document type descriptor
+            (DTD) for the Struts configuration file (which is typically named
+            <code>/WEB-INF/struts-config.xml</code>.  Your configuration file
+            will be validated against an internal copy of this DTD -- this
+            copy is available for reference purposes only.</li>
+        <li><code>web-app_2_2.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.2 specification.
+            This copy is for reference purposes only.</li>
+        <li><code>web-app_2_3.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.3 specification.
+            This copy is for reference purposes only.</li>
+        </ul>
+        <li><code>webapps/</code> - Web Application Archive (WAR) files for the
+            web applications that are included with Struts.</li>
+    </ul>
+
+    <p>The struts 0.5 milestone API release is no longer supported.
+       and has been removed as of Struts 1.1:</p>
+    <ul>
+    </ul>
+
+  </section>
+
+
+  <section name="What's New?" href="New">
+
+
+    <p>The following new features have been added to the basic controller
+    framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the utility classes
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    <li>LocalStrings: Correct message regarding replaceable parameter so that it does not append an extraneous character.</li>
+    <li>Add LabelValueBean class. This defines a collection of name/value pairs that can be used with the &gt;html:options> tag, and elsewhere.</li>
+    <li>MessageResources: Escape any single quote characters that are included in the specified message string.</li>
+    <li>Allow a transaction token to be the only parameter in computeParameters().</li>
+    <li>Change RequestUtils to encode ampersands when building a query string.</li>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-template</em> custom tag library (package
+    <code>org.apache.struts.taglib.template</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the Struts Documentation
+    application (and corresponding contents on the Struts web site):</p>
+    <ul>
+    </ul>
+
+  </section>
+
+
+  <section name="Changes and Bug Fixes" href="Changes">
+
+    <p>The following changes and bug fixes have occurred in the configuration
+    files related to Struts:</p>
+    <ul>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the basic
+    controller framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    <li>Modify ActionForm class to use ActionServletWrapper rather than expose ActionServlet.</li>
+    <li>Add ActionServletWrapper class. Used by ActionForm to prevent the Public String properties of ActionServlet from being changed via a query string.</li>
+    <li>The logic for creating an ActionErrors or ActionMessages object has been moved to a utility method in RequestUtils. The JspException message is also generated in RequestUtils.</li>
+    <li>Unconditionally pass the selected mapping as a request attribute under key Action.MAPPING_KEY, even if no form bean is specified.</li>
+    <li>Avoid a NullPointerException in corner cases caused by failed initialization of ActionServlet.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the file upload
+    package (package <code>org.apache.struts.upload</code>):</p>
+    <ul>
+    <li>Fixed lost byte problem in BufferedMultipartInputStream</li>
+    <li>Fixed ArrayIndexOutOfBoundsException situations</li>
+    <li>Better reporting for premature closing of input streams while reading
+multipart requests.</li>
+    <li>Additional fix for file corruption problem with uploads and new line characters.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the utilities
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    <li>Modify RequestUtils class to use ActionServletWrapper rather than expose ActionServlet.</li>
+    <li>Added error message for the getActionErrors and getActionMessages method.</li>
+    <li>Added a getActionErrors and getActionMessages methods to generate the correct corresponding object based on the object retrieved from request scope based on the key passed in.</li>
+    <li>The logic for creating an ActionErrors or ActionMessages object has been moved to a utility method in RequestUtils. The JspException message is also generated in RequestUtils.</li>
+    <li><code>ConvertUtils.convertCharacter()</code> will now detect empty strings and return the default value.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occured in the
+    <em>struts-bean</em> custom tag library (package
+    <code>org.apache.struts.taglib.bean</code>):</p>
+    <ul>
+    <li>Correct the generated scripting variable type when the &lt;bean:cookie>, &lt;bean:header>, or &lt;bean:parameter> tag is used with the "multiple" attribute.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occured in the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    <li>Fixed FormTag to exclude query string when identifying action mapping name.</li>
+    <li>Correct MultiboxTagdoAfterBody() to return SKIP_BODY instead of SKIP_PAGE.</li>
+    <li>Added the 'align' attribute to the &lt;html:image> tag.</li>
+    <li>On the Options tag, if the property specified by the "property" attribute returns null, it now throws an error message that indicates what the real problem is, rather than causing an NPE.</li>
+    <li>Added 'style' and 'styleClass' attributes for &lt;html:option&gt; and &lt;html:options&gt; tags.</li>
+    <li>Correctly URLEncode the query string parameter value on ImgTag, even if there is only a single parameter.</li>
+    </ul>
+
+
+    <p>The following changes and bug fixes have occurred in the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    <li>Added tags for checking if a message is present in general or for a specific property. They retrieve an object from request scope just like the html:errors and html:messages tags.</li>
+    <li>The <code>&lt;html:errors&gt;</code> when the property tag is
+    specified, errors are no longer printed if the specified property
+    has no errors. Previously errors were always printed! Future
+    enhancements would include additional attributes to always turn
+    off the header or footer. </li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Documentation
+    application (and corresponding contents on the Struts web site) have
+    occurred:</p>
+    <ul>
+    <li>Add installation notes for Jetty.</li>
+    <li>In the Tag Developers Guide, add more detail regarding file upload requirements.</li>
+    <li>In the Introduction, added references to basic background material.</li>
+    <li>In Building View Components, clarify that additional i18n support may be provided by the browser, and is outside the scope of the framework.</li>
+    <li>In Building Controller Components, document 'validating' init-param, add defaults for various parameters, clarify that some web.xml settings are not Struts-specific.</li>
+    <li>Correct the example page in the User's Guide (Building View Components) to reflect current practice.</li>
+    <li>Revised installation instructions for SilverStream and Resin.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Example Application
+    have occurred:</p>
+    <ul>
+    <li>Remove references to saving database data from "tour" document, since this functionality was removed.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Template Example
+    Application have occurred:</p>
+    <ul>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Exercise Taglib Example
+    Application have occurred:</p>
+    <ul>
+    <li>Added test case for &lt;html:select> using &lt;html:options> based on a collection
+  saved in the page context.</li>
+    </ul> 
+
+  </section>
+
+
+  </body>
+
+</document>
diff --git a/doc/release-notes-1.0.xml b/doc/release-notes-1.0.xml
new file mode 100644
index 0000000..0f41d45
--- /dev/null
+++ b/doc/release-notes-1.0.xml
@@ -0,0 +1,292 @@
+<?xml version="1.0"?>
+<document url="./release-notes-1.0.xml">
+
+  <properties>
+    <author>Craig R. McClanahan</author>
+    <title>Struts Release Notes (Version 1.0)</title>
+  </properties>
+
+  <body>
+
+  <section name="Introduction" href="Introduction">
+
+    <p>This document contains the release notes for
+    <strong>Version 1.0</strong> of the Struts Framework,
+    and covers changes that have taken place since
+    <a href="release-notes-1.0-b3.html">Version 1.0-beta-3</a>
+    was released.  The following sections cover
+    <a href="#New">New Features</a> and <a href="#Changes">Changes</a>
+    to Struts.</p>
+
+  </section>
+
+
+  <section name="What's Included?" href="Included">
+
+    <p>The binary distribution of this release includes the following
+    files relevant to Struts 1.0:</p>
+    <ul>
+    <li><code>INSTALL</code> - Brief installation instructions.  See
+        the <code>Struts Documentation Application</code>, or online at
+        <a href="http://jakarta.apache.org/struts/">http://jakarta.apache.org/struts/</a>
+        for more information.</li>
+    <li><code>LICENSE</code> - The Apache Software Foundation license that
+        defines the terms under which you can use Struts (and other software
+        licensed by Apache).</li>
+    <li><code>README</code> - A brief introduction to Struts.</li>
+    <li><code>lib/</code> - Directory containing files you will need in
+        your own applications.  The individual files of interest are:
+        <ul>
+        <li><code>struts.jar</code> - JAR file that contains the compiled
+            Java classes for both version 0.5 and 1.0 of Struts.  You must
+            place this file in the <code>/WEB-INF/lib</code> directory of
+            your web application.</li>
+        <li><code>struts-xxxxx.tld</code> - The tag library descriptor files
+            for the Struts 1.0 tag libraries (bean, html, logic, and
+            template).  You must place these files in the <code>/WEB-INF</code>
+            directory of your web application, and reference them with
+            appropriate <code>&lt;taglib&gt;</code> directives in your
+            web.xml file.  <strong>NOTE</strong> - The struts-form.tld
+            file is deprecated; you should use the struts-html.tld file
+            instead.</li>
+        <li><code>jdbc2_0-stdext.jar</code> - The JDBC 2.0 Optional Package
+            API classes (package <code>javax.sql</code>).  You will need to
+            include this file in the <code>/WEB-INF/lib</code> directory
+            of your application, if it is not already made visible to web
+            applications by your servlet container.</li>
+        <li><code>struts-config_1_0.dtd</code> - The document type descriptor
+            (DTD) for the Struts configuration file (which is typically named
+            <code>/WEB-INF/struts-config.xml</code>.  Your configuration file
+            will be validated against an internal copy of this DTD -- this
+            copy is available for reference purposes only.</li>
+        <li><code>web-app_2_2.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.2 specification.
+            This copy is for reference purposes only.</li>
+        <li><code>web-app_2_3.dtd</code> - The document type descriptor (DTD)
+            for web.xml files conforming to the Servlet 2.3 specification.
+            This copy is for reference purposes only.</li>
+        </ul></li>
+    <li><code>webapps/</code> - Web Application Archive (WAR) files for the
+        web applications that are included with Struts.</li>
+    </ul>
+
+    <p>For backwards compatibility only, the binary distribution also
+    includes the following files that conform to the Struts 0.5 milestone
+    release APIs.  Usage of these files and APIs is deprecated, and they
+    will be removed from releases after Struts 1.0:</p>
+    <ul>
+    <li><code>lib/</code> - Directory containing files you will need in
+        your own applications.  The individual files of interest are:
+        <ul>
+        <li><code>struts.jar</code> - JAR file that contains the compiled
+            Java classes for both version 0.5 and 1.0 of Struts.  You must
+            place this file in the <code>/WEB-INF/lib</code> directory of
+            your web application.</li>
+        <li><code>struts.tld</code> - The tag library descriptor file for
+            the 0.5 version of the Struts tags.  You must place this file
+            in the <code>/WEB-INF</code> directory of your web application,
+            and reference it with appropriate <code>&lt;taglib&gt;</code>
+            directives in your web.xml file.</li>
+        </ul></li>
+    </ul>
+
+  </section>
+
+
+  <section name="What's New?" href="New">
+
+    <p><strong>DEPRECATIONS</strong> - The entire custom tag library
+    that is documented in <code>struts.tld</code> has been deprecated.
+    These tags correspond to the Struts 0.5 functionality that is also
+    deprecated, and have been replaced (and considerably enhanced) in
+    the various individual tag libraries.</p>
+
+    <p><strong>DEPRECATIONS</strong> - The entire custom tag library
+    that is documented in <code>struts-form.tld</code> has been deprecated
+    because this library has been renamed <code>struts-html.tld</code>
+    instead.</p>
+
+    <p><strong>DEPRECATIONS</strong> - Several classes in the
+    <code>org.apache.struts.util</code> package have been marked as
+    deprecated in their entirety, because they will be replaced by
+    versions from the Jakarta Commons project once those packages are
+    released.  These deprecated classes will <strong>not</strong> be
+    removed until a release after Struts 1.1.  In general, the only
+    change required inside user code using these classes will be to
+    update the <code>import</code> statement.  The following classes
+    are involved:</p>
+    <ul>
+    <li>ArrayStack</li>
+    <li>BeanUtils</li>
+    <li>ConvertUtils</li>
+    <li>FastArrayList</li>
+    <li>FastHashMap</li>
+    <li>FastTreeMap</li>
+    <li>GenericConnection</li>
+    <li>GenericDataSource</li>
+    <li>PropertyUtils</li>
+    </ul>
+
+    <p>The following new features have been added to the basic controller
+    framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the utility classes
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    <li>The <code>&lt;html:link&gt;</code> tag now supports the optional
+        <code>title</code> attribute, that causes some browsers to display
+        alternate text when the mouse is hovered over a hyperlink.</li>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    <li>The <code>&lt;logic:iterate&gt;</code> tag now supports a new
+        attribute, <code>indexId</code>.  This attribute names a page scope
+        attribute (and corresponding scripting variable) that will be
+        exposed in the nested body of the iteration, which will contain
+        the current loop index as a java.lang.Integer.</li>
+    </ul>
+
+    <p>The following new features have been added to the
+    <em>struts-template</em> custom tag library (package
+    <code>org.apache.struts.taglib.template</code>):</p>
+    <ul>
+    </ul>
+
+    <p>The following new features have been added to the Struts Documentation
+    application (and corresponding contents on the Struts web site):</p>
+    <ul>
+    </ul>
+
+  </section>
+
+
+  <section name="Changes and Bug Fixes" href="Changes">
+
+    <p>The following changes and bug fixes have occurred in the configuration
+    files related to Struts:</p>
+    <ul>
+    <li>The documentation about configuring a data source element in the
+        <code>struts-config.xml</code> file has been updated to emphasize
+        the use of <code>&lt;set-property&gt;</code> elements nested inside
+        the <code>&lt;data-source&gt;</code> element.  No further additional
+        attributes will be added to the <code>&lt;data-source&gt;</code>
+        element in the DTD to support custom properties of particular
+        data source implementations.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the basic
+    controller framework (package <code>org.apache.struts.action</code>):</p>
+    <ul>
+    <li>Several issues introduced with the internal wrapping of multipart
+        requests have been fixed.</li>
+    <li>The instance variables in the <code>ActionForm</code> base class
+        are now transient, so that <code>ActionForm</code> instances can
+        actually be serialized.  <strong>WARNING</strong> - If you deserialize
+        such an <code>ActionForm</code> instance and attempt to use it within
+        the Struts framework, be sure to call <code>setServlet()</code> (and
+        <code>setMultipartRequestHander()</code> if appropriate) first.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the file upload
+    package (package <code>org.apache.struts.upload</code>):</p>
+    <ul>
+    <li>Fixed a bug that could cause corruption in the uploaded file,
+        by converting sequences of \r\n\n into \r\n\r\n.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the utilities
+    (package <code>org.apache.struts.util</code>):</p>
+    <ul>
+    <li>Corrected a cut-and-paste typo that caused NullPointerException
+        on attempts to use the new <code>pingQuery</code> property that
+        was added in Struts 1.0-b3.</li>
+    <li>Fix operation ordering so that <code>RequestUtils.lookup()</code>
+        will throw a JspException when the specified bean is missing, in
+        accordance with its JavaDoc documentation.</li>
+    <li>Digester calls to <code>Rule.body()</code> methods will now trim
+        leading and trailing whitespace first, consistent with the behavior
+        of other body processing performed within the rules.</li>
+    <li>Correct the calculation of an absolute URL from a context-relative
+        path in <code>RequestUtils.absoluteURL()</code>.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occured in the
+    <em>struts-bean</em> custom tag library (package
+    <code>org.apache.struts.taglib.bean</code>):</p>
+    <ul>
+    <li>The <code>&lt;bean:include&gt;</code> tag will now pass a session
+        identifier on to the included request (assuming that it is part of
+        the same web application), even if the current request is maintaining
+        session identity with cookies.  Previously, this only worked if you
+        were using URL rewriting.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occured in the
+    <em>struts-html</em> custom tag library (package
+    <code>org.apache.struts.taglib.html</code>):</p>
+    <ul>
+    <li>For all tags where Struts generates attributes that are allowed to
+        be minimized in the HTML specification (i.e. checked, disabled,
+        multiple, readonly, and selected), generate attribute values equal
+        to the attribute name, as required by HTML 4.01, section 3.3.4.
+        For example, generate <code>checked="checked"</code> instead of
+        <code>checked="true"</code> for the "checked" attribute.</li>
+    <li>Correctly generate a <code>&lt;a name="my name"&gt;&lt;&gt;</code>
+        element when the <code>linkName</code> attribute is used on the
+        <code>&lt;html:link&gt;</code> tag.</li>
+    </ul>
+
+    <p>The following changes and bug fixes have occurred in the
+    <em>struts-logic</em> custom tag library (package
+    <code>org.apache.struts.taglib.logic</code>):</p>
+    <ul>
+    <li>Update the processing performed by the
+        <code>&lt;logic:present&gt;</code> and
+        <code>&lt;logic:notPresent&gt;</code> tags to reflect the changed
+        behavior of <code>RequestUtils.lookup()</code>.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Documentation
+    application (and corresponding contents on the Struts web site) have
+    occurred:</p>
+    <ul>
+    <li>Links to subscribe and unsubscribe from the STRUTS-DEV and
+        STRUTS-USER mailing lists have been added to the home page.</li>
+    <li>Miscellaneous corrections to typos and hyperlinks.</li>
+    <li>Cleaned up problems in the stylesheets used to create documentation
+        pages that formerly emitted <code>&lt;project&gt;</code> tags in the
+        generated HTML, and generated incorrect references to link colors in
+        the navigation bar.</li>
+    <li>Added a "Who We Are" page to the documentation.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Example Application
+    have occurred:</p>
+    <ul>
+    <li>The <code>name</code> and <code>page</code> attributes of the
+        <code>&lt;app:checkLogon&gt;</code> tag now accept runtime
+        expressions.</li>
+    </ul>
+
+    <p>The following changes and bug fixes to the Struts Template Example
+    Application have occurred:</p>
+    <ul>
+    </ul> 
+
+  </section>
+
+
+  </body>
+
+</document>
diff --git a/doc/struts-bean.xml b/doc/struts-bean.xml
index e7f08e5..346e158 100644
--- a/doc/struts-bean.xml
+++ b/doc/struts-bean.xml
@@ -15,7 +15,7 @@
   <jspversion>1.1</jspversion>
   <shortname>bean</shortname>
   <display-name>Struts Bean Tags</display-name>
-  <uri>http://jakarta.apache.org/struts/tags-bean-1.0</uri>
+  <uri>http://jakarta.apache.org/struts/tags-bean-1.0.1</uri>
   <info>
   <p>This tag library contains tags useful in accessing beans and their
   properties, as well as defining new beans (based on these accesses)
diff --git a/doc/struts-html.xml b/doc/struts-html.xml
index 5829f34..f24cdfb 100644
--- a/doc/struts-html.xml
+++ b/doc/struts-html.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<document url="./struts-form.xml">
+<document url="./struts-html.xml">
 
 <properties>
   <author>Mike Schachter</author>
@@ -15,6 +15,7 @@
   <jspversion>1.1</jspversion>
   <shortname>html</shortname>
   <display-name>Page Construction Tags</display-name>
+  <uri>http://jakarta.apache.org/struts/tags-html-1.0.1</uri>
   <info>
   <p>
         This taglib contains tags used to create struts
@@ -858,6 +859,16 @@
                 associated with our current form. This tag is only valid when
                 nested inside a form tag body.
             </p>
+            <p>
+                As with the corresponding HTML &lt;input&gt; element, the
+                enclosing form element must specify "POST" for the <code>method</code>
+                attribute, and "multipart/form-data" for the <code>enctype</code>
+                attribute. For example:
+    <pre>
+    &lt;html:form method="POST" enctype="multipart/form-data"&gt;
+        &lt;html:file property="theFile" /&gt;
+    &lt;/html:form&gt;</pre>
+            </p>
         </info>
 
         <attribute>
@@ -1416,6 +1427,15 @@
         </attribute>
 
         <attribute>
+                <name>align</name>
+                <required>false</required>
+                <rtexprvalue>true</rtexprvalue>
+                <info>
+                <p>The alignment option for this image.</p>
+                </info>
+        </attribute>
+
+        <attribute>
                 <name>alt</name>
                 <required>false</required>
                 <rtexprvalue>true</rtexprvalue>
@@ -1707,7 +1727,8 @@
                 to be the names of query parameters to be appended to the
                 <code>src</code> URL.  The value associated with each key
                 must be either a String or a String array representing the
-                parameter value(s).  If a String array is specified, more than
+                parameter value(s), or an object whose toString() method
+                will be called.  If a String array is specified, more than
                 one value for the same query parameter name will be
                 created.</p>
 
@@ -2172,7 +2193,8 @@
                 <p>As the <code>Map</code> is processed, the keys are assumed
                 to be the names of query parameters to be appended to the
                 hyperlink.  The value associated with each key must be either
-                a String or a String array representing the parameter value(s).
+                a String or a String array representing the parameter value(s),
+                or an object whose toString() method will be called.
                 If a String array is specified, more than one value for the
                 same query parameter name will be created.</p>
 
@@ -2525,6 +2547,15 @@
                 </attribute>
 
                 <attribute>
+                  <name>title</name>
+                  <required>false</required>
+                  <rtexprvalue>true</rtexprvalue>
+                  <info>
+                  <p>The advisory title for this hyperlink.</p>
+                  </info>
+                </attribute>
+
+                <attribute>
                   <name>transaction</name>
                   <required>false</required>
                   <rtexprvalue>true</rtexprvalue>
@@ -2866,6 +2897,23 @@
                 </attribute>
 
         <attribute>
+            <name>style</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <info>
+                CSS styles to be applied to this HTML element.
+            </info>
+        </attribute>
+
+        <attribute>
+            <name>styleClass</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <info>
+                CSS stylesheet class to be applied to this HTML element.
+            </info>
+        </attribute>
+        <attribute>
                     <name>value</name>
                     <required>true</required>
                     <rtexprvalue>true</rtexprvalue>
@@ -3016,6 +3064,24 @@
                 to the server for these options.
             </info>
         </attribute>
+
+        <attribute>
+            <name>style</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <info>
+                CSS styles to be applied to this HTML element.
+            </info>
+        </attribute>
+
+        <attribute>
+            <name>styleClass</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <info>
+                CSS stylesheet class to be applied to this HTML element.
+            </info>
+        </attribute>
     </tag>
 
     <tag>
@@ -3472,6 +3538,15 @@
             </info>
         </attribute>
 
+        <attribute>
+            <name>tabindex</name>
+            <required>false</required>
+            <rtexprvalue>true</rtexprvalue>
+            <info>
+                The tab order (ascending positive integers) for this element.
+            </info>
+        </attribute>
+
                 <attribute>
                         <name>value</name>
                         <required>true</required>
diff --git a/doc/struts-logic.xml b/doc/struts-logic.xml
index 29a2d8f..7dccfbb 100644
--- a/doc/struts-logic.xml
+++ b/doc/struts-logic.xml
@@ -14,7 +14,7 @@
   <jspversion>1.1</jspversion>
   <shortname>logic</shortname>
   <display-name>Struts Logic Tags</display-name>
-  <uri>http://jakarta.apache.org/struts/tags-logic-1.0</uri>
+  <uri>http://jakarta.apache.org/struts/tags-logic-1.0.1</uri>
   <info>
   <p>This tag library contains tags that are useful in managing conditional
   generation of output text, looping over object collections for
@@ -465,6 +465,16 @@
     </attribute>
 
     <attribute>
+      <name>indexId</name>
+      <required>false</required>
+      <rtexprvalue>true</rtexprvalue>
+      <info>
+      <p>The name of a page scope JSP bean that will contain the current
+      index of the collection on each iteration.</p>
+      </info>
+    </attribute>
+
+    <attribute>
       <name>length</name>
       <required>false</required>
       <rtexprvalue>true</rtexprvalue>
diff --git a/doc/struts-template.xml b/doc/struts-template.xml
index c67af1f..51bd128 100644
--- a/doc/struts-template.xml
+++ b/doc/struts-template.xml
@@ -15,7 +15,7 @@
   <jspversion>1.1</jspversion>
   <shortname>template</shortname>
   <display-name>Template Tags</display-name>
-  <uri>http://jakarta.apache.org/struts/tags-template-1.0</uri>
+  <uri>http://jakarta.apache.org/struts/tags-template-1.0.1</uri>
   <info>
   This tag library contains three tags: put, get, and insert. Put tags
   put content into request scope, which is retrieved by a get tag in
diff --git a/doc/stylesheets/struts.xsl b/doc/stylesheets/struts.xsl
index 15b312f..b02bcf8 100644
--- a/doc/stylesheets/struts.xsl
+++ b/doc/stylesheets/struts.xsl
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!-- Content Stylesheet for Struts Documentation -->
-<!-- $Id: struts.xsl,v 1.1 2001/03/18 17:48:59 vmassol Exp $ -->
+<!-- $Id: struts.xsl,v 1.1.2.2 2001/06/12 03:18:10 craigmcc Exp $ -->
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="1.0">
@@ -80,12 +80,17 @@
 
   </xsl:template>
 
+  <!-- Process the project element for the navigation bar -->
+  <xsl:template match="project">
+    <xsl:apply-templates/>
+  </xsl:template>
+
   <!-- Process a menu for the navigation bar -->
   <xsl:template match="menu">
     <table border="0" cellspacing="5">
       <tr>
         <th colspan="2" align="left">
-          <font color="{body-link}"><strong>
+          <font color="{$body-link}"><strong>
             <xsl:value-of select="@name"/>
           </strong></font>
         </th>
@@ -110,6 +115,13 @@
     </tr>
   </xsl:template>
 
+
+  <!-- Process a document body -->
+  <xsl:template match="body">
+    <xsl:apply-templates/>
+  </xsl:template>
+
+
   <!-- Process a documentation section -->
   <xsl:template match="section">
     <xsl:choose>
diff --git a/doc/stylesheets/userGuide.xsl b/doc/stylesheets/userGuide.xsl
index 1c6e834..35f7291 100644
--- a/doc/stylesheets/userGuide.xsl
+++ b/doc/stylesheets/userGuide.xsl
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!-- Content Stylesheet for Struts User's Guide -->
-<!-- $Id: userGuide.xsl,v 1.1 2001/03/18 17:48:59 vmassol Exp $ -->
+<!-- $Id: userGuide.xsl,v 1.1.2.1 2001/06/12 03:18:10 craigmcc Exp $ -->
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="1.0">
@@ -83,6 +83,12 @@
   </xsl:template>
 
 
+  <!-- Process the project element for the navigation bar -->
+  <xsl:template match="project">
+    <xsl:apply-templates/>
+  </xsl:template>
+
+
   <!-- Process an entire chapter (assumes one chapter per page) -->
   <xsl:template match="chapter">
     <xsl:element name="a">
@@ -106,7 +112,7 @@
     <table border="0" cellspacing="5">
       <tr>
         <th colspan="2" align="left">
-          <font color="{body-link}"><strong>
+          <font color="{$body-link}"><strong>
             <xsl:value-of select="@name"/>
           </strong></font>
         </th>
@@ -165,4 +171,4 @@
   </xsl:template>
 
 
-</xsl:stylesheet>
\ No newline at end of file
+</xsl:stylesheet>
diff --git a/doc/userGuide/building_controller.xml b/doc/userGuide/building_controller.xml
index 9bfb919..5d228e1 100644
--- a/doc/userGuide/building_controller.xml
+++ b/doc/userGuide/building_controller.xml
@@ -5,6 +5,8 @@
     <author>Craig R. McClanahan</author>
     <author>Mike Schachter</author>
     <author>Ted Husted</author>
+    <author>Martin Cooper</author>
+    <author>Ed Burns</author>
     <title>The Struts User's Guide - Building Controller Components</title>
   </properties>
   
@@ -22,14 +24,11 @@
       </p>
       
       <ul>
-        <li>Write an <code>Action</code> class (that is, an extension of the
-            <code>Action</code> class) for each logical request
-            that may be received.</li>
-        <li>[Optionally] Write an <code>ActionMapping</code> class (that is, an
-           extension of the <code>ActionMapping</code> class) that defines the class
-           names and other information associated with each possible mapping.</li>
-        <li>Write the action mapping configuration file (in XML) that is used
-            to configure the controller servlet.</li>
+        <li>Write an <code>Action</code> class for each logical request that may 
+            be received (extend <code>org.apache.action.Action</code>).</li>
+        <li>Configure a ActionMapping (in XML) for each logical request that may 
+            be submitted. The XML configuration file is usually named
+            <code>struts-config.xml</code>.</li>
         <li>Update the web application deployment descriptor file (in XML)
             for your application to include the necessary Struts components.</li>
         <li>Add the appropriate Struts components to your application.</li>
@@ -57,31 +56,31 @@
 </pre>
       
       <p>
-        Most people would only use the "HttpServletRequest" version. 
+        Most projects would only use the "HttpServletRequest" version. 
       </p>
       <p>
-        The goal of an <code>Action</code> class is to process this request,
-        and then to return an <code>ActionForward</code> object that identifies
-        the JSP page (if any) to which control should be forwarded to generate
-        the corresponding response.  In the <i>MVC/Model 2</i> design pattern,
-        a typical <code>Action</code> class will implement the following
-        logic in its <code>perform()</code> method:
+        The goal of an <code>Action</code> class is to process a request, via 
+        its <code>perform()</code> method, and return an <code>ActionForward</code> object 
+        that identifies where control should be forwarded (e.g. a JSP) to provide 
+        the appropriate response. In the <i>MVC/Model 2</i> design pattern,
+        a typical <code>Action</code> class will often implement logic like the following
+        in its <code>perform()</code> method:
       </p>
       <ul>
         <li>Validate the current state of the user's session (for example, checking
             that the user has successfully logged on).  If the <code>Action</code>
-            class finds that no logon exists, the request should be forwarded to
+            class finds that no logon exists, the request can be forwarded to
             the JSP page that displays the username and password prompts for
-            logging on.  This could occur because a user tried to enter your
+            logging on.  This could occur because a user tried to enter an 
             application "in the middle" (say, from a bookmark), or because the
             session has timed out, and the servlet container created a new one.</li>
-        <li>If validation has not yet occurred,
-            validate the form bean properties as necessary.  If a problem is found,
+        <li>If validation is not complete,
+            validate the form bean properties as needed.  If a problem is found,
             store the appropriate error message keys as a request attribute, and
             forward control back to the input form so that the errors can be
             corrected.</li>
         <li>Perform the processing required to deal with this request (such as
-            saving a row into a database).  This can be done by code embedded within
+            saving a row into a database).  This can be done by logic code embedded within
             the <code>Action</code> class itself, but should generally be performed
             by calling an appropriate method of a business logic bean.</li>
         <li>Update the server-side objects that will be used to create the next
@@ -137,6 +136,12 @@
         it is embedded inside a component (the <code>Action</code> class) that
         is tied to being executed in a web application environment.
       </p>
+
+      <p>
+        An <code>Action</code> can be factored into several local methods, so long as all 
+        properties needed are passed in the method signatures. The JVM 
+        handles such properties using the stack, and so they are thread-safe. 
+      </p>
         
       <p>
         The example application included with Struts stretches this design
@@ -164,7 +169,6 @@
           that this action will use</li>
         <li><b>path</b> - The request URI path that is matched to select this
             mapping.  See below for examples of how matching works.</li>
-            
         <li><b>unknown</b> - Set to <code>true</code> if this action
           should be configured as the default for this application, to handle
           all requests not handled by another action.  Only one action can be
@@ -172,6 +176,10 @@
         <li><b>validate</b> - Set to <code>true</code> if the
           <code>validate()</code> method of the action associated
           with this mapping should be called.</li>
+        <li><b>forward</b> - The request URI path to which control is passed 
+         when his mapping is invoked. This is an alternative to declaring 
+         a <b>type</b> property. </li>
+
       </ul>
                
     </section>
@@ -197,8 +205,8 @@
       </p>
       
       <p>
-        Inside of the &lt;struts-config&gt; element, there two important elements that use
-        to describe your actions:
+        Inside of the &lt;struts-config&gt; element, there are two important
+        elements that are used to describe your actions:
         
         <blockquote>
           <b>&lt;form-beans&gt;</b><br />
@@ -206,18 +214,20 @@
             for each form bean, which has the following important attributes:
             <ul>
               <li>
-                <b>name</b>: The name of the request or session level attribute that this form
-                bean will be stored as
+                <b>name</b>: A unique identifier for this bean, which will be used
+                to reference it in corresponding action mappings. Usually, this
+                is also the name of the request or session attribute under which
+                this form bean will be stored.
               </li>
               <li>
-                <b>type</b>: The fully-qualified Java classname of your form bean
+                <b>type</b>: The fully-qualified Java classname of your form bean.
               </li>
             </ul>
         </blockquote>
         <blockquote>
           <b>&lt;action-mappings&gt;</b><br />
             This section contains your action definitions.  You use an &lt;action&gt; element
-            for each of your actions you would like to define.  Each action element has requires
+            for each of your actions you would like to define.  Each action element requires
             the following attributes to be defined:
             
             <ul>
@@ -235,6 +245,7 @@
         
       </p>
         
+
       <p>
         The <code>struts-config.xml</code> file from the example application includes
         the following mapping entry for the "log on" function, which we will use
@@ -273,7 +284,7 @@
         name for the form bean.
       </p>
       <p>
-        The "<code>global-forwards</code>" section is used to create logical name mappings between commonly used
+        The "<code>global-forwards</code>" section is used to create logical name mappings for commonly used
         jsp pages.  Each of these forwards is available through a call to your action mapping instance,
         i.e. <code>actionMappingInstace.findForward("logicalName")</code>.
       </p>
@@ -287,7 +298,7 @@
         and saving a bean of the specified class if needed.
       </p>
       <p>
-        An optional but very useful section is the local "local <code>forwards</code>". In the example 
+        Optional but very useful are the local "<code>forward</code>" elements. In the example 
         application, many actions include a local "success" and/or "failure" forward as 
         part of an Action mapping. 
       </p>
@@ -415,7 +426,8 @@
               instead of the servlet log.  [0]</li>
           <li><strong>factory</strong> - The Java class name of the
               <code>MessageResourcesFactory</code> used to create the application
-              <code>MessageResources</code> object.</li>
+              <code>MessageResources</code> object.
+              [org.apache.struts.util.PropertyMessageResourcesFactory]</li>
           <li><strong>formBean</strong> - The Java class name of the ActionFormBean
               implementation to use [org.apache.struts.action.ActionFormBean].</li>
           <li><strong>forward</strong> - The Java class name of the ActionForward
@@ -435,7 +447,7 @@
               user session, identify and store an appropriate
               <code>java.util.Locale</code> object (under the standard key
               identified by <code>Action.LOCALE_KEY</code>) in the user's session
-              if there is not a Locale object there already.</li>
+              if there is not a Locale object there already. [true]</li>
           <li><strong>mapping</strong> - The Java class name of the ActionMapping
               implementation to use [org.apache.struts.action.ActionMapping].
               Two convenient classes you may wish to use are:
@@ -453,7 +465,7 @@
               by a "K" "M", or "G", which are interpreted to mean kilobytes,
               megabytes, or gigabytes, respectively.  [250M]</li>
           <li><strong>multipartClass</strong> - The fully qualified name of the
-              MultiplartRequestHandler implementation class to be used for processing
+              MultipartRequestHandler implementation class to be used for processing
               file uploads.  [org.apache.struts.upload.DiskMultipartRequestHandler]
               </li>
           <li><strong>nocache</strong> - If set to <code>true</code>, add HTTP headers
@@ -468,12 +480,20 @@
               application as a servlet context attribute]</li>
           <li><strong>validate</strong> - Are we using the new configuration file
               format?  [true]</li>  
+          <li><strong>validating</strong> - Should we use a validating XML parse to
+              process the configuration file (strongly recommended)? [true]</li>  
         </ul>
       </section>
       
       <section name="4.5.2 Configure the Action Servlet Mapping" href="dd_config_mapping">
       
         <p>
+          <strong>Note:</strong> The material in this section is not specific to
+          Struts. The configuration of servlet mappings is defined in the Java
+          Servlet Specification. This section describes the most common means
+          of configuring a Struts application.
+        </p>
+        <p>
           There are two common approaches to defining the URLs that will
           be processed by the controller servlet -- prefix matching and extension
           matching.  An appropriate mapping entry for each approach will be
@@ -536,7 +556,7 @@
         
         <p>
           Next, you must add an entry defining the Struts tag library.  There are currently four
-          taglibs that struts is packaged with.
+          taglibs that Struts is packaged with.
         </p>
         <p>
           The struts-bean taglib contains tags useful in accessing
@@ -608,8 +628,10 @@
       <section name="4.5.4 Add Struts Components To Your Application" href="config_add">
         
         <p>
-          To use struts, you must copy the .tld files that you require into your
-          WEB-INF directory, and copy struts.jar into your WEB-INF/lib directory.
+         To use Struts, you must copy the .tld files that you require into
+         your <code>WEB-INF</code> directory, and copy <code>struts.jar</code>
+         (and all of the <code>commons-*.jar</code> files) into your
+         <code>WEB-INF/lib</code> directory.
         </p>
                                 <p>
                                         Next: <a href="resources.html">Struts Resources</a>
diff --git a/doc/userGuide/building_model.xml b/doc/userGuide/building_model.xml
index b61aa94..d3066c9 100644
--- a/doc/userGuide/building_model.xml
+++ b/doc/userGuide/building_model.xml
@@ -5,6 +5,8 @@
     <author>Craig R. McClanahan</author>
     <author>Mike Schachter</author>
     <author>Ted Husted</author>
+    <author>Martin Cooper</author>
+    <author>Ed Burns</author>
     <title>The Struts User's Guide - Building Model Components</title>
   </properties>
   
@@ -14,16 +16,18 @@
       <section name="2.1 Overview" href="overview">
         
         <p>
-          The application requirements document that you are using will likely
-        have focused on the user interface to be created.  However, you should ensure
-        that the processing required for each submitted request is also clearly
-        defined.  In general, the developer of the <i>Model</i> components will be
-        focusing on the creation of JavaBeans classes that support all of the
-        functional requirements.  The precise nature of the beans required by a
-        particular application will vary widely depending on those requirements,
-        but they can generally be classified into several categories discussed
-        below.  However, a brief review of the concept of "scope" as it relates
-        to beans is useful first.
+        Many requirements documents used for building web applications
+        focus on the <i>View</i>.  However, you should ensure that the
+        processing required for each submitted request is also clearly
+        defined from the <i>Model's</i> perspective.  In general, the
+        developer of the <i>Model</i> components will be focusing on
+        the creation of JavaBeans classes that support all of the
+        functional requirements.  The precise nature of the beans
+        required by a particular application will vary widely
+        depending on those requirements, but they can generally be
+        classified into several categories discussed below.  However,
+        a brief review of the concept of "scope" as it relates to
+        beans and JSP is useful first.
       </p>
     </section>
     
@@ -81,10 +85,11 @@
         than the <i>Model</i>.
       </p>
       <p>
-        The Struts framework generally assumes that you have created an
+        The Struts framework generally assumes that you have defined an
         <code>ActionForm</code> bean (that is, a Java class extending the
         <code>ActionForm</code> class) for each input form required in your
-        application.  If you define such beans in your <code>ActionMapping</code>
+        application. <code>ActionForm</code> beans are sometimes just called
+        "form beans". If you declare such beans in your <code>ActionMapping</code>
         configuration file (see "<a href="building_controller.html#config">
         Building the Controller Components</a>"), the Struts  controller servlet 
         will automatically perform the following services for you, before 
@@ -130,12 +135,22 @@
             to the usual JavaBeans conventions.  For example, an input field named
             <code>username</code> will cause the <code>setUsername()</code> method
             to be called.</li>
+        <li>Think of your ActionForm beans as a firewall between HTTP and the Action. 
+            Use the validate method to ensure all required properties are present, and 
+            that they contain reasonable values. An ActionForm that fails validation 
+            will not even be presented to the Action for handling.</li>
         <li>You may also place a bean instance on your form, and use nested property 
             references. For example, you might have a "customer" bean on your Action 
             Form, and then refer to the property "customer.name" in your JSP view. 
             This would correspond to the methods <code>customer.getName()</code> and 
             <code>customer.setName(string Name)</code> on your customer bean. See the 
             Tag Library Developer Guides for more about nested syntax.</li>
+        <li><i>Caution:</i> If you nest an existing bean instance on your form, think 
+            about the properties it exposes. Any public property on an ActionForm that 
+            accepts a single String value can be set with a query string. It may be 
+            useful to place such beans inside a thin "wrapper" that exposes only the 
+            properties required. This wrapper can also provide a filter to be 
+            sure runtime properties are not set to inappropriate values.</li> 
       </ul>
         
       <p>
@@ -148,7 +163,7 @@
         properties for all of the fields, no matter which page the field is actually
         displayed on.  Likewise, the various pages of the same form should all be
         submitted to the same Action Class.  If you follow these suggestions, the
-        page designers can rearrange the fields among the various pages, pftem without 
+        page designers can rearrange the fields among the various pages, often without 
         requiring changes to the processing logic.
       </p>
     </section>
@@ -217,7 +232,7 @@
       
       <p>
         Struts can define the datasources for an application from within its standard 
-        configuration file. A simple JDBC connection pool is also provided. See <a 
+        configuration file. A <b>simple</b> JDBC connection pool is also provided. See <a 
         href="building_controller.html#config">The Action Mappings Configuration File</a>
         section and the Utilities Developer Guide for details. 
       </p>
@@ -254,6 +269,11 @@
 }
 </pre>
       
+      <p>
+        Note that the Struts generic connection pool is an <b>optional</b> component. Many 
+        Struts applications use other connection pools for better performance, 
+        especially with high-volume production systems. 
+       </p>
       <p align="center">
         Next: <a href="building_view.html">Building View Components</a>
       </p>
diff --git a/doc/userGuide/building_view.xml b/doc/userGuide/building_view.xml
index 8560c45..bc09da8 100644
--- a/doc/userGuide/building_view.xml
+++ b/doc/userGuide/building_view.xml
@@ -5,6 +5,8 @@
     <author>Craig R. McClanahan</author>
     <author>Mike Schachter</author>
     <author>Ted Husted</author>
+    <author>Martin Cooper</author>
+    <author>Ed Burns</author>
     <title>The Struts User's Guide - Building View Components</title>
   </properties>
   
@@ -78,6 +80,14 @@
       </ul>
         
       <p>
+        Please note that the i18n support in a framework like Struts is limited to the
+        <b>presentation</b> of internationalized text and images to the user.
+        Support for Locale specific <b>input methods</b> (used with languages 
+        such as Japanese, Chinese, and Korean) is left up to the client device, which 
+        is usually a web browser.
+      </p>
+
+      <p>
         For an internationalized application, follow the steps described in
         the Internationalization document in the JDK documentation bundle for your
         platform to create a properties file containing the messages for each
@@ -107,7 +117,7 @@
       </ul>
         
       <p>
-        When you configue the controller servlet in the web application
+        When you configure the controller servlet in the web application
         deployment descriptor, one of the things you will need to define in
         an initialization parameter is the base name of the resource bundle
         for the application.  In the case described above, it would be
@@ -129,13 +139,24 @@
         The important thing is for the resource bundle to be found on the 
         class path for your application. Another approach is to store 
         the <code>MyResources.properties</code> file in your application's 
-        class folder. You can then simply specify "myResources" as the 
-        application value.
+        <code>classes</code> folder. You can then simply specify "myResources" as the 
+        application value. Just be careful it is not deleted if your 
+        build script deletes classes as part of a "clean" target.
       </p>
+      <p>
+        If it does, here is an Ant task to run when compiling your application 
+        that copies the contents of a <code>src/conf</code>
+        directory to the <code>classes</code> directory:
+      </p>
+       <pre>
+        &lt;!-- Copy any configuration files -->
+        &lt;copy todir="classes">
+            &lt;fileset dir="src/conf"/>
+        &lt;/copy>
+       </pre>
     </section>
 
-    <section name="3.3 Forms and FormBean Interactions" href="form_beans">
-    
+    <section name="3.3 Forms and FormBean Interactions" href="form_beans">    
       <p>
         At one time or another, most web developers have built forms using
         the standard capabilities of HTML, such as the <code>&lt;input&gt;</code>
@@ -180,8 +201,9 @@
         files. Struts handles these "multipart" forms in a way identical to 
         building normal forms. In the next section, we will cover using Struts to 
         create a simple login form, and also a simple mulitpart form. 
-      </p>
-    
+      </p>   
+      </section>
+
       <section name="3.3.1 Building Forms With Struts" href="forms">
         
         <p>
@@ -204,8 +226,7 @@
 &lt;/title&gt;
 &lt;body bgcolor="white"&gt;
 &lt;html:errors/&gt;
-&lt;html:form name="logonForm" action="logon.do"
-  type="org.apache.struts.example.LogonForm"&gt;
+&lt;html:form action="/logon" focus="username"&gt;
 &lt;table border="0" width="100%"&gt;
   &lt;tr&gt;
     &lt;th align="right"&gt;
@@ -227,9 +248,9 @@
   &lt;/tr&gt;
   &lt;tr&gt;
     &lt;td align="right"&gt;
-      &lt;struts:submit&gt;
+      &lt;html:submit&gt;
         &lt;bean:message key="button.submit"/&gt;
-      &lt;/struts:submit&gt;
+      &lt;/html:submit&gt;
     &lt;/td&gt;
     &lt;td align="right"&gt;
       &lt;html:reset&gt;
@@ -280,6 +301,8 @@
               <code>&lt;form&gt;</code> element, based on the specified attributes.
               It also associates all of the fields within this form with a session
               scoped FormBean that is stored under the key <code>logonForm</code>.
+              The Struts developer provides the Java implementation of this form
+              bean, subclassing the Struts class <code>ActionForm</code>.
               This bean is used to provide initial values for all of the input
               fields that have names matching the property names of the bean.
               If an appropriate bean is not found, a new one will be created
@@ -356,9 +379,9 @@
 </pre>
 <hr/>        
         <p>
-          Look at the <a href="../api/index.html">javadocs</a> for FormFile to see the
+          Look at the <a href="../api/index.html">Javadocs</a> for FormFile to see the
           methods it exposes to manipulate files in file uploading.  Also look at the
-          javadocs for ActionServlet and ActionMapping for the various parameters
+          Javadocs for ActionServlet and ActionMapping for the various parameters
           you can specify to change how files are uploaded.  Basically in your
           peform() method in your action class you would call <code>((UploadForm) form).getMyFile()</code>
           to retrieve the FormFile and do what you want with it.
@@ -379,8 +402,9 @@
             <li><a href="../struts-html.html#password">password</a> input fields</li>
             <li><a href="../struts-html.html#radio">radio</a> buttons</li>
             <li><a href="../struts-html.html#reset">reset</a> buttons</li>
-            <li><a href="../struts-html.html#select">select</a> lists with embedded</li>
-            <li><a href="../struts-html.html#option">options</a></li>
+            <li><a href="../struts-html.html#select">select</a> lists with embedded option or options items</li>
+            <li><a href="../struts-html.html#option">option</a></li>
+            <li><a href="../struts-html.html#options">options</a></li>
             <li><a href="../struts-html.html#submit">submit</a> buttons</li>
             <li><a href="../struts-html.html#text">text</a> input fields</li>
             <li><a href="../struts-html.html#textarea">textareas</a></li>
@@ -429,7 +453,6 @@
               specified request parameter, and defines the result as a page scope attribute of
               type String or String[].</li>
         </ul>
-        
       </section>
       
       <section name="3.3.4 Automatic Form Validation" href="form_validation">    
@@ -474,12 +497,16 @@
           will assume that any required validation is done by the action class.
         </p>
         <p>
-          One common approach is to perform simple validations using the validate() method, and 
-          also provide further "business logic" validation as part of your Action object. 
+          One common approach is to perform simple, prima facia validations using the 
+          ActionForm validate() method, and then handle the "business logic" validation 
+          from the Action. 
         </p>
-
+        <p>
+          An optional package for performing ActionForm validations is available in the 
+          Nightly Build and from <a href="http://home.earthlink.net/~dwinterfeldt/">
+          David Winterfeldt's Web site</a>.
+        </p>
       </section>
-    </section>
     
     <section name="3.4 Other Presentation Techniques" href="other_presentations">
     
@@ -490,6 +517,7 @@
         reuse, reduce maintenance efforts, and/or reduce errors.  Several options
         are discussed in the following sections.
       </p>
+    </section>
       
       <section name="3.4.1 Application-Specific Custom Tags" href="custom_tags">
       
@@ -558,9 +586,9 @@
           
         <ul>
           <li>An <code>&lt;%@ include file="xxxxx" %&gt;</code> directive can include a file that contains
-          java code or jsp tags. The code in the included file can even reference
+          Java code or JSP tags. The code in the included file can even reference
           variables declared earlier in the outer jsp page. The code is inlined into
-          the other jsp before it is compiled so it can definately contain more than
+          the other JavaServer Page before it is compiled so it can definately contain more than
           just HTML.</li>
           <li>The include <i>action</i> (<code>&lt;jsp:include page="xxxxx"
               flush="true" /&gt;</code>) is processed at request time, and is handled
@@ -577,6 +605,12 @@
           Another approach to this would be to use the Struts Template Tag library. See the         
           Developer's Guide for details.
         </p>  
+        <p>
+          Tiles is an alternative to the original Template Tag library, offering several 
+          enhancements and new capabilities. Tiles is available in the 
+          Nightly Build, and from <a href="http://www.lifl.fr/~dumoulin/tiles/">
+          Cedric Dumoulin's Web site</a>.
+        </p>
       </section>
 
       <section name="3.4.3 Image Rendering Components" href="image_rendering">
@@ -599,16 +633,27 @@
               can have the applet make its own connection to the server to receive
               these parameters.</li>
         </ul>
-      
+      </section>
+
+      <section name="3.4.4 Rendering Text" href="text_rendering">
+
+         <p>
+           Some applications require dynamically generated text or markup, 
+           such as XML. If a complete page is being rendered, and can be output 
+           using a PrintWriter, this is very easy to do from an Action:
+         </p>
+         <pre>
+           response.setContentType("text/plain"); // or text/xml
+           PrintWriter writer = response.getWriter();
+           // use writer to render text
+           return(null);
+         </pre>
+
         <p align="center">
           Next: <a href="building_controller.html">Building Controller Components</a>
         </p>
       </section>
-    </section>
+
   </chapter>
   </body>
-</document> 
-  
-
-
-
+</document> 
\ No newline at end of file
diff --git a/doc/userGuide/index.xml b/doc/userGuide/index.xml
index 41ad0dc..43290e5 100644
--- a/doc/userGuide/index.xml
+++ b/doc/userGuide/index.xml
@@ -18,6 +18,7 @@
         <ul>
             <li><a href="introduction.html">1. Introduction</a>
                 <ul>
+                <li><a href="introduction.html#prereqs">1.0 Prerequisites</a></li>
                 <li><a href="introduction.html#preface">1.1 Preface: Forward into the Past!</a></li>
                 <li><a href="introduction.html#mvc">1.2 The Model-View-Controller ('MVC') Design Pattern</a></li>
                 <li><a href="introduction.html#overview">1.3 Struts Framework Overview</a></li>
@@ -67,6 +68,7 @@
                     </ul></li>
                 </ul></li>
             <li><a href="resources.html">5. Resources</a></li>
+            <li><a href="volunteers.html">6. Who We Are</a></li>
         </ul>
 
       </section>
diff --git a/doc/userGuide/introduction.xml b/doc/userGuide/introduction.xml
index 448ccaf..d50388c 100644
--- a/doc/userGuide/introduction.xml
+++ b/doc/userGuide/introduction.xml
@@ -1,311 +1,369 @@
-<?xml version="1.0"?>

-<document url="./introduction.xml">

-

-  <properties>

-    <author>Craig R. McClanahan</author>

-    <author>Mike Schachter</author>

-    <author>Larry McCay</author>

-    <author>Ted Husted</author>

-    <title>The Struts User's Guide - Introduction</title>

-  </properties>

-

-  <body>

-

-  <chapter name="1. Introduction" href="introduction">

-

-      <section name="1.1 Preface: Forward into the Past! (or a brief history of Struts)" href="preface">

-

-        <p>

-          When Java servlets were first invented, many programmers quickly realized that they were a

-          Good Thing. They were faster and more powerful that standard CGI, portable, and infinitely

-          extensible.

-        </p>

-

-        <p>

-          But writing HTML to send to the browser in endless println() statements was tiresome and

-          problematic. The answer to that was JavaServer Pages, which turned servlet writing inside-out.

-          Now developers could easily mix HTML with Java code, and have all the advantages of servlets.

-          The sky was the limit!

-        </p>

-

-        <p>

-          Java web applications quickly became "JSP-centric". This in-and-of itself was not a Bad

-          Thing, but it did little to resolve flow control issues and other problems endemic to web

-          applications.

-        </p>

-

-        <p>Another model was clearly needed ...</p>

-

-        <p>

-          Many clever developers realized that JavaServer Pages AND servlets could be used <b>

-          together</b> to deploy web applications. The servlets could help with the control-flow, and the

-          JSPs could focus on the nasty business of writing HTML. In due course, using JSPs and servlets

-          together became known as Model 2 (where using JSPs alone was Model 1).

-        </p>

-

-        <p>

-          Of course, there is nothing new under the Sun ... and many have been quick to point out that

-          JSP's Model 2 follows SmallTalk's classic Model-View-Controller design pattern. It is now

-          commonplace to use the terms Model 2 and MVC interchangeably.

-        </p>

-

-        <p>

-          The Struts project was launched in May 2000 by Craig R. McClanahan to provide a standard MVC

-          framework to the Java community. In January 2001, Struts 1.0 was released, and IOHO, Java 

-          Model 2 development will never be quite the same.

-        </p>

-      

-      </section>

-      

-      <section name="1.2 The Model-View-Controller ('MVC') Design Pattern" href="mvc">

-      

-        <p>

-          In the MVC design pattern, application flow is mediated by a central Controller. The           

-          Controller delegates requests to an appropriate handler. The handlers are tied to a Model,           

-          which act as an adapter between the request and the Model. The Model represents, or           

-          encapsulates, an application's business logic or state. Control is usually then forwarded           

-          back through the Controller to the appropriate View. The forwarding can be determined by           

-          consulting a set of mappings, usually loaded from a database or configuration file. This           

-          provides a loose coupling between the View and Model, which can make an application           

-          significantly easier to create and maintain.

-        </p>        

-        

-      </section>

-      

-

-      <section name="1.3 Struts Framework Overview" href="overview">

-      

-         <p>

-           True to the Model-View-Controller design pattern, Struts applications have three 

-          major components: a servlet controller, JavaServer pages (the "view"), and the 

-          application's business logic (or the "model"). Let's step through how this all 

-          fits together.</p>

-         <p>

-           The controller bundles and routes HTTP requests to other objects in the framework,

-          including JavaServer Pages. When initialized, the controller parses a configuration 

-          resource file. The configuration resource defines (among other things) the action

-          mappings for the application. The controller uses these mappings to turn HTTP

-          requests into application actions.

-        </p>

-        

-        <p>

-          At a minimum, a mapping must specify (1) a request path and (2) the object

-          type to act upon the request. The action object can handle the request and respond 

-          to the client (usually a Web browser), or indicate that control should be forwarded 

-          to another action. For example, if a login succeeds, a loginAction object may wish 

-          to forward control to a mainMenu action.

-        </p>

-      

-        <p>

-          Action objects are linked to the application's controller, and so have access

-          to that servlet's methods. When forwarding control, an object can indirectly

-          forward one or more shared objects, including JavaBeans, by placing them in one

-          of the standard collections shared by Java servlets.

-        </p>

-        

-        <p>

-          An action object can create a shopping cart bean, add an item to the

-          cart, place the bean in the session collection, and then forward control to

-          another action -- that may use a JSP to display the contents of the user's cart.

-          Since each client has their own session, they will each also have their own

-          shopping cart. In a Struts application, most of the business logic can be

-          represented using JavaBeans.

-        </p>

-        

-        <p>

-          JavaBeans can also be used to manage input forms. A key problem in designing

-          Web applications is retaining and validating what a user has entered between

-          requests. With Struts, you can easily store the data for a input form in a form

-          bean. The bean is saved in one of the standard, shared context collections, 

-          so that it can be used by other objects, especially the action object.

-        </p>

-        

-        <p>

-          The form bean can be used by a JSP to collect data from the user ... by an

-          action object to validate the user entered ... and then by the JSP again to

-          re-populate the form fields. In the case of validation errors, Struts has a

-          shared mechanism for raising and displaying error messages.

-        </p>

-        

-        <p>

-          A Struts form bean is defined in the configuration resource and linked to an action

-          mapping using a common property name. When a request calls for an action that uses

-          a form bean, the controller servlet either retrieves or creates the form bean, and

-          passes it to the action object. The action object can then check the contents of

-          the form bean before its input form is displayed, and also queue messages to be

-          handled by the form. When ready, the action object can return control with a

-          forwarding to its input form, usually a JSP. The controller can then respond to

-          the HTTP request and direct the client to the Java Server Page.

-        </p>

-        

-        <p>

-          The Struts framework includes custom tags that can automatically populate

-          fields from a form bean. The only thing most JavaServer Pages need to know

-          about the rest of the framework is the proper field names and where to submit

-          the form. Components like the messages set by the action object can be output

-          using a single custom tag. Other application-specific tags can also be defined

-          to hide implementation details from the JSPs.

-        </p>

-        

-        <p>

-          The custom tags in the Struts framework are designed to use the

-          internationalization features built into the Java platform. All the field labels

-          and messages can be retrieved from a message resource, and Java can

-          automatically provide the correct resource for a client's country and language.

-          To provide messages for another language, simply add another resource file.

-        </p>

-        

-        <p>

-          Internationalism aside, other benefits to this approach are consistent labeling 

-          between forms, and the ability to review all labels and messages from a central 

-          location.

-        </p>

-        

-        <p>

-          For the simplest applications, an action object can handle the business logic

-          associated with a request. However, in most cases, an action object should pass

-          the request to another object, usually a JavaBean. To allow resuse on other

-          platforms, business-logic JavaBeans should not refer to any Web application

-          objects. The action object should translate needed details from the HTTP request

-          and pass those along to the business-logic beans as regular Java variables.

-        </p>

-          

-        <p>

-          In a database application, the business-logic beans might connect to and

-          query the database and return the result set back to the action's servlet ... to

-          be stored in a form bean ... and then displayed by the JSP. Neither the action's

-          servlet nor the JSP need to know (or care) where the result set comes from.

-        </p>

-        

-        <p>

-          The rest of this Users Guide explains the various Struts components in greater 

-          detail. The Struts release also includes several Developer Guides covering 

-          various aspects of the frameworks, along with sample applications, 

-          the standard JavaDoc API, and,  of course, the complete source code!

-         </p>

-         

-         <p>

-          Struts is distributed under the Apache Software Foundation license. The code 

-          is copyrighted, but is free to use in any application. See the 

-          <a href="http://www.apache.org/LICENSE-1.1">ASF license</a> for specifics. 

-         </p>

-          

-    </section>

-

-    <section name="1.4 The Model: System State and Business Logic JavaBeans" href="modelConcepts">

-      

-      <p>

-        The <i>Model</i> portion of an MVC-based system can be subdivided into

-        concepts -- the internal state of the system, and the actions that can be

-        taken to change that state.  In grammatical terms, we might think about

-        state information as <i>nouns</i> (things) and actions as <i>verbs</i>

-        (changes to the state of those things).

-      </p>

-        

-      <p>

-        Generally, your application will represent the internal state of the

-        system as a set of one or more JavaBeans, with properties that represent

-        the details of the state.  Depending on your application's complexity,

-        these beans may be self contained (and know how to save their state

-        information persistently somehow), or they may be facades that know

-        how to retrieve information from external sources (such as a database)

-        when it is requested.  Entity Enterprise JavaBeans (EJBs) are also commonly

-        used to represent internal state.

-      </p>

-        

-      <p>

-        Large-scale applications will often represent the business logic actions

-        that are possible in a system as methods that can be called on the beans

-        maintaining the state information.  For example, you might have a shopping

-        cart bean, stored in session scope for each current user, with properties

-        that represent the current set of items that the user has decided to

-        purchase.  This bean might also have a <code>checkOut()</code> method

-        that authorizes the user's credit card, and sends the order to the

-        warehouse to be picked and shipped.  Other systems will represent the

-        available actions separately, perhaps as Session Enterprise JavaBeans

-        (EJBs).

-      </p>

-        

-      <p>

-        In some smaller scale applications, on the other hand, the available

-        actions might be embedded within the <code>Action</code> classes that are

-        part of the Controller role.  This is appropriate when the logic is very

-        simple, or where reuse of the business logic in other environments is not

-        contemplated.  The Struts framework supports any of these approaches, but

-        recommends separating the business logic ("what to do") from the role that

-        <code>Action</code> classes play ("deciding what to do").

-      </p>

-    </section>

-

-    <section name="1.5 The View: JSP Pages and Presentation Components" href="presentationConcepts">

-      

-      <p>

-        The <i>View</i> portion of a Struts-based application is generally

-        constructed using JavaServer Pages (JSP) technology.  JSP pages can

-        contain static HTML (or XML) text called "template text", plus the

-        ability to insert dynamic content based on the interpretation (at page

-        request time) of special action tags.  The JSP environment includes a

-        set of standard action tags, such as <code>&lt;jsp:useBean&gt;</code>

-        whose purpose is described in the JavaServer Pages Specification.  In

-        addition, there is a standard facility to define your own tags, which

-        are organized into "custom tag libraries."

-      </p>

-          

-      <p>

-        Struts includes an extensive custom tag library that facilitates

-        creating user interfaces that are fully internationalized, and that

-        interact gracefully with <code>ActionForm</code> beans that are part

-        of the <i>Model</i> portion of the system.  The use of these tags is

-        discussed in detail later.

-      </p>

-          

-      <p>

-        In addition to JSP pages and the action and custom tags they contain,

-        it is often necessary for business objects to be able to render

-        themselves in HTML (or XML), based on their current state at request time.

-        The rendered output from such objects can be easily included in a

-        resulting JSP page by using the <code>&lt;jsp:include&gt;</code>

-        standard action tag.

-      </p>

-    </section>

-    

-    <section name="1.6 The Controller: ActionServlet and ActionMapping" href="controllerConcepts">

-      

-      <p>

-        The <i>Controller</i> portion of the application is focused on receiving

-        requests from the client (typically a user running a web browser), deciding

-        what business logic function is to be performed, and then delegating

-        responsibility for producing the next phase of the user interface to

-        an appropriate View component.  In Struts, the primary component of the

-        Controller is a servlet of class <code>ActionServlet</code>.  This servlet

-        is configured by defining a set of mappings (described by a Java class

-        <code>ActionMapping</code>).  Each mapping defines a <code>path</code>

-        that is matched against the request URI of the incoming request, and the

-        fully qualified class name of an <code>Action</code> class (that is, a

-        Java class extending the <code>Action</code> class) which is

-        responsible for performing the desired business logic, and then dispatching

-        control to the appropriate View component to create the response.

-      </p>

-        

-      <p>

-        Struts also supports the ability to use <code>ActionMapping</code>

-        classes that have additional properties beyond the standard ones required

-        to operate the framework.  This allows you to store additional information

-        specific to your application, but still utilize the remaining features of

-        the framework.  In addition, Struts lets you define logical "names" to which

-        control should be forwarded so that an action method can ask for the

-        "Main Menu" page (for example), without knowing what the actual name of the

-        corresponding JSP page is.  These features greatly assist you in separating

-        the control logic (what do I do next) with the view logic (what is the name

-        of the corresponding page).

-      </p>

-      

-      <p align="center">

-        Next: <a href="building_model.html">Building Model Components</a>

-      </p>

-      </section>

-      

-      

-    </chapter>

-    </body>

-</document>

+<?xml version="1.0"?>
+<document url="./introduction.xml">
+
+  <properties>
+    <author>Craig R. McClanahan</author>
+    <author>Mike Schachter</author>
+    <author>Larry McCay</author>
+    <author>Ted Husted</author>
+    <author>Martin Cooper</author>
+    <author>Ed Burns</author>
+    <title>The Struts User's Guide - Introduction</title>
+  </properties>
+
+  <body>
+
+  <chapter name="1. Introduction" href="introduction">
+
+      <section name="1.0 Prerequisites" href="prereqs">
+        <p>
+          This User Guide is written for active Web developers, and assumes a working 
+          knowledge about how Java Web applications work. Before getting started, you should 
+          understand the basics of these core technologies:
+        </p>
+
+    <ul>
+      <li><b>The HTTP Request/Response sequence.</b><br/>The canonical source for this
+        is <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616">RFC 2616
+        - Hypertext Transfer Protocol (HTTP/1.1)</a>.</li>
+      <li><b>Java Servlets</b>.<br/> A good place to start is the
+        <a href="http://java.sun.com/products/jsp/product.html">Sun Servlet product page</a>
+        and the <a href="http://java.sun.com/docs/books/tutorial/">Sun Java Tutorials</a>.</li>
+      <li><b>JavaServer Pages (JSP)</b>.<br/> Likewise, a good place to start is the
+        <a href="http://java.sun.com/products/jsp/product.html">Sun JSP product page</a> 
+        and the <a href="http://java.sun.com/docs/books/tutorial/">Sun Java Tutorials</a>.</li>
+      <li><b>JavaBeans</b>.<br/>Many Struts classes are written as JavaBeans. 
+      If you haven't worked with JavaBeans before, see the 
+      <a href="http://java.sun.com/products/javabeans/">Sun JavaBean product page</a> 
+        and the <a href="http://java.sun.com/docs/books/tutorial/">Sun Java Tutorials</a></li>
+    </ul>
+
+       <p>If you've created Web applications on other platforms, you can probably follow along, 
+         and then visit the above references as needed. These are core technologies that 
+         will be used in nearly all Java Web development projects.
+       </p>
+
+     </section>
+
+      <section name="1.1 Preface: Forward into the Past! (or a brief history of Struts)" href="preface">
+
+        <p>
+          When Java servlets were first invented, many programmers quickly realized that they were a
+          Good Thing. They were faster and more powerful that standard CGI, portable, and infinitely
+          extensible.
+        </p>
+
+        <p>
+          But writing HTML to send to the browser in endless println() statements was tiresome and
+          problematic. The answer to that was JavaServer Pages, which turned servlet writing inside-out.
+          Now developers could easily mix HTML with Java code, and have all the advantages of servlets.
+          The sky was the limit!
+        </p>
+
+        <p>
+          Java web applications quickly became "JSP-centric". This in-and-of itself was not a Bad
+          Thing, but it did little to resolve flow control issues and other problems endemic to web
+          applications.
+        </p>
+
+        <p>Another model was clearly needed ...</p>
+
+        <p>
+          Many clever developers realized that JavaServer Pages AND servlets could be used <b>
+          together</b> to deploy web applications. The servlets could help with the control-flow, and the
+          JSPs could focus on the nasty business of writing HTML. In due course, using JSPs and servlets
+          together became known as Model 2 (where using JSPs alone was Model 1).
+        </p>
+
+        <p>
+          Of course, there is nothing new under the Sun ... and many have been quick to point out that
+          JSP's Model 2 follows SmallTalk's classic Model-View-Controller design pattern. It is now
+          commonplace to use the terms Model 2 and MVC interchangeably.
+        </p>
+
+        <p>
+          The Struts project was launched in May 2000 by Craig R. McClanahan to provide a standard MVC
+          framework to the Java community. In July 2001, Struts 1.0 was released, and IOHO, Java 
+          Model 2 development will never be quite the same.
+        </p>
+      
+      </section>
+      
+      <section name="1.2 The Model-View-Controller ('MVC') Design Pattern" href="mvc">
+      
+        <p>
+          In the MVC design pattern, application flow is mediated by a
+          central Controller. The Controller delegates requests - in our
+          case, HTTP requests - to an appropriate handler. The handlers
+          are tied to a Model, and each handler acts as an adapter
+          between the request and the Model. The Model represents, or
+          encapsulates, an application's business logic or
+          state. Control is usually then forwarded back through the
+          Controller to the appropriate View. The forwarding can be
+          determined by consulting a set of mappings, usually loaded
+          from a database or configuration file. This provides a loose
+          coupling between the View and Model, which can make an
+          application significantly easier to create and maintain.
+        </p>
+
+      </section>
+      
+
+      <section name="1.3 Struts Framework Overview" href="overview">
+      
+        <p>
+          True to the Model-View-Controller design pattern, Struts applications have three 
+          major components: a servlet controller, which is provided by Struts itself,
+          JSP pages (the "view"), and the application's business logic (or the
+          "model"). Let's step through how this all fits together.
+        </p>
+
+        <p>
+          The Struts controller servlet bundles and routes HTTP requests to other
+          objects in the framework, including JavaServer Pages and
+          <code>org.apache.struts.action.Action</code> subclasses provided by the
+          Struts developer. When initialized, the controller parses a configuration
+          resource file. The configuration resource defines (among other things)
+          the <code>org.apache.struts.action.ActionMapping</code>s for an application. 
+          The controller uses these mappings to turn HTTP requests into application actions.
+        </p>
+        
+        <p>
+          An ActionMapping will usually specify:</p>
+        <ul>
+          <li><b>a request path</b> (or "URI"),</li>
+          <li>the <b>object type</b> (Action subclass) to act upon the request, </li>
+          <li>and other properties as needed. </li>
+        </ul>
+        <p>The Action object can handle the request and respond 
+          to the client (usually a Web browser), or indicate that control should be forwarded 
+          elsewhere. For example, if a login succeeds, a login action may wish 
+          to forward the request onto the mainMenu.
+        </p>
+      
+        <p>
+          Action objects have access to the application's controller servlet, and so have access
+          to that servlet's methods. When forwarding control, an Action object can indirectly
+          forward one or more shared objects, including JavaBeans, by placing them in one
+          of the standard collections shared by Java servlets.
+        </p>
+        
+        <p>
+          An Action object can create a shopping cart bean, add an item to the
+          cart, place the bean in the session collection, and then forward control to
+          another mapping. That mapping may use a JavaServer Page to display the contents of the user's cart.
+          Since each client has their own session, they will each also have their own
+          shopping cart. In a Struts application, most of the business logic can be
+          represented using JavaBeans. An Action can call the properties of a JavaBean 
+          without knowing how it actually works. This encapsulates the business logic, 
+          so that the Action can focus on error handling and where to forward control.</p>
+        
+        <p>
+          JavaBeans can also be used to manage input forms. A key problem in designing
+          Web applications is retaining and validating what a user has entered between
+          requests. With Struts, you can define your own set of form bean classes, by
+          subclassing <code>org.apache.struts.action.ActionForm</code>, and easily store
+          the data for an input form in these form beans. The bean is saved in one of the
+          standard, shared context collections, so that it can be used by other objects,
+          especially an Action object.
+        </p>
+        
+        <p>
+          The form bean can be used by a JSP to collect data from the user ... by an
+          Action object to validate the user-entered data ... and then by the JSP again to
+          re-populate the form fields. In the case of validation errors, Struts has a
+          shared mechanism for raising and displaying error messages.
+        </p>
+        
+        <p>
+          A Struts form bean is declared in the configuration resource, defined in a Java
+          source file, and linked to an ActionMapping using a common property name. When
+          a request calls for an Action that uses a form bean, the controller servlet
+          either retrieves or creates the form bean, and passes it to the Action object.
+          The Action object can then check the contents of the form bean before its input
+          form is displayed, and also queue messages to be handled by the form. When
+          ready, the Action object can return control with a forwarding to its input
+          form, usually a JSP. The controller can then respond to the HTTP request and
+          direct the client to the JavaServer Page.
+        </p>
+        
+        <p>
+          The Struts framework includes custom tags that can automatically populate
+          fields from a form bean. The only thing most JavaServer Pages need to know
+          about the rest of the framework is the proper field names and where to submit
+          the form. Components like the messages queued by the Action can be output
+          using a single custom tag. Other application-specific tags can also be defined
+          to hide implementation details from the JSPs.
+        </p>
+        
+        <p>
+          The custom tags in the Struts framework are designed to use the
+          internationalization features built into the Java platform. All the field labels
+          and messages can be retrieved from a message resource, and Java can
+          automatically provide the correct resource for a client's country and language.
+          To provide messages for another language, simply add another resource file.
+        </p>
+        
+        <p>
+          Internationalism aside, other benefits to this approach are consistent labeling 
+          between forms, and the ability to review all labels and messages from a central 
+          location.
+        </p>
+        
+        <p>
+          For the simplest applications, an Action object may sometimes handle the business logic
+          associated with a request. <b>However, in most cases, an Action object should 
+          invoke another object, usually a JavaBean, to perform the actual business logic.</b> 
+          This lets the Action focus on error handling and control flow, rather than 
+          business logic. To allow  reuse on other platforms, business-logic JavaBeans should not refer to any Web 
+          application objects. The Action object should translate needed details from the 
+          HTTP request and pass those along to the business-logic beans as regular Java 
+          variables.
+        </p>
+          
+        <p>
+          In a database application, for example: 
+        </p>
+
+        <ul>
+         <li>A business-logic bean will connect to and query the database,</li>
+         <li>The business-logic bean returns the result to the Action,</li>
+         <li>The Action stores the result in a form bean in the request,</li>
+         <li>The JavaServer Page displays the result in a HTML form.</li>
+         </ul>
+
+         <p>Neither the Action nor the JSP need to know (or care) from where 
+         the result comes. They just need to know how to package and display it.
+         </p>
+        
+        <p>
+          The rest of this Users Guide explains the various Struts components in greater 
+          detail. The Struts release also includes several Developer Guides covering 
+          various aspects of the frameworks, along with sample applications, 
+          the standard Javadoc API, and,  of course, the complete source code!
+         </p>
+         
+         <p>
+          Struts is distributed under the Apache Software Foundation license. The code 
+          is copyrighted, but is free to use in any application. See the 
+          <a href="http://www.apache.org/LICENSE-1.1">ASF license</a> for specifics. 
+         </p>
+          
+    </section>
+
+    <section name="1.4 The Model: System State and Business Logic JavaBeans" href="modelConcepts">
+      
+      <p>
+        The <i>Model</i> portion of an MVC-based system can be subdivided into
+        concepts -- the internal state of the system, and the actions that can be
+        taken to change that state.  In grammatical terms, we might think about
+        state information as <i>nouns</i> (things) and actions as <i>verbs</i>
+        (changes to the state of those things).
+      </p>
+        
+      <p>
+        Generally, your application will represent the internal state of the
+        system as a set of one or more JavaBeans, with properties that represent
+        the details of the state.  Depending on your application's complexity,
+        these beans may be self contained (and know how to save their state
+        information persistently somehow), or they may be facades that know
+        how to retrieve information from external sources (such as a database)
+        when it is requested. Entity Enterprise JavaBeans (Entity EJBs) are also commonly
+        used to represent internal state.
+      </p>
+        
+      <p>
+        Large-scale applications will often represent the set of possible
+        business logic actions as methods that can be called on the beans
+        maintaining the state information.  For example, you might have a shopping
+        cart bean, stored in session scope for each current user, with properties
+        that represent the current set of items that the user has decided to
+        purchase.  This bean might also have a <code>checkOut()</code> method
+        that authorizes the user's credit card, and sends the order to the
+        warehouse to be picked and shipped.  Other systems will represent the
+        available actions separately, perhaps as Session Enterprise JavaBeans
+        (Session EJBs).
+      </p>
+        
+      <p>
+        In some smaller scale applications, on the other hand, the available
+        actions might be embedded within the <code>Action</code> classes that are
+        part of the Controller role.  This is appropriate when the logic is very
+        simple, or where reuse of the business logic in other environments is not
+        contemplated. The Struts framework supports any of these approaches, but
+        <b>strongly</b> recommends separating the business logic ("how it's done") 
+        from the role that <code>Action</code> classes play ("what to do").
+      </p>
+    </section>
+
+    <section name="1.5 The View: JSP Pages and Presentation Components" href="presentationConcepts">
+      
+      <p>
+        The <i>View</i> portion of a Struts-based application is generally
+        constructed using JavaServer Pages (JSP) technology.  JSP pages can
+        contain static HTML (or XML) text called "template text", plus the
+        ability to insert dynamic content based on the interpretation (at page
+        request time) of special action tags.  The JSP environment includes a
+        set of standard action tags, such as <code>&lt;jsp:useBean&gt;</code>
+        whose purpose is described in the <a href="http://java.sun.com/products/jsp/download.html">JavaServer Pages Specification</a>.  In
+        addition, there is a standard facility to define your own tags, which
+        are organized into "custom tag libraries."
+      </p>
+          
+      <p>
+        Struts includes an extensive custom tag library that facilitates
+        creating user interfaces that are fully internationalized, and that
+        interact gracefully with <code>ActionForm</code> beans that are part
+        of the <i>Model</i> portion of the system.  The use of these tags is
+        discussed in detail later.
+      </p>
+          
+      <p>
+        In addition to JSP pages and the action and custom tags they contain,
+        it is often necessary for business objects to be able to render
+        themselves in HTML (or XML), based on their current state at request time.
+        The rendered output from such objects can be easily included in a
+        resulting JSP page by using the <code>&lt;jsp:include&gt;</code>
+        standard action tag.
+      </p>
+    </section>
+    
+    <section name="1.6 The Controller: ActionServlet and ActionMapping" href="controllerConcepts">
+      
+      <p>
+        The <i>Controller</i> portion of the application is focused on receiving
+        requests from the client (typically a user running a web browser), deciding
+        what business logic function is to be performed, and then delegating
+        responsibility for producing the next phase of the user interface to
+        an appropriate View component.  In Struts, the primary component of the
+        Controller is a servlet of class <code>ActionServlet</code>. This servlet
+        is configured by defining a set of <code>ActionMappings</code>. 
+        An ActionMapping defines a <code>path</code> that is matched against the 
+        request URI of the incoming request, and usually specifies the
+        fully qualified class name of an Action class. All Actions
+        are subclassed from <code>org.apache.struts.action.Action</code>. Actions 
+        encapsulate the business logic, interpret the outcome, and ultimately dispatch
+        control to the appropriate View component to create the response.
+      </p>
+        
+      <p>
+        Struts also supports the ability to use <code>ActionMapping</code>
+        classes that have additional properties beyond the standard ones required
+        to operate the framework.  This allows you to store additional information
+        specific to your application, but still utilize the remaining features of
+        the framework.  In addition, Struts lets you define logical "names" to which
+        control should be forwarded so that an action method can ask for the
+        "Main Menu" page (for example), without knowing what the actual name of the
+        corresponding JSP page is.  These features greatly assist you in separating
+        the control logic (what to do) with the view logic (how it's rendered).
+      </p>
+      
+      <p align="center">
+        Next: <a href="building_model.html">Building Model Components</a>
+      </p>
+      </section>
+      
+     
+    </chapter>
+    </body>
+</document>
diff --git a/doc/userGuide/kickstart.xml b/doc/userGuide/kickstart.xml
new file mode 100644
index 0000000..8091a5e
--- /dev/null
+++ b/doc/userGuide/kickstart.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0"?>
+<document url="./kickstart.xml">
+<properties>
+<author>Ted Husted</author> 
+<title>The Struts User's Guide - Kickstart FAQ</title>
+</properties>
+<body> 
+<chapter href="faq" name="Kickstart FAQ"> 
+<section href="contents" name="Table of Contents">
+<p>Here are answers to the usual getting-started questions. <b>For an in-depth, searchable FAQ, visit our friends at <a href="http://www.jguru.com/faq/home.jsp?topic=Struts">JGuru</a>.</b></p>
+  <ul>
+    <li><a href="#why">Why do we need Struts?</a></li>
+    <li><a href="#how">How does Struts work?</a></li>
+    <li><a href="#compat">Is Struts compatible with other Java technologies?</a></li>
+    <li><a href="#who">Who wrote Struts?</a></li>
+    <li><a href="#struts">Why is it called Struts?</a></li>
+    <li><a href="#license">How is Struts licensed?</a></li>
+    <li><a href="#usage">Can Struts be used in a commercial application?</a></li>
+
+    <li><a href="#where">Where can I get a copy of Struts?</a></li>
+    <li><a href="#install">How do I install Struts?</a></li>
+    <li><a href="#jar">When do I need the struts.jar on my classpath?</a></li>
+
+    <li><a href="#help">Where can I get help with Struts?</a></li>
+    <li><a href="#consultants">Is commercial support available for Struts?</a></li>
+    <li><a href="#hosts">Are there ISPs that will host my Struts application?</a></li>
+    <li><a href="#powered">What Web sites are already Powered by Struts?</a></li>
+
+    <li><a href="#turbine">Whats the difference between Struts and Turbine?</a></li>
+    <li><a href="#taglibs">Why aren't the Struts tags maintained as part of the Jakarta Taglibs project?</a></li>
+  
+    <li><a href="#bugs">Where can I report bugs or make feature requests?</a></li>
+    <li><a href="#contribute">How can I contribute to the development of Struts?</a></li>
+    <li><a href="#release">When is the next release coming out?</a></li>
+    <li><a href="#unsubscribe">How do I unsubscribe from the mailing list?</a></li>
+  </ul>
+</section>
+
+<section href="why" name="Why do we need Struts?">
+<p>Java technologies give developers a serious boost when creating and maintaining applications to meet the demands of today's public Web sites and enterprise intranets. Struts combines Java Servlets, Java ServerPages, custom tags, and message resources into a unified framework. The end result is a cooperative, synergistic platform, suitable for development teams, independent developers, and everyone in between.</p>
+</section>
+
+<section href="how" name="How does Struts work?">
+<p>Java Servlets are designed to handle requests made by Web browsers. Java ServerPages are designed to create dynamic Web pages that can turn billboard sites into live applications. Struts uses a special Servlet as a switchboard to route requests from Web browsers to the appropriate ServerPage. This makes Web applications much easier to design, create, and maintain.</p>
+</section>
+
+<section href="javasoft" name="Is Struts compatible with other Java technologies?">
+<p>Yes. Struts is committed to supporting industry standards. Our lead developer is a member of <a href="http://java.sun.com/aboutJava/communityprocess/jsr/jsr_052_jsptaglib.html">JSR052</a>, Sun's Expert group for developing a standard library of custom JSP tags. A primary design criteria is that Struts must be compatible with Sun's J2EE platform for corporate enterprises. In fact, Struts really acts as an integrator of Java technologies, so that they can be used in the &quot;real world&quot;.</p>
+</section>
+
+<section href="who" name="Who wrote Struts?">
+<p>Struts was created by Craig R. McClanahan, and donated to the Apache Software Foundation in May 2000. Craig is the primary developer of both Struts and <a href="http://jakarta.apache.org/tomcat/index.html">Tomcat 4</a>, the official reference implementation for a Java servlet container. With stable releases of Struts and Tomcat 4 in circulation, Craig is now working as the Implementation Engineer for Sun's new <a href="http://java.sun.com/pr/2001/06/pr010604-03.html">Web Services Pack</a>. </p>
+
+<p>There are now many active committers to the Struts project, working cooperatively from around the globe. Other Java developers are invited to <a href="#contribute">contribute to the project</a>. Struts is an <a href="http://jakarta.apache.org/">Apache Jakarta</a>  project, with the common mission to &quot;provide commercial-quality server solutions based on the Java Platform that are developed in an open and cooperative fashion&quot;. All told, 17 individual developers and committers contributed to the Struts 1.0 codebase.</p>
+</section>
+
+<section href="struts" name="Why is it called Struts?">
+<p>It's a reference to struts in the architectural sense, a reminder of the nearly invisible pieces that hold up buildings, houses, and bridges.</p>
+</section>
+
+<section href="license" name="How is Struts licensed?">
+<p>Struts is copyrighted software available under a &quot;free-to-use-license&quot; by the Apache Software Foundation. The license appears at the head of every source code file. A reference copy of the license is available <a href="http://www.apache.org/LICENSE-1.1">here</a>.</p>
+</section>
+
+<section href="usage" name="Can Struts be used in a commercial product?">
+<p>Yes. The only requirements you must meet are those listed in the Apache Software Foundation license, which is included at the top of each source file and in the file LICENSE in the top-level directory of the distribution.</p>
+<p>In addition, contributions of patches, improved code, new features, or even just requests for features are also welcome.</p>
+</section>
+
+<section href="where" name="Where can I get a copy of Struts?">
+<p>The best place to download Struts is at <a href="http://jakarta.apache.org/struts/">jakarta.apache.org/struts</a>. The nightly builds are very stable, and recommended as the best place to start today.</p>
+</section>
+
+<section href="install" name="How do I install Struts?">
+<p>To develop applications with Struts, you can usually just add the Struts JAR file to your Java development environment. You can then start using the Struts classes as part of your own application. A <a href="struts-blank.war">blank Struts application</a> is provided, which you can just copy to get a quick-start on your own brainchild.</p>
+<p>Since the full source code for Struts is available, we also provide <a href="http://jakarta.apache.org/struts/installation.html">complete instructions</a> for compiling your own Struts JAR from scratch. (This is actually easier that it looks!)</p>
+<p>Your Struts application can be usually be deployed using a standard WAR file. In most cases, you simply deposit the WAR file on your application server, and it is installed automatically. If not, step-by-step installation instructions for <a href="http://jakarta.apache.org/struts/installation.html#Containers">various servlet containers</a> are available.</p>
+</section>
+
+<section href="jar" name="When do I need &quot;struts.jar&quot; on my classpath?">
+<p>When you are compiling an application that uses the Struts classes, you must have the &quot;struts.jar&quot; on the classpath your <b>compiler</b> sees -- it does not <i> have</i> to be on your CLASSPATH environment variable.</p>
+<p>Why is that an important distinction? Because if you are using a servlet container on your development machine to test your application, the &quot;struts.jar&quot; <b>must not</b> be on your CLASSPATH environment variable when running the container. (This is because each Web application must also have their own copy of the Struts classes, and the container will become confused if it is on the environment path as well.)</p>
+<p>There are several general approaches to this issue:</p>
+<ul>
+<li><b>Use ANT</b> for building your projects -- it can easily assemble  classpaths for the compiler.  (This is how Struts itself is  built, along with Tomcat and most other Java-based projects).</li>
+<li><b>Use an IDE</b> where you can configure the "class path" used  for compilation independent of the CLASSPATH environment  variable.</li>
+<li><b>Use a shell script</b> that temporarily adds struts.jar  to the classpath just for compilation, for example<br/> 
+<i>javac -classpath /path/to/struts.jar:$CLASSPATH $@</i></li>
+</ul>
+</section>
+
+<section href="help" name="Where can I get help with Struts?">
+<p>The Struts package comes complete with a <a href="http://jakarta.apache.org/struts/userGuide/index.html">users guide</a> to introduce people to the framework and its underlying technologies. Various components also have their own in-depth developers guide, to cover more advanced topics. Comprehesive <a href="http://jakarta.apache.org/struts/api-1.0/index.html">Javadocs</a> are included along with the <b>full source code</b>. The <a href="http://jakarta.apache.org/site/mail.html">Strut's mailing list</a> is also very active, and welcomes posts from new users.</p>
+<p>There are also many third-party tutorials, articles, and books that cover Struts. See our <a href="resources.html#tutorials">Resources page</a> for current listings and links. Two very useful resources are the <a href="http://www.mail-archive.com/index.php3?hunt=struts">mailing list archives</a> and the <a href="http://www.jguru.com/forums/Struts">Struts Forum at JGuru</a>.</p>
+</section>
+
+<section href="support" name="Is commercial support available?">
+<p>There is no official, commercial support for Struts, though third parties may offer different degrees of support. A list of Struts consultants is available on our <a href="resources.html#consultants">Resources page</a></p>
+</section>
+
+<section href="providers" name="Are there ISPs that will host my Struts application?">
+<p>For a listing of some Java and Struts ISPs, visit our <a href="resources.html#hosts">Resources page</a>.</p>
+</section>
+
+<section href="powered" name="What Web sites are already Powered by Struts?">
+<p>For a listing of some Struts-powered Web sites available to the public, visit our <a href="resources.html#powered">Resources page</a>.</p>
+</section>
+
+<section href="turbine" name="What's the difference between Jakarta Struts and Jakarta Turbine?">
+<p>See</p>
+<ul><li>&lt; <a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg03206.html">http://www.mail-archive.com/struts-user@jakarta.apache.org/msg03206.html</a> ></li>
+<li>&lt; <a href="http://www.mail-archive.com/general@jakarta.apache.org/msg00495.html">http://www.mail-archive.com/general@jakarta.apache.org/msg00495.html</a> ></li>
+<li>&lt; <a href="http://jakarta.apache.org/velocity/ymtd/ymtd.html">http://jakarta.apache.org/velocity/ymtd/ymtd.html</a> &gt;</li>
+</ul>
+</section>
+
+<section href="taglibs" name="Why aren't the Struts tags maintained as part of the Jakarta Taglibs project?">
+<p>Development of both products began about the same time. Leading up to the release of 1.0, it was thought better to continue to develop the taglibs alongside the controller. Now that 1.0 is out, the Java ServerPages Standard Taglib is in active development. Once work on the JSPTL stabilizes, the Struts taglibs will be revisited. Tags which are are not linked directly to the framework may be hosted at Jakarta Taglibs instead.</p>
+</section>
+
+<section href="bugs" name="Where can I report bugs or make feature requests?">
+<p>You can research and report outstanding fixes and feature requests using <a href="http://jakarta.apache.org/site/bugs.html">Jakarta Bugzilla</a>.</p>
+<p>If you are unsure if this is in actual problem, feel free to bring it up on the list first. But to be sure an issue is resolved, always report it to <a href="http://jakarta.apache.org/site/bugs.html">Bugzilla</a>.</p>
+<p>Struts also maintains a <a href="../todo-1.1.html">TODO list</a> outlining features being planned or developed.</p>
+</section>
+
+<section href="contribute" name="How can I contribute to the development of Struts?">
+<p>Struts is distributed by the <a href="http://apache.org/">Apache Software Foundation</a>. These are the same people who distribute the Apache Web server. Like all ASF projects, Struts is managed as a &quot;meritocracy&quot;, where everyone's contribution is welcome. Users can help other users on the <a href="http://jakarta.apache.org/site/mail.html">mailing lists</a>, <a href="http://jakarta.apache.org/site/bugs.html">report bugs</a>, and <a href="http://jakarta.apache.org/site/bugs.html">request new features</a>. Developers can contribute patches, new code, and documentation. The most active Developers may become <a href="http://jakarta.apache.org/site/roles.html">Committers</a>, who make the actual decisions about the Strut's codebase.</p>
+<p>You can start by joining the Struts User list. If you enjoy participating there, then sign up for the Struts Developer list too. If you find any problems with Struts, or find a missing feature, you can enter a record to our <a href="http://jakarta.apache.org/site/bugs.html">Bugzilla</a> database.</p>
+</section>
+
+<section href="release" name="When is the next release coming out?">
+<p>Here is the truth regarding releases:</p>
+<p>Jakarta products are released on the basis of merit, and ~not~ according
+to a strict timetable. The volunteers devote whatever time they can to working
+on the product. But all volunteers have real jobs and real lives, that 
+do take precedence. Since Struts does have have paid personnel working 
+on the project, we simply cannot make date-orientated commitments.</p>
+<p>All Jakarta products must circulate a public beta before release. If a
+beta is not in circulation, then it's a good bet that a release is not
+forthcoming any time soon. Products sometimes go through several betas
+before final release. So if this is beta 1, then it still may not be
+released any time soon.</p>
+<p>The bottom line is that Jakarta takes releases very seriously. We do not
+compromise the quality of our software by watching the calendar (and
+then ship something ready or not). A release is ready when it is ready.</p>
+<p>That may sound flip, but it ~is~ the truth. The delivery of
+production-quality, leading-edge software is not something anyone can 
+prognasticate. If anyone tries, they are lying to you. That, we won't 
+do ;-)</p>
+<p>What we ~will~ do is release all of our development software as soon as it
+is developed. This way you can judge for yourself how quickly the
+development is proceeding, and whether what is being developed will meet
+your needs. If you need a feature right now, you can use the nightly
+build, or roll your own patch. There are no private CVS's or a private
+development lists. What you see is what we got. If you are following the
+DEV list, then you know everything the developers know. Really, you do.</p>
+
+</section>
+
+<section href="unsubscribe" name="How do I unsubscribe from the mailing list?">
+<p><b>From the email account used to subscribe to the list,</b> <a href="mailto:struts-user-unsubscribe@jakarta.apache.org">send a blank message</a> to &lt; <a href="mailto:struts-user-unsubscribe@jakarta.apache.org">struts-user-unsubscribe@jakarta.apache.org</a>&gt;.</p>
+
+  <p>Next: <a href="introduction.html">Introduction to the Users Guide</a></p>
+
+</section>
+
+</chapter></body></document>
diff --git a/doc/userGuide/project.xml b/doc/userGuide/project.xml
index 7166521..9617212 100644
--- a/doc/userGuide/project.xml
+++ b/doc/userGuide/project.xml
@@ -13,6 +13,7 @@
       <item name="View Components"       href="building_view.html"/>
       <item name="Controller Components" href="building_controller.html"/>
       <item name="Resources"             href="resources.html"/>
+      <item name="Who We Are"            href="volunteers.html"/>
     </menu>
 
 </project>
diff --git a/doc/userGuide/resources.xml b/doc/userGuide/resources.xml
index 1ed4201..28a084c 100644
--- a/doc/userGuide/resources.xml
+++ b/doc/userGuide/resources.xml
@@ -7,33 +7,242 @@
 </properties>
 <body> 
 <chapter name="Struts Resources" href="resources"> 
-<section name="Struts Tutorials" href="tutorials"> 
-<h3>Articles</h3>
-<p><b>Introduction to MVC and the Jakarta Struts Framework</b> (online presentation), 
-  <a href="mailto:craiger@tataryn.net">Craig Tataryn</a> -- <a href="http://www.us-eh.com/craiger/articles/struts/">http://www.us-eh.com/craiger/articles/struts/</a> 
-</p>
-<p><b>Struts, an open-source MVC implementation</b>, <a href="mailto:malcolm@nuearth.com">Malcom 
-  Davis</a> -- <a href="http://www-106.ibm.com/developerworks/library/j-struts/?n-j-2151">http://www-106.ibm.com/developerworks/library/j-struts/?n-j-2151</a> 
-</p>
-<p><b>Strut Your Stuff With JSP Tags</b>, <a href="mailto:Thor.Kristmundsson@javaworld.com">Thor 
-  Kristmundsson</a> -- <a href="http://www.javaworld.com/javaworld/jw-12-2000/jw-1201-struts.html">http://www.javaworld.com/javaworld/jw-12-2000/jw-1201-struts.html</a> 
-</p>
-<p><b>Using the Struts Framework to Develop a Message Board</b>, Maneesh Sahu 
-  -- <a href="http://informit.com/books/authors/author_template/index.asp?authorid={A08A00B0-71BB-42DB-9B29-08879A9A7ABE}&amp;t={94AE5B48-1D7D-462A-A4A6-83CE19EC0705}&amp;n={4641FAF9-E21F-4902-8F6E-0C8FAF114C62}">Author's 
-  Page</a> (article requires registration with informit.com) </p>
-<p><b>JSP templates</b>, <a href="mailto:david.geary@javaworld.com">David Geary</a> 
-  -- <a href="http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-jspweb_p.html">http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-jspweb_p.html</a></p>
-<h3>Tutorials</h3>
-<p><b>Welcome to the Struts Framework</b>, <a href="http://www.bluestone.com">Bluestone 
-  Software</a> -- <a href="http://developer.bluestone.com/scripts/SaISAPI.dll/Gallery.class/demos/trailMaps/index.jsp">http://developer.bluestone.com/scripts/SaISAPI.dll/Gallery.class/demos/trailMaps/index.jsp</a> 
-</p>
-<h3>Mailing List Archives</h3>
-<p><a href="http://archive.covalent.net/"><b>covalent.net</b></a><br />
-  <a href="http://mail-archive.com/"><b>mail-archive.com</b></a> </p>
-<h3>Other Resource Pages</h3>
-<p><b>About Struts</b>, <a href="mailto:support@husted.com">Husted dot Com</a> 
-  -- <a href="http://www.husted.com/about/struts/">http://www.husted.com/about/struts/</a> 
-</p>
+
+<section name="Contributor Taglibs" href="taglibs"> 
+<p><a href="http://husted.com/struts/resources/MonkeyStruts.htm"><b>MonkeyStruts</b></a> by Arron Bates. An approach to nesting beans.</p>
+<p><a href="http://www.multimania.com/bist77/struts.php"><font size="2"><b>REGEXP.VALIDATOR.STRUTS</b></font></a> by Emmanuel Boudrant - A validation component that works with Struts 1.0, to manage form validation on server-side and client-side.</p>
+<p><a href="http://husted.com/struts/resources/struts-was.zip"><b>Struts-WAS.jar</b></a> by Christopher Assenza - Modified Struts 1.0 JAR for Websphere 3.5 or 4. Zipped for download. (For additional tips regarding Websphere 3.5 see <a href="http://jakarta.apache.org/struts/installation-was352-x.html">http://jakarta.apache.org/struts/installation-was352-x.html</a>.)</p>
+<p><a href="http://struts.application-servers.com/"><b>Struts Layout</b></a> by Improve - An extension library to      improve interfaces creation with Struts.</p>
+<p><a href="http://husted.com/struts/resources/indexed-tags.htm"><b>Indexed Tags</b></a> [Also available in the nightly build] by Dave Hays - Produce indexed names such as &lt;input type="text" name="parameter[0].value" value="Mac">. Link, Submit, and Select tags are included too.</p>
+<p><a href="http://husted.com/struts/resources/logic-niallp.htm"><b>Struts IF/THEN/ELSE and SWITCH tags</b></a> by Niall Pemberton.</p>
+<p><a href="http://www.mail-archive.com/struts-dev@jakarta.apache.org/msg01251.html"><b>TextArea Wrapping</b></a> by Matthias Bauer. Patch to HTML:TextArea tag to provide wrapping of long lines.</p>
+<p><a href="http://husted.com/struts/resources/rowtag.zip"><b>RowTag</b></a> (ZIP file for download) - Source for a Struts-compatible tag to generate alternating row colors in a table by Niall Pemberton. [<i>NOTE: Requires a Struts build dated after 2001-04-28</i>]</p>
 </section>
-</chapter> 
-</body></document>
+
+<section name="Contributor Extensions" href="extensions"> 
+<p><a href="resources/pow2acl.htm"><b> Pow2ACL</b></a> - Access Control List library. Track of application users roles and                          permissions. User can be authenticated: - directly using the                          package API; - using custom JSP tag
+libraries. </p>
+<p><a href="http://bist77.multimania.com/struts.php#rose"><b>Struts .. in Rose</b></a> by Emmanuel.Boudrant - Use Struts with the Rational Rose UML model. </p>
+<p><a href="http://husted.com/struts/resources/multi-struts.htm"><b>Multi-Controller</b></a> by Sukachevin, Stoehr - Use more than once ActionServlet in your Struts application </p>
+<p><a href="http://www.mail-archive.com/struts-user@jakarta.apache.org/msg16093.html"><b>JavaScript with html:errors - new Struts validation</b></a> by Adam Grohs.  </p>
+<p><a href="http://www.scioworks.com/scioworks_camino.html"><b>Scioworks Camino</b></a> by Scioworks Pte Ltd. A visual tool for Struts. </p>
+<p><a href="http://www.ejcenter.com/struts/"><b>Struts Console</b></a> by James Holmes. The Struts Console is a Java Swing application that provides an easy to use interface for editing Struts' &quot;struts-config.xml&quot; configuration file.</p>
+<p><a href="http://jcorporate.com/"><b>Expresso</b></a> by JCorporate. An open source application development (AD) framework integrated with Struts.</p>
+<p><a href="http://husted.com/struts/resources/DynamicProperties.htm"><b>Dynamic ActionForm Properties</b></a> by Jan Sorensen.</p>
+<p><a href="http://husted.com/struts/resources/bean-util.htm"><b>Bean Utils with Indexed Strings</b></a> by Gregor Rayman.</p>
+<p><a href="http://husted.com/struts/resources/struts-security.htm"><b>Role-Based Actions</b></a> by Nic Hobs. Set a security role for an Action from with struts-config.</p>
+<p><a href="http://husted.com/struts/resources/codemaker.htm"><b>Struts CodeMaker</b></a> by Ravindran Ramaiah - Generate Struts application by reading configuration file or JSP files. Updated 2001-08-21.</p>
+<p><a href="http://home.earthlink.net/~dwinterfeldt/generator/"><b>Struts Generator</b></a> by David Winterfeldt - Based on the generator.xml and a table/query an xml file is generated.  Based on the generated xml file a primary key class, data bean class, jdbc class, and an ActionForm (Struts) can be generated.</p>
+<p><a href="http://husted.com/struts/resources/ValueIterator.zip"><b>ValueIterator</b></a> by Ted Husted - Simple wrapper around a RowSet for use with Struts iterator tag. Also includes generic toMap(), set(map) methods for flexible data transfer.</p>
+<p><a href="http://www.rpsenterprises.com/struts/index.html"><b>Struts Transformer</b></a> by Ron Smith - Transformations are responsible for taking an object in one form and transforming it into another. A forward transformation takes an object from its primary form to a secondary form (e.g. Date object to String).  A reverse transformation takes an object from a secondary form to its primary form (e.g. String to Date).</p>
+<p><a href="http://www.rpsenterprises.com/struts/index.html"><b>Struts Extender</b></a> by Ron Smith - Add extensions to the struts framework via entries in the Struts configuration file.</p>
+<p><a href="http://husted.com/struts/resources/mapper.zip"><b>Mapper Framework</b></a> by Capco - The Mapper framework can be used for automating the process of validating/converting/transferring data fields. <font size="2">(See README to get started. Updated 18-JUL-2001.)</font></p>
+<p><a href="http://www.sura.ru/~gonza/bean-factory/"><b>Bean factory</b></a> by Oleg V Alexeev - Adds the ability to easily link data bean creation to any Struts Action. All information about databeans and actions mappings stored in the standard Struts configuraton file. </p>
+<p><a href="http://husted.com/struts/resources/workflow.htm"><b>Workflow Extension</b></a> by Matthias Bauer - An extension to the core Struts framework which provides control flow between actions.</p>
+<p><a href="http://husted.com/struts/resources/struts-menu.zip"><b>Struts Menu</b></a> by Scott Sayles (ZIP file for download) - A Struts-compatible web menuing component (early release - work in progress) - unzip to a &quot;struts-menu&quot; folder, and see the README.</p>
+<p><a href="http://home.earthlink.net/~dwinterfeldt/"><b>Struts Validator</b></a> [Also in the nightly build /contrib folder] by David Winterfeldt - Perform basic validations to check if a field is required, matches a regular expression, and some basic type checking. Different validation rules can be defined for different locales. The framework has basic support for user defined constants which can be used in some field attributes. The validation routines are modifiable in the validation.xml file so custom validation routines can be created and added to the framework.</p>
+<p><a href="http://husted.com/struts/resources/tldtovlm.zip"><b>TLD to VLM</b></a> by Mario Busche - Simple Java program to convert standard TLD's to the VLM format used by Homesite, CF Studio, and JRun Studio.</p>
+<p><a href="http://jakarta.apache.org/taglibs/doc/ultradev4-doc/intro.html"><b>UltraDev 4.0 Custom Tag Library Extension</b></a> - Hosted by Jakarta Taglibs.</p>
+<p><a href="http://www.lifl.fr/~dumoulin/tiles/"><b>Tiles Library for building JSP views</b></a> [Also in the nightly build /contrib folder] by Cedric Dumoulin - A component is a JSP page that can be inserted in another JSP page, like templates, but can take "parameters" (URLs or 'direct' string intemplates).</p>
+</section>
+
+<section name="Projects and Examples" href="examples">
+<p><a href="http://husted.com/struts/resources/artimus.zip"><b>Artimus</b></a> by Ted  Husted - Simple news poster application. Demonstrates using helper beans and a JDBC database with Struts. WAR zipped for download. Uses Scaffold package. See WEB-INF/README.txt for setup.</p>
+<p><a href="http://husted.com/struts/resources/scaffold.zip"><b>Scaffold</b></a> by Ted Husted - Utility package of classes that can be used with various Web applications.</p>
+<p><a href="http://husted.com/struts/resources/polls-20010812.zip"><b>Struts Polls</b></a> by Ted Husted - Simple poll application. Demonstrates using a database with Struts.</p>
+<p><a href="http://www.raibledesigns.com/struts/"><b>Struts-example modified for iPlanet Application Server SP2</b></a> by Matt Raible.</p>
+<p><a href="http://www.newparticles.com/struts/"><b>The Struts Framework</b></a> by Steve Wilkinson - Excerpt from latest Wrox Professional JSP book.</p>
+<p><a href="http://husted.com/struts/resources/struts-simple.zip"><b>Struts-Simple</b></a> by Ted Husted - (WAR file zipped for download) A simple skeleton application outlining the files needs to input and re-display data. Now also demonstrates using &quot;nested&quot; beans.</p>
+<p><a href="http://mycart.cjb.net/"><b>myCart</b></a> - Example Shopping Cart application using Struts - joint project with several contributors.</p>
+<p><a href="http://www.oakgrovesoftware.com/~rbackhouse"><b>Sample hdml/wireless based struts application</b></a> by Richard Backhouse.</p>
+<p><a href="http://husted.com/struts/resources/struts-logon.zip"><b>Struts Login</b></a> (WAR file zipped for download) by Ted Husted - A minimalist Struts application demonstrating form validation and tracking users with a session attribute (WAR file).</p>
+</section>
+
+<section name="Tutorials" href="tutorials"> 
+<p><a href="http://husted.com/struts/resources/fb-auth.htm"><b>How To: (Form-Based Authentication) use the form-error page to login</b></a> by Matt Raible.</p>
+<p><a href="http://www.redbooks.ibm.com/redpieces/pdfs/sg246134.pdf"><b>WebSphere 4 Application Development Handbook</b></a> - IBM &quot;Redbook&quot; - See &quot;Designing with Frameworks (Chapter 7).</p>
+<p><a href="http://husted.com/about/scaffolding/catalog.htm"><b>Struts Catalog</b></a> by Ted Husted - Overview of Struts Design Patterns and Strategies.</p>
+<p><a href="http://home.iprimus.com.au/moktc/howto/struts/howto_forte_struts.htm"><b>HOWTO Setup and Debug STRUTS Example in Forte</b></a> by Michael Mok.</p>
+<p><a href="http://www.netstore.ch/mesi/strutsTutorial/"><b>JBuilder 5, Struts 1.0 &amp; WebLogic 6.0, a Tutorial</b></a> by Markus Colombo.</p>
+<p><a href="http://www1.tramsasp.com/?section=dev"><b>Using JBuilder5 with Struts 1.0 Release</b></a> by Anthony Martin.</p>
+<p><a href="http://www.borland.com/conf2001/updates/"><b>3148 Configuring AppServer to Work with Struts</b></a> by Ken Sipe (7/25/2001)</p>
+<p><a href="http://www.borland.com/conf2001/updates/"><b>3004 Building Extensible Web Frameworks Using XML, XSL-T, and Java</b></a> by Richard Vowles 7/21/2001</p>
+<p><a href="http://husted.com/about/scaffolding/strutByStrut.htm"><b>Strut by Strut</b></a> by Ted Husted - Building a web application from the ground up (maintenance release 2001/Aug/19).</p>
+<p><a href="http://ioctl.org/doc/j2ee-tutorial/doc/JSPTags3.html"><b>J2EE Tutorial</b></a> - Early Release chapter featuring Struts 1.0 tags.</p>
+<p><a href="http://developer.bluestone.com/scripts/SaISAPI.dll/Gallery.class/demos/trailMaps/index.jsp"><b>Welcome to the Struts Framework</b></a> by <a href="http://www.bluestone.com">Bluestone Software</a>.</p>
+<p><a href="http://www.jspinsider.com/tutorials/jsp/struts/strutsintro.view"><b>An Introduction to Struts</b></a> by Casey Kochmer.</p>
+<p><a href="http://husted.com/struts/resources/uml-jps.pdf"><b>Struts UML Diagrams</b></a> (PDF) by Jean-Pierre Schnyder.</p>
+<p><a href="http://husted.com/struts/resources/example-spec.html"><b>Blueprinting a Struts Application</b></a> by Ted Husted - Sample specification and API for the Struts Example application.</p>
+</section>
+
+<section name="Seminars" href="seminars"> 
+<p><a href="http://www.basebean.com/"><b> Fast Track to MVC Frameworks</b></a> - 2001-Dec-2.</p>
+<p><a href="http://bravepoint.com/scripts/wsisa.dll/WService=training/training_course.html?courseid=354"><b>BravePoint - Advanced JSP Architecture for J2EE</b></a> - 2001-11-19, 2001-12-10.</p>
+<p><a href="http://www.avantsoft.com/jsp.html"><b>AvantSoft Inc. - JSP, Servlets and Struts</b></a></p>
+</section>
+
+<section name="Articles" href="articles"> 
+<p><a href="http://www.informit.com/content/index.asp?product_id={0917F29F-56D8-4B25-9C67-211EC945BBAB}"><b>The Struts Framework's Action Mappings Configuration File</b></a> by Wellington L.S. da Silva</p>
+<p><a href="http://husted.com/struts/resources/web_dev_products.htm"><b>Web Development Products Spreadsheet</b> </a>by Dan Cancro.</p>
+<p><a href="http://www.javadude.com/articles/layering.html"><b>Layering Applications</b></a> by Scott Stanchfield.</p>
+<p><a href="http://www.sys-con.com/java/article.cfm?id=1175"><b>MVC and Struts</b></a> by Steven Sweeting, Clive Jones, and Aaron Rustad.</p>
+<p><a href="http://www.onjava.com/pub/a/onjava/2001/09/11/jsp_servlets.html"><b>Introduction to Jakarta Struts Framework</b></a> by Sue Spielman.</p>
+<p><a href="http://www.informit.com/content/index.asp?product_id={0917F29F-56D8-4B25-9C67-211EC945BBAB}"><b>The Struts Framework's Action Mappings Configuration File</b></a> by Wellington L.S. da Silva</p>
+<p><a href="http://husted.com/struts/resources/performant.htm"><b>Is Struts Performant?</b></a> by Ted Husted -- An analysis of framework components, and how they contribute to overall efficiency.</p>
+<p><a href="http://husted.com/struts/resources/strutsforeveryone.zip"><b>Struts for Everyone</b></a> by Jonathan Asbell -- Word document zipped for download. Early release: still in working draft form.</p>
+<p><a href="http://husted.com/struts/resources/1291-authentication.zip"><b>Approaches to User Authentication and Access Control in Web Applications</b></a> by Craig McClanahan. Slides from the JavaOne BOF (June 2001 #1291). Star Office Format. Zipped for download.</p>
+<p><b>Support your application development with Struts</b> [404] by McClanahan, McCay, and Bergenholtz.</p>
+<p><a href="http://www.computer-programmer.org/articles/struts/"><b>Introduction to MVC and the Jakarta Struts Framework</b></a> by <a href="mailto:craiger@tataryn.net">Craig Tataryn</a>.</p>
+<p><a href="http://husted.com/struts/resources/kickstart.html"><b>Kickstart</b></a><b>  </b>- The obligatory Struts Q&amp;A.</p>
+<p><a href="http://www-106.ibm.com/developerworks/library/j-struts/?n-j-2151"><b>Struts, an open-source MVC implementation</b></a>  by <a href="mailto:malcolm@nuearth.com">Malcom Davis</a>.</p>
+<p><a href="http://www.javaworld.com/javaworld/jw-12-2000/jw-1201-struts.html"><b>Strut Your Stuff With JSP Tags</b></a>, by <a href="mailto:Thor.Kristmundsson@javaworld.com">Thor Kristmundsson</a>.</p>
+<p><a href="http://informit.com/books/authors/author_template/index.asp?authorid={A08A00B0-71BB-42DB-9B29-08879A9A7ABE}&amp;t={94AE5B48-1D7D-462A-A4A6-83CE19EC0705}&amp;n={4641FAF9-E21F-4902-8F6E-0C8FAF114C62}"><b>Using the Struts Framework to Develop a Message Board</b></a> by Maneesh Sahu (article requires registration with informit.com).</p>
+<p><a href="http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-jspweb_p.html"><b>JSP templates</b></a> by <a href="mailto:david.geary@javaworld.com">David Geary</a>.</p>
+</section>
+
+<section name="Books" href="books"> 
+<ul>
+<li><a href="http://www.amazon.com/exec/obidos/ISBN=1861005512/hitchhikeguidetoA/"><b>Professional JSP Site Design</b></a> - Wrox book - Features Struts throughout.</li>
+<li><a href="http://www.amazon.com/exec/obidos/ISBN=0735710953/hitchhikeguidetoA/"><b>JSP and Tag Libraries for Web Development </b></a>- by Wellington L. S. Da Silva. Several chapters regarding Struts.</li>
+<li><a href="http://www.redbooks.ibm.com/redpieces/pdfs/sg246134.pdf"><b>Websphere Version 4 Application Development Handbook</b></a> <font size="1">(PDF)</font> - Chapter 7 covers designing with both the Struts and Websphere frameworks,</li>
+<li><a href="http://shannon.informatik.fh-wiesbaden.de/jsp/index.html"><b>Java Server Pages and J2EE Web-based Applications for Enterprises</b></a> - In German, with a Chapter regarding MVC and Struts.</li>
+<li><a href="http://www.amazon.com/exec/obidos/ISBN=0130648841/hitchhikeguidetoA/"><b>Core J2EE Patterns</b></a> - Many of these patterns are deployed in Struts.</li>
+<li><a href="http://www.amazon.com/exec/obidos/ISBN=1861004958/hitchhikeguidetoA/"><b>Professional JSP 2nd Edition</b></a> - Wrox book - long chapter on Struts.</li>
+<li><a href="http://www.amazon.com/exec/obidos/ISBN=0130307041/hitchhikeguidetoA/"><b>Advanced JavaServer Pages</b></a> by David Geary - features template tag library from Struts 1.0</li>
+</ul>
+</section>
+
+<section name="Selected APIs, RFCs, and JSRs" href="apis"> 
+
+<ul>
+<li><a href="http://java.sun.com/products/servlet/download.html">Servlet API</a></li>
+<li><a href="http://java.sun.com/products/jsp/technical.html"> JavaServer Pages</a></li>
+<ul>
+<li><a href="http://java.sun.com/products/jsp/technical.html">JSP Tag Libraries</a></li>
+<ul>
+<li><a href="http://jakarta.apache.org/taglibs/doc/jsptl-doc/intro.html">JavaServer Pages Standard Tag Library (JSPTL) Early Release</a></li>
+</ul>
+</ul>
+</ul>
+
+<ul>
+<li> <a href="http://java.sun.com/products/javabeans/docs/"> JavaBeans</a></li>
+<li> <a href="http://java.sun.com/j2se/1.3/docs/guide/jdbc/index.html"> JDBC API Documentation</a></li>
+<li> <a href="http://java.sun.com/j2ee/blueprints/"> Java2 Enterprise Edition (J2EE)</a></li>
+<li> <a href="http://java.sun.com/products/jaas/index-10.html">Java Authentication and Authorization Service</a> (JAAS)</li>
+</ul>
+
+<ul>
+<li> <a href="http://www.w3.org/MarkUp/">HyperText Markup Language</a> (w3c)</li>
+<ul>
+<li><a href="http://www.w3.org/TR/html4/">HTML 4.01 Specification</a></li>
+</ul>
+</ul>
+
+<ul>
+<li><a href="http://www.ietf.org/rfc/rfc2396.txt">Uniform Resource Identifiers (URI): Generic Syntax</a></li>
+<ul>
+<li><a href="http://www.w3.org/Addressing/#9808uri">Naming and Addressing: URIs, URLs, ...</a></li>
+</ul>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2616.txt">Hypertext Transfer Protocol -- HTTP/1.1</a></li>
+<ul>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2617.txt">HTTP Authentication: Basic and Digest Access Authentication</a></li>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2660.txt">The Secure HyperText Transfer Protocol</a></li>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2936.txt">HTTP MIME Type Handler Detection</a></li>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2854.txt">The 'text/html' Media Type</a></li>
+<li><a href="ftp://ftp.isi.edu/in-notes/rfc2518.txt">HTTP Extensions for Distributed Authoring -- WEBDAV</a></li>
+<ul>
+<li><a href="http://www.ics.uci.edu/pub/ietf/webdav/intro/webdav_intro.pdf">WebDAV: IETF Standard for Collaborative Authoring on the Web</a></li>
+</ul>
+</ul>
+<li><a href="http://www.rfc-editor.org/"><b>RFC Editor (index)</b></a></li>
+</ul>
+
+<ul>
+<li><a href="http://www.jcp.org/jsr/detail/52.jsp">Standard Tag Library for JavaServer Pages</a></li>
+<li><a href="http://jcp.org/jsr/detail/127.jsp">Java Faces</a></li>
+<li><a href="http://jcp.org/jsr/overview/index.jsp"><b>JSR Index</b></a></li>
+</ul>
+</section>
+
+<section name="Other Resource Pages" href="other"> 
+<p><a href="http://www.jguru.com/faq/home.jsp?topic=Struts"><b>JGuru FAQ</b></a></p>
+<p><a href="http://husted.com/struts/"><b>More About Struts</b></a> by <a href="mailto:support@husted.com">Husted dot Com</a>.</p>
+<p><a href="http://habweb.de/struts/"><b>German Translation of Users Guide</b></a> by Hartmut Bernecker.</p>
+<p><a href="http://java.sun.com/docs/books/tutorial/"><b>Javasoft Tutorials</b></a></p>
+<p><a href="http://archives.java.sun.com"><b>Javasoft Mailing Lists</b></a></p>
+</section>
+
+<section name="Mailing List Archives" href="archives"> 
+<p><a href="http://mail-archive.com/"><b>mail-archive.com</b></a>.</p>
+<p><b><a href="http://husted.com/struts/FAQ/">Struts FAQ with Mailing List Threads</a>  - </b> Clippings from the User Lists</p>
+</section>
+
+<section name="Powered by Struts" href="powered">
+ <ul>
+    <li><a href="http://www.application-servers.com/"><b>Application-Servers.com</b></a> - French site.</li>
+    <li><a href="http://www.clickstarttutoring.com/index.jsp"><b>Clickstart Tutoring</b></a> - One on one in home tutoring.</li>
+    <li><a href="http://dbforms.org/"><b>dbForms</b></a> - RAD framework for database applications.</li>
+    <li><a href="http://www.e-involve.com"><b>E-Involve</b></a></li>
+    <li><a href="http://adminweb.enitel.no/login.jsp"><b>Enitel</b></a> - French site.</li>
+    <li><a href="http://www.hallmarkstories.com"><b>Hallmark Stories</b></a> - "Tell the story behind your photos".</li>
+    <li><a href="http://www.iknowbase.com/"><b>iKnowBase</b></a> - The Knowledge Engine.</li>
+    <li><a href="http://ironmax.com/"><b>IronMax</b></a> - B2B site; see Equipment Information Products.</li>
+    <li><a href="http://www.ipipi.com/index.jsp"><b>IPIPI</b></a> - e-Mail to SMS delivery service.</li>
+    <li><a href="http://www.jcorporate.com"><b>Jcorporate.com</b></a> - open source and shared source commercial applications.</li>
+    <li><a href="http://get2hawaii.com/"><b>Get To Hawaii</b></a> - B2B Travel Service Provider</li>
+    <li><a href="http://www.newdawnart.com/"><b>New Dawn Art</b></a> - Social and spiritual art on the Internet.</li>
+    <li><a href="http://www.webappcabaret.com/normad"><b>Normad</b></a> - Web Timesheet Management System.</li>
+    <li><a href="https://www.organox.com.br/"><b>Organonx</b></a></li>
+    <li><a href="http://www.pizzahut.com.au/"><b>Pizza Hut Online / Sydney Metro</b></a> - For pickup or delivery in the Syndey Metro area.</li>
+    <li><!-- href="http://www.penza.ru/povolgie"--><b>Povoglie</b> [403] - Goverment regional press services news center in Russia, middle Volga.</li>
+    <li><a href="http://www.ipayment.co.za"><b>South African Revenue Services</b></a> - Directive and certificate service.</li>
+    <li><a href="http://www.redgalleon.com/"><b>Red Galleon</b></a> - Offer aggregator.</li>
+    <li><a href="http://www.webappcabaret.com/teatimej/"><b>TeaTimeJ</b></a> - Website and Java hosting.</li>
+    <li><a href="http://wxxi.org/"><b>WXXI Spring MarketPlace 2001</b></a> - Online auction for Public Television station.</li>
+  </ul>
+
+</section>
+
+<section name="Java / Struts ISPs" href="hosts">
+<p>Provided as a reference only. No endorsements given or implied. To be listed, post a documentation enhancement request in Bugzilla.</p>
+<ul>
+    <li><a href="http://www.aoindustries.com/servlet/com.aoindustries.website.HomePage"><b>AO Industries</b></a></li>
+    <li><a href="http://www.hostjsp.com"><b>host<font size="-1">JSP</font>.com</b></a></li>
+    <li><a href="http://www.imagineis.com"><b>Imagine Internet Services</b></a></li>
+    <li><a href="http://www.infinitehost.com/"><b>Infinite Host</b></a></li>
+    <li><a href="http://www.irdesign.com/services/hosting/website_hosting.html"><b>irdesign.com</b></a></li>
+    <li><a href="http://www.mmaweb.net/"><b>mma</b></a></li>
+    <li><a href="http://www.servlets.net/index.html"><b>servlets.com</b></a></li>
+    <li><a href="http://www.webappcabaret.com"><b>Web App Cabaret</b></a></li>
+  </ul>
+</section>
+
+<section name="Consultants" href="consultants">
+<p>Provided as a reference only. No endorsements given or implied. To be listed, post a documentation enhancement request in Bugzilla.</p>
+<ul>
+  <li><b>AccessData</b> - <a href="http://www.accessdc.com/">www.accessdc.com</a> - <a href="mailto:cassenza@Accessdc.com">Chris Assenza</a>.</li>
+  <li><b>Bravepoint</b> - <a href="http://www.bravepoint.com">www.bravepoint.com</a> - <a href="mailto:struts@bravepoint.com">Struts Info</a>.</li>
+  <li><b>Creatrix</b> - <a href="http://www.creatrixs.com">www.creatrixs.com</a> - <a href="mailto:sami.elhini@creatrixs.com">sami.elhini@creatrixs.com</a>.</li>
+  <li><b>eBlox</b> - <a href="http://www.eblox.com/">www.eblox.com</a> - <a href="mailto:andrewb@eblox.com">andrewb@eblox.com</a>.</li>
+  <li><b>Husted dot Com</b>   - <a href="http://husted.com/">www.husted.com</a> - <a href="mailto:ted@husted.com">Ted Husted</a>.</li>
+  <li><font size="1"><b>JATEC AG</b></font> - <a href="http://www.jatec.ch"> www.jatec.ch</a> - <a href="mailto:sascha.urfer@jatec.net">Sascha Urfer</a>.</li>
+  <li><b>jCorporate</b> - <a href="http://www.jcorporate.com">jcorporate.com</a> - <a href="mailto:scann@jcorporate.com">Sandra Cann</a>.</li>
+  <li><b>Kambrium.net Technologies</b> - <a href="http://www.kambrium.net/"></a><a href="http://www.kambrium.net/">kambrium.net</a> - <a href="mailto:struts@kambrium.net">Dirk Gabler</a>.</li>  
+  <li><b>Living Logic</b> - <a href="http://www.livinglogic.de/">www.livinglogic.de</a> - <a href="mailto:matthias.bauer@livinglogic.de">Matthias Bauer</a>.</li>
+  <li><b>Multitask Consulting</b> - <a href="http://www.multitask.com.au/">www.multitask.com.au</a> - <a href="dion@multitask.com.au">dIon Gillard</a><a href="dion@multitask.com.au">.</a></li>
+  <li><b>New Particles</b> - <a href="http://www.newparticles.com/struts">www.newparticles.com/struts</a> - <a href="mailto:steve@newparticles.com">Steve Wilkinson</a>.</li>
+  <li><b>Raible Designs</b> - <a href="http://www.raibledesigns.com/">www.raibledesigns.com</a> - <a href="mailto:matt_raible@yahoo.com">Matt Raible</a>.</li>
+  <li><b>Shared Skills Ltd (UK)</b> - <a href="http://www.sharedskills.com/">www.sharedskills.com</a> - <a href="mailto:mike.way@sharedskills.com">Mike Way</a>.</li>
+  <li><b>SoftwareMentor</b> - <a href="http://softwareMentor.com/">softwareMentor.com</a> - <a href="mailto:tim@softwareMentor.com">Tim Biernat</a>.</li>
+  <li><b>Solution Array</b> - <a href="http://www.solutionarray.com/">www.solutionarray.com</a> - <a href="mailto:chkmiec@hotmail.com">Chris Kmiec</a>.</li>
+  <li><b>Stonebridge Technology</b> - <a href="http://www.sbti.com/">www.sbti.com</a> - <a href="mailto:john.thomas@sbti.com">John J. Thomas</a>.</li>
+  <li><b>Tallan</b> - <a href="http://www.tallan.com/">www.tallan.com</a> - <a href="mailto:michael.grassotti@tallan.com">Michael Grassotti</a>.</li>
+  <li><b>Thalles Information Services</b> - <a href="http://www.thales-is.ch/">www.thales-is.ch</a> - <a href="mailto:markus.colombo@thales-is.ch">Markus Collumbo</a>.</li>
+  <li><b>U</b><b>pco</b> -<a href="http://www.upco.co.uk">upco.co.uk</a> - <a href="mailto:Jon.Ridgway@upco.co.uk">Jon Ridgeway</a>.</li>
+  <li><b>viadee <font size="1">UNTERNEHMENSBERATUNG GmbH</font></b> - <a href="http://www.viadee.de/">www.viadee.de</a> - <a href="mailto:friedrich.budde@viadee.de">Frido Budde</a>.</li>
+</ul>
+  <p>Next: <a href="volunteers.html">Who We Are</a></p>
+</section>
+
+</chapter></body></document>
diff --git a/doc/userGuide/volunteers.xml b/doc/userGuide/volunteers.xml
new file mode 100644
index 0000000..a4203ef
--- /dev/null
+++ b/doc/userGuide/volunteers.xml
@@ -0,0 +1,281 @@
+<?xml version="1.0"?>
+<document url="./resources.xml">
+<properties>
+<author>Ted Husted</author> 
+<title>The Struts User's Guide - Who We Are</title>
+</properties>
+<body> 
+<chapter name="Who We Are" href="whoWeAre"> 
+
+<section name="The Meritocracy" href="meritocracy">
+<p>All work on Struts is contributed by volunteers whose only motivation
+is to help make Struts work even better, both for themselves and for rest of the community.</p> 
+<p>All contributions are welcome, and may be discussed and posted on the mailing lists. 
+The final decision of what becomes part of the official distribution is made by a group of 
+<a href="#committers">Committers</a>. For more about Meritocracy, see the 
+<a href="http://jakarta.apache.org/site/roles.html">Management page</a> on the 
+Apache Jarakta Website.</p>
+</section>
+
+<section name="Source Code Contributors" href="contributors.source"> 
+<ul>
+<li>Arun M. Thomas</li>
+<li>Chris Audley</li>
+<li>Craig R. McClanahan</li>
+<li>David Geary</li>
+<li>Don Clasen</li>
+<li>Florent Carpentier</li>
+<li>Jeff Hutchison</li>
+<li>Jimmy Larsson</li>
+<li>Luis Arias</li>
+<li>Marius Barduta</li>
+<li>Martin Cooper</li>
+<li>Mike Schachter</li>
+<li>Niall Pemberton</li>
+<li>Oleg V Alexeev</li>
+<li>Ralph Schaer</li>
+<li>Rob Leland</li>
+<li>Sean Kelly</li>
+<li>Ted Husted</li>
+</ul>
+</section>
+
+<section name="User Guide Contributors" href="contributors.documentation"> 
+<ul>
+<li>Chris Assenza</li>
+<li>Craig R. McClanahan</li>
+<li>David Geary</li>
+<li>dIon Gillard</li>
+<li>Ed Burns</li>
+<li>Eric Wu</li>
+<li>John Rousseau</li>
+<li>John Ueltzhoeffer</li>
+<li>Larry McCay</li>
+<li>Martin Cooper</li>
+<li>Matthias Kerkhoff</li>
+<li>Mike Schachter</li>
+<li>Paul Runyan</li>
+<li>Robert Hayden</li>
+<li>Stanley Santiago</li>
+<li>Ted Husted</li>
+<li>Wong Kok Kai</li>
+</ul>
+</section>
+
+<section name="Active Committers" href="committers"> 
+<ul>
+<li><b>Craig R. McClanahan</b></li> (craigmcc at apache.org)
+<li><b>Michael Schachter</b></li>   (mschachter at apache.org)
+<li><b>Ted Husted</b></li>          (husted at apache.org)
+<li><b>Rob Leland</b></li>          (rleland at apache.org)
+<li><b>Vincent Massol</b></li>      (vmassol at apache.org)
+<li><b>Cedric Dumoulin</b></li>     (cedric.dumoulin at lifl.fr)
+<li><b>Martin Cooper</b></li>       (martinc at apache.org)
+<li><b>David Winterfeldt</b></li>   (dwinterfeldt at apache.org)
+<li><b>Oleg Alexeev</b></li>        (oalexeev at apache.org)
+</ul>
+</section>
+
+<section name="Emeritus Committers" href="comitters.emeritus"> 
+<ul>
+<li>David Geary</li>
+<li>Luis Arias</li>
+<li>Pierre Delilse</li>
+</ul>
+</section>
+
+<section name="More About Us" href="about">
+
+<h3><a name="craigmcc">Craig R. McClanahan -- Committer</a></h3>
+
+<p>I've been involved with servlet and JSP technology since around 1998.  It
+started out that I needed a way to build some web applications for several
+projects, and liked Java a lot better than the alternatives.  I also liked the
+price tag of open source software, and started using Apache JServ -- later on,
+getting involved in the project (like many people, I was whining about the
+twelve months it took to get from version 0.9 to version 1.0, and my son said
+"Dad, you know Java -- go help them finish it!" -- so I did :-).</p>
+
+<p>For quite a while, I was participating a lot on the JSP-INTEREST and
+SERVLET-INTEREST <a href="http://archives.java.sun.com">mailing lists</a>, especially on
+the topic of good architectures for web applications.  I was disgusted with the
+hash that many beginners created when they used (or abused) scriptlets in JSP
+pages, and built (for my former employer) a pretty comprehensive framework that
+could be considered ("Struts 0.01 without the custom tags").  It was
+proprietary code, but I was able to describe the concepts, and there started to
+be a feeling on the lists that this "Model 2" thing was pretty cool -- but
+there were no good examples to look at, so it was mostly hand waving types of
+discussions.</p>
+
+<p>Over the same time period, I got involved as an individual contributor in the
+<a href="http://java.sun.com/jcp">Java Community Process</a>, and joined the expert group
+that defined the servlet 2.2 and JSP 1.1 specs.  Sun was impressed enough to
+offer me a job as the technical lead on the team within Sun (currently five
+other individuals) that works on <a href="http://jakarta.apache.org/tomcat">Tomcat</a>  --
+the architecture for Catalina, which is the servlet container part of Tomcat
+4.0, is also mine -- so I am in the really nice position of getting paid to
+work on open source software :-).  And, participate on the expert groups for
+Servlet 2.3 and JSP 1.2.  And, speak at various conferences, including
+ApacheCon and JavaOne.  And, talk to groups within Sun about using Struts and
+JSP/servlet technology.  And ... (there's some really interesting things being
+considered for the future).</p>
+
+<p>The original design of what came to be Struts has been in my head for a long
+time, since those interesting mailing list discussions, but the first version
+of the actual code was written on my laptop on a Memorial Day weekend vacation
+trip (end of May, 2000) to the Oregon coast -- in between watching the surf and
+having the house shaken by a windstorm at night.  Since then, it has gathered
+attention and popularity as we approach our first official release, and it
+delights me to see my "baby" grow up so well :-).  Of course, it is no longer
+just me -- there have been incredible numbers of good ideas from all over, and
+a peek at the TODO list for 1.1 says that even more good stuff is coming in the
+future.</p>
+
+<p>One motivation factor was <a href="http://www.servlets.com/soapbox/problems-jsp.html">
+Jason Hunter's</a> article about the Problems with JSP. Jason and I get along
+fine, even though we have different preferences about presentation
+technologies.  Besides being the author of a very popular book about servlets,
+with a second edition coming soon, Jason is also the representative for the
+Apache Software Foundation on the Executive Committe of the Java Community
+Process.</p>
+
+<p>Personally, I live in Portland, Oregon (even though my team at Sun is mostly in
+Cupertino, CA -- staying here was part of the job deal :-).  I like to support
+Oregon sports teams (Oregon State Beavers, Oregon Ducks, Portland Trailblazers)
+and work on cool software.</p>
+
+<p>I figured out I was getting pretty old when I realized that 2000 was the 25th
+year I had been paid to work in some aspect of software development :-).  I've
+got a son who is a full-time software developer (primarily in PHP so far, but
+I'm going to corrupt him with Java eventually :-), and a daughter in college.
+I'll happily let the other committers speak for themselves.</p>
+
+<h3><a name="mschachter">Mike Schachter -- Committer</a></h3>
+
+<p>I'm currently a student of computer
+science at Drexel University in Philadelphia, PA.
+I've been working at HP Middleware, formerly
+Bluestone Software for 3 years programming in 
+Java and recently J2EE technologies.  I'm a full
+time worker from September until April and a student
+and part time worker from April until August.
+In my spare time I've been known to run monkey-knife
+fights in a shady south philly warehouse.  Err...
+I mean... nothing.</p>
+
+<h3><a name="husted">Ted Husted -- Committer</a></h3>
+
+<p>My primary interest in Struts is to put it to work writing lots of
+real-life Web applications:-) To do that effectively means having good
+documentation and code samples at my fingertips, so that's been my focus
+with the Struts product so far.</p>
+
+<p>I've been writing software for hire since 1984, but only recently jumped
+on the Java bandwagon. My initial interest was with electronic
+publishing, and started by converting my various print projects to
+electronic media. The "Information Superhighway" was still the private
+stomping ground of Universities and government agencies then. The rest
+of us had to make do with diskettes and bulletin boards.</p>
+
+<p>Between 1985 and 1994, I created and marketed several software products
+for publishing on disk, the most popular being "Dart" and "Iris". In
+1992, Dart was awarded the Digital Quill for software excellence,
+featured in PC Magazine (February 1992), and bundled with McGraw Hill's
+bookset,"Paperless Publishing" by Colin Hayes (McGraw Hill 1994). Dart
+won a second Digital Quill in 1993. Several titles that used Iris for a 
+publishing system have also won awards and been widely distributed, 
+including "Hermitville USA." I was also fortunate to find kindred souls 
+on CompuServe and America Online, who helped me pioneer resources areas 
+there in 1993 and 1994 for the nascent electronic publishing industry.</p>
+
+<p>I finally cut loose on the Internet in 1995, launching Epub News, an
+electronic newspage about electronic publishing. After taking on several
+private contracts, I opened the Husted dot Com Website (www.husted.com)
+in 1996. I've drifted away from electronic books, but have noticed that
+several products are now making their way into the consumer mainstream
+-- as usual, I was twenty minutes into the future:-)</p>
+
+<p>My favorite all-time project is the Hitchhikers Guide to Science
+Fiction. This was one of my earliest hypertext projects (it started as a
+print-book idea), and I had a lot of fun bringing it forward onto the
+Web. (Now, if I only had time to bring it current and dress it up!)</p>
+
+<p>My favorite all-time client is is WXXI Public Broadcasting Council, 
+where I've served as the station's Webmaster. WXXI provides public 
+broadcasting services for television and radio, and we are working to do 
+the same online. Along with providing companion Web sites for every WXXI
+production, we stream both our AM and FM signals, in both Real and 
+QuickTime, with online archives in the works. It's a long journey, but 
+we've taken the first steps. I'm responsible for most of the regular 
+updates to the site, and much of the overall layout and design. We're 
+grateful to have won the PBS award for best Web site in our market for 
+two years running.</p>
+
+<p>Our most ambitious projects at WXXI have been Spring Marketplace 2000
+and the NY Election Finder. For Spring Marketplace, we put our annual
+auction fully online for simultaneous telephone and Website bidding. On
+NY Election, we offered not only the usual election-finder application,
+but collected voter registration records from around the state, so
+people could also check their registration status and polling place. I
+developed the Web-enabled database applications for both projects.</p>
+
+<p>Currently, I'm expanding the WXXI online auction software into a
+complete package for hosting online auctions as fund-raisers; this is 
+to be an open-source project called Gavel, and, of course, is 
+based on Struts. </p>
+
+<h3><a name="cedric">Cedric Dumoulin -- Committer</a></h3>
+
+<p>As a dreamer / researcher I have thought a lot about a framework like Struts.
+But, as a lazy developer I have first checked what already exists, and I have
+found Struts. Struts goals fulfilled nearly all I needed for my (now old)
+portal project, except the capability to reuse and assemble easily pieces of
+pages or components. So, I have proposed the Components framework. This
+framework can be seen as a superset of the Templates tag library contributed 
+by David Geary, and contains lot of interesting features.</p>
+
+<p>From a professional point of view, I have a Ph.D. in computer science. I have
+worked for 3 years in the R&amp;D department of a worldwide company developing 
+Internet banking solutions. I am now a researcher at a university, and work 
+on European research projects. My main research interest is WWW, Distributed 
+Systems and Object Oriented Design. When developing code, I always try to 
+first propose reusable pieces of code.</p>
+
+<h3><a name="martinc">Martin Cooper -- Committer</a></h3>
+
+<p>Currently, I'm a Principal Software Engineer at Tumbleweed Communications, 
+working on the Messaging Management System. Early last year (2000), I was 
+working on the architecture for a new web-based administration system for 
+the product, and headed in the direction of servlets and JSP. I joined the 
+JSP-INTEREST and SERVLET-INTEREST mailing lists to see what was going on in 
+those respective areas.</p>
+
+<p>Before too long, some interesting discussions started up around the topic 
+of Model 2 architectures. Model 2 sounded like the right way to go about 
+things, and I followed those discussions closely. I was, however, still 
+looking for a "leg up" - something to give me that core on which to build.</p>
+
+<p>Then, in May, I saw a post to JSP-INTEREST from Craig McClanahan entitled 
+something like "New Jakarta-Struts Subproject", and describing Struts, and 
+his vision for it. I hopped right over to the Jakarta web site and signed 
+up for the mailing list. Before long, I realised this was exactly what I 
+had been looking for.</p>
+
+<p>Now, a year or so later, we have a team of people, on which I am the 
+technical lead, just finishing up our web-based administration system as 
+Struts reaches its 1.0 release. And I am still firmly convinced that I made 
+the right decision in going with Struts in the first place.</p>
+
+<p>Like anyone else, my first postings to the struts-user list were questions 
+to help me understand how to do things, and why Struts is the way it is. 
+Over time, reading the lists and also the source code, and working on my 
+own fairly large web application, I came to the point where I could answer 
+questions too. Now, I'm glad to be able to give something back to the 
+Struts community by helping others understand, and also by contributing 
+ideas and code to help make Struts even better than it already is.</p>
+
+</section></chapter>
+
+  <p>Next: <a href="../index.html">Struts Home</a></p>
+
+</body></document>
diff --git a/src/example/org/apache/struts/webapp/example/ApplicationResources.properties b/src/example/org/apache/struts/webapp/example/ApplicationResources.properties
index f38de01..4834d88 100644
--- a/src/example/org/apache/struts/webapp/example/ApplicationResources.properties
+++ b/src/example/org/apache/struts/webapp/example/ApplicationResources.properties
@@ -31,7 +31,7 @@
 index.heading=MailReader Demonstration Application Options
 index.logon=Log on to the MailReader Demonstration Application
 index.registration=Register with the MailReader Demonstration Application
-index.title=MailReader Demonstration Application (Struts 1.0-b1)
+index.title=MailReader Demonstration Application (Struts 1.0)
 index.tour=A Walking Tour of the Example Application
 linkSubscription.io=I/O Error: {0}
 linkSubscription.noSubscription=No subscription under attribute {0}
diff --git a/src/exercise-taglib/org/apache/struts/webapp/exercise/OptionBean.java b/src/exercise-taglib/org/apache/struts/webapp/exercise/OptionBean.java
new file mode 100644
index 0000000..af41b76
--- /dev/null
+++ b/src/exercise-taglib/org/apache/struts/webapp/exercise/OptionBean.java
@@ -0,0 +1,120 @@
+/*
+ * $Header: /home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exercise/Attic/OptionBean.java,v 1.1.2.1 2001/10/15 05:56:22 martinc Exp $
+ * $Revision: 1.1.2.1 $
+ * $Date: 2001/10/15 05:56:22 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * 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.
+ *
+ * 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 acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Struts", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this 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 names without prior written
+ *    permission of the Apache Group.
+ *
+ * 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
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * 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.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+
+package org.apache.struts.webapp.exercise;
+
+
+/**
+ * A simple bean for use in testing the <code>&lt;html:options&gt;</code> tag
+ * in conjunction with the <code>collection</code> attribute.
+ *
+ * @author  Martin F N Cooper
+ * @version $Revision: 1.1.2.1 $ $Date: 2001/10/15 05:56:22 $
+ */
+
+public class OptionBean {
+
+
+    // ----------------------------------------------------------- Constructors
+
+
+    /**
+     * Construct an instance with the supplied property values.
+     */
+    public OptionBean(String label, String value) {
+        this.label = label;
+        this.value = value;
+    }
+
+
+    // ------------------------------------------------------------- Properties
+
+
+    /**
+     * The property which supplies the option label visible to the end user.
+     */
+    private String label;
+
+    public String getLabel() {
+        return this.label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+
+
+    /**
+     * The property which supplies the value returned to the server.
+     */
+    private String value;
+
+    public String getValue() {
+        return this.value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+
+}
diff --git a/src/exercise-taglib/org/apache/struts/webapp/exercise/TestBean.java b/src/exercise-taglib/org/apache/struts/webapp/exercise/TestBean.java
index bb8d69d..c57cca8 100644
--- a/src/exercise-taglib/org/apache/struts/webapp/exercise/TestBean.java
+++ b/src/exercise-taglib/org/apache/struts/webapp/exercise/TestBean.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exercise/Attic/TestBean.java,v 1.2 2001/05/04 21:49:27 craigmcc Exp $
- * $Revision: 1.2 $
- * $Date: 2001/05/04 21:49:27 $
+ * $Header: /home/cvs/jakarta-struts/src/exercise-taglib/org/apache/struts/webapp/exercise/Attic/TestBean.java,v 1.2.2.1 2001/10/15 05:56:22 martinc Exp $
+ * $Revision: 1.2.2.1 $
+ * $Date: 2001/10/15 05:56:22 $
  *
  * ====================================================================
  *
@@ -72,7 +72,7 @@
  * General purpose test bean for Struts custom tag tests.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.2 $ $Date: 2001/05/04 21:49:27 $
+ * @version $Revision: 1.2.2.1 $ $Date: 2001/10/15 05:56:22 $
  */
 
 public class TestBean extends ActionForm {
@@ -96,6 +96,21 @@
 
 
     /**
+     * A multiple-String SELECT element using a collection.
+     */
+    private String[] collectionSelect = { "Value 2", "Value 4",
+                                          "Value 6" };
+
+    public String[] getCollectionSelect() {
+        return (this.collectionSelect);
+    }
+
+    public void setCollectionSelect(String collectionSelect[]) {
+        this.collectionSelect = collectionSelect;
+    }
+
+
+    /**
      * A double property.
      */
     private double doubleProperty = 321.0;
@@ -327,6 +342,7 @@
     public void reset(ActionMapping mapping, HttpServletRequest request) {
 
         booleanProperty = false;
+        collectionSelect = new String[0];
         intMultibox = new int[0];
         multipleSelect = new String[0];
         stringMultibox = new String[0];
diff --git a/src/share/org/apache/struts/action/ActionError.java b/src/share/org/apache/struts/action/ActionError.java
index 7a09059..a1ddfbb 100644
--- a/src/share/org/apache/struts/action/ActionError.java
+++ b/src/share/org/apache/struts/action/ActionError.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionError.java,v 1.3 2001/02/21 00:35:41 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/02/21 00:35:41 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionError.java,v 1.3.2.1 2001/11/01 07:08:41 martinc Exp $
+ * $Revision: 1.3.2.1 $
+ * $Date: 2001/11/01 07:08:41 $
  *
  * ====================================================================
  *
@@ -73,8 +73,12 @@
  * message resources database) plus up to four placeholder objects that can
  * be used for parametric replacement in the message text.
  *
+ * The placeholder objects are referenced in the message text using the same
+ * syntax used by the JDK <code>MessageFormat</code> class. Thus, the first
+ * placeholder is '{0}', the second is '{1}', etc.
+ *
  * @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2001/02/21 00:35:41 $
+ * @version $Revision: 1.3.2.1 $ $Date: 2001/11/01 07:08:41 $
  */
 
 public class ActionError implements Serializable {
diff --git a/src/share/org/apache/struts/action/ActionForm.java b/src/share/org/apache/struts/action/ActionForm.java
index 318cbc4..f5a8a00 100755
--- a/src/share/org/apache/struts/action/ActionForm.java
+++ b/src/share/org/apache/struts/action/ActionForm.java
@@ -1,13 +1,13 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionForm.java,v 1.7 2001/05/11 17:10:58 mschachter Exp $
- * $Revision: 1.7 $
- * $Date: 2001/05/11 17:10:58 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionForm.java,v 1.7.2.2 2001/11/21 13:29:31 husted Exp $
+ * $Revision: 1.7.2.2 $
+ * $Date: 2001/11/21 13:29:31 $
  *
  * ====================================================================
- * 
+ *
  * The Apache Software License, Version 1.1
  *
- * Copyright (c) 1999-2001 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
@@ -15,7 +15,7 @@
  * 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
@@ -23,15 +23,15 @@
  *    distribution.
  *
  * 3. The end-user documentation included with the redistribution, if
- *    any, must include the following acknowlegement:  
- *       "This product includes software developed by the 
+ *    any, must include the following acknowlegement:
+ *       "This product includes software developed by the
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowlegement may appear in the software itself,
  *    if and wherever such third-party acknowlegements normally appear.
  *
  * 4. The names "The Jakarta Project", "Struts", and "Apache Software
  *    Foundation" must not be used to endorse or promote products derived
- *    from this software without prior written permission. For written 
+ *    from this software without prior written permission. For written
  *    permission, please contact apache@apache.org.
  *
  * 5. Products derived from this software may not be called "Apache"
@@ -57,7 +57,7 @@
  * information on the Apache Software Foundation, please see
  * <http://www.apache.org/>.
  *
- */ 
+ */
 
 
 package org.apache.struts.action;
@@ -94,7 +94,8 @@
  * </p>
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.7 $ $Date: 2001/05/11 17:10:58 $
+ * @author Ted Husted
+ * @version $Revision: 1.7.2.2 $ $Date: 2001/11/21 13:29:31 $
  */
 
 public abstract class ActionForm implements Serializable {
@@ -106,14 +107,14 @@
     /**
      * The controller servlet instance to which we are attached.
      */
-    protected ActionServlet servlet = null;
-    
-    
+    protected transient ActionServlet servlet = null;
+
+
     /**
      * The MultipartRequestHandler for this form, can be
      * <code>null</code>
      */
-    protected MultipartRequestHandler multipartRequestHandler;
+    protected transient MultipartRequestHandler multipartRequestHandler;
 
 
     // ------------------------------------------------------------- Properties
@@ -122,13 +123,23 @@
     /**
      * Return the controller servlet instance to which we are attached.
      */
-    public ActionServlet getServlet() {
+    protected ActionServlet getServlet() {
 
         return (this.servlet);
 
     }
-    
-    
+
+
+    /**
+     * Return the controller servlet instance to which we are attached.
+     */
+    public ActionServletWrapper getServletWrapper() {
+
+        return new ActionServletWrapper(getServlet());
+
+    }
+
+
     /**
      * Return the MultipartRequestHandler for this form
      * The reasoning behind this is to give form bean developers
@@ -139,7 +150,7 @@
      * "multipart/request-data".
      * @see org.apache.struts.upload.MultipartRequestHandler
      */
-    public MultipartRequestHandler getMultipartRequestHandler() {
+    protected MultipartRequestHandler getMultipartRequestHandler() {
         return multipartRequestHandler;
     }
 
@@ -157,7 +168,7 @@
 
     }
 
-    
+
     public void setMultipartRequestHandler(MultipartRequestHandler multipartRequestHandler) {
         this.multipartRequestHandler = multipartRequestHandler;
     }
diff --git a/src/share/org/apache/struts/action/ActionMapping.java b/src/share/org/apache/struts/action/ActionMapping.java
index c5d7efa..003eef7 100755
--- a/src/share/org/apache/struts/action/ActionMapping.java
+++ b/src/share/org/apache/struts/action/ActionMapping.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionMapping.java,v 1.17 2001/03/23 22:21:34 craigmcc Exp $
- * $Revision: 1.17 $
- * $Date: 2001/03/23 22:21:34 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionMapping.java,v 1.17.2.2 2001/11/04 07:43:50 martinc Exp $
+ * $Revision: 1.17.2.2 $
+ * $Date: 2001/11/04 07:43:50 $
  *
  * ====================================================================
  *
@@ -135,7 +135,7 @@
  *     selected by this <code>ActionMapping</code>.
  * <li><strong>path</strong> - Request URI path used to select this mapping.
  *     If extension mapping is used for the controller servlet, the extension
- *     will be stripped before comparisions against this value are made.
+ *     will be stripped before comparisons against this value are made.
  * <li><strong>prefix</strong> - Prefix used to match request parameter
  *     names to form bean property names, if any.  Replaces the old
  *     <code>formPrefix</code> property.
@@ -161,7 +161,7 @@
  * </ul>
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.17 $ $Date: 2001/03/23 22:21:34 $
+ * @version $Revision: 1.17.2.2 $ $Date: 2001/11/04 07:43:50 $
  */
 
 public class ActionMapping implements Serializable {
@@ -863,7 +863,14 @@
             return (forward);
 
         // Second, check the globally defined forwards
-        return (getMappings().getServlet().findForward(name));
+        ActionMappings mappings = getMappings();
+        if (mappings == null)
+            return (null);
+        ActionServlet servlet = mappings.getServlet();
+        if (servlet == null)
+            return (null);
+        else
+            return (servlet.findForward(name));
 
     }
 
diff --git a/src/share/org/apache/struts/action/ActionServlet.java b/src/share/org/apache/struts/action/ActionServlet.java
index 8c9039f..9c45934 100755
--- a/src/share/org/apache/struts/action/ActionServlet.java
+++ b/src/share/org/apache/struts/action/ActionServlet.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.69 2001/05/18 17:11:37 mschachter Exp $
- * $Revision: 1.69 $
- * $Date: 2001/05/18 17:11:37 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 1.68.2.4 2001/10/07 04:49:15 martinc Exp $
+ * $Revision: 1.68.2.4 $
+ * $Date: 2001/10/07 04:49:15 $
  *
  * ====================================================================
  *
@@ -88,6 +88,7 @@
 import org.apache.struts.util.MessageResources;
 import org.apache.struts.util.MessageResourcesFactory;
 import org.apache.struts.util.RequestUtils;
+import org.apache.struts.util.ServletContextWriter;
 import org.apache.struts.upload.MultipartRequestWrapper;
 import org.xml.sax.AttributeList;
 import org.xml.sax.SAXException;
@@ -171,7 +172,8 @@
  *     instead of the servlet log.  [0]</li>
  * <li><strong>factory</strong> - The Java class name of the
  *     <code>MessageResourcesFactory</code> used to create the application
- *     <code>MessageResources</code> object.</li>
+ *     <code>MessageResources</code> object.
+ *     [org.apache.struts.util.PropertyMessageResourcesFactory]</li>
  * <li><strong>formBean</strong> - The Java class name of the ActionFormBean
  *     implementation to use [org.apache.struts.action.ActionFormBean].
  * <li><strong>forward</strong> - The Java class name of the ActionForward
@@ -191,7 +193,7 @@
  *     user session, identify and store an appropriate
  *     <code>java.util.Locale</code> object (under the standard key
  *     identified by <code>Action.LOCALE_KEY</code>) in the user's session
- *     if there is not a Locale object there already.</li>
+ *     if there is not a Locale object there already. [true]</li>
  * <li><strong>mapping</strong> - The Java class name of the ActionMapping
  *     implementation to use [org.apache.struts.action.ActionMapping].
  *     Two convenient classes you may wish to use are:
@@ -229,7 +231,7 @@
  * </ul>
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.69 $ $Date: 2001/05/18 17:11:37 $
+ * @version $Revision: 1.68.2.4 $ $Date: 2001/10/07 04:49:15 $
  */
 
 public class ActionServlet
@@ -1054,11 +1056,21 @@
      */
     protected void initDataSources() throws ServletException {
 
+        ServletContextWriter scw =
+            new ServletContextWriter(getServletContext());
+
         synchronized (dataSources) {
             Iterator keys = dataSources.keySet().iterator();
             while (keys.hasNext()) {
                 String key = (String) keys.next();
                 DataSource dataSource = findDataSource(key);
+                try {
+                    dataSource.setLogWriter(scw);
+                } catch (SQLException e) {
+                    log(internal.getMessage("initDataSource", key), e);
+                    throw new ServletException
+                        (internal.getMessage("initDataSource", key), e);
+                }
                 if (dataSource instanceof GenericDataSource) {
                     if (debug >= 1)
                         log(internal.getMessage("dataSource.init", key));
@@ -1817,7 +1829,7 @@
         String forward = mapping.getForward();
         if (forward == null)
             return (true);
-
+        
         //unwrap the multipart request if there is one
         if (request instanceof MultipartRequestWrapper) {
             request = ((MultipartRequestWrapper) request).getRequest();
@@ -1928,6 +1940,8 @@
         ActionMapping mapping = findMapping(path);
         if (mapping == null)
             mapping = mappings.getUnknown(request);
+        if (mapping != null)
+            request.setAttribute(Action.MAPPING_KEY, mapping);
         return (mapping);
 
     }
@@ -2044,9 +2058,6 @@
         if (mapping.getMultipartClass() != null)
             request.setAttribute(Action.MULTIPART_KEY,
                                 mapping.getMultipartClass());
-        //also pass the mapping through the request
-        request.setAttribute(Action.MAPPING_KEY,
-                             mapping);
         RequestUtils.populate(formInstance, mapping.getPrefix(),
                               mapping.getSuffix(), request);
 
@@ -2122,7 +2133,7 @@
 
 	// Save our error messages and return to the input form if possible
 	if (debug >= 1)
-	    log("  Validation error(s), redirecting to: " + uri);
+	    log("  Validation error(s), redirecting to: " + uri);        
 	request.setAttribute(Action.ERROR_KEY, errors);
         //unwrap the multipart request if there is one
         if (request instanceof MultipartRequestWrapper) {
diff --git a/src/share/org/apache/struts/action/ActionServletWrapper.java b/src/share/org/apache/struts/action/ActionServletWrapper.java
new file mode 100644
index 0000000..6065131
--- /dev/null
+++ b/src/share/org/apache/struts/action/ActionServletWrapper.java
@@ -0,0 +1,140 @@
+/*
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServletWrapper.java,v 1.1.2.1 2001/11/21 13:29:31 husted Exp $
+ * $Revision: 1.1.2.1 $
+ * $Date: 2001/11/21 13:29:31 $
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * 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.
+ *
+ * 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 acknowlegement:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Struts", and "Apache Software
+ *    Foundation" must not be used to endorse or promote products derived
+ *    from this 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 names without prior written
+ *    permission of the Apache Group.
+ *
+ * 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
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * 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.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+
+package org.apache.struts.action;
+
+import org.apache.struts.upload.MultipartRequestHandler;
+import org.apache.struts.upload.MultipartRequestWrapper;
+
+
+/**
+ * Provide a wrapper around an ActionServlet to expose only
+ * those methods needed by other objects. When used with an
+ * ActionForm, subclasses must be careful that they do
+ * not return an object with public getters and setters that
+ * could be exploited by automatic population of properties.
+ * @author Craig R. McClanahan
+ * @author Ted Husted
+ * @version $Revision: 1.1.2.1 $ $Date: 2001/11/21 13:29:31 $
+ */
+public class ActionServletWrapper {
+
+
+    /**
+     * The controller servlet instance to which we are attached.
+     */
+    protected transient ActionServlet servlet = null;
+
+
+
+    /**
+     * Log the specified message if the current debugging detail level for
+     * this servlet has been set to an equal or higher value.  Otherwise,
+     * ignore this message.
+     *
+     * @param message Message to be logged
+     * @param level Debugging detail level of this message
+     */
+    public void log(String message, int level) {
+
+           servlet.log(message,level);
+
+    }
+
+
+    public void log(String message) {
+
+            servlet.log(message);
+
+    }
+
+    /**
+     * Get the class name of the MultipartRequestHandler implementation
+     *
+     * @return A qualified classname of the MultipartRequestHandler implementation
+     */
+     public String getMultipartClass() {
+        return servlet.multipartClass;
+    }
+
+
+    /**
+     * Set servlet to a MultipartRequestHandler.
+     * :FIXME: Should this be based on an "setServlet"
+     * interface or introspection for a setServlet method?
+     * Or, is it safer to just add the types we want as we want them?
+     */
+     public void setServletFor(MultipartRequestHandler object) {
+        object.setServlet(this.servlet);
+    }
+
+
+    /**
+     * Create object and set servlet property
+     *
+     */
+     public ActionServletWrapper (ActionServlet servlet) {
+        super();
+        this.servlet = servlet;
+    }
+
+}
diff --git a/src/share/org/apache/struts/digester/Digester.java b/src/share/org/apache/struts/digester/Digester.java
index 6d90e8e..a0ec8ce 100755
--- a/src/share/org/apache/struts/digester/Digester.java
+++ b/src/share/org/apache/struts/digester/Digester.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/Attic/Digester.java,v 1.19 2001/04/15 22:21:18 craigmcc Exp $
- * $Revision: 1.19 $
- * $Date: 2001/04/15 22:21:18 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/digester/Attic/Digester.java,v 1.19.2.1 2001/06/11 19:54:48 craigmcc Exp $
+ * $Revision: 1.19.2.1 $
+ * $Date: 2001/06/11 19:54:48 $
  *
  * ====================================================================
  * 
@@ -103,7 +103,7 @@
  * even from the same thread.</p>
  *
  * @author Craig McClanahan
- * @version $Revision: 1.19 $ $Date: 2001/04/15 22:21:18 $
+ * @version $Revision: 1.19.2.1 $ $Date: 2001/06/11 19:54:48 $
  */
 
 public class Digester extends HandlerBase {
@@ -385,7 +385,7 @@
 	if (rules != null) {
 	    //	    if (debug >= 3)
 	    //		log("  Firing 'body' events for " + rules.size() + " rules");
-	    String bodyText = this.bodyText.toString();
+	    String bodyText = this.bodyText.toString().trim();
 	    for (int i = 0; i < rules.size(); i++) {
 		try {
 		    ((Rule) rules.get(i)).body(bodyText);
diff --git a/src/share/org/apache/struts/taglib/bean/CookieTei.java b/src/share/org/apache/struts/taglib/bean/CookieTei.java
index 907f733..44f2b67 100644
--- a/src/share/org/apache/struts/taglib/bean/CookieTei.java
+++ b/src/share/org/apache/struts/taglib/bean/CookieTei.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/CookieTei.java,v 1.4 2001/02/12 01:26:57 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/02/12 01:26:57 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/CookieTei.java,v 1.4.2.1 2001/10/04 03:25:32 craigmcc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/10/04 03:25:32 $
  *
  * ====================================================================
  *
@@ -74,7 +74,7 @@
  * tag, identifying the scripting object(s) to be made visible.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/02/12 01:26:57 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/10/04 03:25:32 $
  */
 
 public class CookieTei extends TagExtraInfo {
@@ -85,14 +85,15 @@
      */
     public VariableInfo[] getVariableInfo(TagData data) {
 
+        String className = null;
         Object type = null;
         if (data.getAttribute("multiple") == null)
-            type = new Cookie("name", "value");
+            className = "javax.servlet.http.Cookie";
         else
-            type = new Cookie[0];
+            className = "javax.servlet.http.Cookie[]";
 	return new VariableInfo[] {
 	  new VariableInfo(data.getAttributeString("id"),
-	                   type.getClass().getName(),
+	                   className,
 	                   true,
 	                   VariableInfo.AT_BEGIN)
 	};
diff --git a/src/share/org/apache/struts/taglib/bean/HeaderTei.java b/src/share/org/apache/struts/taglib/bean/HeaderTei.java
index aaba232..a9cbf04 100644
--- a/src/share/org/apache/struts/taglib/bean/HeaderTei.java
+++ b/src/share/org/apache/struts/taglib/bean/HeaderTei.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/HeaderTei.java,v 1.4 2001/02/12 01:26:57 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/02/12 01:26:57 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/HeaderTei.java,v 1.4.2.1 2001/10/04 03:25:32 craigmcc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/10/04 03:25:32 $
  *
  * ====================================================================
  *
@@ -73,7 +73,7 @@
  * tag, identifying the scripting object(s) to be made visible.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/02/12 01:26:57 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/10/04 03:25:32 $
  */
 
 public class HeaderTei extends TagExtraInfo {
@@ -84,14 +84,14 @@
      */
     public VariableInfo[] getVariableInfo(TagData data) {
 
-        Object type = null;
+        String className = null;
         if (data.getAttribute("multiple") == null)
-            type = new String();
+            className = "java.lang.String";
         else
-            type = new String[0];
+            className = "java.lang.String[]";
 	return new VariableInfo[] {
 	  new VariableInfo(data.getAttributeString("id"),
-	                   type.getClass().getName(),
+                           className,
 	                   true,
 	                   VariableInfo.AT_BEGIN)
 	};
diff --git a/src/share/org/apache/struts/taglib/bean/IncludeTag.java b/src/share/org/apache/struts/taglib/bean/IncludeTag.java
index 396dc26..af647e3 100644
--- a/src/share/org/apache/struts/taglib/bean/IncludeTag.java
+++ b/src/share/org/apache/struts/taglib/bean/IncludeTag.java
@@ -1,5 +1,5 @@
 /*
- * $Id: IncludeTag.java,v 1.15 2001/05/14 17:54:56 craigmcc Exp $
+ * $Id: IncludeTag.java,v 1.15.2.1 2001/06/13 21:26:29 craigmcc Exp $
  * ====================================================================
  *
  * The Apache Software License, Version 1.1
@@ -63,6 +63,7 @@
 
 import java.io.BufferedInputStream;
 import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
@@ -92,7 +93,7 @@
  * wrapped response passed to RequestDispatcher.include().
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.15 $ $Date: 2001/05/14 17:54:56 $
+ * @version $Revision: 1.15.2.1 $ $Date: 2001/06/13 21:26:29 $
  */
 
 public class IncludeTag extends TagSupport {
@@ -246,10 +247,23 @@
 
 	URLConnection conn = null;
 	try {
+            // Set up the basic connection
 	    conn = url.openConnection();
 	    conn.setAllowUserInteraction(false);
 	    conn.setDoInput(true);
 	    conn.setDoOutput(false);
+            // Add a session id cookie if appropriate
+            HttpServletRequest request =
+                (HttpServletRequest) pageContext.getRequest();
+            if ((conn instanceof HttpURLConnection) &&
+                urlString.startsWith(request.getContextPath()) &&
+                (request.getRequestedSessionId() != null) &&
+                request.isRequestedSessionIdFromCookie()) {
+                StringBuffer sb = new StringBuffer("JSESSIONID=");
+                sb.append(request.getRequestedSessionId());
+                conn.setRequestProperty("Cookie", sb.toString());
+            }
+            // Connect to the requested resource
 	    conn.connect();
 	} catch (Exception e) {
             RequestUtils.saveException(pageContext, e);
diff --git a/src/share/org/apache/struts/taglib/bean/ParameterTei.java b/src/share/org/apache/struts/taglib/bean/ParameterTei.java
index 42e3a20..200bfd0 100644
--- a/src/share/org/apache/struts/taglib/bean/ParameterTei.java
+++ b/src/share/org/apache/struts/taglib/bean/ParameterTei.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/ParameterTei.java,v 1.4 2001/02/12 01:26:57 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/02/12 01:26:57 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/ParameterTei.java,v 1.4.2.1 2001/10/04 03:25:32 craigmcc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/10/04 03:25:32 $
  *
  * ====================================================================
  *
@@ -73,7 +73,7 @@
  * tag, identifying the scripting object(s) to be made visible.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/02/12 01:26:57 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/10/04 03:25:32 $
  */
 
 public class ParameterTei extends TagExtraInfo {
@@ -84,14 +84,14 @@
      */
     public VariableInfo[] getVariableInfo(TagData data) {
 
-        Object type = null;
+        String className = null;
         if (data.getAttribute("multiple") == null)
-            type = new String();
+            className = "java.lang.String";
         else
-            type = new String[0];
+            className = "java.lang.String[]";
 	return new VariableInfo[] {
 	  new VariableInfo(data.getAttributeString("id"),
-	                   type.getClass().getName(),
+                           className,
 	                   true,
 	                   VariableInfo.AT_BEGIN)
 	};
diff --git a/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java b/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java
index f5fbb7b..5345573 100644
--- a/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java
+++ b/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java,v 1.3 2001/05/05 00:54:33 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/05/05 00:54:33 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/BaseHandlerTag.java,v 1.3.2.3 2001/06/13 03:44:29 craigmcc Exp $
+ * $Revision: 1.3.2.3 $
+ * $Date: 2001/06/13 03:44:29 $
  *
  * ====================================================================
  *
@@ -71,7 +71,7 @@
  * appropriate implementations of these.
  *
  * @author Don Clasen
- * @version $Revision: 1.3 $ $Date: 2001/05/05 00:54:33 $
+ * @version $Revision: 1.3.2.3 $ $Date: 2001/06/13 03:44:29 $
  */
 
 public abstract class BaseHandlerTag extends BodyTagSupport {
@@ -162,6 +162,12 @@
     /** Identifier associated with component.  */
     private String styleId = null;
 
+// Other Common Attributes
+
+    /** The advisory title of this element. */
+    private String title = null;
+
+
     // ------------------------------------------------------------- Properties
 
 //  Navigation Management
@@ -387,6 +393,19 @@
         return styleId;
     }
 
+// Other Common Elements
+
+    /** Returns the advisory title attribute. */
+    public String getTitle() {
+        return title;
+    }
+
+    /** Sets the advisory title attribute. */
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+
     // --------------------------------------------------------- Public Methods
 
 
@@ -417,6 +436,7 @@
 	style = null;
 	styleClass = null;
         styleId = null;
+        title = null;
 
     }
 
@@ -445,6 +465,11 @@
             styles.append(styleId);
             styles.append("\"");
         }
+        if (title != null) {
+            styles.append(" title=\"");
+            styles.append(title);
+            styles.append("\"");
+        }
         return styles.toString();
     }
 
@@ -580,11 +605,11 @@
         }
 
         if (disabled) {
-            handlers.append(" disabled");
+            handlers.append(" disabled=\"disabled\"");
         }
 
         if (readonly) {
-            handlers.append(" readonly");
+            handlers.append(" readonly=\"readonly\"");
         }
 
     }
diff --git a/src/share/org/apache/struts/taglib/html/ButtonTag.java b/src/share/org/apache/struts/taglib/html/ButtonTag.java
index c215860..b0f2e59 100644
--- a/src/share/org/apache/struts/taglib/html/ButtonTag.java
+++ b/src/share/org/apache/struts/taglib/html/ButtonTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ButtonTag.java,v 1.3 2001/04/18 01:31:14 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/04/18 01:31:14 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ButtonTag.java,v 1.3.2.1 2001/06/01 17:11:45 craigmcc Exp $
+ * $Revision: 1.3.2.1 $
+ * $Date: 2001/06/01 17:11:45 $
  *
  * ====================================================================
  *
@@ -74,7 +74,7 @@
  * Renders an HTML BUTTON tag within the Struts framework.
  *
  * @author Don Clasen
- * @version $Revision: 1.3 $ $Date: 2001/04/18 01:31:14 $
+ * @version $Revision: 1.3.2.1 $ $Date: 2001/06/01 17:11:45 $
  */
 
 public class ButtonTag extends BaseHandlerTag {
@@ -154,6 +154,22 @@
     
 
     /**
+     * Save the associated label from the body content (if any).
+     * @exception JspException if a JSP exception has occurred
+     */
+    public int doAfterBody() throws JspException {
+
+        if (bodyContent != null) {
+            String value = bodyContent.getString().trim();
+            if (value.length() > 0)
+                text = value;
+        }
+        return (SKIP_BODY);
+
+    }
+
+
+    /**
      * Process the end of this tag.
      * @exception JspException if a JSP exception has occurred
      */
diff --git a/src/share/org/apache/struts/taglib/html/CheckboxTag.java b/src/share/org/apache/struts/taglib/html/CheckboxTag.java
index d7bcc03..664cd78 100644
--- a/src/share/org/apache/struts/taglib/html/CheckboxTag.java
+++ b/src/share/org/apache/struts/taglib/html/CheckboxTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/CheckboxTag.java,v 1.4 2001/04/18 01:31:14 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/04/18 01:31:14 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/CheckboxTag.java,v 1.4.2.2 2001/06/10 03:51:40 craigmcc Exp $
+ * $Revision: 1.4.2.2 $
+ * $Date: 2001/06/10 03:51:40 $
  *
  * ====================================================================
  *
@@ -76,7 +76,7 @@
  * Tag for input fields of type "checkbox".
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/04/18 01:31:14 $
+ * @version $Revision: 1.4.2.2 $ $Date: 2001/06/10 03:51:40 $
  */
 
 public class CheckboxTag extends BaseHandlerTag {
@@ -212,7 +212,7 @@
 	if (checked.equalsIgnoreCase("true")
             || checked.equalsIgnoreCase("yes")
 	    || checked.equalsIgnoreCase("on"))
-	    results.append(" checked");
+	    results.append(" checked=\"checked\"");
 	results.append(prepareEventHandlers());
 	results.append(prepareStyles());
 	results.append(">");
diff --git a/src/share/org/apache/struts/taglib/html/ErrorsTag.java b/src/share/org/apache/struts/taglib/html/ErrorsTag.java
index d68fdc7..fda4fe2 100644
--- a/src/share/org/apache/struts/taglib/html/ErrorsTag.java
+++ b/src/share/org/apache/struts/taglib/html/ErrorsTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ErrorsTag.java,v 1.8 2001/04/18 23:32:34 craigmcc Exp $
- * $Revision: 1.8 $
- * $Date: 2001/04/18 23:32:34 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ErrorsTag.java,v 1.8.2.1 2001/06/24 03:36:10 rleland Exp $
+ * $Revision: 1.8.2.1 $
+ * $Date: 2001/06/24 03:36:10 $
  *
  * ====================================================================
  *
@@ -98,7 +98,7 @@
  * </ul>
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.8 $ $Date: 2001/04/18 23:32:34 $
+ * @version $Revision: 1.8.2.1 $ $Date: 2001/06/24 03:36:10 $
  */
 
 public class ErrorsTag extends TagSupport {
@@ -237,30 +237,34 @@
         if (headerPresent)
             message = RequestUtils.message(pageContext, bundle,
                                            locale, "errors.header");
-	if (message != null) {
-	    results.append(message);
-	    results.append("\r\n");
-	}
         Iterator reports = null;
         if (property == null)
             reports = errors.get();
         else
             reports = errors.get(property);
+       // Render header iff this is a global tag or there is an error for this property
+       boolean propertyMsgPresent = reports.hasNext();
+       if ((message != null)&&(property == null) || propertyMsgPresent) {
+           results.append(message);
+           results.append("\r\n");
+       }
+
         while (reports.hasNext()) {
             ActionError report = (ActionError) reports.next();
             message = RequestUtils.message(pageContext, bundle,
                                            locale, report.getKey(),
                                            report.getValues());
-	    if (message != null) {
-		results.append(message);
-		results.append("\r\n");
+	        if (message != null) {
+		        results.append(message);
+		        results.append("\r\n");
+	        }
 	    }
-	}
         message = null;
         if (footerPresent)
             message = RequestUtils.message(pageContext, bundle,
                                            locale, "errors.footer");
-	if (message != null) {
+
+    if ((message != null)&&(property == null) || propertyMsgPresent) {
 	    results.append(message);
 	    results.append("\r\n");
 	}
diff --git a/src/share/org/apache/struts/taglib/html/FormTag.java b/src/share/org/apache/struts/taglib/html/FormTag.java
index 78c2282..0ff7d17 100644
--- a/src/share/org/apache/struts/taglib/html/FormTag.java
+++ b/src/share/org/apache/struts/taglib/html/FormTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v 1.13 2001/05/04 22:21:05 craigmcc Exp $
- * $Revision: 1.13 $
- * $Date: 2001/05/04 22:21:05 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FormTag.java,v 1.13.2.1 2001/11/05 04:53:24 martinc Exp $
+ * $Revision: 1.13.2.1 $
+ * $Date: 2001/11/05 04:53:24 $
  *
  * ====================================================================
  *
@@ -88,7 +88,7 @@
  * properties correspond to the various fields of the form.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.13 $ $Date: 2001/05/04 22:21:05 $
+ * @version $Revision: 1.13.2.1 $ $Date: 2001/11/05 04:53:24 $
  */
 
 public class FormTag extends TagSupport {
@@ -683,8 +683,8 @@
         int question = action.indexOf("?");
         if (question >= 0)
             value = value.substring(0, question);
-        int slash = action.lastIndexOf("/");
-        int period = action.lastIndexOf(".");
+        int slash = value.lastIndexOf("/");
+        int period = value.lastIndexOf(".");
         if ((period >= 0) && (period > slash))
             value = value.substring(0, period);
         if (value.startsWith("/"))
diff --git a/src/share/org/apache/struts/taglib/html/ImageTag.java b/src/share/org/apache/struts/taglib/html/ImageTag.java
index f9cb5bb..232a55d 100644
--- a/src/share/org/apache/struts/taglib/html/ImageTag.java
+++ b/src/share/org/apache/struts/taglib/html/ImageTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java,v 1.8 2001/04/19 21:09:30 craigmcc Exp $
- * $Revision: 1.8 $
- * $Date: 2001/04/19 21:09:30 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java,v 1.8.2.1 2001/09/23 18:48:49 martinc Exp $
+ * $Revision: 1.8.2.1 $
+ * $Date: 2001/09/23 18:48:49 $
  *
  * ====================================================================
  *
@@ -81,7 +81,7 @@
  * Tag for input fields of type "image".
  *
  * @author Oleg V Alexeev
- * @version $Revision: 1.8 $ $Date: 2001/04/19 21:09:30 $
+ * @version $Revision: 1.8.2.1 $ $Date: 2001/09/23 18:48:49 $
  */
 
 public class ImageTag extends SubmitTag {
@@ -89,6 +89,20 @@
 
     // ----------------------------------------------------- Instance Variables
 
+    
+    /**
+     * The alignment for this image.
+     */
+    protected String align = null;
+
+    public String getAlign() {
+        return (this.align);
+    }
+
+    public void setAlign(String align) {
+        this.align = align;
+    }
+
 
     /**
      * The default Locale for our server.
@@ -282,6 +296,11 @@
             results.append(tmp);
             results.append("\"");
         }
+        if (align != null) {
+            results.append(" align=\"");
+            results.append(align);
+            results.append("\"");
+        }
         if (border != null) {
             results.append(" border=\"");
             results.append(border);
diff --git a/src/share/org/apache/struts/taglib/html/ImgTag.java b/src/share/org/apache/struts/taglib/html/ImgTag.java
index 1096dab..b1abded 100755
--- a/src/share/org/apache/struts/taglib/html/ImgTag.java
+++ b/src/share/org/apache/struts/taglib/html/ImgTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java,v 1.10 2001/04/29 00:38:04 craigmcc Exp $
- * $Revision: 1.10 $
- * $Date: 2001/04/29 00:38:04 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java,v 1.10.2.1 2001/08/07 18:00:02 craigmcc Exp $
+ * $Revision: 1.10.2.1 $
+ * $Date: 2001/08/07 18:00:02 $
  *
  * ====================================================================
  *
@@ -95,7 +95,7 @@
  *
  * @author Michael Westbay
  * @author Craig McClanahan
- * @version $Revision: 1.10 $
+ * @version $Revision: 1.10.2.1 $
  */
 
 public class ImgTag extends BaseHandlerTag {
@@ -757,7 +757,7 @@
             Object value = RequestUtils.lookup(pageContext, paramName,
                                               paramProperty, paramScope);
             if (value != null)
-                src.append(value.toString());
+                src.append(URLEncoder.encode(value.toString()));
         }
 
 	// Just return the URL if there is no bean to look up
diff --git a/src/share/org/apache/struts/taglib/html/LinkTag.java b/src/share/org/apache/struts/taglib/html/LinkTag.java
index 37c6ac3..b2bdad9 100644
--- a/src/share/org/apache/struts/taglib/html/LinkTag.java
+++ b/src/share/org/apache/struts/taglib/html/LinkTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.14 2001/05/12 20:34:01 craigmcc Exp $
- * $Revision: 1.14 $
- * $Date: 2001/05/12 20:34:01 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.14.2.2 2001/06/11 17:39:52 craigmcc Exp $
+ * $Revision: 1.14.2.2 $
+ * $Date: 2001/06/11 17:39:52 $
  *
  * ====================================================================
  *
@@ -89,7 +89,7 @@
  * Generate a URL-encoded hyperlink to the specified URI.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.14 $ $Date: 2001/05/12 20:34:01 $
+ * @version $Revision: 1.14.2.2 $ $Date: 2001/06/11 17:39:52 $
  */
 
 public class LinkTag extends BaseHandlerTag {
@@ -326,6 +326,7 @@
             StringBuffer results = new StringBuffer("<a name=\"");
             results.append(linkName);
             results.append("\">");
+            ResponseUtils.write(pageContext, results.toString());
             return (EVAL_BODY_TAG);
         }
 
@@ -430,132 +431,4 @@
 
     }
 
-
-    /*
-
-        // Save any currently specified anchor string
-        String anchor = this.anchor;
-        int hash = href.indexOf('#');
-        if (hash >= 0) {
-            if (anchor == null)
-                anchor = href.substring(hash + 1);
-            href = href.substring(0, hash);
-        }
-
-        // Append the transaction token, if requested and it exists
-        if (transaction) {
-            HttpSession session = pageContext.getSession();
-            String token = null;
-            if (session != null)
-                token =
-                   (String) session.getAttribute(Action.TRANSACTION_TOKEN_KEY);
-            if (token != null) {
-                StringBuffer sb = new StringBuffer(href);
-                if (href.indexOf('?') < 0)
-                    sb.append('?');
-                else
-                    sb.append('&');
-                sb.append(Constants.TOKEN_KEY);
-                sb.append('=');
-                sb.append(token);
-                href = sb.toString();
-            }
-        }
-
-        // Append a single-parameter name and value, if requested
-        StringBuffer sb = new StringBuffer(href);
-        if ((paramId != null) && (paramName != null)) {
-            if (href.indexOf('?') < 0)
-                sb.append('?');
-            else
-                sb.append('&');
-            sb.append(paramId);
-            sb.append('=');
-            Object value = RequestUtils.lookup(pageContext, paramName,
-                                               paramProperty, paramScope);
-            if (value != null)
-                sb.append(value.toString());
-        }
-
-	// Just return the "href" attribute if there is no bean to look up
-	if ((property != null) && (name == null)) {
-	    JspException e = new JspException
-		(messages.getMessage("getter.name"));
-            RequestUtils.saveException(pageContext, e);
-            throw e;
-        }
-	if (name == null) {
-            if (anchor != null) {
-                sb.append('#');
-                sb.append(anchor);
-            }
-	    return (sb.toString());
-        }
-
-	// Look up the map we will be using
-        Map map = null;
-        try {
-            map = (Map) RequestUtils.lookup(pageContext, name,
-                                            property, scope);
-        } catch (ClassCastException e) {
-            RequestUtils.saveException(pageContext, e);
-            throw new JspException
-                (messages.getMessage("linkTag.type"));
-        }
-
-	// Append the required query parameters
-        href = sb.toString();
-	boolean question = (href.indexOf("?") >= 0);
-	Iterator keys = map.keySet().iterator();
-	while (keys.hasNext()) {
-	    String key = (String) keys.next();
-	    Object value = map.get(key);
-            if (value == null) {
-                if (question)
-                    sb.append('&');
-                else {
-                    sb.append('?');
-                    question = true;
-                }
-                sb.append(key);
-                sb.append('=');
-                // Interpret null as "no value specified"
-	    } else if (value instanceof String[]) {
-		String values[] = (String[]) value;
-		for (int i = 0; i < values.length; i++) {
-		    if (question)
-			sb.append('&');
-		    else {
-			sb.append('?');
-			question = true;
-		    }
-		    sb.append(key);
-		    sb.append('=');
-		    sb.append(URLEncoder.encode(values[i]));
-		}
-	    } else {
-		if (question)
-		    sb.append('&');
-		else {
-		    sb.append('?');
-		    question = true;
-		}
-		sb.append(key);
-		sb.append('=');
-		sb.append(URLEncoder.encode(value.toString()));
-	    }
-	}
-
-        // Append the anchor (if any)
-        if (anchor != null) {
-            sb.append('#');
-            sb.append(anchor);
-        }
-
-	// Return the final result
-	return (sb.toString());
-
-    */
-
-
 }
diff --git a/src/share/org/apache/struts/taglib/html/MultiboxTag.java b/src/share/org/apache/struts/taglib/html/MultiboxTag.java
index 3b096ad..310ac97 100644
--- a/src/share/org/apache/struts/taglib/html/MultiboxTag.java
+++ b/src/share/org/apache/struts/taglib/html/MultiboxTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/MultiboxTag.java,v 1.6 2001/04/18 23:45:02 craigmcc Exp $
- * $Revision: 1.6 $
- * $Date: 2001/04/18 23:45:02 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/MultiboxTag.java,v 1.6.2.3 2001/10/07 06:16:09 martinc Exp $
+ * $Revision: 1.6.2.3 $
+ * $Date: 2001/10/07 06:16:09 $
  *
  * ====================================================================
  *
@@ -83,7 +83,7 @@
  *
  * @author Ralph Schaer
  * @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2001/04/18 23:45:02 $
+ * @version $Revision: 1.6.2.3 $ $Date: 2001/10/07 06:16:09 $
  */
 
 public class MultiboxTag extends BaseHandlerTag {
@@ -210,7 +210,7 @@
             this.constant = bodyContent.getString().trim();
         if ("".equals(this.constant))
             this.constant = null;
-        return (SKIP_PAGE);
+        return (SKIP_BODY);
 
     }
 
@@ -273,7 +273,7 @@
 	}
 	for (int i = 0; i < values.length; i++) {
 	    if (value.equals(values[i])) {
-		results.append(" checked");
+		results.append(" checked=\"checked\"");
 		break;
 	    }
 	}
diff --git a/src/share/org/apache/struts/taglib/html/OptionTag.java b/src/share/org/apache/struts/taglib/html/OptionTag.java
index 9d995aa..38a9f31 100644
--- a/src/share/org/apache/struts/taglib/html/OptionTag.java
+++ b/src/share/org/apache/struts/taglib/html/OptionTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java,v 1.6 2001/05/05 00:54:33 craigmcc Exp $
- * $Revision: 1.6 $
- * $Date: 2001/05/05 00:54:33 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/OptionTag.java,v 1.6.2.3 2001/10/05 05:05:48 martinc Exp $
+ * $Revision: 1.6.2.3 $
+ * $Date: 2001/10/05 05:05:48 $
  *
  * ====================================================================
  *
@@ -82,7 +82,7 @@
  * the server if this option is selected.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.6 $ $Date: 2001/05/05 00:54:33 $
+ * @version $Revision: 1.6.2.3 $ $Date: 2001/10/05 05:05:48 $
  */
 
 public class OptionTag extends BodyTagSupport {
@@ -173,6 +173,34 @@
 
 
     /**
+     * The style associated with this tag.
+     */
+    private String style = null;
+
+    public String getStyle() {
+        return style;
+    }
+
+    public void setStyle(String style) {
+        this.style = style;
+    }
+
+
+    /**
+     * The named style class associated with this tag.
+     */
+    private String styleClass = null;
+
+    public String getStyleClass() {
+        return styleClass;
+    }
+
+    public void setStyleClass(String styleClass) {
+        this.styleClass = styleClass;
+    }
+
+
+    /**
      * The server value for this option, also used to match against the
      * current property value to determine whether this option should be
      * marked as selected.
@@ -248,9 +276,19 @@
 	results.append(value);
 	results.append("\"");
         if (disabled)
-            results.append(" disabled");
+            results.append(" disabled=\"disabled\"");
         if (selectTag.isMatched(value))
-	    results.append(" selected");
+	    results.append(" selected=\"selected\"");
+        if (style != null) {
+            results.append(" style=\"");
+            results.append(style);
+            results.append("\"");
+        }
+        if (styleClass != null) {
+            results.append(" class=\"");
+            results.append(styleClass);
+            results.append("\"");
+        }
 	results.append(">");
         String text = text();
 	if (text == null)
@@ -278,6 +316,8 @@
         disabled = false;
         key = null;
         locale = Action.LOCALE_KEY;
+	style = null;
+	styleClass = null;
         text = null;
 	value = null;
 
diff --git a/src/share/org/apache/struts/taglib/html/OptionsTag.java b/src/share/org/apache/struts/taglib/html/OptionsTag.java
index 9a54535..cbeb15c 100644
--- a/src/share/org/apache/struts/taglib/html/OptionsTag.java
+++ b/src/share/org/apache/struts/taglib/html/OptionsTag.java
@@ -165,6 +165,34 @@
 
 
     /**
+     * The style associated with this tag.
+     */
+    private String style = null;
+
+    public String getStyle() {
+        return style;
+    }
+
+    public void setStyle(String style) {
+        this.style = style;
+    }
+
+
+    /**
+     * The named style class associated with this tag.
+     */
+    private String styleClass = null;
+
+    public String getStyleClass() {
+        return styleClass;
+    }
+
+    public void setStyleClass(String styleClass) {
+        this.styleClass = styleClass;
+    }
+
+
+    /**
      * Process the start of this tag.
      *
      * @exception JspException if a JSP exception has occurred
@@ -193,20 +221,15 @@
         if (collection != null) {
             Iterator collIterator = getIterator(collection, null);
             while (collIterator.hasNext()) {
+
                 Object bean = collIterator.next();
                 Object value = null;
                 Object label = null;;
+
                 try {
                     value = PropertyUtils.getProperty(bean, property);
                     if (value == null)
                         value = "";
-                    if (labelProperty != null)
-                        label =
-                            PropertyUtils.getProperty(bean, labelProperty);
-                    else
-                        label = value;
-                    if (label == null)
-                        label = "";
                 } catch (IllegalAccessException e) {
                     throw new JspException
                         (messages.getMessage("getter.access",
@@ -221,10 +244,37 @@
                         (messages.getMessage("getter.method",
                                              property, collection));
                 }
+
+                try {
+                    if (labelProperty != null)
+                        label =
+                            PropertyUtils.getProperty(bean, labelProperty);
+                    else
+                        label = value;
+                    if (label == null)
+                        label = "";
+                } catch (IllegalAccessException e) {
+                    throw new JspException
+                        (messages.getMessage("getter.access",
+                                             labelProperty, collection));
+                } catch (InvocationTargetException e) {
+                    Throwable t = e.getTargetException();
+                    throw new JspException
+                        (messages.getMessage("getter.result",
+                                             labelProperty, t.toString()));
+                } catch (NoSuchMethodException e) {
+                    throw new JspException
+                        (messages.getMessage("getter.method",
+                                             labelProperty, collection));
+                }
+
+
                 String stringValue = value.toString();
                 addOption(sb, stringValue, label.toString(),
                           selectTag.isMatched(stringValue));
+
             }
+
         }
 
         // Otherwise, use the separate iterators mode to render options
@@ -240,10 +290,10 @@
 
               // Render the options tags for each element of the values coll.
               while (valuesIterator.hasNext()) {
-                  String value = (String) valuesIterator.next();
+                  String value = valuesIterator.next().toString();
                   String label = value;
                   if (labelsIterator.hasNext())
-                      label = (String) labelsIterator.next();
+                      label = labelsIterator.next().toString();
                   addOption(sb, value, label,
                             selectTag.isMatched(value));
               }
@@ -269,6 +319,8 @@
 	labelProperty = null;
 	name = null;
 	property = null;
+	style = null;
+	styleClass = null;
 
     }
 
@@ -292,7 +344,17 @@
         sb.append(value);
         sb.append("\"");
         if (matched)
-            sb.append(" selected");
+            sb.append(" selected=\"selected\"");
+        if (style != null) {
+            sb.append(" style=\"");
+            sb.append(style);
+            sb.append("\"");
+        }
+        if (styleClass != null) {
+            sb.append(" class=\"");
+            sb.append(styleClass);
+            sb.append("\"");
+        }
         sb.append(">");
         sb.append(ResponseUtils.filter(label));
         sb.append("</option>\r\n");
@@ -326,6 +388,9 @@
 	if (property != null) {
 	    try {
 		collection = PropertyUtils.getProperty(bean, property);
+                if (collection == null)
+                    throw new JspException
+                        (messages.getMessage("getter.property", property));
 	    } catch (IllegalAccessException e) {
 		throw new JspException
 		    (messages.getMessage("getter.access", property, name));
diff --git a/src/share/org/apache/struts/taglib/html/RadioTag.java b/src/share/org/apache/struts/taglib/html/RadioTag.java
index d92f8c8..a4f0f83 100644
--- a/src/share/org/apache/struts/taglib/html/RadioTag.java
+++ b/src/share/org/apache/struts/taglib/html/RadioTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/RadioTag.java,v 1.3 2001/04/18 01:31:15 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/04/18 01:31:15 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/RadioTag.java,v 1.3.2.2 2001/06/10 03:51:41 craigmcc Exp $
+ * $Revision: 1.3.2.2 $
+ * $Date: 2001/06/10 03:51:41 $
  *
  * ====================================================================
  *
@@ -77,7 +77,7 @@
  * Tag for input fields of type "radio".
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2001/04/18 01:31:15 $
+ * @version $Revision: 1.3.2.2 $ $Date: 2001/06/10 03:51:41 $
  */
 
 public class RadioTag extends BaseHandlerTag {
@@ -224,7 +224,7 @@
 	results.append(this.value);
 	results.append("\"");
 	if (value.equals(current))
-	    results.append(" checked");
+	    results.append(" checked=\"checked\"");
 	results.append(prepareEventHandlers());
 	results.append(prepareStyles());
 	results.append(">");
diff --git a/src/share/org/apache/struts/taglib/html/SelectTag.java b/src/share/org/apache/struts/taglib/html/SelectTag.java
index 42392c6..c739f6f 100644
--- a/src/share/org/apache/struts/taglib/html/SelectTag.java
+++ b/src/share/org/apache/struts/taglib/html/SelectTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java,v 1.3 2001/02/22 02:53:30 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/02/22 02:53:30 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/SelectTag.java,v 1.3.2.2 2001/06/10 03:51:41 craigmcc Exp $
+ * $Revision: 1.3.2.2 $
+ * $Date: 2001/06/10 03:51:41 $
  *
  * ====================================================================
  *
@@ -81,7 +81,7 @@
  * inside a form tag.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2001/02/22 02:53:30 $
+ * @version $Revision: 1.3.2.2 $ $Date: 2001/06/10 03:51:41 $
  */
 
 public class SelectTag extends BaseHandlerTag {
@@ -251,7 +251,7 @@
 	    results.append("\"");
 	}
 	if (multiple != null) {
-	    results.append(" multiple");
+	    results.append(" multiple=\"multiple\"");
 	}
 	if (size != null) {
 	    results.append(" size=\"");
diff --git a/src/share/org/apache/struts/taglib/html/package.html b/src/share/org/apache/struts/taglib/html/package.html
index afe17de..48bcfe0 100644
--- a/src/share/org/apache/struts/taglib/html/package.html
+++ b/src/share/org/apache/struts/taglib/html/package.html
@@ -8,7 +8,7 @@
 forms.</p>
 <div align="center">
   <p> <a href="#doc.Intro">[Introduction]</a> <a href="#doc.Form">[HTML Form Tags]</a>
-    <a href="#doc.Form">[Other HTML Tags]</a> </p>
+    <a href="#doc.Other">[Other HTML Tags]</a> </p>
 </div>
 
 <hr>
@@ -84,7 +84,7 @@
 &lt;/pre&gt;
 </pre>
 
-<p>Given this configuration, the HTML form tag for <code>input.jsp</code> will default
+<p>Given this configuration, the HTML form tag for <code>logon.jsp</code> will default
 to using "<code>logonForm</code>" as its name property and
 "<code>org.apache.struts.example.LogonForm</code>" as the attribute's type. This way you
 can manage the namespace for your framework components from the configuration file.</p>
@@ -321,7 +321,7 @@
 <p>Most often, error messages are displayed in a particular way. To make it easy
   to format your messages, you can also specific an <code>errors.header</code>
   and <code>errors.footer</code> string in your message resource. Typically, you
-  might want to render the messages in a different color, or set them up them
+  might want to render the messages in a different color, or set them up
   to appear in an unordered list. Using the <code>errors.header</code> and <code>errors.footer</code>
   strings keeps the setup codes out of your JSP until a message actually prints.</p>
 <pre>
@@ -379,7 +379,7 @@
   holding the value using the <code>paramName</code> attribute, and a particular
   property using <code>paramProperty</code>. </p>
 <p>So, a tag like</p>
-<pre>   &lt;html:link paramID=&quot;target&quot;
+<pre>   &lt;html:link paramId=&quot;target&quot;
      paramName=&quot;linkParams&quot; <br>     paramProperty=&quot;target&quot;
      paramScope=&quot;request&quot;<br>   &gt;detail.html&lt;/html:link&gt;</pre>
 <p>would correspond to something like</p>
@@ -392,7 +392,7 @@
   named bean identifies a value that can be converted to a String.
 <p>To pass multiple dynamic parameters, you can store them in a <code><a href="http://java.sun.com/j2se/1.3/docs/api/java/util/Map.html">java.util.Map</a></code>,
   and use the name of the map for the <code>paramName</code>. The map must then
-  contain one or more <code>paramIDs</code> and their corresponding values. As
+  contain one or more <code>paramIds</code> and their corresponding values. As
   the Map is processed, the keys are assumed to be the names of query parameters
   to be appended. The value associated with each key must be either a String or
   a String array representing the parameter value(s). If a String array is specified,
diff --git a/src/share/org/apache/struts/taglib/logic/IterateTag.java b/src/share/org/apache/struts/taglib/logic/IterateTag.java
index 1f68384..7532093 100644
--- a/src/share/org/apache/struts/taglib/logic/IterateTag.java
+++ b/src/share/org/apache/struts/taglib/logic/IterateTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/IterateTag.java,v 1.11 2001/04/29 01:26:19 craigmcc Exp $
- * $Revision: 1.11 $
- * $Date: 2001/04/29 01:26:19 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/IterateTag.java,v 1.11.2.1 2001/06/14 04:24:27 martinc Exp $
+ * $Revision: 1.11.2.1 $
+ * $Date: 2001/06/14 04:24:27 $
  *
  * ====================================================================
  *
@@ -88,7 +88,7 @@
  * or a Map (which includes Hashtables) whose elements will be iterated over.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.11 $ $Date: 2001/04/29 01:26:19 $
+ * @version $Revision: 1.11.2.1 $ $Date: 2001/06/14 04:24:27 $
  */
 
 public class IterateTag extends BodyTagSupport {
@@ -188,6 +188,20 @@
 
 
     /**
+     * The name of the scripting variable to be exposed as the current index.
+     */
+    protected String indexId = null;
+
+    public String getIndexId() {
+	return (this.indexId);
+    }
+
+    public void setIndexId(String indexId) {
+	this.indexId = indexId;
+    }
+
+
+    /**
      * The length value or attribute name (<=0 means no limit).
      */
     protected String length = null;
@@ -366,6 +380,8 @@
                 pageContext.setAttribute(id, element);
 	    lengthCount++;
             started = true;
+            if (indexId != null)
+                pageContext.setAttribute(indexId, new Integer(getIndex()));
 	    return (EVAL_BODY_TAG);
         } else
             return (SKIP_BODY);
@@ -397,6 +413,8 @@
             else
                 pageContext.setAttribute(id, element);
 	    lengthCount++;
+            if (indexId != null)
+                pageContext.setAttribute(indexId, new Integer(getIndex()));
 	    return (EVAL_BODY_TAG);
 	} else
 	    return (SKIP_BODY);
diff --git a/src/share/org/apache/struts/taglib/logic/IterateTei.java b/src/share/org/apache/struts/taglib/logic/IterateTei.java
index bb13485..cd5d1c2 100644
--- a/src/share/org/apache/struts/taglib/logic/IterateTei.java
+++ b/src/share/org/apache/struts/taglib/logic/IterateTei.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/IterateTei.java,v 1.4 2001/02/12 21:49:56 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/02/12 21:49:56 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/IterateTei.java,v 1.4.2.1 2001/06/14 04:24:27 martinc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/06/14 04:24:27 $
  *
  * ====================================================================
  *
@@ -73,7 +73,7 @@
  * tag, identifying the scripting object(s) to be made visible.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/02/12 21:49:56 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/06/14 04:24:27 $
  */
 
 public class IterateTei extends TagExtraInfo {
@@ -87,13 +87,26 @@
         String type = data.getAttributeString("type");
         if (type == null)
             type = "java.lang.Object";
+        VariableInfo typeInfo = new VariableInfo(
+                data.getAttributeString("id"),
+	        type,
+	        true,
+	        VariableInfo.NESTED);
 
-	return new VariableInfo[] {
-	  new VariableInfo(data.getAttributeString("id"),
-	                   type,
-	                   true,
-	                   VariableInfo.NESTED)
-	};
+        String indexId = data.getAttributeString("indexId");
+        VariableInfo indexIdInfo = null;
+        if (indexId != null)
+            indexIdInfo = new VariableInfo(
+                indexId,
+	        "java.lang.Integer",
+	        true,
+	        VariableInfo.NESTED);
+
+        if (indexIdInfo == null) {
+            return new VariableInfo[] { typeInfo };
+        } else {
+            return new VariableInfo[] { typeInfo, indexIdInfo };
+        }
 
     }
 
diff --git a/src/share/org/apache/struts/taglib/logic/PresentTag.java b/src/share/org/apache/struts/taglib/logic/PresentTag.java
index 2cfc650..677ecda 100644
--- a/src/share/org/apache/struts/taglib/logic/PresentTag.java
+++ b/src/share/org/apache/struts/taglib/logic/PresentTag.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/PresentTag.java,v 1.7 2001/02/12 21:49:58 craigmcc Exp $
- * $Revision: 1.7 $
- * $Date: 2001/02/12 21:49:58 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/logic/PresentTag.java,v 1.7.2.1 2001/06/11 17:34:40 craigmcc Exp $
+ * $Revision: 1.7.2.1 $
+ * $Date: 2001/06/11 17:34:40 $
  *
  * ====================================================================
  *
@@ -77,7 +77,7 @@
  * is present for this request.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.7 $ $Date: 2001/02/12 21:49:58 $
+ * @version $Revision: 1.7.2.1 $ $Date: 2001/06/11 17:34:40 $
  */
 
 public class PresentTag extends ConditionalTagBase {
@@ -133,8 +133,13 @@
                 getHeader(header);
             present = (value != null);
         } else if (name != null) {
-            Object value =
-                RequestUtils.lookup(pageContext, name, property, scope);
+            Object value = null;
+            try {
+                value =
+                    RequestUtils.lookup(pageContext, name, property, scope);
+            } catch (JspException e) {
+                value = null;
+            }
             present = (value != null);
         } else if (parameter != null) {
             String value =
diff --git a/src/share/org/apache/struts/taglib/logic/package.html b/src/share/org/apache/struts/taglib/logic/package.html
index c92ae65..1a8f8b6 100644
--- a/src/share/org/apache/struts/taglib/logic/package.html
+++ b/src/share/org/apache/struts/taglib/logic/package.html
@@ -31,8 +31,8 @@
 <a name="doc.Functionality"></a>
 <h3>Logic Tag Functionality<a name="doc.Functionality"></a></h3>
 <p> The functionality of the logic tags can be divided into four groups:</p>
-<p><b>Value Comparisions -</b> The purpose of these tags is to print out the body
-  of the tag if the comparision evaluates to <i>true. </i></p>
+<p><b>Value Comparisons -</b> The purpose of these tags is to print out the body
+  of the tag if the comparison evaluates to <i>true. </i></p>
 <ul>
   <li><b><a href="../../../../../../struts-logic.html#equal">equal,</a> <a href="../../../../../../struts-logic.html#notEqual">notEqual</a></b>
   </li>
@@ -59,26 +59,26 @@
 <p>Each of the four groups of logic tags have a common set of attributes associated
   with them. :</p>
 <blockquote>
-  <p><b>Value Comparisions</b> (equal, notEqual, greaterEqual, lessEqual, greaterThan,
+  <p><b>Value Comparisons</b> (equal, notEqual, greaterEqual, lessEqual, greaterThan,
     lessThan, present, notPresent)</p>
-  <p>Each of the value comparision tags takes a <i>value</i> and compares it to
-    the value of a comparision attribute. If the value given can be successfully
-    converted to a <i>float</i> or <i>double</i>, then a number comparision is
-    performed on the value given and the value of the comparision attribute. Otherwise
-    a String comparision is performed. You have to specify one of the comparision
+  <p>Each of the value comparison tags takes a <i>value</i> and compares it to
+    the value of a comparison attribute. If the value given can be successfully
+    converted to a <i>float</i> or <i>double</i>, then a number comparison is
+    performed on the value given and the value of the comparison attribute. Otherwise
+    a String comparison is performed. You have to specify one of the comparison
     attributes: <i>cookie</i>, <i>header</i>, <i>parameter</i>, <i>property</i>
-    or <i>name. </i>For each of the examples, the tag &quot;<i>someComparisionTag&quot;</i>can
-    be replaced by any of the value comparision tags.</p>
+    or <i>name. </i>For each of the examples, the tag &quot;<i>someComparisonTag&quot;</i>can
+    be replaced by any of the value comparison tags.</p>
   <ul>
     <li>value - the value to which this tag is going to compare, used in conjunction
-      with one of the comparision attributes: <i>cookie</i>, <i>header</i>, <i>parameter</i>,
+      with one of the comparison attributes: <i>cookie</i>, <i>header</i>, <i>parameter</i>,
       <i>and property</i> and/or <i>name. </i></li>
     <li>cookie - the name of the cookie to compare to <i>value</i>
       <ul>
         <li>example:
-          <pre>&lt;logic:<i>someComparisionTag</i> value=&quot;someUserName&quot; cookie=&quot;userName&quot;&gt;
+          <pre>&lt;logic:<i>someComparisonTag</i> value=&quot;someUserName&quot; cookie=&quot;userName&quot;&gt;
   User Logged In
-&lt;/logic:<i>someComparisionTag</i>&gt;
+&lt;/logic:<i>someComparisonTag</i>&gt;
 </pre>
         </li>
       </ul>
@@ -86,9 +86,9 @@
     <li>header - the name of the HTTP header to compare to <i>value</i>
       <ul>
         <li>example:
-          <pre>&lt;logic:<i>someComparisionTag</i> value=&quot;en_US&quot; header=&quot;Accept-Language&quot;&gt;
+          <pre>&lt;logic:<i>someComparisonTag</i> value=&quot;en_US&quot; header=&quot;Accept-Language&quot;&gt;
   Welcome English-speaking User*
-&lt;/logic:<i>someComparisionTag</i>&gt;
+&lt;/logic:<i>someComparisonTag</i>&gt;
 </pre>
         </li>
         <li>
@@ -107,9 +107,9 @@
   pageContext.setAttribute(&quot;testString&quot;, testString, PageContext.PAGE_SCOPE);
 %&gt;
 &lt;jsp:useBean id=&quot;testString&quot; scope=&quot;page&quot; type=&quot;java.lang.String&quot; /&gt;
-&lt;logic:<i>someComparisionTag</i> name=&quot;testString&quot; value=&quot;pantalones&quot;&gt;
+&lt;logic:<i>someComparisonTag</i> name=&quot;testString&quot; value=&quot;pantalones&quot;&gt;
   Usted tiene pantalones!
-&lt;/logic:<i>someComparision</i>&gt;
+&lt;/logic:<i>someComparison</i>&gt;
 </pre>
         </li>
       </ul>
@@ -117,9 +117,9 @@
     <li>parameter - the name of the request parameter to compare to <i>value</i>
       <ul>
         <li>example:
-          <pre>&lt;logic:<i>someComparisionTag</i> value=&quot;&quot; parameter=&quot;username&quot;&gt;
+          <pre>&lt;logic:<i>someComparisonTag</i> value=&quot;&quot; parameter=&quot;username&quot;&gt;
   Error: a username must be specified
-&lt;/logic:<i>someComparisionTag</i>&gt;
+&lt;/logic:<i>someComparisonTag</i>&gt;
 </pre>
         </li>
       </ul>
@@ -136,8 +136,8 @@
       scope&quot; </li>
   </ul>
   <p><b>Substring Matching</b> (match, notMatch)</p>
-  <p>The substring matching tags take all the same arguments as the value comparision
-    tags. You compare the String specified by <i>value</i> to any of the comparision
+  <p>The substring matching tags take all the same arguments as the value comparison
+    tags. You compare the String specified by <i>value</i> to any of the comparison
     values you give it, specified by <i>cookie</i>, <i>header</i>, <i>parameter</i>,
     <i>property</i> or <i>name.</i> Note that in the examples, <i>matchTag</i>
     corresponds either the <i>match </i>or <i>notMatch</i> tag. Matching tags
@@ -149,13 +149,13 @@
       matched to the end of the String
       <ul>
         <li>example:
-          <pre>&lt;logic:<i>matchTag</i> parameter=&quot;action&quot; value=&quot;processLogin&quot;&gt;
+          <pre>&lt;logic:<i>matchTag</i> parameter=&quot;action&quot; value=&quot;processLogin&quot; location=&quot;start&quot;&gt;
   Processing Login....
 &lt;/logic:<i>matchTag</i>&gt;
 
-Basically, in this short example, a request parameter &quot;action&quot;
-was compared to see if it was equal to the String value &quot;processLogin&quot;.
-In this case, <i>matchTag</i> would have to be &lt;logic:match&gt;.
+In this example, a request parameter &quot;action&quot; was compared to see if
+its value started with the String &quot;processLogin&quot;. In this case,
+<i>matchTag</i> would have to be &lt;logic:match&gt;.
 </pre>
         </li>
       </ul>
@@ -183,7 +183,7 @@
     <li>name - The logical name of the ActionForward to use</li>
   </ul>
   <p><b>Collection Utilities</b> (iterate)</p>
-  <p>The <i>iterate</i> tag is responsible for executing it's body content once
+  <p>The <i>iterate</i> tag is responsible for executing its body content once
     for every element inside of the specified Collection. There is one required
     attribute:</p>
   <ul>
@@ -200,7 +200,7 @@
           <pre>&lt;%
   java.util.Vector vector = new java.util.Vector();
   vector.add(new Integer(12));
-  vector.add(new Integer(5))
+  vector.add(new Integer(5));
  %&gt;
 </pre>
         </li>
@@ -209,9 +209,9 @@
   </ul>
   <blockquote>
     <blockquote>
-      <pre>&lt;bean:iterate id=&quot;myCollectionElement&quot; collection=&quot;&lt;%= vector %&gt;&quot;&gt;
+      <pre>&lt;logic:iterate id=&quot;myCollectionElement&quot; collection=&quot;&lt;%= vector %&gt;&quot;&gt;
 <i> Do something with myCollectionElement</i>
-&lt;/bean:iterate&gt;
+&lt;/logic:iterate&gt;
 </pre>
     </blockquote>
   </blockquote>
@@ -280,7 +280,7 @@
 </blockquote>
 <h3>Logic Examples</h3>
 <blockquote>
-  <p><b>Value Comparisions</b></p>
+  <p><b>Value Comparisons</b></p>
   <blockquote>
     <p><u></u><u></u><u>Logic Equivalence Tags (equal, notEqual, greaterEqual,
       lessEqual, lessThan, greaterThan)</u></p>
@@ -339,7 +339,7 @@
         is higher or lower than 7, and prints out a hint. As said before, this
         is a horribly designed small application, with no validity checks on the
         number input, but shows the basic usage of the logic equal tags</p>
-      <p>For String comparisions, the equal tags use the java.lang.String.compareTo()
+      <p>For String comparisons, the equal tags use the java.lang.String.compareTo()
         method. See the javadocs on the compareTo() method for more information,
         located <a href="http://www.javasoft.com/products/jdk/1.2/docs/api/java/lang/String.html#compareTo(java.lang.Object)">here</a>.</p>
     </blockquote>
diff --git a/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java b/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java
index e69730b..291d664 100644
--- a/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java
+++ b/src/share/org/apache/struts/upload/BufferedMultipartInputStream.java
@@ -2,6 +2,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
 
 /**
  * This class implements buffering for an InputStream as well as a
@@ -9,60 +10,60 @@
  * readLine() method.
  */
 public class BufferedMultipartInputStream extends InputStream {
-   
+
     /**
      * The underlying InputStream used by this class
      */
     protected InputStream inputStream;
-    
+
     /**
      * The byte array used to hold buffered data
      */
     protected byte[] buffer;
-    
+
     /**
      * The current offset we're at in the buffer's byte array
      */
     protected int bufferOffset = 0;
-    
+
     /**
      * The size of the byte array buffer
      */
     protected int bufferSize = 8192;
-    
+
     /**
      * The number of bytes read from the underlying InputStream that are
      * in the buffer
      */
     protected int bufferLength = 0;
-    
+
     /**
      * The total number of bytes read so far
      */
     protected int totalLength = 0;
-    
+
     /**
      * The content length of the multipart data
      */
     protected long contentLength;
-    
+
     /**
      * The maximum allowed size for the multipart data, or -1 for an unlimited
      * maximum file length
      */
     protected long maxSize = -1;
-    
+
     /**
      * Whether or not bytes up to the Content-Length have been read
      */
     protected boolean contentLengthMet = false;
-    
+
     /**
      * Whether or not bytes up to the maximum length have been read
      */
     protected boolean maxLengthMet = false;
-    
-    
+
+
     /**
      * Public constructor for this class, just wraps the InputStream
      * given
@@ -80,14 +81,14 @@
         this.bufferSize = bufferSize;
         this.contentLength = contentLength;
         this.maxSize = maxSize;
-        
+
         if (maxSize < contentLength) {
             throw new MaxLengthExceededException(maxSize);
         }
         buffer = new byte[bufferSize];
         fill();
     }
-    
+
     /**
      * This method returns the number of available bytes left to read
      * in the buffer before it has to be refilled
@@ -95,50 +96,50 @@
     public int available() {
         return bufferLength - bufferOffset;
     }
-    
+
     /**
      * This method attempts to close the underlying InputStream
      */
     public void close() throws IOException {
         inputStream.close();
     }
-    
+
     /**
      * This method calls on the mark() method of the underlying InputStream
      */
     public void mark(int position) {
-        inputStream.mark(position);  
-    } 
-    
+        inputStream.mark(position);
+    }
+
     /**
      * This method calls on the markSupported() method of the underlying InputStream
      * @return Whether or not the underlying InputStream supports marking
      */
     public boolean markSupported() {
-        return inputStream.markSupported();        
+        return inputStream.markSupported();
     }
-    
+
     /**
      * @return true if the maximum length has been reached, false otherwise
      */
     public boolean maxLengthMet() {
         return maxLengthMet;
     }
-    
+
     /**
      * @return true if the content length has been reached, false otherwise
      */
     public boolean contentLengthMet() {
         return contentLengthMet;
     }
-    
+
     /**
      * This method returns the next byte in the buffer, and refills it if necessary.
      * @return The next byte read in the buffer, or -1 if the end of the stream has
      *         been reached
      */
     public int read() throws IOException {
-        
+
         if (maxLengthMet) {
             throw new MaxLengthExceededException(maxSize);
         }
@@ -148,34 +149,34 @@
         if (buffer == null) {
             return -1;
         }
-        
-        if (bufferOffset < bufferLength) {            
-            return (int)(char) buffer[bufferOffset++];            
+
+        if (bufferOffset < bufferLength) {
+            return (int)(char) buffer[bufferOffset++];
         }
         fill();
-        return read();        
+        return read();
     }
-    
+
     /**
      * This method populates the byte array <code>b</code> with data up to
      * <code>b.length</code> bytes
      */
     public int read(byte[] b) throws IOException {
-        return read(b, 0, b.length);        
+        return read(b, 0, b.length);
     }
-    
+
     /**
-     * This method populates the byte array <code>b</code> with data up to 
+     * This method populates the byte array <code>b</code> with data up to
      * <code>length</code> starting at b[offset]
      */
     public int read(byte[] b, int offset, int length) throws IOException {
-        
-        int count = 0;
+
         int read = read();
         if (read == -1) {
             return -1;
         }
-        
+        int count = 1;
+
         while ((read != -1) && (count < length)) {
             b[offset] = (byte) read;
             read = read();
@@ -184,20 +185,20 @@
         }
         return count;
     }
-    
+
     /**
      * This method reads into the byte array <code>b</code> until
      * a newline ('\n') character is encountered or the number of bytes
      * specified by <code>length</code> have been read
      */
     public int readLine(byte[] b, int offset, int length) throws IOException {
-        
+
         int count = 0;
         int read = read();
         if (read == -1) {
             return -1;
         }
-        
+
         while ((read != -1) && (count < length)) {
             if (read == '\n')
                 break;
@@ -208,13 +209,34 @@
         }
         return count;
     }
-    
+
+    /**
+     * This method reads a line, regardless of length.
+     * @return A byte array representing the line.
+     */
+    public byte[] readLine() throws IOException {
+
+        int read = read();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+         // return null if there are no more bytes to read
+        if( -1 == read )
+            return null;
+
+        while ((read != -1) && (read != '\n')) {
+            baos.write(read);
+            read = read();
+        }
+
+        return baos.toByteArray();
+    }
+
     /**
      * This method makes a call to the reset() method of the underlying
      * InputStream
      */
     public void reset() throws IOException {
-        inputStream.reset();        
+        inputStream.reset();
     }
 
     /**
@@ -248,7 +270,7 @@
             else {
                 bufferLength = bytesRead;
                 totalLength += bytesRead;
-                bufferOffset = 0;            
+                bufferOffset = 0;
             }
         }
     }
diff --git a/src/share/org/apache/struts/upload/MultipartIterator.java b/src/share/org/apache/struts/upload/MultipartIterator.java
index cd86266..63a80d6 100755
--- a/src/share/org/apache/struts/upload/MultipartIterator.java
+++ b/src/share/org/apache/struts/upload/MultipartIterator.java
@@ -21,7 +21,7 @@
  * <pre>
  *      MultipartIterator iterator = new MultipartIterator(request);
  *      MultipartElement element;
- * 
+ *
  *      while ((element = iterator.getNextElement()) != null) {
  *           //do something with element
  *      }
@@ -31,64 +31,64 @@
  * @author Mike Schachter
  */
 public class MultipartIterator {
-    
+
     /**
      * The maximum size in bytes of the buffer used to read lines [4K]
      */
     public static int MAX_LINE_SIZE = 4096;
-    
+
     /**
      * The request instance for this class
      */
     protected HttpServletRequest request;
-    
+
     /**
      * The input stream instance for this class
      */
     protected BufferedMultipartInputStream inputStream;
-    
+
     /**
      * The boundary for this multipart request
      */
     protected String boundary;
-    
+
     /**
      * The byte array representing the boundary for this multipart request
      */
     protected byte[] boundaryBytes;
-    
+
     /**
      * Whether or not the input stream is finished
      */
     protected boolean contentRead = false;
-    
+
     /**
      * The maximum file size in bytes allowed. Ignored if -1
      */
     protected long maxSize = -1;
-    
+
     /**
      * The total bytes read from this request
      */
     protected long totalLength = 0;
-    
+
     /**
      * The content length of this request
      */
     protected int contentLength;
-    
+
     /**
      * The size in bytes written to the filesystem at a time [20K]
      */
     protected int diskBufferSize = 2 * 10240;
-    
+
     /**
      * The amount of data read from a request at a time.
      * This also represents the maximum size in bytes of
      * a line read from the request [4KB]
      */
     protected int bufferSize = 4096;
-    
+
     /**
      * The temporary directory to store files
      */
@@ -97,13 +97,13 @@
     /**
      * Constructs a MultipartIterator with a default buffer size and no file size
      * limit
-     * 
+     *
      * @param request The multipart request to iterate
      */
     public MultipartIterator(HttpServletRequest request) throws ServletException{
         this(request, -1);
     }
-    
+
     /**
      * Constructs a MultipartIterator with the specified buffer size and
      * no file size limit
@@ -112,10 +112,10 @@
      * @param bufferSize The size in bytes that should be read from the input
      *                   stream at a times
      */
-    public MultipartIterator(HttpServletRequest request, int bufferSize) throws ServletException {        
+    public MultipartIterator(HttpServletRequest request, int bufferSize) throws ServletException {
        this (request, bufferSize, -1);
     }
-    
+
     /**
      * Constructs a MultipartIterator with the specified buffer size and
      * the specified file size limit in bytes
@@ -125,18 +125,18 @@
      *                   stream at a times
      * @param maxSize The maximum size in bytes allowed for a multipart element's data
      */
-    public MultipartIterator(HttpServletRequest request, int bufferSize, long maxSize) 
+    public MultipartIterator(HttpServletRequest request, int bufferSize, long maxSize)
                                                                  throws ServletException {
-                         
-        this(request, bufferSize, maxSize, null);                                                                 
-        
+
+        this(request, bufferSize, maxSize, null);
+
     }
-    
+
     public MultipartIterator(HttpServletRequest request,
                              int bufferSize,
                              long maxSize,
                              String tempDir) throws ServletException {
-                                 
+
         this.request = request;
         this.maxSize = maxSize;
         if (bufferSize > -1) {
@@ -151,7 +151,7 @@
         }
         parseRequest();
     }
-    
+
     /**
      * Retrieves the next element in the iterator if one exists.
      *
@@ -166,18 +166,18 @@
         //retrieve the "Content-Disposition" header
         //and parse
         String disposition = readLine();
-        
-        
+
+
         if ((disposition != null) && (disposition.startsWith("Content-Disposition"))) {
             String name = parseDispositionName(disposition);
             String filename = parseDispositionFilename(disposition);
-                                   
+
             String contentType = null;
             boolean isFile = (filename != null);
-            
+
             if (isFile) {
                 filename = new File(filename).getName();
-                
+
                 //check for windows filenames,
                 //from linux jdk's the entire filepath
                 //isn't parsed correctly from File.getName()
@@ -187,29 +187,29 @@
                     colonIndex = filename.indexOf("\\\\");
                 }
                 int slashIndex = filename.lastIndexOf("\\");
-                
+
                 if ((colonIndex > -1) && (slashIndex > -1)) {
                     //then consider this filename to be a full
                     //windows filepath, and parse it accordingly
                     //to retrieve just the file name
                     filename = filename.substring(slashIndex+1, filename.length());
                 }
-            
+
                 //get the content type
                 contentType = readLine();
                 contentType = parseContentType(contentType);
             }
-            
-           
-            
+
+
+
             //ignore next line (whitespace) (unless it's a file
             //without content-type)
 	    if (! ((isFile) && contentType == null)) {
 		readLine();
             }
-            
+
             MultipartElement element = null;
-            
+
             //process a file element
             if (isFile) {
                 try {
@@ -218,6 +218,7 @@
 
                     element = new MultipartElement(name, filename, contentType, elementFile);
                 } catch (IOException ioe) {
+                    ioe.printStackTrace(System.err);
                     throw new ServletException("IOException while reading file element: " + ioe.getMessage(), ioe);
                 }
             }
@@ -240,13 +241,13 @@
                         textData.setLength(textData.length()-1);
                     }
                 }
-                
+
                 //create the element
                 element = new MultipartElement(name, textData.toString());
             }
             return element;
-        }       
-        
+        }
+
         //reset stream
         if (inputStream.markSupported()) {
             try {
@@ -257,9 +258,9 @@
                     ioe.getMessage());
             }
         }
-        return null;       
+        return null;
     }
-    
+
     /**
      * Set the maximum amount of bytes read from a line at one time
      *
@@ -268,7 +269,7 @@
     public void setBufferSize(int bufferSize) {
         this.bufferSize = bufferSize;
     }
-    
+
     /**
      * Get the maximum amount of bytes read from a line at one time
      *
@@ -277,7 +278,7 @@
     public int getBufferSize() {
         return bufferSize;
     }
-    
+
     /**
      * Set the maximum post data size allowed for a multipart request
      * @param maxSize The maximum post data size in bytes, set to <code>-1</code>
@@ -286,26 +287,26 @@
     public void setMaxSize(long maxSize) {
         this.maxSize = maxSize;
     }
-    
-    /** 
+
+    /**
      * Get the maximum post data size allowed for a multipart request
      * @return The maximum post data size in bytes
      */
     public long getMaxSize() {
         return maxSize;
     }
-    
+
     /**
      * Handles retrieving the boundary and setting the input stream
      */
     protected void parseRequest() throws ServletException {
-             
+
         contentLength = request.getContentLength();
-        
+
         //set boundary
         boundary = parseBoundary(request.getContentType());
         boundaryBytes = boundary.getBytes();
-        
+
         try {
             //set the input stream
             inputStream = new BufferedMultipartInputStream(request.getInputStream(),
@@ -316,23 +317,23 @@
             if (inputStream.markSupported()) {
                 inputStream.mark(contentLength+1);
             }
-                
+
         }
         catch (IOException ioe) {
-            throw new ServletException("Problem while reading request: " + 
+            throw new ServletException("Problem while reading request: " +
                 ioe.getMessage(), ioe);
         }
-       
+
         if ((boundary == null) || (boundary.length() < 1)) {
             //try retrieving the header through more "normal" means
             boundary = parseBoundary(request.getHeader("Content-type"));
         }
-        
+
         if ((boundary == null) || (boundary.length() < 1)) {
             throw new ServletException("MultipartIterator: cannot retrieve boundary " +
                                        "for multipart request");
         }
-        
+
         //read first line
         try {
 	    String firstLine = readLine();
@@ -350,37 +351,39 @@
             throw new ServletException("MultipartIterator: encoding \"ISO-8859-1\" not supported");
         }
     }
-      
+
     /**
-     * Parses a content-type String for the boundary.  Appends a 
+     * Parses a content-type String for the boundary.  Appends a
      * "--" to the beginning of the boundary, because thats the
      * real boundary as opposed to the shortened one in the
      * content type.
      */
     public static String parseBoundary(String contentType) {
         if (contentType.lastIndexOf("boundary=") != -1) {
-            String _boundary = "--" + 
+            String _boundary = "--" +
                                contentType.substring(contentType.lastIndexOf("boundary=")+9);
             if (_boundary.endsWith("\n")) {
                 //strip it off
                 return _boundary.substring(0, _boundary.length()-1);
             }
-            return _boundary; 
+            return _boundary;
         }
-        return null;      
+        return null;
     }
-    
+
     /**
      * Parses the "Content-Type" line of a multipart form for a content type
      *
-     * @param contentTypeString A String reprsenting the Content-Type line, 
+     * @param contentTypeString A String reprsenting the Content-Type line,
      *        with a trailing "\n"
      * @return The content type specified, or <code>null</code> if one can't be
      *         found.
      */
     public static String parseContentType(String contentTypeString) {
         int nameIndex = contentTypeString.indexOf("Content-Type: ");
-        
+        if (nameIndex == -1)
+            nameIndex = contentTypeString.indexOf("\n");
+
         if (nameIndex != -1) {
             int endLineIndex = contentTypeString.indexOf("\n");
             if (endLineIndex == -1) {
@@ -390,10 +393,10 @@
         }
         return null;
     }
-    
+
     /**
      * Retrieves the "name" attribute from a content disposition line
-     * 
+     *
      * @param dispositionString The entire "Content-disposition" string
      * @return <code>null</code> if no name could be found, otherwise,
      *         returns the name
@@ -402,8 +405,8 @@
     public static String parseDispositionName(String dispositionString) {
         return parseForAttribute("name", dispositionString);
     }
-    
-    /** 
+
+    /**
      * Retrieves the "filename" attribute from a content disposition line
      *
      * @param dispositionString The entire "Content-disposition" string
@@ -414,8 +417,8 @@
     public static String parseDispositionFilename(String dispositionString) {
         return parseForAttribute("filename", dispositionString);
     }
-        
-    
+
+
     /**
      * Parses a string looking for a attribute-value pair, and returns the value.
      * For example:
@@ -424,7 +427,7 @@
      *      MultipartIterator.parseForAttribute(parseString, "name");
      * </pre>
      * That will return "bob".
-     * 
+     *
      * @param attribute The name of the attribute you're trying to get
      * @param parseString The string to retrieve the value from
      * @return The value of the attribute, or <code>null</code> if none could be found
@@ -432,61 +435,66 @@
     public static String parseForAttribute(String attribute, String parseString) {
         int nameIndex = parseString.indexOf(attribute + "=\"");
         if (nameIndex != -1) {
-            
+
             int endQuoteIndex = parseString.indexOf("\"", nameIndex+attribute.length()+3);
-            
+
             if (endQuoteIndex != -1) {
                 return parseString.substring(nameIndex+attribute.length()+2, endQuoteIndex);
             }
             return "";
-        }        
+        }
         return null;
     }
-    
+
     /**
      * Reads the input stream until it reaches a new line
      */
     protected String readLine() throws ServletException, UnsupportedEncodingException {
-       
-        byte[] bufferByte = new byte[bufferSize];
+
+        byte[] bufferByte;
         int bytesRead;
-        
+
         if (totalLength >= contentLength) {
             return null;
         }
-        
+
         try {
-            bytesRead = inputStream.readLine(bufferByte,
-                                             0,
-                                             bufferSize);
+            bufferByte = inputStream.readLine();
+            if (bufferByte == null)
+                return null;
+            bytesRead  = bufferByte.length;
         }
         catch (IOException ioe) {
-            throw new ServletException("IOException while reading multipart request: " + 
+            throw new ServletException("IOException while reading multipart request: " +
 				       ioe.getMessage());
         }
         if (bytesRead == -1) {
             return null;
         }
-        
+
         totalLength += bytesRead;
         return new String(bufferByte, 0, bytesRead, "ISO-8859-1");
     }
-    
+
     /**
      * Creates a file on disk from the current mulitpart element
      * @param fileName the name of the multipart file
      */
     protected File createLocalFile() throws IOException {
-        
+
         File tempFile = File.createTempFile("strts", null, new File(tempDir));
         BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile),
                                                             diskBufferSize);
-        byte[] lineBuffer = new byte[MAX_LINE_SIZE];
-	int bytesRead = inputStream.readLine(lineBuffer, 0, MAX_LINE_SIZE);
-        
+        byte[] lineBuffer = inputStream.readLine();
+        if (lineBuffer == null)
+        {
+            throw new IOException("Premature end of stream while reading multipart request");
+        }
+	    int bytesRead = lineBuffer.length;
+
         boolean cutCarriage = false;
         boolean cutNewline = false;
-        
+
         try {
             while ((bytesRead != -1) && (!equals(lineBuffer, 0, boundaryBytes.length,
                     boundaryBytes))) {
@@ -497,18 +505,21 @@
                         if (cutNewline) {
                             fos.write('\n');
                         }
+                        cutCarriage = false;
                         if (bytesRead > 0) {
                             if (lineBuffer[bytesRead-1] == '\r') {
                                 bytesRead--;
                                 cutCarriage = true;
                             }
-                            else {
-                                cutCarriage = false;
-                            }
                         }
                         cutNewline = true;
                         fos.write(lineBuffer, 0, bytesRead);
-                        bytesRead = inputStream.readLine(lineBuffer, 0, MAX_LINE_SIZE);
+                        lineBuffer = inputStream.readLine();
+                        if (lineBuffer == null)
+                        {
+                            throw new IOException("Premature end of stream while reading multipart request");
+                        }
+                        bytesRead = lineBuffer.length;
             }
         }
         catch (IOException ioe) {
@@ -516,12 +527,12 @@
             tempFile.delete();
             throw ioe;
         }
-        
-        fos.flush();	
+
+        fos.flush();
         fos.close();
         return tempFile;
     }
-    
+
    /**
     * Checks bytes for equality.  Two byte arrays are equal if
     * each of their elements are the same.  This method checks
@@ -530,21 +541,21 @@
     * @param comp The byte to compare to <code>source</code>
     * @param offset The offset to start at in <code>comp</code>
     * @param length The length of <code>comp</code> to compare to
-    * @param source The reference byte to test for equality
+    * @param source The reference byte array to test for equality
     */
    public static boolean equals(byte[] comp, int offset, int length,
                                 byte[] source) {
-    
-       if (length != source.length) {
-         return false;
+
+       if ((length != source.length) || (comp.length - offset < length)) {
+            return false;
        }
-    
+
        for (int i = 0; i < length; i++) {
            if (comp[offset+i] != source[i]) {
                return false;
            }
        }
-       return true;    
+       return true;
    }
 
 }
diff --git a/src/share/org/apache/struts/util/BeanUtils.java b/src/share/org/apache/struts/util/BeanUtils.java
index b3d0ab3..9444874 100755
--- a/src/share/org/apache/struts/util/BeanUtils.java
+++ b/src/share/org/apache/struts/util/BeanUtils.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/BeanUtils.java,v 1.28 2001/05/20 01:18:27 craigmcc Exp $
- * $Revision: 1.28 $
- * $Date: 2001/05/20 01:18:27 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/BeanUtils.java,v 1.28.2.1 2001/05/21 04:23:48 craigmcc Exp $
+ * $Revision: 1.28.2.1 $
+ * $Date: 2001/05/21 04:23:48 $
  *
  * ====================================================================
  *
@@ -88,7 +88,7 @@
  * @author Craig R. McClanahan
  * @author Ralph Schaer
  * @author Chris Audley
- * @version $Revision: 1.28 $ $Date: 2001/05/20 01:18:27 $
+ * @version $Revision: 1.28.2.1 $ $Date: 2001/05/21 04:23:48 $
  */
 
 public class BeanUtils {
@@ -162,7 +162,8 @@
                NoSuchMethodException {
 
         if (bean == null)
-            return (Collections.EMPTY_MAP);
+            //            return (Collections.EMPTY_MAP);
+            return (new HashMap());
         PropertyDescriptor descriptors[] =
             PropertyUtils.getPropertyDescriptors(bean);
         Map description = new HashMap(descriptors.length);
diff --git a/src/share/org/apache/struts/util/ConvertUtils.java b/src/share/org/apache/struts/util/ConvertUtils.java
index 068c8bf..d02832b 100644
--- a/src/share/org/apache/struts/util/ConvertUtils.java
+++ b/src/share/org/apache/struts/util/ConvertUtils.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/ConvertUtils.java,v 1.8 2001/05/20 01:18:27 craigmcc Exp $
- * $Revision: 1.8 $
- * $Date: 2001/05/20 01:18:27 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/ConvertUtils.java,v 1.8.2.1 2001/09/15 05:02:20 martinc Exp $
+ * $Revision: 1.8.2.1 $
+ * $Date: 2001/09/15 05:02:20 $
  *
  * ====================================================================
  *
@@ -80,7 +80,7 @@
  * @author Craig R. McClanahan
  * @author Ralph Schaer
  * @author Chris Audley
- * @version $Revision: 1.8 $ $Date: 2001/05/20 01:18:27 $
+ * @version $Revision: 1.8.2.1 $ $Date: 2001/09/15 05:02:20 $
  */
 
 public class ConvertUtils {
@@ -467,12 +467,10 @@
     private static Character convertCharacter(String value,
                                               Character defaultValue) {
 
-        if (value == null)
+        if (value == null || value.length() == 0)
             return (defaultValue);
-        else if (value.length() == 0)
-            return (new Character(' '));
         else
-            return (defaultValue);
+            return (new Character(value.charAt(0)));
 
     }
 
diff --git a/src/share/org/apache/struts/util/FastArrayList.java b/src/share/org/apache/struts/util/FastArrayList.java
index 88fd6ab..8cb1b42 100644
--- a/src/share/org/apache/struts/util/FastArrayList.java
+++ b/src/share/org/apache/struts/util/FastArrayList.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastArrayList.java,v 1.4 2001/05/20 01:15:17 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/05/20 01:15:17 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastArrayList.java,v 1.4.2.1 2001/05/20 21:06:43 craigmcc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/05/20 21:06:43 $
  *
  * ====================================================================
  *
@@ -97,7 +97,7 @@
  *  an equivalent class in the Jakarta Commons Collections package.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/05/20 01:15:17 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/05/20 21:06:43 $
  */
 
 public class FastArrayList extends ArrayList {
@@ -455,7 +455,7 @@
 
         if (fast) {
             int hashCode = 1;
-            Iterator i = list.iterator();
+            java.util.Iterator i = list.iterator();
             while (i.hasNext()) {
                 Object o = i.next();
                 hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
@@ -464,7 +464,7 @@
         } else {
             synchronized (list) {
                 int hashCode = 1;
-                Iterator i = list.iterator();
+                java.util.Iterator i = list.iterator();
                 while (i.hasNext()) {
                     Object o = i.next();
                     hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
diff --git a/src/share/org/apache/struts/util/FastHashMap.java b/src/share/org/apache/struts/util/FastHashMap.java
index 770bc2c..30f72db 100644
--- a/src/share/org/apache/struts/util/FastHashMap.java
+++ b/src/share/org/apache/struts/util/FastHashMap.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastHashMap.java,v 1.4 2001/05/20 01:15:17 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/05/20 01:15:17 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastHashMap.java,v 1.4.2.1 2001/05/20 21:06:43 craigmcc Exp $
+ * $Revision: 1.4.2.1 $
+ * $Date: 2001/05/20 21:06:43 $
  *
  * ====================================================================
  *
@@ -98,7 +98,7 @@
  *  an equivalent class in the Jakarta Commons Collections package.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/05/20 01:15:17 $
+ * @version $Revision: 1.4.2.1 $ $Date: 2001/05/20 21:06:43 $
  */
 
 public class FastHashMap extends HashMap {
@@ -303,7 +303,7 @@
         if (fast) {
             if (mo.size() != map.size())
                 return (false);
-            Iterator i = map.entrySet().iterator();
+            java.util.Iterator i = map.entrySet().iterator();
             while (i.hasNext()) {
                 Map.Entry e = (Map.Entry) i.next();
                 Object key = e.getKey();
@@ -321,7 +321,7 @@
             synchronized (map) {
                 if (mo.size() != map.size())
                     return (false);
-                Iterator i = map.entrySet().iterator();
+                java.util.Iterator i = map.entrySet().iterator();
                 while (i.hasNext()) {
                     Map.Entry e = (Map.Entry) i.next();
                     Object key = e.getKey();
@@ -371,14 +371,14 @@
 
         if (fast) {
             int h = 0;
-            Iterator i = map.entrySet().iterator();
+            java.util.Iterator i = map.entrySet().iterator();
             while (i.hasNext())
                 h += i.next().hashCode();
             return (h);
         } else {
             synchronized (map) {
                 int h = 0;
-                Iterator i = map.entrySet().iterator();
+                java.util.Iterator i = map.entrySet().iterator();
                 while (i.hasNext())
                     h += i.next().hashCode();
                 return (h);
diff --git a/src/share/org/apache/struts/util/FastTreeMap.java b/src/share/org/apache/struts/util/FastTreeMap.java
index bbc8b07..507e056 100644
--- a/src/share/org/apache/struts/util/FastTreeMap.java
+++ b/src/share/org/apache/struts/util/FastTreeMap.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastTreeMap.java,v 1.3 2001/05/20 01:15:18 craigmcc Exp $
- * $Revision: 1.3 $
- * $Date: 2001/05/20 01:15:18 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/FastTreeMap.java,v 1.3.2.1 2001/05/20 21:06:43 craigmcc Exp $
+ * $Revision: 1.3.2.1 $
+ * $Date: 2001/05/20 21:06:43 $
  *
  * ====================================================================
  *
@@ -100,7 +100,7 @@
  *  an equivalent class in the Jakarta Commons Collections package.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.3 $ $Date: 2001/05/20 01:15:18 $
+ * @version $Revision: 1.3.2.1 $ $Date: 2001/05/20 21:06:43 $
  */
 
 public class FastTreeMap extends TreeMap {
@@ -323,7 +323,7 @@
         if (fast) {
             if (mo.size() != map.size())
                 return (false);
-            Iterator i = map.entrySet().iterator();
+            java.util.Iterator i = map.entrySet().iterator();
             while (i.hasNext()) {
                 Map.Entry e = (Map.Entry) i.next();
                 Object key = e.getKey();
@@ -341,7 +341,7 @@
             synchronized (map) {
                 if (mo.size() != map.size())
                     return (false);
-                Iterator i = map.entrySet().iterator();
+                java.util.Iterator i = map.entrySet().iterator();
                 while (i.hasNext()) {
                     Map.Entry e = (Map.Entry) i.next();
                     Object key = e.getKey();
@@ -407,14 +407,14 @@
 
         if (fast) {
             int h = 0;
-            Iterator i = map.entrySet().iterator();
+            java.util.Iterator i = map.entrySet().iterator();
             while (i.hasNext())
                 h += i.next().hashCode();
             return (h);
         } else {
             synchronized (map) {
                 int h = 0;
-                Iterator i = map.entrySet().iterator();
+                java.util.Iterator i = map.entrySet().iterator();
                 while (i.hasNext())
                     h += i.next().hashCode();
                 return (h);
diff --git a/src/share/org/apache/struts/util/GenericDataSource.java b/src/share/org/apache/struts/util/GenericDataSource.java
index 8335489..245db79 100644
--- a/src/share/org/apache/struts/util/GenericDataSource.java
+++ b/src/share/org/apache/struts/util/GenericDataSource.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/GenericDataSource.java,v 1.5 2001/04/18 22:15:56 craigmcc Exp $
- * $Revision: 1.5 $
- * $Date: 2001/04/18 22:15:56 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/Attic/GenericDataSource.java,v 1.5.2.2 2001/06/10 03:36:50 craigmcc Exp $
+ * $Revision: 1.5.2.2 $
+ * $Date: 2001/06/10 03:36:50 $
  *
  * ====================================================================
  *
@@ -66,7 +66,9 @@
 import java.io.PrintWriter;
 import java.sql.Connection;
 import java.sql.Driver;
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.LinkedList;
 import java.util.Properties;
 import javax.sql.DataSource;
@@ -75,10 +77,8 @@
 /**
  * <p>Generic data source implementation of the <code>DataSource</code>
  * interface.  <b>WARNING</b> - This implementation does not know how to
- * provide connections with different username/password combinations.  It
- * always returns connections based on the username and password configured
- * with <code>setUser()</code> and <code>setPassword()</code>,
- * respectively. Calling this version of the implementation using the
+ * provide connections with different username/password combinations.
+ * Calling this version of the implementation using the
  * getConnection(username,password) signature will throw an exception.</p>
  *
  * <p>The following properties are supported by the standard
@@ -127,6 +127,26 @@
  *       the <code>user</code> property.</td>
  * </tr>
  * <tr>
+ *   <td align="center">pingCommand</td>
+ *   <td>A non-query SQL command that, if specified, will be executed before
+ *       a connection is returned by a call to <code>getConnection()</code>.
+ *       If any SQLException is thrown by the execution of this statement,
+ *       it is assumed that this connection is stale and it will be discarded.
+ *       Because this happens on every connection allocation, you should ensure
+ *       that the statement executes very quickly.</td>
+ * </tr>
+ * <tr>
+ *   <td align="center">pingQuery</td>
+ *   <td>A query SQL command (i.e. a SELECT) that, if specified, will be
+ *       executed before a connection is returned by a call to
+ *       <code>getConnection()</code>.  If any SQLException is thrown by the
+ *       execution of this query (or by the subsequent processing of the
+ *       entire returned <code>ResultSet</code>), it is assumed that this
+ *       connection is stale and it will be discarded.  Because this happens
+ *       on every connection allocation, you should ensure that the
+ *       statement executes very quickly.</td>
+ * </tr>
+ * <tr>
  *   <td align="center">readOnly</td>
  *   <td>Set to <code>true</code> if you want the connections returned to you
  *       by calling <code>getConnection()</code> to be configured for read only
@@ -158,7 +178,7 @@
  *
  * @author Craig R. McClanahan
  * @author Ted Husted
- * @version $Revision: 1.5 $ $Date: 2001/04/18 22:15:56 $
+ * @version $Revision: 1.5.2.2 $ $Date: 2001/06/10 03:36:50 $
  */
 
 public class GenericDataSource implements DataSource {
@@ -206,13 +226,6 @@
     protected PrintWriter logWriter = null;
 
 
-    /**
-     * The connection properties for use in establishing connections.
-     */
-    protected Properties properties = new Properties();
-
-
-
     // ------------------------------------------------------------- Properties
 
 
@@ -252,6 +265,20 @@
 
 
     /**
+     * The debugging detail level for this data source.
+     */
+    protected int debug = 0;
+
+    public int getDebug() {
+        return (this.debug);
+    }
+
+    public void setDebug(int debug) {
+        this.debug = debug;
+    }
+
+
+    /**
      * The description of this data source.
      */
     protected String description = null;
@@ -322,6 +349,41 @@
     }
 
 
+
+    /**
+     * The non-query SQL command used to ping an allocated connection.
+     */
+    protected String pingCommand = null;
+
+    public String getPingCommand() {
+        return (this.pingCommand);
+    }
+
+    public void setPingCommand(String pingCommand) {
+        this.pingCommand = pingCommand;
+    }
+
+
+    /**
+     * The query SQL command used to ping an allocated connection.
+     */
+    protected String pingQuery = null;
+
+    public String getPingQuery() {
+        return (this.pingQuery);
+    }
+
+    public void setPingQuery(String pingQuery) {
+        this.pingQuery = pingQuery;
+    }
+
+
+    /**
+     * The connection properties for use in establishing connections.
+     */
+    protected Properties properties = new Properties();
+
+
     /**
      * The default read-only state for newly created connections.
      */
@@ -387,6 +449,8 @@
     public Connection getConnection() throws SQLException {
 
         int seconds = 0;
+        if (debug >= 2)
+            log("  getConnection()");
 
         // Validate the opened status of this data source
         if (closed)
@@ -397,31 +461,68 @@
         while (true) {
 
             // Have we timed out yet?
+            if (debug >= 3)
+                log("   Check for timeout, activeCount=" + activeCount +
+                    ", useCount=" + useCount);
             if ((loginTimeout > 0) && (seconds >= loginTimeout))
                 break;
 
             // Return an existing connection from the pool if there is one
             synchronized (connections) {
                 if (!connections.isEmpty()) {
-                    useCount++;
-                    GenericConnection connection = (GenericConnection) connections.removeFirst();
-                    // unclose the connection's wrapper
+
+                    // Allocate the first available connection
+                    GenericConnection connection =
+                        (GenericConnection) connections.removeFirst();
+                    if (debug >= 3)
+                        log("   Found available connection");
+
+                    // Make sure this connection is not stale
                     connection.setClosed(false);
+                    try {
+                        ping(connection);
+                    } catch (SQLException e) {
+                        if (debug >= 3)
+                            log("   Connection stale, releasing");
+                        try {
+                            connection.getConnection().close();
+                        } catch (SQLException f) {
+                            ;
+                        }
+                        activeCount--;
+                        continue;
+                    }
+
+                    // unclose the connection's wrapper and return it
+                    useCount++;
+                    if (debug >= 3)
+                        log("   Return allocated connection, activeCount=" +
+                            activeCount + ", useCount=" + useCount);
                     return(connection);
-                    // return ((Connection) connections.removeFirst()); DEBUG
+
                 }
             }
 
             // Create a new connection if we are not yet at the maximum
             if (activeCount < maxCount) {
-                Connection conn = createConnection();
-                if (conn != null) {
+                Connection connection = createConnection();
+                if (connection != null) {
+                    try {
+                        ping(connection);
+                    } catch (SQLException e) {
+                        throw e;
+                    }
                     useCount++;
-                    return (conn);
+                    if (debug >= 3)
+                        log("   Return new connection, activeCount=" +
+                            activeCount + ", useCount=" + useCount);
+                    return (connection);
                 }
             }
 
             // Wait for an existing connection to be returned
+            if (debug >= 3)
+                log("   Sleep until next test");
             try {
                 Thread.sleep(1000);
                 seconds++;
@@ -432,6 +533,8 @@
         }
 
         // We have timed out awaiting an available connection
+        if (debug >= 3)
+            log("   Timeout awaiting connection");
         throw new SQLException
             ("getConnection: Timeout awaiting connection");
 
@@ -440,16 +543,14 @@
 
     /**
      * Attempt to establish a database connection.  <b>WARNING</b> - The
-     * specified username and password are ignored by this implementation.
+     * specified username and password are not supported by this
+     * implementation.
      *
      * @param username Database username for this connection
      * @param password Database password for this connection
      *
      * @exception SQLException if a database access error occurs
      */
-
-
-
     public Connection getConnection(String username, String password)
         throws SQLException {
 
@@ -523,6 +624,8 @@
 
         if (closed)
             throw new SQLException("close:  Data Source already closed");
+        if (debug >= 1)
+            log(" close()");
 
         // Shut down all active connections
         while (activeCount > 0) {
@@ -548,13 +651,15 @@
         // Have we already been opened?
         if (driver != null)
             return;
+        if (debug >= 1)
+            log(" open()");
 
         // Instantiate our database driver
         try {
             Class clazz = Class.forName(driverClass);
             driver = (Driver) clazz.newInstance();
         } catch (Throwable t) {
-            throw new SQLException("createConnection: " + t);
+            throw new SQLException("open: " + t);
         }
 
         // Create the initial minimum number of required connections
@@ -621,15 +726,125 @@
     protected synchronized Connection createConnection() throws SQLException {
 
         if (activeCount < maxCount) {
+            if (debug >= 3)
+                log("   createConnection()");
             Connection conn = driver.connect(url, properties);
             activeCount++;
             return (new GenericConnection(this, conn, autoCommit, readOnly));
         }
+        if (debug >= 3)
+            log("   createConnection() returning null");
         return (null);
 
     }
 
 
+    /**
+     * Log the specified message to our log writer, if we have one.
+     *
+     * @param message The message to be logged
+     */
+    protected void log(String message) {
+
+        if (logWriter != null) {
+            logWriter.print("GenericDataSource[");
+            logWriter.print(description);
+            logWriter.print("]: ");
+            logWriter.println(message);
+        }
+
+    }
+
+
+    /**
+     * Log the specified message and exception to our log writer, if we
+     * have one.
+     *
+     * @param message The message to be logged
+     * @param throwable The exception to be logged
+     */
+    protected void log(String message, Throwable throwable) {
+
+        if (logWriter != null) {
+            logWriter.print("GenericDataSource[");
+            logWriter.print(description);
+            logWriter.print("]: ");
+            logWriter.println(message);
+            throwable.printStackTrace(logWriter);
+        }
+
+    }
+
+
+    /**
+     * Perform any configured <code>pingCommand</code> and/or
+     * <code>pingQuery</code> on the specified connection, returning any
+     * SQLException that is encountered along the way.
+     *
+     * @param conn The connection to be pinged
+     */
+    protected void ping(Connection conn) throws SQLException {
+
+        if (pingCommand != null) {
+
+            if (debug >= 4)
+                log("    ping(" + pingCommand + ")");
+
+            Statement stmt = conn.createStatement();
+            try {
+                stmt.execute(pingCommand);
+                stmt.close();
+            } catch (SQLException e) {
+                if (debug >= 5)
+                    log("     ping() failed:  " + e);
+                try {
+                    if (stmt != null)
+                        stmt.close();
+                } catch (SQLException f) {
+                    ;
+                }
+                throw e;
+            }
+
+        }
+
+        if (pingQuery != null) {
+
+            if (debug >= 4)
+                log("    ping(" + pingQuery + ")");
+
+            ResultSet rs = null;
+            Statement stmt = conn.createStatement();
+            try {
+                rs = stmt.executeQuery(pingQuery);
+                while (rs.next()) {
+                    ;
+                }
+                rs.close();
+                stmt.close();
+            } catch (SQLException e) {
+                if (debug >= 5)
+                    log("     ping() failed: " + e);
+                try {
+                    if (rs != null)
+                        rs.close();
+                } catch (SQLException f) {
+                    ;
+                }
+                try {
+                    if (stmt != null)
+                        stmt.close();
+                } catch (SQLException f) {
+                    ;
+                }
+                throw e;
+            }
+
+        }
+
+    }
+
+
     // -------------------------------------------------------- Package Methods
 
 
@@ -640,6 +855,10 @@
      */
     void returnConnection(GenericConnection conn) {
 
+        if (debug >= 2)
+            log("  releaseConnection(), activeCount=" + activeCount +
+                ", useCount=" + (useCount - 1));
+
         synchronized (connections) {
             connections.addLast(conn);
             useCount--;
diff --git a/src/share/org/apache/struts/util/LocalStrings.properties b/src/share/org/apache/struts/util/LocalStrings.properties
index 101812d..7247383 100644
--- a/src/share/org/apache/struts/util/LocalStrings.properties
+++ b/src/share/org/apache/struts/util/LocalStrings.properties
@@ -7,6 +7,6 @@
 lookup.scope=Invalid bean scope {0}
 lookup.target=Exception thrown by getter for property {0} of bean {1}
 message.bundle=Cannot find message resources under key {0}
-parameters.multi=Cannot cast to Map for name={0} property={1e} scope={2}
+parameters.multi=Cannot cast to Map for name={0} property={1} scope={2}
 parameters.single=Cannot cast to String for name={0} property={1} scope={2}
 write.io=Input/output error: {0}
diff --git a/src/share/org/apache/struts/util/MessageResources.java b/src/share/org/apache/struts/util/MessageResources.java
index 563e06f..44d9f90 100755
--- a/src/share/org/apache/struts/util/MessageResources.java
+++ b/src/share/org/apache/struts/util/MessageResources.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/MessageResources.java,v 1.10 2001/04/18 23:32:35 craigmcc Exp $
- * $Revision: 1.10 $
- * $Date: 2001/04/18 23:32:35 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/MessageResources.java,v 1.10.2.1 2001/08/06 22:40:12 craigmcc Exp $
+ * $Revision: 1.10.2.1 $
+ * $Date: 2001/08/06 22:40:12 $
  *
  * ====================================================================
  * 
@@ -89,7 +89,7 @@
  * application server environments.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.10 $ $Date: 2001/04/18 23:32:35 $
+ * @version $Revision: 1.10.2.1 $ $Date: 2001/08/06 22:40:12 $
  */
 
 public abstract class MessageResources implements Serializable {
@@ -317,7 +317,7 @@
 		    else
 			return ("???" + formatKey + "???");
 		}
-		format = new MessageFormat(formatString);
+		format = new MessageFormat(escape(formatString));
 		formats.put(formatKey, format);
 	    }
 
@@ -458,6 +458,29 @@
 
 
     /**
+     * Escape any single quote characters that are included in the specified
+     * message string.
+     *
+     * @param string The string to be escaped
+     */
+    protected String escape(String string) {
+
+        if ((string == null) || (string.indexOf('\'') < 0))
+            return (string);
+        int n = string.length();
+        StringBuffer sb = new StringBuffer(n);
+        for (int i = 0; i < n; i++) {
+            char ch = string.charAt(i);
+            if (ch == '\'')
+                sb.append('\'');
+            sb.append(ch);
+        }
+        return (sb.toString());
+
+    }
+
+
+    /**
      * Compute and return a key to be used in caching information by a Locale.
      * <strong>NOTE</strong> - The locale key for the default Locale in our
      * environment is a zero length String.
diff --git a/src/share/org/apache/struts/util/RequestUtils.java b/src/share/org/apache/struts/util/RequestUtils.java
index 739bccf..56604c5 100644
--- a/src/share/org/apache/struts/util/RequestUtils.java
+++ b/src/share/org/apache/struts/util/RequestUtils.java
@@ -1,7 +1,7 @@
 /*
- * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v 1.14 2001/05/12 22:35:43 craigmcc Exp $
- * $Revision: 1.14 $
- * $Date: 2001/05/12 22:35:43 $
+ * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v 1.14.2.7 2001/11/21 13:30:38 husted Exp $
+ * $Revision: 1.14.2.7 $
+ * $Date: 2001/11/21 13:30:38 $
  *
  * ====================================================================
  *
@@ -84,7 +84,7 @@
 import org.apache.struts.action.ActionForward;
 import org.apache.struts.action.ActionForwards;
 import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionServlet;
+import org.apache.struts.action.ActionServletWrapper;
 import org.apache.struts.taglib.html.Constants;
 import org.apache.struts.upload.FormFile;
 import org.apache.struts.upload.MultipartRequestHandler;
@@ -95,7 +95,7 @@
  * in the Struts controller framework.
  *
  * @author Craig R. McClanahan
- * @version $Revision: 1.14 $ $Date: 2001/05/12 22:35:43 $
+ * @version $Revision: 1.14.2.7 $ $Date: 2001/11/21 13:30:38 $
  */
 
 public class RequestUtils {
@@ -114,8 +114,8 @@
      * The message resources for this package.
      */
     private static MessageResources messages =
-	MessageResources.getMessageResources
-	("org.apache.struts.util.LocalStrings");
+    MessageResources.getMessageResources
+    ("org.apache.struts.util.LocalStrings");
 
 
 
@@ -135,7 +135,7 @@
     public static URL absoluteURL(HttpServletRequest request, String path)
         throws MalformedURLException {
 
-        return (new URL(serverURL(request), path));
+        return (new URL(serverURL(request), request.getContextPath() + path));
 
     }
 
@@ -179,7 +179,7 @@
         throws JspException {
 
         // Short circuit if no parameters are specified
-        if ((paramId == null) && (name == null))
+        if ((paramId == null) && (name == null) && !transaction)
             return (null);
 
         // Locate the Map containing our multi-value parameters map
@@ -339,7 +339,7 @@
             url.append('#');
             url.append(URLEncoder.encode(anchor));
         }
-        
+
         // Add dynamic parameters if requested
         if ((params != null) && (params.size() > 0)) {
 
@@ -364,7 +364,7 @@
                         url.append('?');
                         question = true;
                     } else
-                        url.append('&');
+                        url.append("&amp;");
                     url.append(URLEncoder.encode(key));
                     url.append('='); // Interpret null as "no value"
                 } else if (value instanceof String) {
@@ -372,22 +372,31 @@
                         url.append('?');
                         question = true;
                     } else
-                        url.append('&');
+                        url.append("&amp;");
                     url.append(URLEncoder.encode(key));
                     url.append('=');
                     url.append(URLEncoder.encode((String) value));
-                } else /* if (value instanceof String[]) */ {
+                } else if (value instanceof String[]) {
                     String values[] = (String[]) value;
                     for (int i = 0; i < values.length; i++) {
                         if (!question) {
                             url.append('?');
                             question = true;
                         } else
-                            url.append('&');
+                            url.append("&amp;");
                         url.append(URLEncoder.encode(key));
                         url.append('=');
                         url.append(URLEncoder.encode(values[i]));
                     }
+                } else /* Convert other objects to a string */ {
+                    if (!question) {
+                        url.append('?');
+                        question = true;
+                    } else
+                        url.append("&amp;");
+                    url.append(URLEncoder.encode(key));
+                    url.append('=');
+                    url.append(URLEncoder.encode(value.toString()));
                 }
             }
 
@@ -480,14 +489,14 @@
 
         // Look up the requested bean, and return if requested
         Object bean = lookup(pageContext, name, scope);
-        if (property == null)
-            return (bean);
         if (bean == null) {
             JspException e = new JspException
                 (messages.getMessage("lookup.bean", name, scope));
             saveException(pageContext, e);
             throw e;
         }
+        if (property == null)
+            return (bean);
 
         // Locate and return the specified property
         try {
@@ -648,11 +657,11 @@
             //initialize a MultipartRequestHandler
             MultipartRequestHandler multipart = null;
 
-            //get an instance of ActionServlet
-            ActionServlet servlet;
+            //get an instance of ActionServletWrapper
+            ActionServletWrapper servlet;
 
             if (bean instanceof ActionForm) {
-                servlet = ((ActionForm) bean).getServlet();
+                servlet = ((ActionForm) bean).getServletWrapper();
             } else {
                 throw new ServletException("bean that's supposed to be " +
                                            "populated from a multipart request is not of type " +
@@ -717,7 +726,7 @@
             ((ActionForm) bean).setMultipartRequestHandler(multipart);
 
             //set servlet and mapping info
-            multipart.setServlet(servlet);
+            servlet.setServletFor(multipart);
             multipart.setMapping((ActionMapping)
                                  request.getAttribute(Action.MAPPING_KEY));
             request.removeAttribute(Action.MAPPING_KEY);
diff --git a/src/share/org/apache/struts/util/package.html b/src/share/org/apache/struts/util/package.html
index 67d213f..3f0f46c 100644
--- a/src/share/org/apache/struts/util/package.html
+++ b/src/share/org/apache/struts/util/package.html
@@ -434,12 +434,24 @@
 Simply include a section that looks like this:</p>
 <pre>
     &lt;data-sources&gt;
-        &lt;data-source
-          autoCommit="false" description="My Database Connection Pool"
-          driverClass="org.postgresql.Driver" maxCount="4" minCount="1"
-          password="mypassword" url="jdbc:postgresql://localhost/mydatabase"
-          user="myusername"
-        /&gt;
+      &lt;data-source&gt;
+        &lt;set-property property="autoCommit"
+                      value="false"/&gt;
+        &lt;set-property property="description"
+                      value="Example Data Source Configuration"/&gt;
+        &lt;set-property property="driverClass"
+                      value="org.postgresql.Driver"/&gt;
+        &lt;set-property property="maxCount"
+                      value="4"/&gt;
+        &lt;set-property property="minCount"
+                      value="2"/&gt;
+        &lt;set-property property="password"
+                      value="mypassword"/&gt;
+        &lt;set-property property="url"
+                      value="jdbc:postgresql://localhost/mydatabase"/&gt;
+        &lt;set-property property="user"
+                      value="myusername"/&gt;
+      &lt;/data-source&gt;
     &lt;/data-sources&gt;
 </pre>
 
diff --git a/web/documentation/tags.html b/web/documentation/tags.html
index be75988..86de2cd 100644
--- a/web/documentation/tags.html
+++ b/web/documentation/tags.html
@@ -1247,7 +1247,7 @@
 <p>Repeats the body of this tag once for each element of a collection, which
 must be an <code>Iterator</code>, a <code>Collection</code> (which includes
 Lists, Sets, and Vectors), a <code>Map</code> (which includes Hashtables)
-whose elements will be interated over, or an array of objects.  The collection
+whose elements will be iterated over, or an array of objects.  The collection
 to be iterated over
 is identified by the <code>name</code> or <code>name</code> and
 <code>property</code> attributes, and the element being processed is exposed
diff --git a/web/example/WEB-INF/app.tld b/web/example/WEB-INF/app.tld
index c4679e5..d253abd 100755
--- a/web/example/WEB-INF/app.tld
+++ b/web/example/WEB-INF/app.tld
@@ -66,7 +66,7 @@
 
       <required>false</required>
 
-      <rtexprvalue>false</rtexprvalue>
+      <rtexprvalue>true</rtexprvalue>
 
     </attribute>
 
@@ -76,7 +76,7 @@
 
       <required>false</required>
 
-      <rtexprvalue>false</rtexprvalue>
+      <rtexprvalue>true</rtexprvalue>
 
     </attribute>
 
diff --git a/web/example/WEB-INF/struts-config.xml b/web/example/WEB-INF/struts-config.xml
index c091b01..d561eb8 100644
--- a/web/example/WEB-INF/struts-config.xml
+++ b/web/example/WEB-INF/struts-config.xml
@@ -22,16 +22,24 @@
   <!-- ========== Data Source Configuration =============================== -->
 <!--
   <data-sources>
-    <data-source
-       autoCommit="false"
-      description="Example Data Source Configuration"
-      driverClass="org.postgresql.Driver"
-         maxCount="4"
-         minCount="2"
-         password="mypassword"
-              url="jdbc:postgresql://localhost/mydatabase"
-             user="myusername"
-    />
+    <data-source>
+      <set-property property="autoCommit"
+                       value="false"/>
+      <set-property property="description"
+                       value="Example Data Source Configuration"/>
+      <set-property property="driverClass"
+                       value="org.postgresql.Driver"/>
+      <set-property property="maxCount"
+                       value="4"/>
+      <set-property property="minCount"
+                       value="2"/>
+      <set-property property="password"
+                       value="mypassword"/>
+      <set-property property="url"
+                       value="jdbc:postgresql://localhost/mydatabase"/>
+      <set-property property="user"
+                       value="myusername"/>
+    </data-source>
   </data-sources>
 -->
 
diff --git a/web/example/tour.htm b/web/example/tour.htm
index ea29a7d..b9f447a 100644
--- a/web/example/tour.htm
+++ b/web/example/tour.htm
@@ -110,9 +110,7 @@
 digester and loaded as a set of nested hashtables. The outer table is the list
 of user objects, each of which has its own inner hashtable of subscriptions.
 When you register, a user object is stored in this hashtable ... and when you
-login, the user object is stored within the session context. When the
-application is shut down, the database servlet unloads the database by writing a
-fresh database.xml file.</p>
+login, the user object is stored within the session context.</p>
 <blockquote>
   <p><i>If you want to follow along (and you should!), the package source can be found under the src/example folder in your
   jakarta-struts folder.</i></p>
@@ -233,19 +231,19 @@
 <p>Before passing the request to LogonAction, the ActionServlet looks for the
 LogonForm bean. If it finds it, the ActionServlet updates the bean by matching
 properties named in the HTTP request with properties named in the form bean. If
-it doesn't find the bean, ActionServlet creates it, so ActionLogon can assume
+it doesn't find the bean, ActionServlet creates it, so LogonAction can assume
 that it already exists.</p>
 <p>When called by the ActionServlet, LogonAction retrieves the username and
 password from the LogonForm bean. (If just created, the bean will return default
 values.)</p>
-<p>In the example, LoginAction then checks with the DatabaseServlet to see if
+<p>In the example, LogonAction then checks with the DatabaseServlet to see if
 the logon matches a registered user. If the logon doesn't match, LogonAction
 adds a message key to an error list. At the end of the routine, if the error
 list is not empty, LogonAction adds a User bean to the session context, and forwards
 control to its input form (login.jsp).</p>
 <blockquote>
 <p><i>Note that direct access to the DatabaseServlet should really be handled by a
-business-logic bean, and NOT by LoginAction. To quote the example's author
+business-logic bean, and NOT by LogonAction. To quote the example's author
 &quot;This should be considered a bug in the example.&quot;&nbsp;</i></p>
 </blockquote>
 <p>If there are no errors, LogonAction places a user bean into the
@@ -598,10 +596,6 @@
 folders.&nbsp;</p>
 <p>In addition to the usual getters and setters, the user object also has two methods for working with subscription objects. findSubscription takes a hostname and returns the subscription object for that host. getSubscriptions returns an array of all the
 subscriptions for the user (ready-made for the iterate tag!). Besides the fields needed to manage the SubscriptionForm data, the object also maintains a runtime link to its user object.</p>
-<blockquote>
-  <p><i>When the application shuts down, the database servlets stores the user objects and their subscriptions in XML. When the application is initialized again, the database servlet (courtesy of the Struts Digester) loads the objects back into memory,
-  restoring the runtime links. Of course a production system would want a more permanent storage solution, so all the changes won't be lost if the application ever terminates abnormally.&nbsp;</i></p>
-</blockquote>
 <p>To create a new subscription, EditSubscriptionAction.java simply creates a new subscription object, and sets its user to the object found in the request, and then forwards control to its input form, subscription.jsp.&nbsp;</p>
 <h3><font face="Arial"><a name="subcription.jsp">subscription.jsp</a></font></h3>
 Saving the best for last, subscription.jsp demonstrates use of some interesting Struts custom form tags,&nbsp; html:options and html:checkbox.&nbsp;
diff --git a/web/exercise-taglib/WEB-INF/struts-config.xml b/web/exercise-taglib/WEB-INF/struts-config.xml
index f2695d5..83fb366 100644
--- a/web/exercise-taglib/WEB-INF/struts-config.xml
+++ b/web/exercise-taglib/WEB-INF/struts-config.xml
@@ -17,6 +17,14 @@
 
   <action-mappings>
 
+    <action    path="/html-link"
+               type="org.apache.struts.webapp.exercise.HtmlSettersAction"
+               name="testbean"
+              scope="session"
+           validate="false">
+      <forward name="input"                path="/html-link.jsp"/>
+    </action>
+
     <action    path="/html-multibox"
                type="org.apache.struts.webapp.exercise.HtmlSettersAction"
                name="testbean"
diff --git a/web/exercise-taglib/html-link.jsp b/web/exercise-taglib/html-link.jsp
new file mode 100644
index 0000000..2923bf6
--- /dev/null
+++ b/web/exercise-taglib/html-link.jsp
@@ -0,0 +1,144 @@
+<%@ page language="java"%>
+<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
+<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
+<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
+<html:html>
+<head>
+<title>Test html:link Tag</title>
+<%
+  String newValue = "New string value";
+  pageContext.setAttribute("newValue", newValue);
+  java.util.HashMap newValues = new java.util.HashMap();
+  newValues.put("floatProperty", new Float(444.0));
+  newValues.put("intProperty", new Integer(555));
+  newValues.put("stringArray", new String[]
+   { "Value 1", "Value 2", "Value 3" });
+  pageContext.setAttribute("newValues", newValues);
+%>
+</head>
+<body bgcolor="white">
+
+<div align="center">
+<h1>Test struts-html Link Tag</h1>
+</div>
+
+The following links should hyperlink back to this page, with various
+combinations of request parameters used to modify the previous values of
+the associated form bean.  Press the "Cancel" button to return to the
+main menu.
+
+<html:form action="html-link.do">
+<table border="0" width="100%">
+
+  <tr>
+    <th colspan="4" align="center">Current Values</th>
+  </tr>
+
+  <tr>
+    <th align="right">booleanProperty</th>
+    <td align="left">
+      <html:checkbox property="booleanProperty"/>
+    </td>
+    <th align="right">intProperty</th>
+    <td align="left">
+      <html:text property="intProperty" size="16"/>
+    </td>
+  </tr>
+
+  <tr>
+    <th align="right">doubleProperty</th>
+    <td align="left">
+      <html:text property="doubleProperty" size="16"/>
+    </td>
+    <th align="right">longProperty</th>
+    <td align="left">
+      <html:text property="longProperty" size="16"/>
+    </td>
+  </tr>
+
+  <tr>
+    <th align="right">floatProperty</th>
+    <td align="left">
+      <html:text property="floatProperty" size="16"/>
+    </td>
+    <th align="right">stringProperty</th>
+    <td align="left">
+      <html:text property="stringProperty" size="16"/>
+    </td>
+  </tr>
+
+  <tr>
+    <th align="right">stringArray</th>
+    <td align="left" colspan="3">
+      <html:text property="stringArray[0]" size="16"/>
+      <html:text property="stringArray[1]" size="16"/>
+    </td>
+  </tr>
+
+  <tr>
+    <th colspan="4" align="center">
+      Hyperlinks To Be Tested
+    </th>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:link page="/html-link.do">
+        No modifications at all
+      </html:link>
+    </td>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:link page="/html-link.do?doubleProperty=321.321&amp;longProperty=321321">
+        Double and long via hard coded changes
+      </html:link>
+    </td>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:link page="/html-link.do"
+              paramId="stringProperty" paramName="newValue">
+        String via paramId and paramName
+      </html:link>
+    </td>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:link page="/html-link.do"
+              paramId="booleanProperty"
+            paramName="testbean" paramProperty="nested.booleanProperty">
+        Boolean via paramId, paramName, and paramValue
+      </html:link>
+    </td>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:link page="/html-link.do"
+                 name="newValues">
+        Float, int, and stringArray via name (Map)
+      </html:link>
+    </td>
+  </tr>
+
+  <tr>
+    <th colspan="4" align="center">Reset and Cancel Buttons</th>
+  </tr>
+
+  <tr>
+    <td colspan="4" align="center">
+      <html:reset>Reset</html:reset>
+      <html:cancel>Cancel</html:cancel>
+    </td>
+  </tr>
+
+</table>
+
+</html:form>
+
+
+</html:html>
diff --git a/web/exercise-taglib/html-select.jsp b/web/exercise-taglib/html-select.jsp
index b727176..b0c6753 100644
--- a/web/exercise-taglib/html-select.jsp
+++ b/web/exercise-taglib/html-select.jsp
@@ -1,4 +1,4 @@
-<%@ page language="java"%>
+<%@ page language="java" import="java.util.*, org.apache.struts.webapp.exercise.*;"%>
 <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
 <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
 <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
@@ -10,6 +10,19 @@
    { "Multiple 0", "Multiple 1", "Multiple 2", "Multiple 3", "Multiple 4",
      "Multiple 5", "Multiple 6", "Multiple 7", "Multiple 8", "Multiple 9" };
   pageContext.setAttribute("multipleValues", multipleValues);
+
+  Vector options = new Vector();
+  options.add(new OptionBean("Label 0", "Value 0"));
+  options.add(new OptionBean("Label 1", "Value 1"));
+  options.add(new OptionBean("Label 2", "Value 2"));
+  options.add(new OptionBean("Label 3", "Value 3"));
+  options.add(new OptionBean("Label 4", "Value 4"));
+  options.add(new OptionBean("Label 5", "Value 5"));
+  options.add(new OptionBean("Label 6", "Value 6"));
+  options.add(new OptionBean("Label 7", "Value 7"));
+  options.add(new OptionBean("Label 8", "Value 8"));
+  options.add(new OptionBean("Label 9", "Value 9"));
+  pageContext.setAttribute("options", options);
 %>
 </head>
 <body bgcolor="white">
@@ -53,6 +66,15 @@
   </tr>
 
   <tr>
+    <th align="right">Multiple Select From A Collection:</th>
+    <td align="left">
+      <html:select property="collectionSelect" size="10" multiple="true">
+        <html:options collection="options" property="value" labelProperty="label"/>
+      </html:select>
+    </td>
+  </tr>
+
+  <tr>
     <td align="right">
       <html:submit>Save</html:submit>
     </td>
diff --git a/web/exercise-taglib/index.jsp b/web/exercise-taglib/index.jsp
index c1f2828..cf81cbc 100644
--- a/web/exercise-taglib/index.jsp
+++ b/web/exercise-taglib/index.jsp
@@ -22,6 +22,7 @@
 
 <h3>HTML Tags</h3>
 <ul>
+<li><a href="html-link.jsp">&lt;html:link&gt;</a></li>
 <li><a href="html-multibox.jsp">&lt;html:multibox&gt;</a></li>
 <li><a href="html-select.jsp">&lt;html:select&gt;</a></li>
 <li><a href="html-setters.jsp">Scalar Setters</a></li>
diff --git a/web/exercise-taglib/logic-iterate.jsp b/web/exercise-taglib/logic-iterate.jsp
index 16deed8..34f2cf3 100644
--- a/web/exercise-taglib/logic-iterate.jsp
+++ b/web/exercise-taglib/logic-iterate.jsp
@@ -29,59 +29,61 @@
 <h3>Test 1 - Iterate Over A String Array [0..4]</h3>
 
 <ol>
-<logic:iterate id="element" name="bean" property="stringArray">
-  <li><em><bean:write name="element"/></em></li>
+<logic:iterate id="element" name="bean" property="stringArray" indexId="index">
+  <li><em><bean:write name="element"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 2 - Iterate Over A String Array [0..2]</h3>
 
 <ol>
-<logic:iterate id="element" name="bean" property="stringArray" length="3">
-  <li><em><bean:write name="element"/></em></li>
+<logic:iterate id="element" name="bean" property="stringArray" indexId="index"
+        length="3">
+  <li><em><bean:write name="element"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 3 - Iterate Over A String Array [3..4]</h3>
 
 <ol>
-<logic:iterate id="element" name="bean" property="stringArray" offset="3">
-  <li><em><bean:write name="element"/></em></li>
+<logic:iterate id="element" name="bean" property="stringArray" indexId="index"
+        offset="3">
+  <li><em><bean:write name="element"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 4 - Iterate Over A String Array [1..3]</h3>
 
 <ol>
-<logic:iterate id="element" name="bean" property="stringArray"
+<logic:iterate id="element" name="bean" property="stringArray" indexId="index"
                offset="1" length="3">
-  <li><em><bean:write name="element"/></em></li>
+  <li><em><bean:write name="element"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 5 - Iterate Over an Array List</h3>
 
 <ol>
-<logic:iterate id="item" name="list">
-  <li><em><bean:write name="item"/></em></li>
+<logic:iterate id="item" name="list" indexId="index">
+  <li><em><bean:write name="item"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 6 - Iterate Over an Array List [0..2]</h3>
 
 <ol>
-<logic:iterate id="item" name="list"
+<logic:iterate id="item" name="list" indexId="index"
        offset="0" length="3">
-  <li><em><bean:write name="item"/></em></li>
+  <li><em><bean:write name="item"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>
 
 <h3>Test 7 - Iterate Over an Array List [2..4]</h3>
 
 <ol>
-<logic:iterate id="item" name="list"
+<logic:iterate id="item" name="list" indexId="index"
        offset="2" length="3">
-  <li><em><bean:write name="item"/></em></li>
+  <li><em><bean:write name="item"/></em>&nbsp;[<bean:write name="index"/>]</li>
 </logic:iterate>
 </ol>