You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ol...@apache.org on 2020/04/09 23:02:20 UTC

[tomcat-taglibs-standard] tag ea3 created (now c23a6a2)

This is an automated email from the ASF dual-hosted git repository.

olamy pushed a change to tag ea3
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git.


      at c23a6a2  (commit)
This tag includes the following new commits:

     new 9c6d864  This commit was manufactured by cvs2svn to create tag 'ea3'.
     new c23a6a2  Moving the Standard taglib over to Tomcat

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-taglibs-standard] 02/02: Moving the Standard taglib over to Tomcat

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to tag ea3
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git

commit c23a6a2d2a87a682b40a40d8e6c3b66be13c8a69
Author: Henri Yandell <ba...@apache.org>
AuthorDate: Mon Aug 17 04:16:09 2009 +0000

    Moving the Standard taglib over to Tomcat


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


[tomcat-taglibs-standard] 01/02: This commit was manufactured by cvs2svn to create tag 'ea3'.

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to tag ea3
in repository https://gitbox.apache.org/repos/asf/tomcat-taglibs-standard.git

commit 9c6d864679eb7ff5ef1ffde78dd52a9cb7104ccc
Author: no_author <de...@apache.org>
AuthorDate: Wed Dec 12 18:34:44 2001 +0000

    This commit was manufactured by cvs2svn to create tag 'ea3'.
---
 README                                             |   2 +
 build.xml                                          |  11 +-
 conf/c-rt.tld                                      |  10 +
 conf/c.tld                                         |  10 +
 conf/fmt-rt.tld                                    |  59 +-
 conf/fmt.tld                                       |  66 +-
 conf/sql-rt.tld                                    | 149 ++++
 conf/sql.tld                                       | 178 ++++
 conf/x-rt.tld                                      |  33 +-
 conf/x.tld                                         |  33 +-
 doc/web/EcmaScriptEL.html                          | 599 +++++++++++++
 doc/web/GettingStarted.html                        |   4 +-
 doc/web/I18N_FunctionalDescription_5_EA2.html      | 989 +++++++++++++++++++++
 .../IOT_Import_FunctionalDescription_5_EA2.html    |  23 +-
 doc/web/Overview.html                              | 155 +++-
 doc/web/ReleaseNotes.html                          |  14 +
 ...ML_ControlFlow_FunctionalDescription_1_EA2.html |   5 +-
 doc/web/XML_Core_FunctionalDescription_2_EA2.html  |  32 +-
 ...Transformation_FunctionalDescription_3_EA2.html |   7 +-
 doc/web/index.html                                 |  25 +-
 doc/web/spel/index.html                            |  36 +-
 examples/conf/web.xml                              |  12 +
 .../taglibs/jsptl/examples/i18n/Resources_de.java  |   1 +
 .../taglibs/jsptl/examples/startup/Init.java       |  11 +-
 examples/web/ShowSource.jsp                        |  25 +-
 examples/web/Templates/ExamplesTemplate.dwt        |  13 +-
 examples/web/conditionals/If.jsp                   |   2 +-
 examples/web/conditionals/index.html               |  26 +-
 examples/web/ecmascript/ConditionalOperator.jsp    |  10 +-
 examples/web/ecmascript/MapAccess.jsp              |   2 +-
 examples/web/ecmascript/PropertyAccess.jsp         |   2 +-
 examples/web/ecmascript/index.html                 |  63 +-
 examples/web/elsupport/index.html                  |  15 +-
 examples/web/format/Exception.jsp                  |   3 +-
 examples/web/format/FormatDateTime.jsp             |  33 +-
 examples/web/format/FormatNumber.jsp               |  10 +-
 examples/web/format/MessageFormat.jsp              |   3 +-
 examples/web/format/ParametricReplacement.jsp      |   3 +
 examples/web/format/index.html                     |  86 +-
 examples/web/import/Absolute.jsp                   |   5 +-
 examples/web/import/Encode.jsp                     |   2 +-
 examples/web/import/index.html                     |  92 +-
 examples/web/index.html                            |  47 +-
 examples/web/iterators/Collaboration.jsp           |   4 +-
 examples/web/iterators/DataTypes.jsp               |   2 +-
 examples/web/iterators/SimpleRange.jsp             |   2 +-
 examples/web/iterators/Status.jsp                  |  10 +-
 examples/web/iterators/index.html                  |  29 +-
 examples/web/misc/index.html                       |  17 +-
 examples/web/xml/index.html                        | 107 +--
 lib/jdbc2_0-stdext.jar                             | Bin 0 -> 6727 bytes
 .../jsp/jstl/core/ConditionalTagSupport.java}      | 136 +--
 .../jsp/jstl/core/ExpressionException.java}        |  37 +-
 .../servlet/jsp/jstl/core/IteratorTag.java}        |  47 +-
 .../servlet/jsp/jstl/core/IteratorTagStatus.java   | 204 +++++
 .../servlet/jsp/jstl/core/IteratorTagSupport.java  | 657 ++++++++++++++
 .../servlet/jsp/jstl/sql/Column.java}              |  29 +-
 src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java | 185 ++++
 .../servlet/jsp/jstl/sql/Result.java}              |  38 +-
 .../servlet/jsp/jstl/sql/ResultMetaData.java}      |  31 +-
 .../servlet/jsp/jstl/sql/Row.java}                 |  31 +-
 .../servlet/jsp/jstl/sql/SQLExecutionTag.java}     |  18 +-
 .../javascript/JavascriptExpressionEvaluator.java  |  12 +-
 .../lang/jpath/JPathExpressionEvaluator.java       |   4 +-
 .../lang/jxpath/JXPathExpressionEvaluator.java     |   2 +-
 .../lang/support/ExpressionEvaluatorManager.java   |  12 +-
 .../standard/resources/Resources.properties        |   6 +
 .../ChooseTag.java}                                | 102 ++-
 .../common/core/DeclareTag.java}                   |  25 +-
 .../standard/tag/common/core/ForEachSupport.java   | 435 +++++++++
 .../SetTag.java => core/ForTokensSupport.java}     |  80 +-
 .../standard/tag/common/core/ImportSupport.java    | 487 ++++++++++
 .../core/NullAttributeException.java}              |  34 +-
 .../common/core/OtherwiseTag.java}                 |  22 +-
 .../tag/common/{xml => core}/ParamSupport.java     |  38 +-
 .../URLEncodeSupport.java}                         |  73 +-
 .../fmt/MessageTag.java => common/core/Util.java}  |  31 +-
 .../ParamSupport.java => core/WhenTagSupport.java} |  82 +-
 .../standard/tag/common/fmt/BundleSupport.java     |  43 +-
 .../standard/tag/common/fmt/ExceptionSupport.java  |   9 +-
 .../standard/tag/common/fmt/FormatDateSupport.java |  58 +-
 .../tag/common/fmt/FormatNumberSupport.java        |  29 +-
 .../standard/tag/common/fmt/LocaleSupport.java     | 157 ++--
 .../standard/tag/common/fmt/MessageSupport.java    |  15 +-
 .../standard/tag/common/fmt/ParseDateSupport.java  |  44 +-
 .../tag/common/fmt/ParseNumberSupport.java         |  17 +-
 .../RequestEncodingSupport.java}                   |  58 +-
 .../standard/tag/common/fmt/TimeZoneSupport.java   |  63 +-
 .../common/sql/ColumnImpl.java}                    |  52 +-
 .../tag/common/sql/ColumnMetaDataImpl.java         | 489 ++++++++++
 .../DataSourceWrapper.java}                        | 170 ++--
 .../common/{xml/SetTag.java => sql/DriverTag.java} | 131 ++-
 .../sql/ParamTagSupport.java}                      |  46 +-
 .../standard/tag/common/sql/QueryTagSupport.java   | 300 +++++++
 .../standard/tag/common/sql/ResultImpl.java        | 167 ++++
 .../tag/common/sql/ResultMetaDataImpl.java         | 263 ++++++
 .../FormatDateTag.java => common/sql/RowImpl.java} |  74 +-
 .../tag/common/sql/TransactionTagSupport.java      | 206 +++++
 .../standard/tag/common/sql/UpdateTagSupport.java  | 251 ++++++
 .../standard/tag/common/xml/ParamSupport.java      |   9 +-
 .../standard/tag/common/xml/ParseSupport.java      |  11 +-
 .../taglibs/standard/tag/common/xml/SetTag.java    |   9 +-
 .../standard/tag/common/xml/TransformSupport.java  | 112 ++-
 .../tag/common/xml/TransformerSupport.java         |   9 +-
 .../xml/SetTag.java => el/core/ExprTag.java}       | 115 ++-
 .../core/ExpressionLanguageTag.java}               |  75 +-
 .../ParamTag.java => el/core/ExpressionUtil.java}  |  43 +-
 .../FormatDateTag.java => core/ForEachTag.java}    | 101 ++-
 .../FormatDateTag.java => core/ForTokensTag.java}  | 122 ++-
 .../{common/xml/SetTag.java => el/core/IfTag.java} |  86 +-
 .../ParseNumberTag.java => core/ImportTag.java}    |  48 +-
 .../standard/tag/el/{xml => core}/ParamTag.java    |  26 +-
 .../tag/{common/xml => el/core}/SetTag.java        | 103 ++-
 .../{xml/ParamTag.java => core/URLEncodeTag.java}  |  28 +-
 .../xml/SetTag.java => el/core/WhenTag.java}       |  80 +-
 .../taglibs/standard/tag/el/fmt/FormatDateTag.java |  14 +-
 .../standard/tag/el/fmt/FormatNumberTag.java       |  14 +-
 .../taglibs/standard/tag/el/fmt/MessageTag.java    |  20 +-
 .../taglibs/standard/tag/el/fmt/ParseDateTag.java  |  26 +-
 .../standard/tag/el/fmt/ParseNumberTag.java        |  14 +-
 .../{ParseDateTag.java => RequestEncodingTag.java} |  22 +-
 .../standard/tag/{rt/xml => el/sql}/ParamTag.java  |  36 +-
 .../FormatDateTag.java => el/sql/QueryTag.java}    |  53 +-
 .../sql/TransactionTag.java}                       |  37 +-
 .../FormatDateTag.java => el/sql/UpdateTag.java}   |  53 +-
 .../taglibs/standard/tag/el/xml/ParamTag.java      |   4 +-
 .../FormatDateTag.java => core/ForEachTag.java}    |  38 +-
 .../FormatDateTag.java => core/ForTokensTag.java}  |  47 +-
 .../{common/xml/SetTag.java => rt/core/IfTag.java} |  78 +-
 .../rt/{xml/ParamTag.java => core/ImportTag.java}  |  22 +-
 .../standard/tag/rt/{xml => core}/ParamTag.java    |   9 +-
 .../{xml/ParamTag.java => core/URLEncodeTag.java}  |  13 +-
 .../rt/core/WhenTag.java}                          |  63 +-
 .../taglibs/standard/tag/rt/fmt/FormatDateTag.java |   5 +
 .../standard/tag/rt/fmt/FormatNumberTag.java       |   5 +
 .../taglibs/standard/tag/rt/fmt/MessageTag.java    |   5 +
 .../taglibs/standard/tag/rt/fmt/ParseDateTag.java  |  10 +
 .../standard/tag/rt/fmt/ParseNumberTag.java        |   5 +
 .../{ParseDateTag.java => RequestEncodingTag.java} |   9 +-
 .../BundleTEI.java => tag/rt/sql/ParamTag.java}    |  23 +-
 .../FormatNumberTag.java => sql/QueryTag.java}     |  38 +-
 .../rt/sql/TransactionTag.java}                    |  23 +-
 .../FormatNumberTag.java => sql/UpdateTag.java}    |  38 +-
 .../taglibs/standard/tag/rt/xml/ParamTag.java      |   2 +-
 .../apache/taglibs/standard/tei/TimeZoneTEI.java   |  74 --
 src/org/apache/taglibs/standard/tei/Util.java      |  21 +-
 .../apache/taglibs/standard/tlv/JstlBaseTLV.java   |  36 +
 .../apache/taglibs/standard/tlv/JstlCoreTLV.java   |  81 +-
 .../taglibs/standard/tlv/JstlCoreTLVHelper.java    |   6 +-
 .../apache/taglibs/standard/tlv/JstlXmlTLV.java    |  49 +-
 xml/intro.xml                                      |  72 +-
 151 files changed, 8619 insertions(+), 2000 deletions(-)

diff --git a/README b/README
index d005775..c9e0772 100644
--- a/README
+++ b/README
@@ -25,6 +25,8 @@ Included in this distibution:
 	    Note that these are not formal specifications, just technical
 	    overviews of functionality and intent.
 
+	Release notes:  Changes since EA1 and other historical info.
+
     EXAMPLES ('examples' directory)
 
 	The standard-examples application included with this distribution
diff --git a/build.xml b/build.xml
index 69e0b36..092751f 100644
--- a/build.xml
+++ b/build.xml
@@ -5,6 +5,7 @@
     <property file="../build.properties"/>
     <property file="../common.properties"/>
     <property name="js.jar"   value="lib/js.jar"/>
+    <property name="jdbc.jar"   value="lib/jdbc2_0-stdext.jar"/>
     <property name="jaxen-full.jar"   value="lib/jaxen-full.jar"/>
     <property name="saxpath.jar"      value="lib/saxpath.jar"/>
     <property name="crimson.jar"      value="lib/crimson.jar"/>
@@ -136,8 +137,8 @@
               tofile="${build.examples}/WEB-INF/scriptfree.tld"/>
     -->
     <!-- Copy the 'standard' jar files -->
-    <copy file="${dist.library}/jstl.jar"
-              tofile="${build.examples}/WEB-INF/lib/jstl.jar"/>
+    <copy file="${dist.library}/standard.jar"
+              tofile="${build.examples}/WEB-INF/lib/standard.jar"/>
     <javac srcdir="${examples.src}" destdir="${build.examples}/WEB-INF/classes"
         classpath="${servlet23.jar}:${build.library}"/>
   </target>
@@ -179,7 +180,7 @@
 -->
 
     <javac srcdir="${library.src}" destdir="${build.library}"
-           classpath="${servlet23.jar}:${jxpath.jar}:${js.jar}:${jaxen-full.jar}:${saxpath.jar}:${crimson.jar}:${xalan.jar}"
+           classpath="${servlet23.jar}:${jxpath.jar}:${js.jar}:${jdbc.jar}:${jaxen-full.jar}:${saxpath.jar}:${crimson.jar}:${xalan.jar}"
 	   debug="on"/>
   </target>
 
@@ -208,10 +209,10 @@
   <!-- Create the library distribution files -->
   <target name="library-dist" depends="library">
     <!-- Create the tag library jar -->
-    <jar jarfile="${dist.library}/jstl.jar"
+    <jar jarfile="${dist.library}/standard.jar"
          basedir="${build.library}"/>
     <!-- Create the 'standard' API jar -->
-    <jar jarfile="${dist.library}/jstl-api.jar"
+    <jar jarfile="${dist.library}/jstl.jar"
          basedir="${build.library}"
          includes="javax/**"/>
     <copy todir="${dist.dir}/${taglib.name}">
diff --git a/conf/c-rt.tld b/conf/c-rt.tld
index 4445452..ce755e0 100644
--- a/conf/c-rt.tld
+++ b/conf/c-rt.tld
@@ -94,6 +94,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>varReader</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -268,6 +273,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
diff --git a/conf/c.tld b/conf/c.tld
index b1ee816..9da7655 100644
--- a/conf/c.tld
+++ b/conf/c.tld
@@ -165,6 +165,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>varReader</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -354,6 +359,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>value</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/fmt-rt.tld b/conf/fmt-rt.tld
index a51ba46..ead81ef 100644
--- a/conf/fmt-rt.tld
+++ b/conf/fmt-rt.tld
@@ -20,6 +20,20 @@
   </validator>
 
   <tag>
+    <name>requestEncoding</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.fmt.RequestEncodingTag</tag-class>
+    <body-content>EMPTY</body-content>
+    <description>
+        Sets the request character encoding
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
     <name>exception</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ExceptionTag</tag-class>
     <body-content>EMPTY</body-content>
@@ -46,7 +60,6 @@
   <tag>
     <name>locale</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.LocaleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.LocaleTEI</tei-class>
     <body-content>EMPTY</body-content>
     <description>
         Establishes the locale to use for resource bundles and formatting
@@ -71,7 +84,6 @@
   <tag>
     <name>timeZone</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.TimeZoneTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.TimeZoneTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Establishes the time zone in which to represent a &lt;formatDate&gt;
@@ -97,7 +109,6 @@
   <tag>
     <name>bundle</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.BundleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.BundleTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Loads a resource bundle containing localized messages
@@ -127,7 +138,6 @@
   <tag>
     <name>message</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Maps key to localized message and performs parametric replacement
@@ -143,6 +153,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -157,7 +172,6 @@
   <tag>
     <name>messageFormat</name>
     <tag-class>org.apache.taglibs.standard.tag.rt.fmt.MessageFormatTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageFormatTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Performs parametric replacement on a given pattern string
@@ -218,6 +232,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -253,6 +272,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -303,6 +327,11 @@
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -333,11 +362,31 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>dateStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>timeStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>pattern</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
     </attribute>
     <attribute>
+        <name>timeZone</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/fmt.tld b/conf/fmt.tld
index af0cd5f..aae85aa 100644
--- a/conf/fmt.tld
+++ b/conf/fmt.tld
@@ -17,6 +17,7 @@
     <init-param>
 	<param-name>expressionAttributes</param-name>
 	<param-value>
+            requestEncoding:value 
 	    exception:value
 	    exception:bundle
 	    exception:stackTrace
@@ -27,17 +28,23 @@
 	    bundle:prefix
 	    message:key
 	    message:bundle
+	    message:messageArgs
 	    messageFormat:value
 	    messageArg:value
 	    formatNumber:value
 	    formatNumber:pattern
+	    formatNumber:parseLocale
 	    parseNumber:value
 	    parseNumber:pattern
+	    parseNumber:parseLocale
 	    formatDate:value
 	    formatDate:pattern
 	    formatDate:timeZone
+	    formatDate:parseLocale
 	    parseDate:value
 	    parseDate:pattern
+	    parseDate:timeZone
+	    parseDate:parseLocale
 	</param-value>
 	<description>
 	    Whitespace-separated list of colon-separated token pairs
@@ -59,6 +66,20 @@
   </listener>
 
   <tag>
+    <name>requestEncoding</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.fmt.RequestEncodingTag</tag-class>
+    <body-content>EMPTY</body-content>
+    <description>
+        Sets the request character encoding
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
     <name>exception</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.ExceptionTag</tag-class>
     <body-content>EMPTY</body-content>
@@ -85,7 +106,6 @@
   <tag>
     <name>locale</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.LocaleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.LocaleTEI</tei-class>
     <body-content>EMPTY</body-content>
     <description>
         Establishes the locale to use for resource bundles and formatting
@@ -110,7 +130,6 @@
   <tag>
     <name>timeZone</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.TimeZoneTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.TimeZoneTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Establishes the time zone in which to represent a &lt;formatDate&gt;
@@ -136,7 +155,6 @@
   <tag>
     <name>bundle</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.BundleTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.BundleTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Loads a resource bundle containing localized messages
@@ -166,7 +184,6 @@
   <tag>
     <name>message</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.MessageTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Maps key to localized message and performs parametric replacement
@@ -182,6 +199,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>messageArgs</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -196,7 +218,6 @@
   <tag>
     <name>messageFormat</name>
     <tag-class>org.apache.taglibs.standard.tag.el.fmt.MessageFormatTag</tag-class>
-    <tei-class>org.apache.taglibs.standard.tei.MessageFormatTEI</tei-class>
     <body-content>JSP</body-content>
     <description>
         Performs parametric replacement on a given pattern string
@@ -257,6 +278,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -292,6 +318,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -342,6 +373,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -372,11 +408,31 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>dateStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>timeStyle</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>pattern</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>timeZone</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>parseLocale</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>var</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
diff --git a/conf/sql-rt.tld b/conf/sql-rt.tld
new file mode 100644
index 0000000..3613c9f
--- /dev/null
+++ b/conf/sql-rt.tld
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib
+  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+  <tlib-version>1.0 EA3</tlib-version>
+  <jsp-version>1.2</jsp-version>
+  <short-name>sql-rt</short-name>
+  <uri>http://java.sun.com/jstl/ea/sql-rt</uri>
+  <display-name>JSTL sql RT</display-name>
+  <description>JSTL 1.0 sql library</description>
+
+  <validator>
+    <validator-class>
+        org.apache.taglibs.standard.tlv.JstlCoreTLV
+    </validator-class>
+    <description>
+        Provides core validation features for JSTL tags.
+    </description>
+  </validator>
+
+  <tag>
+    <name>transaction</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.TransactionTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Provides nested database action elements with a shared Connection,
+        set up to execute all statements as one transaction.
+    </description>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>query</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.QueryTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL query defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>startRow</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>maxRows</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>update</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.UpdateTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL update defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>parameter</name>
+    <tag-class>org.apache.taglibs.standard.tag.rt.sql.ParamTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Sets a parameter in an SQL statement to the specified value.
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>true</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>driver</name>
+    <tag-class>org.apache.taglibs.standard.tag.common.sql.DriverTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Creates a simple DataSource suitable only for prototyping.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>driverClassName</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>jdbcURL</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>userName</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+</taglib>
diff --git a/conf/sql.tld b/conf/sql.tld
new file mode 100644
index 0000000..94906e1
--- /dev/null
+++ b/conf/sql.tld
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE taglib
+  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
+  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
+<taglib>
+  <tlib-version>1.0 EA3</tlib-version>
+  <jsp-version>1.2</jsp-version>
+  <short-name>sql</short-name>
+  <uri>http://java.sun.com/jstl/ea/sql</uri>
+  <display-name>JSTL sql</display-name>
+  <description>JSTL 1.0 sql library</description>
+
+  <validator>
+    <validator-class>
+	org.apache.taglibs.standard.tlv.JstlCoreTLV
+    </validator-class>
+    <init-param>
+        <param-name>expressionAttributes</param-name>
+        <param-value>
+        transaction:dataSource
+        query:sql
+        query:dataSource
+        query:startRow
+        query:maxRows
+        update:sql
+        update:dataSource
+        param:value
+        driver:driver
+        driver:jdbcURL
+        driver:userName
+        </param-value>
+        <description>
+            Whitespace-separated list of colon-separated token pairs
+            describing tag:attribute combinations that accept expressions.
+            The validator uses this information to determine which
+            attributes need their syntax validated.
+        </description>
+     </init-param>
+    <description>
+	Provides core validation features for JSTL tags.
+    </description>
+  </validator>
+
+  <!-- The validator also listens in order to recover a context parameter -->
+  <listener>
+    <listener-class>
+	org.apache.taglibs.standard.tlv.JstlCoreTLVHelper
+    </listener-class>
+  </listener>
+
+  <tag>
+    <name>transaction</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.TransactionTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Provides nested database action elements with a shared Connection,
+        set up to execute all statements as one transaction.
+    </description>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>query</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.QueryTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL query defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>startRow</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>maxRows</name>
+        <required>false</required>
+        <rtexprvalue>true</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>update</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.UpdateTag</tag-class>
+    <body-content>JSP</body-content>
+    <description>
+        Executes the SQL update defined in its body or through the
+        sql attribute.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>sql</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>dataSource</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>param</name>
+    <tag-class>org.apache.taglibs.standard.tag.el.sql.ParamTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Sets a parameter in an SQL statement to the specified value.
+    </description>
+    <attribute>
+        <name>value</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+
+  <tag>
+    <name>driver</name>
+    <tag-class>org.apache.taglibs.standard.tag.common.sql.DriverTag</tag-class>
+    <body-content>empty</body-content>
+    <description>
+        Creates a simple DataSource suitable only for prototyping.
+    </description>
+    <attribute>
+        <name>var</name>
+        <required>true</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>driver</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>jdbcURL</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
+        <name>userName</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+  </tag>
+</taglib>
diff --git a/conf/x-rt.tld b/conf/x-rt.tld
index 4e88913..ef95e94 100644
--- a/conf/x-rt.tld
+++ b/conf/x-rt.tld
@@ -49,20 +49,14 @@
     <tag-class>org.apache.taglibs.standard.tag.common.core.IfTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-        Simple conditional tag, which evalutes its body if the
-        supplied condition is true and optionally exposes a Boolean
-        scripting variable representing the evaluation of this condition
+        XML conditional tag, which evalutes its body if the
+        supplied XPath expression evalutes to 'true' as a boolean
     </description>
     <attribute>
         <name>select</name>
         <required>true</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <attribute>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
   </tag>
 
   <tag>
@@ -119,7 +113,7 @@
     <tag-class>org.apache.taglibs.standard.tag.rt.xml.ParseTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Parses XML content from 'source' attribute or 'body'; exposes as 'var'.
+	Parses XML content from 'source' attribute or 'body'
     </description>
     <attribute>
         <name>var</name>
@@ -132,6 +126,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>source</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -148,7 +147,7 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Sets the result of an XPath expression evaluation in a 'scope'
+	Saves the result of an XPath expression evaluation in a 'scope'
     </description>
     <attribute>
         <name>var</name>
@@ -160,13 +159,11 @@
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <!--
     <attribute>
         <name>scope</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    -->
   </tag>
 
   <tag>
@@ -184,6 +181,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>result</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -218,6 +220,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
 	<name>xslt</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
@@ -230,7 +237,7 @@
     <body-content>JSP</body-content>
     <description>
         Subtag of &lt;choose&gt; that includes its body if its
-        condition evalutes to 'true'
+        expression evalutes to 'true'
     </description>
     <attribute>
         <name>select</name>
diff --git a/conf/x.tld b/conf/x.tld
index b444d29..c61aca1 100644
--- a/conf/x.tld
+++ b/conf/x.tld
@@ -74,20 +74,14 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.IfTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-        Simple conditional tag, which evalutes its body if the
-        supplied condition is true and optionally exposes a Boolean
-        scripting variable representing the evaluation of this condition
+      XML conditional tag, which evalutes its body if the
+      supplied XPath expression evalutes to 'true' as a boolean
     </description>
     <attribute>
         <name>select</name>
         <required>true</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <attribute>
-        <name>var</name>
-        <required>false</required>
-        <rtexprvalue>false</rtexprvalue>
-    </attribute>
   </tag>
 
   <tag>
@@ -144,7 +138,7 @@
     <tag-class>org.apache.taglibs.standard.tag.el.xml.ParseTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Parses XML content from 'source' attribute or 'body'; exposes as 'var'.
+	Parses XML content from 'source' attribute or 'body'
     </description>
     <attribute>
         <name>var</name>
@@ -157,6 +151,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>source</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -173,7 +172,7 @@
     <tag-class>org.apache.taglibs.standard.tag.common.xml.SetTag</tag-class>
     <body-content>JSP</body-content>
     <description>
-	Sets the result of an XPath expression evaluation in a 'scope'
+	Saves the result of an XPath expression evaluation in a 'scope'
     </description>
     <attribute>
         <name>var</name>
@@ -185,13 +184,11 @@
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    <!--
     <attribute>
         <name>scope</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
     </attribute>
-    -->
   </tag>
 
   <tag>
@@ -209,6 +206,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
         <name>result</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -243,6 +245,11 @@
         <rtexprvalue>false</rtexprvalue>
     </attribute>
     <attribute>
+        <name>scope</name>
+        <required>false</required>
+        <rtexprvalue>false</rtexprvalue>
+    </attribute>
+    <attribute>
 	<name>xslt</name>
         <required>false</required>
         <rtexprvalue>false</rtexprvalue>
@@ -255,7 +262,7 @@
     <body-content>JSP</body-content>
     <description>
         Subtag of &lt;choose&gt; that includes its body if its
-        condition evalutes to 'true'
+        expression evalutes to 'true'
     </description>
     <attribute>
         <name>select</name>
diff --git a/doc/web/EcmaScriptEL.html b/doc/web/EcmaScriptEL.html
new file mode 100644
index 0000000..2f32db8
--- /dev/null
+++ b/doc/web/EcmaScriptEL.html
@@ -0,0 +1,599 @@
+<html>
+<head>
+<title>EcmaScript Expression Language Support</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<body bgcolor="#FFFFFF" text="#000000">
+<h1>EcmaScript as an Expression Language for JSTL</h1>
+<h2>Overview</h2>
+<p>EcmaScript is an object-based scripting language for client and server applications. 
+  EcmaScript is the standardized version of JavaScript and behaves the same way 
+  in all applications that support the standard. JavaScript implementations correspond 
+  to the <a href="http://www.ecma.ch/ecma1/stand/ecma-262.htm">ECMA-262</a> Language 
+  Specification standardized by the European standards body.</p>
+<p>Rhino 1.5, one of the supported JSTL EL's, implements JavaScript 1.5, which 
+  conforms to Edition 3 of the EcmaScript Standard. <a href="http://www.mozilla.org/rhino">Rhino</a> 
+  is an open source Java implementation of JavaScript. </p>
+<table border="1" cellpadding="5" align="center">
+  <tr> 
+    <th>Name</th>
+    <th>Links</th>
+    <th>Date</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">June 1997</div>
+    </td>
+    <td> 
+      <div align="left">The original ECMAScript standard.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262 Edition 2</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262-2.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">August 1998 </div>
+    </td>
+    <td> 
+      <div align="left">The second revision of the ECMAScript standard; also ISO 
+        standard 16262.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">ECMA-262 Edition 3</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/E262-3.pdf">PDF</a></div>
+    </td>
+    <td> 
+      <div align="left">December 1999</div>
+    </td>
+    <td> 
+      <div align="left">The third, and most recent, revision of the ECMAScript 
+        standard. Corresponds to JavaScript 1.5.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Proposed EcmaScript Edition 4</div>
+    </td>
+    <td> 
+      <div align="left"><a href="http://www.mozilla.org/js/language/es4/index.html">Home 
+        Page</a></div>
+    </td>
+    <td> 
+      <div align="left">?</div>
+    </td>
+    <td> 
+      <p align="left"><a href="http://www.mozilla.org/js/language/js20/index.html">JavaScript 
+        2.0</a> is the next version of the JavaScript language. It closely matches 
+        the ECMAScript Edition 4 standard under development. The intent is to 
+        make JavaScript 2.0 and ECMAScript Edition 4 be the same language.</p>
+    </td>
+  </tr>
+</table>
+<p>This document gives a brief overview of the main EcmaScript features a page 
+  author may be interested in. </p>
+<h2>Expression Support</h2>
+<p>An expression is any valid set of literals, variables, operators, and expressions 
+  that evaluates to a single value; the value can be a number, a string, a logical 
+  value, or an object.<br>
+</p>
+<p>EcmaScript has the following types of expressions: </p>
+<ul>
+  <li>Arithmetic: evaluates to a number</li>
+  <li>String: evaluates to a character string</li>
+  <li>Logical: evaluates to true or false </li>
+  <li>Object: evaluates to an object </li>
+</ul>
+<h2>Operator Support</h2>
+<p>The following operators should be of interest to a page author.<br>
+</p>
+<h3>Comparison operators</h3>
+<p>A comparison operator compares its operands and returns a logical value based 
+  on whether the comparison is true. The operands can be numerical, string, logical, 
+  or object values. Strings are compared based on standard lexicographical ordering, 
+  using Unicode values.</p>
+<p></p>
+<p></p>
+<p></p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Equal (==)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are equal.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Not equal (!=) </div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are not equal.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Strict equal (===)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are equal and of the same 
+        type.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Strict not equal (!==) </div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the operands are not equal and/or not 
+        of the same type. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Greater than (&gt;)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is greater than the right 
+        operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Greater than or equal (&gt;=)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is greater than or equal 
+        to the right operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Less than (&lt;)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is less than the right 
+        operand.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Less than or equal (&lt;=)</div>
+    </td>
+    <td> 
+      <div align="left">Returns true if the left operand is less than or equal 
+        to the right operand.</div>
+    </td>
+  </tr>
+</table>
+<h3>Arithmetic Operators</h3>
+<p>Arithmetic operators take numerical values (either literals or variables) as 
+  their operands and return a single numerical value. These operators work as 
+  they do in most other programming languages, except the / operator returns a 
+  floating-point division in EcmaScript, not a truncated division as it does in 
+  languages such as C or Java.</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <p align="left">% (Modulus)</p>
+    </td>
+    <td> 
+      <div align="left">Binary operator. Returns the integer remainder of dividing 
+        the two operands.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">++ (Increment)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Adds one to its operand. Can be used as 
+        a prefix or postfix operator.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">-- (Decrement)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Subtracts one to its operand. Can be used 
+        as a prefix or postfix operator.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">- (Unary negation)</div>
+    </td>
+    <td> 
+      <div align="left">Unary operator. Returns the negation of its operand.</div>
+    </td>
+  </tr>
+</table>
+<h3>Logical Operators</h3>
+<p>Logical operators are typically used with Boolean (logical) values; when they 
+  are, they return a Boolean value. However, the &amp;&amp; and || operators return 
+  the value of one of the specified operands.</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Usage</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical AND</div>
+    </td>
+    <td> 
+      <div align="left">expr1 &amp;&amp; expr2 </div>
+    </td>
+    <td> 
+      <div align="left">Returns expr1 if it can be converted to false; otherwise, 
+        returns expr2. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical OR </div>
+    </td>
+    <td> 
+      <div align="left">expr1 || expr2 </div>
+    </td>
+    <td> 
+      <div align="left">Returns expr1 if it can be converted to true; otherwise, 
+        returns expr2. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">Logical NOT</div>
+    </td>
+    <td> 
+      <div align="left">!expr </div>
+    </td>
+    <td> 
+      <div align="left">Returns false if its single operand can be converted to 
+        true; otherwise, returns true. </div>
+    </td>
+  </tr>
+</table>
+<h3>String Operators</h3>
+<p>In addition to the comparison operators, which can be used on string values, 
+  the concatenation operator (+) concatenates two string values together, returning 
+  another string that is the union of the two operand strings. </p>
+<p></p>
+<h3>Special Operators</h3>
+<p>Some special operators of interest:</p>
+<table border="1" align="center" cellpadding="5">
+  <tr> 
+    <th>Operator</th>
+    <th>Usage</th>
+    <th>Description</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">conditional</div>
+    </td>
+    <td> 
+      <div align="left">condition ? val1 : val2</div>
+    </td>
+    <td> 
+      <div align="left">The conditional operator can have one of two values based 
+        on a condition. </div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="left">in</div>
+    </td>
+    <td> 
+      <div align="left">val in Object</div>
+    </td>
+    <td> 
+      <div align="left">The in operator returns true if the specified property 
+        is in the specified object.</div>
+    </td>
+  </tr>
+</table>
+<h2>Reserved Words</h2>
+<p>The reserved words in this list cannot be used as EcmaScript variables, functions, 
+  methods, or object names.</p>
+<table width="95%" border="1" height="298">
+  <tr> 
+    <td> 
+      <p align="center"></p>
+      <p align="center"></p>
+      <p align="center"> </p>
+      <p align="center"> abstract</p>
+    </td>
+    <td> 
+      <div align="center">else</div>
+    </td>
+    <td> 
+      <div align="center">instanceof</div>
+    </td>
+    <td> 
+      <div align="center">switch</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">boolean</div>
+    </td>
+    <td> 
+      <div align="center">enum</div>
+    </td>
+    <td> 
+      <div align="center">int</div>
+    </td>
+    <td> 
+      <div align="center">synchronized</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">break</div>
+    </td>
+    <td> 
+      <div align="center">export</div>
+    </td>
+    <td> 
+      <div align="center">interface</div>
+    </td>
+    <td> 
+      <div align="center">this</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">byte</div>
+    </td>
+    <td> 
+      <div align="center">extends</div>
+    </td>
+    <td> 
+      <div align="center">long</div>
+    </td>
+    <td> 
+      <div align="center">throw</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">case</div>
+    </td>
+    <td> 
+      <div align="center">false</div>
+    </td>
+    <td> 
+      <div align="center">native</div>
+    </td>
+    <td> 
+      <div align="center">throws</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">catch</div>
+    </td>
+    <td> 
+      <div align="center">final</div>
+    </td>
+    <td> 
+      <div align="center">new</div>
+    </td>
+    <td> 
+      <div align="center">transient</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">char</div>
+    </td>
+    <td> 
+      <div align="center">finally</div>
+    </td>
+    <td> 
+      <div align="center">null</div>
+    </td>
+    <td> 
+      <div align="center">true</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="20"> 
+      <div align="center">class</div>
+    </td>
+    <td height="20"> 
+      <div align="center">float</div>
+    </td>
+    <td height="20"> 
+      <div align="center">package</div>
+    </td>
+    <td height="20"> 
+      <div align="center">try</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">const</div>
+    </td>
+    <td> 
+      <div align="center">for</div>
+    </td>
+    <td> 
+      <div align="center">private</div>
+    </td>
+    <td> 
+      <div align="center">typeof</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="18"> 
+      <div align="center">continue</div>
+    </td>
+    <td height="18"> 
+      <div align="center">function</div>
+    </td>
+    <td height="18"> 
+      <div align="center">protected</div>
+    </td>
+    <td height="18"> 
+      <div align="center">var</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">debugger</div>
+    </td>
+    <td> 
+      <div align="center">goto</div>
+    </td>
+    <td> 
+      <div align="center">public</div>
+    </td>
+    <td> 
+      <div align="center">void</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">default</div>
+    </td>
+    <td> 
+      <div align="center">if</div>
+    </td>
+    <td> 
+      <div align="center">return</div>
+    </td>
+    <td> 
+      <div align="center">volatile</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">delete</div>
+    </td>
+    <td> 
+      <div align="center">implements</div>
+    </td>
+    <td> 
+      <div align="center">short</div>
+    </td>
+    <td> 
+      <div align="center">while</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">do</div>
+    </td>
+    <td> 
+      <div align="center">import</div>
+    </td>
+    <td> 
+      <div align="center">static</div>
+    </td>
+    <td> 
+      <div align="center">with</div>
+    </td>
+  </tr>
+  <tr> 
+    <td height="2"> 
+      <div align="center">double</div>
+    </td>
+    <td height="2"> 
+      <div align="center">in </div>
+    </td>
+    <td height="2"> 
+      <div align="center">super</div>
+    </td>
+    <td height="2"> 
+      <div align="center"></div>
+    </td>
+  </tr>
+</table>
+<h2>Type Conversion</h2>
+<p>Values passed from Java to JavaScript are converted as follows: </p>
+<table width="95%" border="1">
+  <tr> 
+    <th>Java Types</th>
+    <th>Converted JavaScript Types</th>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">byte, char, short, int, long, float, and double</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript numbers. Instances of java.lang.Double and 
+        java.lang.Integer are converted to JavaScript objects, not to JavaScript 
+        numbers.</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">boolean</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript boolean</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">arrays</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript pseudo-Array object</div>
+    </td>
+  </tr>
+  <tr> 
+    <td> 
+      <div align="center">Java object of any other class</div>
+    </td>
+    <td> 
+      <div align="center">JavaScript wrapper</div>
+    </td>
+  </tr>
+</table>
+<h2>Expression Exceptions</h2>
+<p>When you are evaluating JavaScript code in Java, the following situations can 
+  cause run-time errors: </p>
+<ul>
+  <li>The JavaScript code is not evaluated, either due to a JavaScript compilation 
+    error or to some other error that occurred at run time. 
+    <p>The JavaScript interpreter generates an error message that is converted 
+      into an instance of JSException. </p>
+  </li>
+  <li>Java successfully evaluates the JavaScript code, but the JavaScript code 
+    executes an unhandled throw statement. 
+    <p>JavaScript throws an exception that is wrapped as an instance of JSException. 
+      Use the getWrappedException method of JSException to unwrap this exception 
+      in Java. </p>
+  </li>
+</ul>
+<p>&nbsp;</p>
+</body>
+</html>
diff --git a/doc/web/GettingStarted.html b/doc/web/GettingStarted.html
index 95ff548..108623c 100644
--- a/doc/web/GettingStarted.html
+++ b/doc/web/GettingStarted.html
@@ -121,7 +121,7 @@ by the class
 JXPath's evaluator is
 <tt>org.apache.taglibs.standard.lang.jxpath.JXPathExpressionEvaluator</tt>;
 and the JavaScript/Rhino evaluator is
-<tt>org.apache.taglibs.standard.lang.javascript.javascript.JavascriptExpressionEvaluator</tt>.
+<tt>org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator</tt>.
 (For an example of how this context parameter is set, see the
 <tt>web.xml</tt> file that comes with the <tt>jstl-examples</tt>
 application.)</p>
@@ -137,7 +137,7 @@ rtexprvalues.  Instead, you specify literal expressions that the tags
 evaluate at runtime.  For example:</p>
 
 <pre>
-    &lt;jx:forEach items="<b>$page:myItems</b>" /&gt;
+    &lt;c:forEach items="<b>$page:myItems</b>" /&gt;
 </pre>
 
 <i><b>Important:</b> The expression-language support included with JSTL
diff --git a/doc/web/I18N_FunctionalDescription_5_EA2.html b/doc/web/I18N_FunctionalDescription_5_EA2.html
new file mode 100644
index 0000000..e8192d7
--- /dev/null
+++ b/doc/web/I18N_FunctionalDescription_5_EA2.html
@@ -0,0 +1,989 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="GENERATOR" content="Mozilla/4.76C-CCK-MCD Netscape [en] (X11; U; SunOS 5.7 sun4u) [Netscape]">
+   <title>I18N -- Functional Description</title>
+<style media="screen" type="text/css"><!--
+.fixme { color: red }
+--></style>
+</head>
+<body bgcolor="#FFFFFF">
+
+<h3>
+
+<hr width="100%" noshade></h3>
+
+<h2>
+I18N/Formatting Tags - Functional Description&nbsp;<br>
+</h2>
+
+<h2>
+<tt>&lt;fmt:locale><br>
+&lt;fmt:timeZone><br>
+&lt;fmt:bundle><br>
+&lt;fmt:message><br>
+&lt;fmt:messageFormat><br>
+&lt;fmt:messageArg><br>
+&lt;fmt:formatNumber><br>
+&lt;fmt:parseNumber><br>
+&lt;fmt:formatDate><br>
+&lt;fmt:parseDate><br>
+&lt;fmt:exception></tt></h2>
+
+<hr width="100%" noshade>
+<h3>
+1. Introduction</h3>
+With the explosion of application development based on web technologies,
+and the deployment of such applications on the Internet, applications must
+be able to adapt to the languages and formatting conventions of their clients.
+This means that page authors must be able to tailor any locale-specific
+page content according to the conventions of the client's language and
+cultural formatting conventions. For example, the number <tt>345987.246
+</tt>should
+be formatted as <tt>345 987,246 </tt>for French, <tt>345.987,246
+</tt>for
+German, and <tt>345,987.246</tt><i> </i>for clients<i> </i>in the U.S.
+<p>The process of designing an application (or page content) so that it
+can be adapted to various languages and regions without requiring any engineering
+changes is known as <i>internationalization</i>, or I18N for short. Once
+a web application has been internationalized, it can be adapted for a number
+of regions or languages by adding locale-specific components and translating
+text. This process is known as <i>localization</i>.
+<p>There are two approaches to internationalizing a web application:
+<ul>
+<li>
+Provide a version of the JSP in each of the target locales and have a controller
+servlet dispatch the request to the appropriate page (depending on the
+requested locale). This approach is useful if large amounts of data on
+a page or an entire web application need to be internationalized.</li>
+
+<li>
+Isolate any locale-sensitive data on a page (such as error messages, string
+literals, or button labels) into resource bundles, and access the data
+via I18N tags, so that the corresponding translated message is fetched
+automatically and inserted into the page.</li>
+</ul>
+This proposal supports both approaches. It defines two sets of<font size=+0>
+tags: I18N tags, whose purpose is to assist page authors with creating
+internationalized page content that can be localized into any locale available
+in the JSP container&nbsp; (this addresses the second approach), and formatting
+tags, which allow various data elements such as numbers, currencies, dates
+and times to be formatted and parsed in a locale-sensitive or customized
+manner (this may be used in either approach).</font>
+<h3>
+2. Locale selection</h3>
+JSTL supports both browser- and application-based locales, which are discussed
+in more detail.
+<h4>
+2.1 Browser-based locales</h4>
+By default, browser-sensing capabilities for locales are enabled. This
+means that the client determines (via its browser settings) which locale
+to use, and allows page authors to cater to the language preferences of
+their clients. For example, a shopping application may want to greet its
+customers in their language, and it may even want to label its GUI components
+in that language (for example, a cancel button would be labelled
+<tt>Cancel</tt>&nbsp;
+for English and <tt>Abbrechen</tt> for German speaking customers).
+<p>Any action that requires a locale first calls the <tt>getLocales()</tt>
+method on the incoming request, which provides a list, in order of preference,
+of the locales that the client wants to use. This list is processed differently
+depending on whether the action is an I18N or a formatting tag.
+<h5>
+2.1.1 Resource bundle locale</h5>
+Any I18N actions that acquire a resource bundle based on its base name
+(that is, the <tt>&lt;bundle></tt> action which (always) takes a <tt>basename</tt>
+attribute and the <tt>&lt;message></tt> action which may use the default
+resource bundle base name defined by the <tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute)
+determine the best matching locale by comparing the list of client locales
+against the list of available locales for the resource bundle in question,
+as follows:
+<p>For each of the client's preferred locales (in order of preference),
+the action checks if there is a matching locale for the resource bundle
+in question, by passing the resource bundle's base name and the client's
+requested locale to the <tt>java.util.ResourceBundle.getBundle()</tt> method.
+The returned locale may either match both the country and language of the
+requested locale (exact match), only its language, or neither. If there
+is an exact match, it is used, and no further client locales are checked.
+Otherwise, the first match on language is used. If no such match exists,
+the fallback locale is used by searching the <tt>javax.servlet.jsp.jstl.i18n.fallbackLocale</tt>
+attribute in the page, request, session (if valid), and application scope(s)
+(in this order) (see Section 16: <i>Configuration parameters</i>). If this
+attribute does not exist, the default locale of the JSP container's Java
+runtime is used.
+<p>For example, if the client's preferred locales were <tt>ja</tt>, <tt>en-UK</tt>,
+<tt>en-US</tt>,
+<tt>en-CA</tt>,
+and f<tt>r </tt>(in this order), and the available ones (for the resource
+bundle in question) <tt>en</tt> and
+<tt>fr</tt>, the best match would be
+<tt>en</tt>;
+if the available ones were
+<tt>en</tt>,
+<tt>en-US</tt>, and
+<tt>fr</tt>,
+then the best match would be <tt>en-US</tt>.
+<p>&nbsp;The behavior is implementation-defined if the set of available
+resource bundles changes during execution of the page. Implementations
+may thus cache the best matching locale for a given resource bundle when
+one is found.
+<h5>
+2.1.2 Formatting locale</h5>
+This is the locale used by the <tt>&lt;formatNumber></tt>, <tt>&lt;parseNumber></tt>,
+<tt>&lt;formatDate></tt>,
+and <tt>&lt;parseDate></tt> actions.
+<p>If the formatting action is enclosed within a <tt>&lt;bundle> </tt>action,
+the locale of the parent bundle is used as the formatting locale.
+<p>Otherwise, if the <tt>javax.servlet.jsp.jstl.i18n.basenam</tt>e attribute
+is set, the best matching locale for that base name is determined (according
+to the algorithm described in Section 2.1.1) and used as the formatting
+locale.
+<p>Otherwise, the formatting action checks, for each of the client's preferred
+locales (in order of preference), if there is a matching locale available.
+The <tt>&lt;formatNumber>
+</tt>and<tt> &lt;parseNumber></tt>, and the <tt>&lt;formatDate>
+</tt>and
+<tt>&lt;parseDate>
+</tt>actions
+determine the available locales by calling <tt>java.text.NumberFormat.getAvailableLocales()</tt>
+and <tt>java.text.DateFormat.getAvailableLocales()</tt>, respectively.
+If there is an exact match (that is, a client locale matches both the language
+and country of an available locale), it is used, and no further client
+locales are checked. Otherwise, the first match on language is used. If
+no such match exists, the default locale of the JSP container's Java runtime
+is used. Once the best matching locale has been determined, it is cached,
+so that any subsequent formatting actions on the same page do not have
+to determine it again.
+<h4>
+2.2. Application-based locales</h4>
+The browser-sensing capabilities for locales can be disabled by setting
+the <tt>javax.servlet.jsp.jstl.i18n.locale</tt> (scoped) attribute. This
+attribute may be set directly by application code for any of the JSP scopes.
+For example, an application might let its users pick their preferred locale
+and then set the <tt>javax.servlet.jsp.jstl.i18n.locale
+</tt>attribute
+accordingly. Alternatively, the <tt>&lt;locale> </tt>action may be used
+to set the <tt>javax.servlet.jsp.jstl.i18n.locale </tt>attribute with page
+scope only. This may be useful in the case where a client's preferred locale
+is retrieved from a database (using the JSTL database tags)and installed
+on the page using the <tt>&lt;locale></tt> tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.locale</tt> attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order).
+<h3>
+3. Response encoding</h3>
+It is the page author's responsibility to make sure that a page's character
+encoding accommodates all characters, including any valid Java (Unicode
+2.0) character, that the page's actions may output at runtime.
+<p>Because this proposal's I18N tags address situations requiring multiple
+locales, they are perhaps more likely than most to output characters that
+cannot be accommodated by the default ISO-8859-1 character encoding.
+<p>Page authors should take note of this and consider using the page directive's
+<tt>contentType</tt>
+attribute to explicitly set the character encoding in the <tt>Content-Type</tt>
+response header in situations where the default (ISO-8859-1) is not sufficient.
+<h3>
+4. Time zone</h3>
+The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>JSP attribute specifies
+the time zone in which any time information formatted using the <tt>&lt;formatDate></tt>
+action is represented. This allows any time information on a page to be
+tailored to the preferred time zone of its clients, which is useful if
+the server hosting the page containing the time information and its clients
+reside in different time zones. Page authors could be advised to always
+use the "long" time format which includes the time zone, but that would
+still require clients to convert the formatted time into their own time
+zone.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute may be set
+directly by application code for any of the JSP scopes. For example, an
+application might let its users pick their preferred time zone and then
+set the <tt>javax.servlet.jsp.jstl.i18n.timeZone
+</tt>attribute accordingly.
+Alternatively, the <tt>&lt;timeZone></tt> action may be used to set the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute for the current page context. This may be useful in the case
+where a client's preferred time zone is retrieved from a database (using
+the JSTL database tags) and imported into the page using the <tt>&lt;timeZone></tt>
+tag.
+<p>The <tt>javax.servlet.jsp.jstl.i18n.timeZone </tt>attribute is searched
+in the page, request, session (if valid), and application scope(s) (in
+this order). If not found, the JSP container's time zone is used.
+<h3>
+5. &lt;locale></h3>
+The <tt>&lt;locale></tt> action is used to set or override the JSP attribute
+<tt>javax.servlet.jsp.jstl.i18n.locale</tt>
+with the locale specified by the <tt>value</tt> attribute in the scope
+given by the <tt>scope</tt> attribute (default: "page").
+<p>The locale specified by the <tt>value</tt> attribute must contain a
+two-letter (lower-case) language code (as defined by ISO-639), and may
+contain a two-letter (upper-case) country code (as defined by ISO-3166)<tt>.
+</tt>Language
+and country codes must be separated by hyphen ('-') or underscore ('_').
+<p>Optionally, a (vendor- or browser-specific) variant may be specified
+using the <tt>variant</tt> attribute. See the <tt>java.util.Locale</tt>
+javadocs for more information on variants.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:locale value="en-US" variant="UNIX"/></tt>
+<p>By using this action, the browser-sensing capabilities for locales described
+in Section 2 of this functional description are disabled. This means that
+if this action is being used, it should be declared at the beginning of
+a page, before any other I18N/Formatting tags. Otherwise, a different locale
+might be used up to the position in the page where the <tt>&lt;locale></tt>
+action is specified.
+<h3>
+6. &lt;timeZone></h3>
+The <tt>&lt;timeZone></tt> action establishes the time zone (specified
+via the <tt>value</tt> attribute) to be used by any nested <tt>&lt;formatDate></tt>
+actions:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:timeZone></tt>
+<p>The time zone may be specified as either an abbreviation (such as "PST"),
+a full name (such as "America/Los_Angeles"), or a custom format (such as
+"GMT-8:00). See
+<tt>java.util.TimeZone.getTimeZone()
+</tt>for more details
+on the supported time zone formats.
+<p>The <tt>var</tt> attribute may be used to expose the time zone as a
+JSP-scoped attribute of type <tt>java.util.TimeZone
+</tt>(with visibility
+<tt>AT_END</tt>),
+so that it can be referenced by any subsequent
+<tt>&lt;formatDate></tt>
+actions that are not nested inside a <tt>&lt;timeZone></tt> action and
+take a <tt>timeZone</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"
+var="losAngelesTimeZone"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time" timeZone="$losAngelesTimeZone"/></tt>
+<p>A <tt>&lt;timeZone></tt> action that is specified without a body and
+without the <tt>var</tt> attribute can be used to set or override the
+<tt>javax.servlet.jsp.jstl.i18n.timeZone</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its time zone the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:timeZone value="America/Los_Angeles"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<h3>
+7. &lt;bundle></h3>
+The <tt>&lt;bundle> </tt>action loads the resource bundle whose base name
+is specified via the <tt>basename</tt> attribute:
+<p>&nbsp;<tt>&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user-of-bundle/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>The resource bundle's locale is determined according to Section 2 of
+this functional description.
+<p>The <tt>var</tt> attribute may be used to expose the resource bundle
+as a JSP-scoped attribute of type <tt>java.util.ResourceBundle
+</tt>(with
+visibility <tt>AT_END</tt>), so that it can be referenced by any subsequent
+<tt>&lt;message></tt>
+actions that take a <tt>bundle</tt> attribute:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"
+var="buttonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit" bundle="$buttonLabels"/></tt>
+<p>Exposing a resource bundle via the <tt>var</tt> attribute is useful
+if the bundle needs to be accessed multiple times.
+<p>A <tt>&lt;bundle></tt> action that is specified without a body and without
+the <tt>var</tt> attribute can be used to set or override the <tt>javax.servlet.jsp.jstl.i18n.basename</tt>
+attribute in the scope given by the <tt>scope</tt> attribute (default:
+"page"), thereby making its base name the (new) default in that scope:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="com.acme.labels.ButtonLabels"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Submit"/></tt>
+<p>The <tt>prefix</tt> attribute is provided as a convenience for very
+long key names: Its value is prepended to any message key (see the <tt>&lt;message></tt>
+action) that is to be looked up in the resource bundle that was loaded
+by this action.
+<h3>
+8. &lt;message></h3>
+The <tt>&lt;message></tt> action retrieves the localized message corresponding
+to the message key specified by the
+<tt>key</tt> attribute.
+<p>The resource bundle in which to look up the message key may be given
+by the <tt>bundle</tt> attribute. If this attribute is missing, and the
+<tt>&lt;message>
+</tt>action
+is nested inside a <tt>&lt;bundle></tt> tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the resource
+bundle with the default base name given by the
+<tt>javax.servlet.jsp.jstl.i18n.basename
+</tt>attribute
+is used,&nbsp; which is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The <tt>&lt;message></tt> action outputs its result to the current
+<tt>JspWriter</tt>
+object, unless the <tt>var</tt> attribute is specified, in which case the
+result is stored in the named JSP attribute.
+<p>Example:
+<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <tt>&lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in default bundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Errors" var="errorBundle"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Greetings"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;%-- Key is looked up in parent &lt;bundle> tag --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="WrongPassword"
+bundle="$errorBundle"/>&nbsp; &lt;%-- Key is looked up in errorBundle --%></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>If the given key is not found in the resource bundle, or a resource
+bundle with the given base name does not exist, a message is logged to
+the servlet context, and an error message of the form <tt>"???&lt;key>???"</tt>
+(where
+<tt>&lt;key></tt> is the name of the undefined key) is output to
+the current <tt>JspWriter
+</tt>object.
+<p>If the message corresponding to the given key is <i>compound</i>, that
+is, contains one or more variables, it can be supplied with argument values
+for these variables by using a <tt>&lt;messageArg></tt> subtag for each
+argument value. This procedure is referred to as <i>parametric replacement.</i>
+If the message is compound, but no <tt>&lt;messageArg></tt> subtags are
+given, the message is left unmodified.
+<p>If the parent <tt>&lt;bundle></tt> action specifies a <tt>prefix</tt>
+attribute, its value is prepended to any key names to be looked up in that
+bundle. For example, using the <tt>prefix</tt> attribute, the key names
+in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="com.acme.labels.lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<p>may be abbreviated to:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="Labels" prefix="com.acme.labels."></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="firstName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:message key="lastName"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:bundle></tt>
+<h3>
+9. &lt;messageFormat></h3>
+The <tt>&lt;messageFormat> </tt>action performs parametric replacement
+on the pattern string specified via the <tt>value</tt> attribute, using
+the runtime's default locale.
+<p>The argument values for parametric replacement must be supplied via
+<tt>&lt;messageArg></tt>
+subtags. Each <tt>&lt;messageArg></tt> subtag replaces one parameter in
+the pattern. Parametric replacement takes place in the order of the
+<tt>&lt;messageArg></tt>
+subtags. If no <tt>&lt;messageArg></tt> subtag is given, the specified
+pattern is left unmodified.
+<p>The result is output to the current <tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored in the
+named JSP attribute.
+<p>The <tt>&lt;messageFormat></tt> action is useful if a pattern needs
+to be supplied from sources other than resource bundles, or if a pattern
+extracted from a resource bundle needs to be used multiple times.
+<p>For example, when displaying a list of products, the same internationalized
+message (pattern) would be used to display the price, but rather than looking
+up the same pattern for every single product, the pattern could be looked
+up once (using the <tt>&lt;message></tt> action) and then passed in to
+the <tt>&lt;messageFormat></tt> action for each product, as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="store.product.price" bundle="$i18n"
+var="priceMsg"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:messageFormat value="$priceMsg">...&lt;/fmt:messageFormat></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<p>instead of the less efficient alternative:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:bundle basename="..." var="i18n"/></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;c:forEach ...></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &lt;fmt:message key="store.product.price"
+bundle="$i18n">...&lt;/fmt:message></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/c:forEach></tt>
+<h3>
+10. &lt;messageArg></h3>
+The <tt>&lt;messageArg></tt> action provides one argument (for parametric
+replacement) to the compound message or pattern in its parent
+<tt>&lt;message></tt>
+or <tt>&lt;messageFormat></tt> action, respectively.
+<p>One <tt>&lt;messageArg> </tt>action must be specified for each variable
+in the compound message or pattern. Parametric replacement takes place
+in the order of the <tt>&lt;messageArg></tt> tags.
+<p>The argument value can be specified either via the <tt>value</tt> attribute:
+<pre>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome">
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg value="$dateArg"/>
+&nbsp;&nbsp;&nbsp; &lt;/fmt:message></pre>
+or inline via the tag's body content:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:message key="Welcome"></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;acme:doIt .../></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/fmt:messageArg></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/fmt:message></tt>
+<h3>
+11. &lt;formatNumber></h3>
+The <tt>&lt;formatNumber></tt> action allows the formatting of numbers,
+currencies, and percentages, using predefined or customized formatting
+styles.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the numeric
+value specified by the <tt>value</tt> attribute is formatted as a number,
+currency, or percentage, respectively, using the default formatting pattern
+for numbers (currencies, percentages) of the page's locale, which is determined
+according to Section 2 of this functional description.
+<p>The result is output to the current
+<tt>JspWriter</tt> object, unless
+the <tt>var</tt> attribute is given, in which case it is stored (as a string)
+in the named JSP attribute.
+<p>Example: The output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="9876543.21" type="currency"/></tt>
+<p>varies with the page's locale (given in parentheses), as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; 9 876 543,21 F&nbsp;&nbsp; (fr_FR)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; 9.876.543,21 DM&nbsp; (de_DE)</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; $9,876,543.21&nbsp;&nbsp;&nbsp; (en_US)</tt>
+<p>When formatting the given value as a number, the predefined formatting
+pattern of the page's locale can be overridden by using the <tt>pattern</tt>
+attribute, allowing page authors to control the display of leading and
+trailing zeros, prefixes and suffixes, grouping (thousands) separators,
+and the decimal separator of the formatted number. The given pattern string
+must follow the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html">Number
+Format Pattern Syntax&nbsp;</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>For example, a pattern of ".000" will cause any numeric value formatted
+with it to be represented with 3 fraction digits, adding trailing zeros
+if necessary, so that
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="12.3" pattern=".000"/></tt>
+<p>will output "12.300".
+<p>Likewise, a pattern of "#,#00.0#" specifies that any numeric value formatted
+with it will be represented with a minimum of 2 integer digits, 1 fraction
+digit, and a maximum of 2 fraction digits, with every 3 integer digits
+grouped. Applied to "123456.7891", as in:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/></tt>
+<p>the formatted output will be "123,456.79" (note that rounding is handled
+automatically).
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values. If the input to the <tt>value</tt> attribute is
+a string literal, it is first parsed into an instance of <tt>java.lang.Number
+</tt>according
+to the default pattern of the page's locale. If the numeric string uses
+a format different from the locale's default, it must be parsed using the
+<tt>&lt;parseNumber></tt>
+action.
+<p>The <tt>type</tt> attribute accepts (case-insensitive) literals only,
+causing an error at translation-time validation if the specified literal
+is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when formatting numbers
+(that is, if the <tt>type</tt> attribute is missing or is equal to "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+12. &lt;parseNumber></h3>
+The <tt>&lt;parseNumber></tt> action is used for parsing numbers, currencies,
+and percentages.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "number", "currency", or "percent" (default: "number"), the string
+specified via the <tt>value</tt> attribute is parsed as a number, currency,
+or percentage, respectively, using the default formatting pattern for numbers
+(currencies, percentages) of the page's locale, which is determined according
+to Section 2 of this functional description.
+<p>If the number specified via the <tt>value</tt> attribute uses a format
+different from the page locale's default, the pattern required to parse
+it may be specified using the <tt>pattern</tt> attribute.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.lang.Number</tt>)
+is stored in the named JSP attribute.&nbsp; Otherwise, it is output to
+the current <tt>JspWriter</tt> object using <tt>java.lang.Number.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values, whereas the <tt>type</tt> attribute accepts (case-insensitive)
+literals only, causing an error at translation-time validation if the specified
+literal is illegal.
+<p>The <tt>pattern</tt> attribute may be used only when parsing numbers
+(that is, if the <tt>type</tt> attribute is missing or equals "number").
+Using it with a <tt>type</tt> attribute equal to "currency" or "percent"
+causes a translation-time error.
+<h3>
+13. &lt;formatDate></h3>
+The <tt>&lt;formatDate</tt>> action allows the formatting of dates and
+times using predefined or customized formatting styles.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), only the time, the
+date, or both the time and date components of the date specified via the
+<tt>value</tt>
+attribute are formatted, using one of the predefined formatting styles
+for dates (specified via the <tt>dateStyle</tt> attribute) and times (specified
+via the <tt>timeStyle</tt> attribute) of the page's locale, which is determined
+according to Section 2 of this functional description.&nbsp; Legal values
+for the
+<tt>dateStyle</tt> and <tt>timeStyle</tt> attributes are "default",
+"short", "medium ", "long", and "full" (default: "default").
+<p>If the <tt>value</tt> attribute is missing, the current date and time
+are used.
+<p>Any time information is represented in the time zone given by the <tt>timeZone</tt>
+attribute.&nbsp; If this attribute is missing, and the <tt>&lt;formatDate>
+</tt>action
+is nested inside a <tt>&lt;timeZone></tt> tag, the time zone to use is
+taken from the enclosing <tt>&lt;timeZone></tt> tag. Otherwise, the default
+time zone given by the <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> attribute
+is used, which is searched in the page, request, session (if valid), and
+application scope(s) (in this order). If not found, the JSP container's
+time zone is used.
+<p>The action's result is output to the current <tt>JspWriter</tt> object,
+unless the <tt>var</tt> attribute is given, in which case it is stored
+(as a string) in the named JSP attribute.
+<p>Example: Assuming a current date of Oct 22, 2001 and a current time
+of 4:05:53 PM,
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt>
+<p>will output
+<p><tt>&nbsp;&nbsp;&nbsp; October 22, 2001 4:05:53 PM PDT</tt>
+<p>for the U.S. and
+<p><tt>&nbsp;&nbsp;&nbsp; 22 octobre 2001 16:05:53 GMT-07:0</tt>
+<p>for the French locale.
+<p>Page authors may also apply a customized formatting style for their
+times and dates by specifying the <tt>pattern</tt> attribute. The specified
+formatting pattern must use the <a href="http://java.sun.com/docs/books/tutorial/i18n/format/datepattern.html">Date
+Format Pattern Syntax</a> specified in the tutorial trail on internationalization
+at <tt>java.sun.com</tt>.
+<p>Example: Assuming the same current date and time as in the above example,
+the output of
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate pattern="EEE, MMM d, ''yy"/></tt>
+<p>will be
+<p><tt>&nbsp;&nbsp;&nbsp; Mon, Oct 22, '01</tt>
+<p>for the U.S. locale.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both string
+literals and EL values (which must evaluate to objects of type<tt> java.util.Date
+</tt>in
+the case of the <tt>value</tt> attribute). If the input to the
+<tt>value</tt>
+attribute is a string literal, it is first parsed into an instance of <tt>java.util.Date</tt>
+according to the default pattern of the page's locale. If the date string
+uses a different pattern, the
+<tt>&lt;parseDate></tt> action must be used.
+<p>The <tt>type</tt>, <tt>timeStyle</tt>, and <tt>dateStyle</tt> attributes
+take (case-insensitive) literals only, causing an error at translation-time
+validation if the specified literal is illegal.
+<h3>
+14. &lt;parseDate></h3>
+The <tt>&lt;parseDate></tt> action is used for parsing date and time strings.
+<p>Depending on the value of the <tt>type</tt> attribute, which must be
+one of "time", "date", or "both" (default: "date"), the date string given
+via the
+<tt>value</tt> attribute is expected to contain only a time, a
+date, or both a time and date component, respectively. It is parsed according
+to the default formatting pattern for dates and times of the page's locale,
+which is determined according to Section 2 of this functional description.
+<p>If the given date string uses a different format, the pattern required
+to parse it may be specified via the <tt>pattern</tt> attribute.
+<p>If the <tt>var</tt> attribute is given, the parsing result (of type
+<tt>java.util.Date</tt>)
+is stored in the named JSP attribute. Otherwise, it is output to the current
+<tt>JspWriter</tt>
+object using <tt>java.util.Date.toString()</tt>.
+<p>The <tt>value</tt> and <tt>pattern</tt> attributes accept both literals
+and EL values. The <tt>type</tt> attribute takes (case-insensitive) literals
+only, causing an error at translation-time validation if the specified
+literal is illegal.
+<h3>
+15. &lt;exception></h3>
+The <tt>&lt;exception</tt>> action is used to display the exception given
+by the <tt>value</tt> attribute in its localized form:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;fmt:exception value="$exception" bundle="$errorMessages"/></tt>
+<p>If no <tt>value</tt> attribute is given, and this action is used in
+an error page, the exception of the error page is used.
+<p>Developers may designate an exception as localizable by having it implement
+the <tt>javax.servlet.jsp.jstl.i18n.LocalizableException</tt> interface,
+which is defined as follows:
+<p><tt>&nbsp;&nbsp;&nbsp; public interface LocalizableException {</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+exception's message key from which the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message
+is derived via a resource bundle lookup.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getMessageKey();</tt>
+<p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Returns the
+arguments for parametric replacement on the exception's</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * localized message.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object[] getMessageArgs();</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; }</tt>
+<p>If the given exception is not an instance of this interface, the <tt>&lt;exception></tt>
+action uses its fully qualified class name as the key to look up in the
+resource bundle for exception messages.
+<p>Otherwise, the <tt>&lt;exception></tt> action uses the return value
+of the exception's
+<tt>getMessageKey</tt> method as the key . If <tt>getMessageKey</tt>
+returns null, the exception's fully qualified class name is used as the
+key.
+<p>The key is looked up in the resource bundle given by the <tt>bundle</tt>
+attribute. If this attribute is missing, and the
+<tt>&lt;exception> </tt>action
+is nested inside a <tt>&lt;bundle> </tt>tag, the resource bundle to use
+is taken from the enclosing <tt>&lt;bundle></tt> tag. Otherwise, the default
+resource bundle for exception messages, whose default base name is given
+by the <tt>javax.servlet.jsp.jstl.i18n.exception.basename</tt> scoped attribute,
+is used. This attribute is searched in the page, request, session (if valid),
+and application scope(s) (in this order).
+<p>The result of looking up the key in the resource bundle is used as the
+localized exception message. If the key is not found in the resource bundle,
+or the default resource bundle for exception messages does not exist, the
+return value of the exception's
+<tt>getLocalizedMessage</tt> method is
+used as the localized exception message. If the exception is an instance
+of the <tt>LocalizableException </tt>interface, the return value of the
+excpetion's <tt>getMessageArgs</tt> method is used for parametric replacement
+on the localized exception message.
+<p>The <tt>&lt;exception></tt> action outputs the localized exception message
+to the current
+<tt>JspWriter</tt> object.
+<p>If the <tt>stackTrace</tt> attribute is given with a value of <tt>true</tt>,
+the exception's stacktrace is printed out in addition to its localized
+exception message.
+<h3>
+16. Configuration parameters</h3>
+This section discusses I18N- and formatting-related initialization parameters
+in a web application's deployment descriptor (DD) file.
+<h4>
+16.1 javax.servlet.jsp.jstl.i18n.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle, which is used if a <tt>&lt;message></tt> action does not specify
+a <tt>bundle</tt> attribute and is not nested inside a
+<tt>&lt;bundle>
+</tt>action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.2 javax.servlet.jsp.jstl.i18n.exception.basename</h4>
+This parameter specifies the base name of the application's default resource
+bundle for exception messages, which is used by the <tt>&lt;exception></tt>
+action.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.exception.basename&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>com.acme.MyExceptionResources&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.3 javax.servlet.jsp.jstl.i18n.fallbackLocale</h4>
+This parameter specifies the application's default fallback locale, which
+is used if browser-sensing capabilities are enabled, but none of the available
+locales for the resource bundle in question match any of the client's preferred
+locales.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.fallbackLocale&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>fr-CA&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h4>
+16.4 javax.servlet.jsp.jstl.i18n.timeZone</h4>
+This parameter specifies the application's default time zone in which any
+times and dates formatted using the <tt>&lt;formatDate></tt> action are
+represented.
+<p>Example:
+<p><tt>&nbsp;&nbsp;&nbsp; &lt;web-app></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name>javax.servlet.jsp.jstl.i18n.timeZone&lt;/param-name></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value>"America/Los_Angeles"&lt;/param-value></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/context-param></tt>
+<br><tt>&nbsp;&nbsp;&nbsp; &lt;/web-app></tt>
+<h3>
+17. Developer support</h3>
+The locale-determination logic for resource bundles described in Section
+2.1.1 is exposed as a general convenience method so it may be used by any
+tag handler implementation that needs to produce localized messages. For
+example, a tag handler's exception messages may be intended directly for
+user consumption on an error page and therefore need to be localized.
+<p>The convenience method, named <tt>getLocalizedMessage</tt> and exposed
+by the <tt>org.apache.taglibs.jstl.extra.i18n.Locale</tt> class, looks
+up a given message key in the resource bundle with a given base name (or
+the default base name), whose locale is determined according to the locale-determination
+logic described in Section 2.1.1, and optionally performs parametric replacement
+on the result of the lookup before returning it.
+<p><tt>getLocalizedMessage</tt> comes in the following overloaded flavors:
+<p>&nbsp;<tt>&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key and</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * performs parametric replacement using
+the arguments specified in the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;tt>args&lt;/tt> parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle whose base</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * name is retrieved from the javax.servlet.jsp.jstl.i18n.basename
+scoped</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * attribute and whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If the javax.servlet.jsp.jstl.i18n.basename
+attribute is not found</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * in any of the scopes, or no resource
+bundle with that base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args);</tt>
+<p><tt>&nbsp;&nbsp;&nbsp; /**</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Retrieves the localized message corresponding
+to the given key.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * The given key is looked up in the resource
+bundle with the given</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * base name whose locale is determined
+according to the</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * algorithm described in Section 2.1.1
+of the functional description.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * Before being returned, the result of
+the lookup undergoes parametric</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * replacement, using the arguments specified
+in the &lt;tt>args&lt;/tt></tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * parameter.</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * If no resource bundle with the given
+base name exists,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * or the given key is undefined in the
+resource bundle that was loaded as</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * a result of this call, the string "???&lt;key>???"
+is returned,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * where "&lt;key>" is replaced with the
+given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param pageContext the page in which
+the given key must be localized</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param key the message key to be looked
+up</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param args the arguments for parametric
+replacement</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @param basename the resource bundle
+base name</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; *</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; * @return the localized message corresponding
+to the given key</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp; */</tt>
+<br><tt>&nbsp;&nbsp;&nbsp; public static String getLocalizedMessage(PageContext
+pageContext,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String key,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Object[] args,</tt>
+<br><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+String basename);</tt>
+<h3>
+18. Summary</h3>
+
+<table BORDER CELLPADDING=5 >
+<tr>
+<td COLSPAN="2" BGCOLOR="#000099"><b><font color="#FFFFFF"><font size=+1>I18N
+Tags</font></font></b></td>
+</tr>
+
+<tr BGCOLOR="#FFFF66">
+<td WIDTH="318"><b>Element</b></td>
+
+<td WIDTH="392"><b>Sample usage</b></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;locale></tt></b>
+<br><tt><font color="#000000"><b>value </b>variant scope</font></tt>
+<p>Establishes the locale specified by the <tt>value</tt> attribute for
+the variant given by the <tt>variant</tt> attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:locale value="en-US" variant="UNIX"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;timeZone></tt></b>
+<br><tt><font color="#000000"><b>value </b>var scope</font></tt>
+<p>Establishes the time zone given by the <tt>value</tt> attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:timeZone value="America/Los_Angeles"></tt>
+<br><tt>&nbsp; &lt;fmt:formatDate type="time"/></tt>
+<br><tt>&lt;/fmt:timeZone></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;bundle></tt></b>
+<br><tt><font color="#000000"><b>basename </b>prefix var scope</font></tt>
+<p>Loads the resource bundle whose base name is specified by the <tt>basename</tt>
+attribute, and optionally exposes it in the named scoped attribute.</td>
+
+<td WIDTH="392"><tt>&lt;fmt:bundle basename="Greetings" var="greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;message></tt></b>
+<br><tt><font color="#000000"><b>key </b>bundle var scope</font></tt>
+<p>Fetches the localized message corresponding to the key specified by
+the <tt>key</tt> attribute from the resource bundle given by the <tt>bundle</tt>
+attribute, and performs parametric replacement on the retrieved message
+using the argument values supplied via <tt>&lt;messageArg></tt> subtags</td>
+
+<td WIDTH="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageFormat></tt></b>
+<br><tt><font color="#000000"><b>value</b> var scope</font></tt>
+<p>Performs parametric replacement on the pattern specified by the <tt>value</tt>
+attribute using the argument values supplied via <tt>&lt;messageArg></tt>
+subtags</td>
+
+<td WIDTH="392"><tt>&lt;fmt:messageFormat value="$priceMsg"></tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$priceArg"/></tt>
+<br><tt>&lt;/fmt:messageFormat></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;messageArg></tt></b>
+<br><tt><font color="#000000">value</font></tt>
+<p>Supplies the argument specified by the <tt>value</tt> attribute&nbsp;
+(if present) or the tag body to its parent <tt>&lt;message></tt> action
+for parametric replacement</td>
+
+<td WIDTH="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle">&nbsp;</tt>
+<br><tt>&nbsp; &lt;fmt:messageArg value="$dateArg"/></tt>
+<br><tt>&lt;/fmt:message></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type pattern var scope</font></tt>
+<p><font color="#000000">Formats the given numeric value as a number, currency,
+or percentage using the locale's predefined or the specified (customized)
+formatting pattern&nbsp;</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:formatNumber value="9876543.21" type="currency"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseNumber></tt></b>
+<br><tt><font color="#000000"><b>value </b>type<b> </b>pattern var scope</font></tt>
+<p><font color="#000000">Parses the given numeric string using the locale's
+default or the specified (customized) formatting pattern</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:parseNumber value="$num" var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;formatDate></tt></b>
+<br><tt><font color="#000000"><b>value </b>type dateStyle timeStyle pattern
+timeZone var scope</font></tt>
+<p><font color="#000000">Formats the given date using the locale's predefined
+or the specified (customized) formatting pattern&nbsp;</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;parseDate></tt></b>
+<br><tt><font color="#000000"><b>value</b> type pattern var scope</font></tt>
+<p><font color="#000000">Parses the given date string using the locale's
+default or the specified (customized) formatting pattern</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:parseDate value="May 22, 2001 4:05:53 PM PDT"
+var="parsed"/></tt></td>
+</tr>
+
+<tr>
+<td WIDTH="318"><b><tt>&lt;exception></tt></b>
+<br><tt><font color="#000000">value bundle stackTrace</font></tt>
+<p><font color="#000000">Displays the exception given by the <tt>value</tt>
+attribute (or the error page's exception if no <tt>value</tt> attribute
+is given) in its localized form</font></td>
+
+<td WIDTH="392"><tt>&lt;fmt:exception bundle="$errorMessages"/></tt></td>
+</tr>
+</table>
+
+</body>
+</html>
diff --git a/doc/web/IOT_Import_FunctionalDescription_5_EA2.html b/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
index 3390663..caa823d 100644
--- a/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
+++ b/doc/web/IOT_Import_FunctionalDescription_5_EA2.html
@@ -288,8 +288,8 @@ modifies the absolute URL as follows:
         <font color="#000000"><b>name</b></font><font color="#CC0000"> </font><font color="#000000">value 
         encode</font></code></p>
       <p>Sub-element to specify request parameters for the enclosing &lt;import&gt;. 
-        If importing a resource using an absolute URL, the value of the parameter 
-        is automatically encoded.</p>
+        The name and value of the parameter are url encoded (unless encode is 
+        false). </p>
     </td>
     <td width="61%"> 
       <p><code>&lt;c:import url=&quot;/exec/register&quot;><br>
@@ -300,7 +300,7 @@ modifies the absolute URL as follows:
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;urlEncode&gt;</b><br>
-        <font color="#FF0000">value</font><font color="#CC0000"> </font><font color="#0000FF">var</font></code></p>
+        <font color="#000000"><b>value</b></font><font color="#CC0000"> </font><font color="#000000">var</font></code></p>
       <p>URL encoding.</p>
     </td>
     <td width="61%"> 
@@ -309,16 +309,27 @@ modifies the absolute URL as follows:
     </td>
   </tr>
 </table>
-<h3>6. Notes</h3>
+<h3>6. Networking Properties</h3>
+<p>If the web container executes behind a firewall, some absolute URL resources 
+  may be inaccessible. To provide access to these resources, the JVM of the container 
+  should be started with the proper networking properties (e.g. proxyHost, proxyPort). 
+  More details can be found in the Java 2 SDK, Standard Edition Documentation 
+  (Networking Features &#151; Networking Properties).</p>
+<h3>7. Notes</h3>
 <ul>
   <li> 
     <p>&lt;c:import&gt; tags are all independent from one another; they do not 
-      create an implicit session among themselves using cookies. 
+      create an implicit session among themselves using cookies.<br>
+      [This refers to absolute HTTP URLs in particular. &lt;c:import&gt; acts 
+      like a &quot;cookie-less&quot; browser in that it ignores cookies it receives 
+      from HTTP URLs and never sends any back. A user of &lt;c:import&gt; can't 
+      assume that successive accesses against the same application will support 
+      a cookie-based session for that application.]
   </li>
   <li>There is no way using the &lt;import&gt; tag to authenticate to a URL that 
     requires HTTP basic authentication.</li>
 </ul>
-<h3>7. Design decisions of interest</h3>
+<h3>8. Design decisions of interest</h3>
 <p>We know you'd eventually ask these questions. Here are the answers...</p>
 <p><b><a name="map"></a>Transparently map absolute URLs to relative ones when 
   possible? No.</b></p>
diff --git a/doc/web/Overview.html b/doc/web/Overview.html
index 5748514..8a8b268 100644
--- a/doc/web/Overview.html
+++ b/doc/web/Overview.html
@@ -1,6 +1,6 @@
 <html>
 <head>
-<title>JSTL: Overview</title>
+<title>JSPTL: Overview</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>
 
@@ -29,7 +29,7 @@
   pages without having to resort to the scripting language associated with their 
   JSP pages (usually the Java programming language). </p>
 <p>The base design philosophy in JSTL is therefore to provide page authors with 
-  a script free environment. EA2 defines the foundation elements to make this 
+  a script free environment. EA1 defines the foundation elements to make this 
   possible.</p>
 <h3>Multiple TLDs</h3>
 <p>A Tag Library is a collection of actions that encapsulate functionality to 
@@ -112,7 +112,7 @@
   EL once the JSTL spec is ready for Community Review.</p>
 <p>Early Access contains several candidate Expression Languages. One of them is 
   an implementation subset of ECMAScript (JavaScript) and is the one used by default. 
-  You can read an <a href="@@@">overview of the ECMAScript subset of interest 
+  Please check <a href="EcmaScriptEL.html">EcmaScript as an Expression Language 
   for JSTL</a>.</p>
 <h3>Tag Collaboration</h3>
 <p>Tags usually collaborate with their environment in implicit and/or explicit 
@@ -157,7 +157,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr bgcolor="#000099"> 
     <td colspan="2"><b><font color="#FFFFFF" size="+1">Expression Language Support 
-      Tags (Core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -172,7 +172,7 @@
       </p>
     </td>
     <td width="48%"> 
-      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;&gt;<br>
+      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;/&gt;<br>
         <br>
         &lt;c:set var=&quot;customerFmt&quot; scope=&quot;request&quot;&gt;<br>
         &nbsp;&nbsp;&lt;font color=red&gt;<br>
@@ -190,7 +190,7 @@
       <code><br>
       </code></td>
     <td width="48%"> 
-      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;&gt;<br>
+      <p><code>&lt;c:set var=&quot;city&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=&quot;$customer.address.city&quot;/&gt;<br>
         <br>
         &lt;c:set var=&quot;customerFmt&quot; scope=&quot;request&quot;&gt;<br>
         &nbsp;&nbsp;&lt;font color=red&gt;<br>
@@ -216,7 +216,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Iterator 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -283,7 +283,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Conditional 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Element</b></td>
@@ -343,7 +343,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">Import 
-      Tags (core)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="39%"><b>Element</b></td>
@@ -374,8 +374,8 @@
         <font color="#000000"><b>name</b></font><font color="#CC0000"> </font><font color="#000000">value 
         encode</font></code></p>
       <p>Sub-element to specify request parameters for the enclosing &lt;import&gt;. 
-        If importing a resource using an absolute URL, the value of the parameter 
-        is automatically encoded.</p>
+        The name and value of the parameter are url encoded (unless encode is 
+        false). </p>
     </td>
     <td width="61%"> 
       <p><code>&lt;c:import url=&quot;/exec/register&quot;><br>
@@ -386,7 +386,7 @@
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;urlEncode&gt;</b><br>
-        <font color="#FF0000">value</font><font color="#CC0000"> </font><font color="#0000FF">var</font></code></p>
+        <font color="#000000"><b>value</b></font><font color="#CC0000"> </font><font color="#000000">var</font></code></p>
       <p>URL encoding.</p>
     </td>
     <td width="61%"> 
@@ -400,7 +400,7 @@
 <table border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Core 
-      Tags (xml)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="318"><b>Element</b></td>
@@ -408,11 +408,11 @@
   </tr>
   <tr> 
     <td width="318"><code><b>&lt;parse&gt;</b></code><br>
-      <code><font color="#FF0000"><b><font color="#000000">var</font></b></font> 
+      <code><font color="#FF0000"><font color="#000000">var</font></font> domVar 
       source filter</code><br>
       <br>
       Parses an XML and saves its internal representation into the JSP scoped 
-      attribute specified by &quot;var&quot;.</td>
+      attribute specified by &quot;var&quot; (or &quot;domVar&quot;).</td>
     <td width="392"> <code>&lt;c:import url=&quot;http://acme.com/athletes?country=ethiopia&quot; 
       var=&quot;xml&quot;/><br>
       &lt;x:parse source=&quot;$xml&quot; var=&quot;athletes&quot;/&gt; </code></td>
@@ -446,7 +446,7 @@
 <table border="1" cellpadding="5" width="100%">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Control 
-      Flow Tags (xml)</font></b></td>
+      Flow Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="55%"><b>Element</b></td>
@@ -454,7 +454,7 @@
   </tr>
   <tr> 
     <td width="55%"><code><b>&lt;forEach&gt;</b></code><br>
-      <b>&nbsp;select</b> var<br>
+      <b><code>&nbsp;select</code></b><code> var</code><br>
       <br>
       Evaluates the given XPath expression and iterates over the result, setting 
       the context node to each element in the iteration.</td>
@@ -505,7 +505,7 @@
 <table width="100%" border="1" cellpadding="5">
   <tr> 
     <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF" size="+1">XML Transformation 
-      Tags (xml)</font></b></td>
+      Tags</font></b></td>
   </tr>
   <tr bgcolor="#FFFF66"> 
     <td width="39%"><b>Element</b></td>
@@ -541,7 +541,7 @@
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;transformer&gt;</b><br>
-        <font color="#000000">xslt <b>var</b></font></code></p>
+        <font color="#000000"><b>var</b> xslt </font></code></p>
       <p>Creates a &quot;transformer&quot; object for more efficient transformations 
         that use the same XSLT stylesheet.</p>
     </td>
@@ -552,13 +552,126 @@
     </td>
   </tr>
 </table>
+<h2>I18N &amp; Formatting actions</h2>
+<table BORDER cellpadding=5 >
+  <tr> 
+    <td colspan="2" bgcolor="#000099"><b><font color="#FFFFFF"><font size=+1>I18N 
+      Tags</font></font></b></td>
+  </tr>
+  <tr bgcolor="#FFFF66"> 
+    <td width="318"><b>Element</b></td>
+    <td width="392"><b>Sample usage</b></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;locale></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>variant scope</font></tt> 
+      <p>Establishes the locale specified by the <tt>value</tt> attribute for 
+        the variant given by the <tt>variant</tt> attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:locale value="en-US" variant="UNIX"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;timeZone></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>var scope</font></tt> 
+      <p>Establishes the time zone given by the <tt>value</tt> attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:timeZone value="America/Los_Angeles"></tt> <br>
+      <tt>&nbsp; &lt;fmt:formatDate type="time"/></tt> <br>
+      <tt>&lt;/fmt:timeZone></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;bundle></tt></b> <br>
+      <tt><font color="#000000"><b>basename </b>prefix var scope</font></tt> 
+      <p>Loads the resource bundle whose base name is specified by the <tt>basename</tt> 
+        attribute, and optionally exposes it in the named scoped attribute.
+    </td>
+    <td width="392"><tt>&lt;fmt:bundle basename="Greetings" var="greetingBundle"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;message></tt></b> <br>
+      <tt><font color="#000000"><b>key </b>bundle var scope</font></tt> 
+      <p>Fetches the localized message corresponding to the key specified by the 
+        <tt>key</tt> attribute from the resource bundle given by the <tt>bundle</tt> 
+        attribute, and performs parametric replacement on the retrieved message 
+        using the argument values supplied via <tt>&lt;messageArg></tt> subtags
+    </td>
+    <td width="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;messageFormat></tt></b> <br>
+      <tt><font color="#000000"><b>value</b> var scope</font></tt> 
+      <p>Performs parametric replacement on the pattern specified by the <tt>value</tt> 
+        attribute using the argument values supplied via <tt>&lt;messageArg></tt> 
+        subtags
+    </td>
+    <td width="392"><tt>&lt;fmt:messageFormat value="$priceMsg"></tt> <br>
+      <tt>&nbsp; &lt;fmt:messageArg value="$priceArg"/></tt> <br>
+      <tt>&lt;/fmt:messageFormat></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;messageArg></tt></b> <br>
+      <tt><font color="#000000">value</font></tt> 
+      <p>Supplies the argument specified by the <tt>value</tt> attribute&nbsp; 
+        (if present) or the tag body to its parent <tt>&lt;message></tt> action 
+        for parametric replacement
+    </td>
+    <td width="392"><tt>&lt;fmt:message key="Welcome" bundle="$greetingBundle">&nbsp;</tt> 
+      <br>
+      <tt>&nbsp; &lt;fmt:messageArg value="$dateArg"/></tt> <br>
+      <tt>&lt;/fmt:message></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;formatNumber></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type pattern var scope</font></tt> 
+      <p><font color="#000000">Formats the given numeric value as a number, currency, 
+        or percentage using the locale's predefined or the specified (customized) 
+        formatting pattern&nbsp;</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:formatNumber value="9876543.21" type="currency"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;parseNumber></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type<b> </b>pattern var scope</font></tt> 
+      <p><font color="#000000">Parses the given numeric string using the locale's 
+        default or the specified (customized) formatting pattern</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:parseNumber value="$num" var="parsed"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;formatDate></tt></b> <br>
+      <tt><font color="#000000"><b>value </b>type dateStyle timeStyle pattern 
+      timeZone var scope</font></tt> 
+      <p><font color="#000000">Formats the given date using the locale's predefined 
+        or the specified (customized) formatting pattern&nbsp;</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:formatDate timeStyle="long" dateStyle="long"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;parseDate></tt></b> <br>
+      <tt><font color="#000000"><b>value</b> type pattern var scope</font></tt> 
+      <p><font color="#000000">Parses the given date string using the locale's 
+        default or the specified (customized) formatting pattern</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:parseDate value="May 22, 2001 4:05:53 PM PDT" 
+      var="parsed"/></tt></td>
+  </tr>
+  <tr> 
+    <td width="318"><b><tt>&lt;exception></tt></b> <br>
+      <tt><font color="#000000">value bundle stackTrace</font></tt> 
+      <p><font color="#000000">Displays the exception given by the <tt>value</tt> 
+        attribute (or the error page's exception if no <tt>value</tt> attribute 
+        is given) in its localized form</font>
+    </td>
+    <td width="392"><tt>&lt;fmt:exception bundle="$errorMessages"/></tt></td>
+  </tr>
+</table>
 <h2>Tag Library Validators</h2>
 <table width="100%" border="1" cellpadding="5">
   <tr bgcolor="#000099"> 
     <td colspan="2"><b><font color="#FFFFFF" size="+1">Tag Library Validators</font></b></td>
   </tr>
   <tr> 
-    <td colspan="2">EA2 comes with two TagLibraryValidators (TLVs), which are 
+    <td colspan="2">EA1 comes with two TagLibraryValidators (TLVs), which are 
       classes that ensure pages meet particular criteria before they can run.</td>
   <tr bgcolor="#FFFF66"> 
     <td width="31%"><b>Tag Library Validator</b></td>
@@ -610,7 +723,7 @@
         &nbsp;&nbsp;&nbsp; </code><code>javax.servlet.jstl.ExpressionEvaluatorClass<br>
         &nbsp;&nbsp;&lt;/param-name&gt;<br>
         &nbsp;&nbsp;&lt;param-value&gt;<br>
-        &nbsp;&nbsp;&nbsp; org.apache.taglibs.standard.lang.spel.Evaluator<br>
+        &nbsp;&nbsp;&nbsp; org.apache.taglibs.jstl.lang.spel.Evaluator<br>
         &nbsp;&nbsp;&lt;/param-value&gt;<br>
         &lt;/context-param&gt;</code></p>
     </td>
diff --git a/doc/web/ReleaseNotes.html b/doc/web/ReleaseNotes.html
index d567cd4..62e6fd4 100644
--- a/doc/web/ReleaseNotes.html
+++ b/doc/web/ReleaseNotes.html
@@ -14,6 +14,20 @@ running list of additions and changes.</b></p>
 <hr />
 
 <dl>
+<dt><b>12 Dec 2001</b></dt>
+<dd>JSTL EA3 RI, version 1.0, introduced.  Version includes the following
+changes and additions:
+<ul>
+ <li>Introduction of SQL tags ("sql:*" library).</li>
+ <li>A performance improvement to the XML "transform" tag.</li>
+ <li>Minor changes and bug fixes to the i18n and XML libraries.</li>
+ <li>Distribution JAR files are now 'standard.jar' (RI) and 'jstl.jar'
+     (API).</li>
+ <li>showSource.jsp no longer depends on raw file I/O (and so 
+     should work even when standard-examples is deployed as a WAR).</li> 
+</ul>
+</dd>
+
 <dt><b>21 Nov 2001</b></dt>
 <dd>JSTL EA2 RI, version 1.0, introduced.  Version includes the following
 major changes and additions:
diff --git a/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html b/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
index d805eb2..3d2c559 100644
--- a/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
+++ b/doc/web/XML_ControlFlow_FunctionalDescription_1_EA2.html
@@ -36,8 +36,7 @@
 </blockquote>
 <p>Optional attribute &quot;var&quot; makes it possible to save the current context 
   node of the iteration in a JSP &quot;page&quot; attribute. The exported object 
-  has nested visibility. It is illegal to specify any scope other than &quot;page&quot; 
-  for &quot;var&quot;.</p>
+  has nested visibility.</p>
 <h3>3. <tt>&lt;if></tt></h3>
 <p>The <tt>&lt;if></tt> action has a &quot;select&quot; attribute that specifies 
   an XPath expression. The expression is evaluated and the resulting object is 
@@ -92,7 +91,7 @@
   </tr>
   <tr> 
     <td width="55%"><code><b>&lt;forEach&gt;</b></code><br>
-      <b>&nbsp;select</b> var<br>
+      <b><code>&nbsp;select</code></b><code> var</code><br>
       <br>
       Evaluates the given XPath expression and iterates over the result, setting 
       the context node to each element in the iteration.</td>
diff --git a/doc/web/XML_Core_FunctionalDescription_2_EA2.html b/doc/web/XML_Core_FunctionalDescription_2_EA2.html
index a5becfa..c2ab35a 100644
--- a/doc/web/XML_Core_FunctionalDescription_2_EA2.html
+++ b/doc/web/XML_Core_FunctionalDescription_2_EA2.html
@@ -27,13 +27,13 @@
   cooperate over the web, XML is the data format of choice for exchanging information.<br>
 </p>
 <p>XML is therefore becoming more and more important in a page author's life. 
-  The set of XML tags specified in JSTL is therefore meant to address the basic 
+  The set of XML tags specified in JSPTL is therefore meant to address the basic 
   XML needs a page author is likely to encounter.</p>
 <h4>XPath</h4>
 <p>A key aspect of dealing with XML documents is to be able to easily access their 
   content. <a href="http://www.w3.org/TR/xpath">XPath</a>, a W3C recommendation 
   since 1999, provides an easy notation for specifying and selecting parts of 
-  an XML document. The XML tagset in JSTL is therefore based on XPath.</p>
+  an XML document. The XML tagset in JSPTL is therefore based on XPath.</p>
 <p>For the <i>XPath challenged</i>, here are a few links to get you started quickly:</p>
 <ul>
   <li><a href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html">Zvon 
@@ -42,7 +42,7 @@
     a Nutshell &#151; Chapter 9 &#151; XPath</a></li>
 </ul>
 <p>It is important to note that the Expert Group is still debating which <i>global</i> 
-  Expression Language(s) will be officially supported by JSTL. While this discussion 
+  Expression Language(s) will be officially supported by JSPTL. While this discussion 
   is still taking place, the approach we've taken here is to consider XPath as 
   a <i>local</i> Expression Language that applies to the XML tagset. How this 
   local XPath Expression Language integrates with the Global Expression Language 
@@ -55,9 +55,9 @@
 <h3>2. XPath as a <i>local</i> Expression Language for the XML set of tags</h3>
 <p>What we're doing with our set of XML tags is expanding our notion of Expression 
   Language so it can also apply &quot;locally&quot; to tags that want to support 
-  an EL that is not <i>the</i> global one(s) supported within JSTL.</p>
+  an EL that is not <i>the</i> global one(s) supported within JSPTL.</p>
 <p>Below are the rules of integration that XPath follows as a <i>local</i> EL, 
-  so we have the guarantees that it plays nicely within the JSP/JSTL environment.</p>
+  so we have the guarantees that it plays nicely within the JSP/JSPTL environment.</p>
 <h4>XPath Context</h4>
   In XPath, the context for evaluating an expression consists of:: 
 <ul>
@@ -65,21 +65,21 @@
   <li>variable bindings (see below)</li>
   <li>function library: the default function library comes with the XPath engine. 
     Some engines provide extension functions or allow customization to add new 
-    functions. The XPath function library in JSTL is limited to the core function 
+    functions. The XPath function library in JSPTL is limited to the core function 
     library of the XPath specification.</li>
   <li>namespace prefix definitions which allow namespace prefixes to be used within 
     the XPath expression<br>
     ( e.g. /SOAP-ENV:Envelope/SOAP-ENV:Body/m:foo)</li>
 </ul>
 <p><b>Attributes to specify XPath Expressions</b></p>
-<p>In the JSTL set of XML tags, XPath expressions are always specified using 
+<p>In the JSPTL set of XML tags, XPath expressions are always specified using 
   attribute &quot;select&quot;. This therefore means that only values specified 
   for &quot;select&quot; attributes are evaluated using the XPath expression language. 
   All other attributes are evaluated using the rules associated with the currently 
   active global Expression Language. This should help avoid confusion between 
   XPath and the global Expression Language.</p>
 <p><b>XPath Variable Bindings</b></p>
-<p>JSTL supports variables in XPath expressions. The mapping of XPath variable 
+<p>JSPTL supports variables in XPath expressions. The mapping of XPath variable 
   expressions is defined as follows:<p>
 <table border="1" cellpadding="2" cellspacing="1">
   <tr> 
@@ -147,7 +147,7 @@
 <p>As mentioned in the previous section, only the &quot;select&quot; attribute 
   of xml tags can take XPath expressions. Global EL expressions and XPath expressions 
   cannot be mixed in the &quot;select&quot; attributes. </p>
-<p>With JSTL 1.0, the xml tagset knows that the value of select attributes are 
+<p>With JSPTL 1.0, the xml tagset knows that the value of select attributes are 
   XPath expressions. However, things will be different in JSP.next when the evaluation 
   of 'elexprvalues' are handled directly by the container. If the metacharacter 
   used to identify an 'elexprvalue' is defined as '$', this means that XPath expressions 
@@ -179,9 +179,15 @@
 &lt;/x:parse&gt;
 </pre>
 </blockquote>
-<p> When used in conjunction with the &lt;parse&gt; tag, the JSTL core tag &lt;import&gt; 
+<p> When used in conjunction with the &lt;parse&gt; tag, the JSPTL core tag &lt;import&gt; 
   provides access to a wide variety of URL-based input resources representing 
   XML documents.</p>
+<p>It is also possible to force the &lt;parse&gt; action to expose an XML Document 
+  (org.w3c.dom.Document) by specifying &quot;domVar&quot; instead of &quot;var&quot; 
+  (mutually exclusive). This would be useful in situations where custom actions 
+  are developed to act on XML documents. Since it is not a requirement for the 
+  implementation to support its own internal data structures, it may therefore 
+  be the case that &quot;var&quot; exposes the same object as &quot;domVar&quot;.</p>
 <h4>Performance</h4>
 <p> If an implementation of the XML tagset is based on DOM-like structures (check 
   with the specific implementation you're using), there will be a significant 
@@ -208,7 +214,7 @@
   object. It is the equivalent of <tt>&lt;%= %></tt> and <code>&lt;jc:expr&gt;</code>, 
   with the difference that it is meant for the XPath Expression Language world 
   (as opposed to the scripting language world (<code>&lt;%= %&gt;</code>) and 
-  the Global Expression Language world of JSTL <code>&lt;jc:expr&gt;</code>). 
+  the Global Expression Language world of JSPTL <code>&lt;jc:expr&gt;</code>). 
 </p>
 <p>The expression to be evaluated is specified via the attribute &quot;select&quot; 
   and must be in the XPath syntax. The result of the evaluation is coerced to 
@@ -252,11 +258,11 @@
   </tr>
   <tr> 
     <td width="318"><code><b>&lt;parse&gt;</b></code><br>
-      <code><font color="#FF0000"><b><font color="#000000">var</font></b></font> 
+      <code><font color="#FF0000"><font color="#000000">var</font></font> domVar 
       source filter</code><br>
       <br>
       Parses an XML and saves its internal representation into the JSP scoped 
-      attribute specified by &quot;var&quot;.</td>
+      attribute specified by &quot;var&quot; (or &quot;domVar&quot;).</td>
     <td width="392"> <code>&lt;c:import url=&quot;http://acme.com/athletes?country=ethiopia&quot; 
       var=&quot;xml&quot;/><br>
       &lt;x:parse source=&quot;$xml&quot; var=&quot;athletes&quot;/&gt; </code></td>
diff --git a/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html b/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
index 687fd3b..6d8e617 100644
--- a/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
+++ b/doc/web/XML_Transformation_FunctionalDescription_3_EA2.html
@@ -68,8 +68,9 @@
   with the transformer attribute of &lt;transform&gt; to efficiently reuse a transformation 
   stylesheet.</p>
 <pre>  &lt;c:import url=&quot;/xslt/style.xsl&quot; var=&quot;xslt&quot;/&gt;<br>  &lt;x:transformer xslt=&quot;$xslt&quot; var=&quot;transformer&quot;/&gt;<br>  &lt;c:forEach items=&quot;$xmlDocs&quot; var=&quot;xml&quot;&gt;<br>    ...<br>    &lt;x:transform source=&quot;$xml&quot; transformer=&quot;$transformer&quot; /&gt;<br>    ...<br>  &lt;/c:forEach&gt;</pre>
-The attribute xslt is optional. If not specified, the stylesheet is read from 
-the tag's body content. 
+The attribute xslt is optional and can be any of the following types: java.lang.String, 
+java.io.Reader, or javax.xml.transform.Source. If not specified, the stylesheet 
+is read from the tag's body content. 
 <h3>4. Summary</h3>
 <table width="100%" border="1" cellpadding="5">
   <tr> 
@@ -110,7 +111,7 @@ the tag's body content.
   <tr> 
     <td width="39%"> 
       <p><code><b>&lt;transformer&gt;</b><br>
-        <font color="#000000">xslt <b>var</b></font></code></p>
+        <font color="#000000"><b>var</b> xslt </font></code></p>
       <p>Creates a &quot;transformer&quot; object for more efficient transformations 
         that use the same XSLT stylesheet.</p>
     </td>
diff --git a/doc/web/index.html b/doc/web/index.html
index 39902e4..3cee777 100644
--- a/doc/web/index.html
+++ b/doc/web/index.html
@@ -1,12 +1,13 @@
 <html>
 <head>
-<title>JSP Standard Tag Library</title>
+<title>standard - Reference Implementation of the JSP(tm) Standard Tag
+  Library</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>
 
 <body bgcolor="#FFFFFF">
-<h1>The JSP&#153; Standard Tag Library (JSTL)</h1>
-<h2>Release: Early Access 1 (EA2)</h2>
+<h1>RI for the JSP&#153; Standard Tag Library (JSTL)</h1>
+<h2>Release: Early Access 2 (EA2)</h2>
 
 <p>Thanks for downloading the JSTL EA2 release. We hope you find the tags, documents, 
   and examples here of interest. We're curious to hear your feedback on this release, 
@@ -22,7 +23,6 @@
 
 <h3>Documentation ('doc/web' directory)</h3>
 
-    
 <ul>
   <li><a href="GettingStarted.html">Getting Started</a>: A quick roadmap to help 
     you get started with this release.</li>
@@ -35,17 +35,17 @@
     just technical overviews of functionality and intent. 
     <ul>
       <li><a href="IteratorTag_FunctionalDescription_2_EAI.html"> Iteration</a></li>
-      <li><a href="Conditionals_FunctionalDescription_1_EA2.html"> Conditional 
+      <li><a href="Conditionals_FunctionalDescription_1_EA1.html"> Conditional 
         logic</a></li>
-      <li><a href="ExpressionLanguageSupport_FunctionalDescription_2_EA2.html"> 
+      <li><a href="ExpressionLanguageSupport_FunctionalDescription_2_EA1.html"> 
         Expression-language support</a></li>
-      <li><a href="ExpressionTags_FunctionalDescription_1_EA2.html"> Expression-language 
+      <li><a href="ExpressionTags_FunctionalDescription_1_EA1.html"> Expression-language 
         tags</a> 
         <ul>
-          <li>The <a href="spel"> Simplest Possible Expression Language (SPEL) 
-            </a> </li>
-          <li>EcmaScript examples: see the <a href="/jsptl-examples/ecmascript/index.html"> 
-            JSTL-examples/ecmascript</a> web application </li>
+          <li><a href="spel/index.html">The Simplest Possible Expression Language 
+            (SPEL) </a> </li>
+          <li><a href="EcmaScriptEL.html">EcmaScript as an Expression Language 
+            for JSTL</a></li>
         </ul>
       </li>
       <li><a href="IOT_Import_FunctionalDescription_5_EA2.html">Import tags</a></li>
@@ -57,7 +57,8 @@
           <li><a href="XML_Transformation_FunctionalDescription_3_EA2.html">transformation</a></li>
         </ul>
       </li>
-      <li>I18N &amp; Formatting tags</li>
+      <li><a href="I18N_FunctionalDescription_5_EA2.html">I18N &amp; Formatting 
+        tags</a></li>
     </ul>
   </li>
 </ul>
diff --git a/doc/web/spel/index.html b/doc/web/spel/index.html
index e60c3a1..b59c7d2 100644
--- a/doc/web/spel/index.html
+++ b/doc/web/spel/index.html
@@ -47,18 +47,17 @@ public Object evaluate(String attributeName,
 </pre></ul>
 
 <p>If this is not the package or definition of the ExpressionEvaluator
-interface, the appropriate changes should be made to the <a
-href="../src/org.apache.taglibs.standard/lang/spel/Evaluator.java">src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java</a>
-source file.  In any case, the <a
-href="../src/javax/servlet/jsptl/ExpressionEvaluator.java">ExpressionEvaluator
-implementation</a> should be removed from the distribution, and the
+interface, the appropriate changes should be made to the <tt>
+src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java</tt>
+source file.  In any case, the <tt>ExpressionEvaluator</tt>
+implementation should be removed from the distribution, and the
 distribution should be compiled against the "real" implementation of
 that class.
 
 <li>The parser was generated using <a
 href="http://www.webgain.com/products/metamata/java_doc.html">JavaCC</a>.
-The parser definition is found in <a
-href="../src/org.apache.taglibs.standard/lang/spel/SpelParser.jj">src/org/apache/taglibs/jsptl/lang/spel/SpelParser.jj</a>,
+The parser definition is found in
+<tt>src/org/apache/taglibs/jsptl/lang/spel/SpelParser.jj</tt>,
 and all files generated by JavaCC are placed into the
 org.apache.taglibs.standard.lang.spel.parser package.  Note that JavaCC is not
 required to compile the SPEL implementation - it is only needed if the
@@ -69,8 +68,8 @@ recent version of JavaCC can be used to regenerate the parser, but the
 <a href="#regressionTests">regression tests</a> should then be run to
 make sure the behavior hasn't changed.
 
-<li>All localizable error messages are stored in the <a
-href="../src/org.apache.taglibs.standard/lang/spel/Resources.properties">src/org/apache/taglibs/jsptl/lang/spel/Resources.properties</a>
+<li>All localizable error messages are stored in the 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/Resources.properties</tt>
 file.  This file must be copied into the final distribution with the
 generated class files.
 
@@ -91,15 +90,14 @@ comments to appear in the output file, which can aid in debugging.
 
 <h4>Parser tests</h4>
 
-<p>The parser test input file is found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/parserTests.txt">src/org/apache/taglibs/jsptl/lang/spel/test/parserTests.txt</a>.
+<p>The parser test input file is found at 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/parserTests.txt</tt/>.
 Each line represents an expression to be parsed - the expression is
 parsed, and printed back out in the evaluator's "canonical form".  For
 example, in the canonical form, all Strings are enclosed by double
 quotes, all names are prefixed by a scope operator ":", etc.
 
-<p>The expected outputs are found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/parserTestsExpectedOutput.txt">src/org/apache/taglibs/jsptl/lang/spel/test/parserTestsExpectedOutput.txt</a>
+<p>The expected outputs are found at <tt>src/org/apache/taglibs/jsptl/lang/spel/test/parserTestsExpectedOutput.txt</tt>.
 
 <p>The parser tests can be run like this:
 
@@ -115,17 +113,17 @@ the test passed or failed.
 
 <p>For the evaluation test, a "dummy" PageContext was created
 containing some beans with properties in various scopes.  That
-PageContext is created in the "createTestContext" method of <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/EvaluationTest.java">src/org/apache/taglibs/jsptl/lang/spel/test/EvaluationTest.java</a>.
+PageContext is created in the "createTestContext" method of 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/EvaluationTest.java</tt>.
 
-<p>The evaluation test input file is found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/evaluationTests.txt">src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTests.txt</a>.
+<p>The evaluation test input file is found at 
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTests.txt</tt>.
 Each line represents an expression to be parsed, followed by a line
 specifying the expected type - the expression is parsed, and the
 resulting value is printed along with its class.
 
-<p>The expected outputs are found at <a
-href="../src/org.apache.taglibs.standard/lang/spel/test/evaluationTestsExpectedOutput.txt">src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTestsExpectedOutput.txt</a>
+<p>The expected outputs are found at
+<tt>src/org/apache/taglibs/jsptl/lang/spel/test/evaluationTestsExpectedOutput.txt</tt>.
 
 <p>The evaluation tests can be run like this:
 
diff --git a/examples/conf/web.xml b/examples/conf/web.xml
index 2e95363..a719145 100644
--- a/examples/conf/web.xml
+++ b/examples/conf/web.xml
@@ -12,10 +12,12 @@
 
     <!-- Modify this context parameter to set a new class to be the default
          expression language for the application. -->
+    <!-- We use the default, which is now EcmaScript
     <context-param>
         <param-name>javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass</param-name>
         <param-value>org.apache.taglibs.standard.lang.spel.Evaluator</param-value>
     </context-param>
+    -->
 
     <listener>
       <listener-class>org.apache.taglibs.standard.examples.startup.Init</listener-class>
@@ -52,6 +54,16 @@
     </taglib>
 
     <taglib>
+        <taglib-uri>http://java.sun.com/jstl/ea/sql</taglib-uri>
+        <taglib-location>/WEB-INF/sql.tld</taglib-location>
+    </taglib>
+
+    <taglib>
+        <taglib-uri>http://java.sun.com/jstl/ea/sql-rt</taglib-uri>
+        <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
+    </taglib>
+
+    <taglib>
         <taglib-uri>/jstl-examples-taglib</taglib-uri>
         <taglib-location>/WEB-INF/jstl-examples.tld</taglib-location>
     </taglib>
diff --git a/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java b/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
index c3d91aa..31d25d6 100644
--- a/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/i18n/Resources_de.java
@@ -9,6 +9,7 @@ public class Resources_de extends ListResourceBundle {
 	contents = new Object[][] {
 	    { "greetingMorning", "Guten Morgen!" },
 	    { "greetingEvening", "Guten Abend!" },
+	    { "serverInfo", "Name und Version des Servlet Containers: {0}" },
 	    { "currentTime", "Heutiges Datum und Uhrzeit: {0}" },
 	    { "com.acme.labels.cancel", "Abbrechen" },
 	    { "java.lang.ArithmeticException", "/ durch 0" }
diff --git a/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java b/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
index 115512f..ccbd5b3 100644
--- a/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
+++ b/examples/src/org/apache/taglibs/jsptl/examples/startup/Init.java
@@ -143,7 +143,16 @@ public class Init implements ServletContextListener {
 	 * Enumeration
 	 */
 	Enumeration enum = numberMap.keys();
-        sce.getServletContext().setAttribute("enum", enum);
+	// don't use 'enum' for attribute name because it is a 
+	// reserved word in EcmaScript.
+        sce.getServletContext().setAttribute("enumeration", enum);
+
+	/**
+	 * Message arguments for parametric replacement
+	 */
+	Object[] messageArgs =
+	    new Object[] { sce.getServletContext().getServerInfo() };
+	sce.getServletContext().setAttribute("messageArgs", messageArgs);
     }
     
     //*********************************************************************
diff --git a/examples/web/ShowSource.jsp b/examples/web/ShowSource.jsp
index 18dc0ef..fc8923f 100644
--- a/examples/web/ShowSource.jsp
+++ b/examples/web/ShowSource.jsp
@@ -1,22 +1,35 @@
 <!--
   Displays the content of the file specified in request
   parameter "filename".
+  <%-- Warning!  Can be used to retrieve the source code for
+       any file in the 'standard-examples' application.
+       It is not advisable to insert any sensitive code
+       (even as an experiment) into this application --%>
 -->
 
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
-<%@ taglib prefix="ex" uri="/jsptl-examples-taglib" %>
+<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
+
+<%-- 
+  Let's get back the URL as a String so we can use it to
+  demonstrate "c:import"
+--%>
+<% pageContext.setAttribute("filepath",
+     application.
+       getResource(request.getParameter("filename")).toExternalForm()); %>
+<% pageContext.setAttribute("filename", request.getParameter("filename")); %>
+
 <html>
 <head>
-  <title>JSTL: Source code for <c:expr value="$param:filename"/></title>
+  <title>JSTL: Source code for <c:expr value="$filename"/></title>
 </head>
 <body bgcolor="#FFFFFF">
-<h3>Source code for:&nbsp; <c:expr value="$param:filename"/></h3>
+<h3>Source code for:&nbsp; <c:expr value="$filename"/></h3>
 
 <hr>
-<c:import varReader="reader" url="$param:filename">
-<%-- <ex:file id="reader" file="$param:filename"> --%>
+
+<c:import varReader="reader" url="$filepath">
   <ex:escapeHtml reader="$reader"/>
-<%-- </ex:file> --%>
 </c:import>
 <hr>
 </body>
diff --git a/examples/web/Templates/ExamplesTemplate.dwt b/examples/web/Templates/ExamplesTemplate.dwt
index c5a9297..da151b2 100644
--- a/examples/web/Templates/ExamplesTemplate.dwt
+++ b/examples/web/Templates/ExamplesTemplate.dwt
@@ -18,13 +18,12 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
 <!-- #BeginEditable "body" -->{body}<!-- #EndEditable -->
diff --git a/examples/web/conditionals/If.jsp b/examples/web/conditionals/If.jsp
index c5b4605..96e41bc 100644
--- a/examples/web/conditionals/If.jsp
+++ b/examples/web/conditionals/If.jsp
@@ -14,6 +14,6 @@
   <c:if test="$customer.address.country == 'USA'">
     <c:expr value="$customer"/><br>
   </c:if>
-</c:forEach> 
+</c:forEach>
 </body>
 </html>
diff --git a/examples/web/conditionals/index.html b/examples/web/conditionals/index.html
index 95006cd..615eb3f 100644
--- a/examples/web/conditionals/index.html
+++ b/examples/web/conditionals/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Conditional Tags Examples</title>
@@ -24,13 +24,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -47,12 +46,11 @@ Only shows a customer from the customer list if the last name is &quot;Howe&quot
 <h3>Custom Logic Tag&nbsp;&nbsp;<a href="../ShowSource.jsp?filename=/conditionals/CustomLogicTag.jsp"><img src="../images/code.gif" width="24" height="24" onMouseDown="MM_callJS('showJspCode(\&quot;Simple2.jsp\&quot;)')" border="0"></a>&nbsp;<a href="CustomLogicTag.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 <p>JSTL exposes in its API the abstract class ConditionalTagSupport to facilitate 
   the implementation of custom conditional tags that leverage the standard conditional 
-  behavior defined in JSTL. This example shows custom tag &lt;usCustomer&gt; that returns true if 
-its customer attribute value points to a US customer. 
-  It can be used both in the context of a simple conditional execution, as well 
-  as in the context of a mutually conditional execution by exposing the result 
-  of the conditional execution in a JSP page attribute via the tag attribute 'var'. 
-</p>
+  behavior defined in JSTL. This example shows custom tag &lt;usCustomer&gt; that 
+  returns true if its customer attribute value points to a US customer. It can 
+  be used both in the context of a simple conditional execution, as well as in 
+  the context of a mutually conditional execution by exposing the result of the 
+  conditional execution in a JSP page attribute via the tag attribute 'var'. </p>
 <!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
diff --git a/examples/web/ecmascript/ConditionalOperator.jsp b/examples/web/ecmascript/ConditionalOperator.jsp
index 7b9d3a9..6be5336 100644
--- a/examples/web/ecmascript/ConditionalOperator.jsp
+++ b/examples/web/ecmascript/ConditionalOperator.jsp
@@ -25,24 +25,24 @@
     <th>Result</th>
   </tr>
   <tr>
-    <td><code><c:expr value="$true"/> ? <jx:expr value="$ifResult"/> : <jx:expr value="$elseResult"/> </code></td>
+    <td><code><c:expr value="$true"/> ? <c:expr value="$ifResult"/> : <c:expr value="$elseResult"/> </code></td>
     <td><c:expr value="$true ? ifResult : elseResult"/></td>
   </tr>
   <tr>
-    <td><code><c:expr value="$false"/> ? <jx:expr value="$ifResult"/> : <jx:expr value="$elseResult"/> </code></td>
+    <td><code><c:expr value="$false"/> ? <c:expr value="$ifResult"/> : <c:expr value="$elseResult"/> </code></td>
     <td><c:expr value="$false ? ifResult : elseResult"/></td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$true == true"&gt; IF result &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$true == true"> IF result</jx:if> </td>
+    <td><c:if test="$true == true"> IF result</c:if> </td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$false == true"&gt; IF result &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$false == true"> IF result </jx:if> </td>
+    <td><c:if test="$false == true"> IF result </c:if> </td>
   </tr>
   <tr>
     <td><code>&lt;c:if test="$myDate.year == 101"&gt; 1900 + 101 = 2001 &lt;/jx:if&gt; </code></td>
-    <td><c:if test="$myDate.year == 101"> 1900 + 101 = 2001</jx:if> </td>
+    <td><c:if test="$myDate.year == 101"> 1900 + 101 = 2001</c:if> </td>
   </tr>
 </table>
 
diff --git a/examples/web/ecmascript/MapAccess.jsp b/examples/web/ecmascript/MapAccess.jsp
index c27cbb5..9462447 100644
--- a/examples/web/ecmascript/MapAccess.jsp
+++ b/examples/web/ecmascript/MapAccess.jsp
@@ -19,7 +19,7 @@
     <th>Value</th>
     <th>Key</th>
   </tr>
-<c:forEach var="prop" items="$systemProperties" begin="1" end="5">
+<c:forEach var="prop" items="$numberMap" begin="1" end="5">
   <tr>
     <td>prop</td>
     <td><c:expr value="$prop.value"/></td>
diff --git a/examples/web/ecmascript/PropertyAccess.jsp b/examples/web/ecmascript/PropertyAccess.jsp
index 3c54aef..a8c4c42 100644
--- a/examples/web/ecmascript/PropertyAccess.jsp
+++ b/examples/web/ecmascript/PropertyAccess.jsp
@@ -22,7 +22,7 @@
     <th>Property</th>
     <th>Value</th>
   </tr>
-<c:forEach var="prop" items="$systemProperties" begin="1" end="5">
+<c:forEach var="prop" items="$numberMap" begin="1" end="5">
   <tr>
     <td>prop</td>
     <td>prop.getKey()</td>
diff --git a/examples/web/ecmascript/index.html b/examples/web/ecmascript/index.html
index 4baff14..80c67ad 100644
--- a/examples/web/ecmascript/index.html
+++ b/examples/web/ecmascript/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,89 +18,80 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>EcmaScript Expression Language Examples</h2>
-<p>In order to use EcmaScript, make sure to set the context parameter to the EcmaScript expression language in your web.xml file as follows:<p>
-<pre>
+<p>In EA2, EcmaScript is the default Expression Language. Instructions below were 
+  necessary only with EA1 when there were no default EL (and one had to be explicitely 
+  defined).
+<blockquote>
+  <p>In order to use EcmaScript, make sure to set the context parameter to the 
+    EcmaScript expression language in your web.xml file as follows:</p>
+  <pre>
     &lt;context-param&gt;
         &lt;param-name&gt;javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass&lt;/param-name&gt;
         &lt;param-value&gt;org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator&lt;/param-value&gt;
     &lt;/context-param&gt;
 </pre>
-
-
-
+</blockquote>
 <h3>Arithmetic Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ArithmeticOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ArithmeticOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Arithmetic Operators perform various operations on either numeric or string operands.<br>
-
 <h3>Comparison Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ComparisonOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ComparisonOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Comparison Operators compare values for equality and identity.<br>
-
 <h3>String Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/StringOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StringOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Comparison Operators produce special effects when used with Strings.<br>
-
 <h3>String Support&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/StringSupport.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StringSupport.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-The EcmaScript String Object type has many useful methods for operating on string values.<br>
-
+The EcmaScript String Object type has many useful methods for operating on string 
+values.<br>
 <h3>Logical Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/LogicalOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="LogicalOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Logical Operators are used to perform boolean algebra.<br>
-
 <h3>Bitwise Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/BitwiseOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="BitwiseOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Bitwise Operators perform boolean algebra on individual bits or are used to shift bits.</br>
-
+Bitwise Operators perform boolean algebra on individual bits or are used to shift 
+bits. 
 <h3>Assignment Operators&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/AssignmentOperators.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="AssignmentOperators.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Assignment Operators are shortcuts for combining assignment with another operation.<br>
-
 <h3>Conditional Operator&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ConditionalOperator.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ConditionalOperator.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Conditional Operator is a shortcut for an if/else statement.<br>
-
 <h3>Array Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/ArrayAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ArrayAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Individual elements of an array can be accessed using the [] notation.<br>
-
 <h3>Property Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/PropertyAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="PropertyAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Elements of an object can be accessed using the . notation.<br>
-
 <h3>Map Access&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/MapAccess.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MapAccess.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 The key and value of a Map.Entry object can be accessed directly.<br>
-
 <h3>Function Call&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/ecmascript/FunctionCall.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FunctionCall.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Functions can be invoked using the () operator.<br>
 <!-- #EndEditable --> 
-
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -121,5 +105,4 @@ Functions can be invoked using the () operator.<br>
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/elsupport/index.html b/examples/web/elsupport/index.html
index 8180ac9..16711de 100644
--- a/examples/web/elsupport/index.html
+++ b/examples/web/elsupport/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Expression Language Support Tags Examples</title>
@@ -24,13 +24,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
diff --git a/examples/web/format/Exception.jsp b/examples/web/format/Exception.jsp
index 94ffb49..7e345a5 100644
--- a/examples/web/format/Exception.jsp
+++ b/examples/web/format/Exception.jsp
@@ -2,9 +2,10 @@
 
 <html>
 <head>
-  <title>JSTL: I18N Support -- Exception Example</title>
+  <title>JSTL: Formatting/I18N Support -- Exception Example</title>
 </head>
 <body bgcolor="#FFFFFF">
+<h3>Localized Error Page Exception</h3>
 
 <%@ page isErrorPage="true" %>
 Looking up exception's fully qualified class name in resource bundle:<br>
diff --git a/examples/web/format/FormatDateTime.jsp b/examples/web/format/FormatDateTime.jsp
index 3c99d84..534dbb4 100644
--- a/examples/web/format/FormatDateTime.jsp
+++ b/examples/web/format/FormatDateTime.jsp
@@ -2,24 +2,39 @@
 
 <html>
 <head>
-  <title>JSTL: Formatting Support -- Date and Time Example</title>
+  <title>JSTL: Formatting/I18N Support -- Date and Time Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Formatting Dates and Times</h3>
 
 <ul>
- <li> Formatting current date as &quot;GMT&quot;: 
+ <li> Formatting current date as &quot;GMT&quot;:<br>
   <fmt:timeZone value="GMT">
-   <fmt:formatDate type="both"/>
+   <fmt:formatDate type="both" dateStyle="full" timeStyle="full"/>
   </fmt:timeZone>
 
- <li> Formatting current date as &quot;GMT+1:00&quot;, and parse
+ <li> Formatting current date as &quot;GMT+1:00&quot;, and parsing
       its date and time components:<br>
-  <fmt:timeZone value="GMT+1:00"/>
-  <fmt:formatDate type="both" dateStyle="long" timeStyle="long" var="formattedDate"/>
-  <fmt:parseDate value="$formattedDate" type="both" var="parsedDate"/>
-  Parsed date: <fmt:formatDate value="$parsedDate" type="date"/><br>
-  Parsed time: <fmt:formatDate value="$parsedDate" type="time"/>
+  <fmt:timeZone value="GMT+1:00">
+   <fmt:formatDate type="both" dateStyle="full" timeStyle="full" var="formattedDateTime"/>
+   <fmt:parseDate value="$formattedDateTime" type="both" dateStyle="full" timeStyle="full" timeZone="PST" var="parsedDateTime"/>
+   Parsed date: <fmt:formatDate value="$parsedDateTime" type="date" dateStyle="full"/><br>
+   Parsed time: <fmt:formatDate value="$parsedDateTime" type="time" timeStyle="full"/>
+  </fmt:timeZone>
+
+ <li> Parsing SHORT version of current time in different time zones:<br>
+  <fmt:formatDate type="both" timeStyle="short" var="formattedDateTime"/>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT"/> (parsed in &quot;GMT&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT+1:00"/> (parsed in &quot;GMT+1:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="GMT+3:00"/> (parsed in &quot;GMT+3:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="short" timeZone="PST"/> (parsed in &quot;PST&quot;)
+
+ <li> Parsing FULL version of current time in different time zones (should not be affected):<br>
+  <fmt:formatDate type="both" timeStyle="full" var="formattedDateTime"/>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT"/> (parsed in &quot;GMT&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT+1:00"/> (parsed in &quot;GMT+1:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="GMT+3:00"/> (parsed in &quot;GMT+3:00&quot;)<br>
+  <fmt:parseDate value="$formattedDateTime" type="both" timeStyle="full" timeZone="PST"/> (parsed in &quot;PST&quot;)
 </ul>
 
 </body>
diff --git a/examples/web/format/FormatNumber.jsp b/examples/web/format/FormatNumber.jsp
index 59b16a5..70baf2b 100644
--- a/examples/web/format/FormatNumber.jsp
+++ b/examples/web/format/FormatNumber.jsp
@@ -2,7 +2,7 @@
 
 <html>
 <head>
-  <title>JSTL: Formatting Support -- Number, Currency, and Percent Example</title>
+  <title>JSTL: Formatting/I18N Support -- Number, Currency, and Percent Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Formatting Numbers, Currencies, and Percentages</h3>
@@ -20,6 +20,14 @@
  <li> Format as currency, parse, and print parsed result: 
   <fmt:formatNumber value="123456789" type="currency" var="cur"/>
   <fmt:parseNumber value="$cur" type="currency"/>
+
+ <li> Parse numeric string (using default &quot;en&quot; locale) and format as currency:
+  <fmt:locale value="de"/>
+  <fmt:formatNumber value="12345.67" type="currency"/>
+
+ <li> Parse numeric string (using 'parseLocale' locale) and format as currency:
+  <fmt:locale value="de"/>
+  <fmt:formatNumber value="12345.67" parseLocale="de" type="currency"/>
 </ul>
 
 </body>
diff --git a/examples/web/format/MessageFormat.jsp b/examples/web/format/MessageFormat.jsp
index bb4274c..75c9e2a 100644
--- a/examples/web/format/MessageFormat.jsp
+++ b/examples/web/format/MessageFormat.jsp
@@ -22,13 +22,12 @@
   </fmt:messageFormat>
 
  <li> Using &lt;messageArg&gt; body:<br>
-  <fmt:messageFormat value="Current time: {0{">
+  <fmt:messageFormat value="Current time: {0}">
    <fmt:messageArg>
     <fmt:formatDate type="both"/>
    </fmt:messageArg>
   </fmt:messageFormat>
 </ul>
 
-</ul>
 </body>
 </html>
diff --git a/examples/web/format/ParametricReplacement.jsp b/examples/web/format/ParametricReplacement.jsp
index 97c383f..6f356b0 100644
--- a/examples/web/format/ParametricReplacement.jsp
+++ b/examples/web/format/ParametricReplacement.jsp
@@ -28,6 +28,9 @@
     <fmt:formatDate type="both"/>
    </fmt:messageArg>
   </fmt:message>
+
+ <li> Using 'messageArgs' attribute:<br>
+  <fmt:message key="serverInfo" bundle="$deBundle" messageArgs="$messageArgs"/>
 </ul>
 
 </body>
diff --git a/examples/web/format/index.html b/examples/web/format/index.html
index a5cb69a..e77b800 100644
--- a/examples/web/format/index.html
+++ b/examples/web/format/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
-<title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<title>JSTL: I18N-Capable Formatting Tags Examples</title>
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,81 +18,57 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
-<h2>Formatting/I18N Tags Examples</h2>
-
+<h2>I18N-Capable Formatting Tags Examples</h2>
 <h3>German&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/GermanLocale.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="GermanLocale.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using resource bundle for German locale.
-<br>
-
+Using resource bundle for German locale. <br>
 <h3>Italian&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ItalianLocale.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ItalianLocale.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using resource bundle for Italian locale.
-<br>
-
-<h3>Missing Resource Bundle&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MissingResourceBundle.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Using resource bundle for Italian locale. <br>
+<h3>Missing Resource Bundle&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MissingResourceBundle.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MissingResourceBundle.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Trying to access a resource bundle that does not exist.
-<br>
-
+Trying to access a resource bundle that does not exist. <br>
 <h3>Undefined Key&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/UndefinedKey.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="UndefinedKey.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Looking up an undefined key in a resource bundle.
-<br>
-
-<h3>Parametric Replacement&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ParametricReplacement.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Looking up an undefined key in a resource bundle. <br>
+<h3>Parametric Replacement&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ParametricReplacement.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ParametricReplacement.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Parametric replacement examples.
-<br>
-
+Parametric replacement examples. <br>
 <h3>MessageFormat&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/MessageFormat.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="MessageFormat.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Message formatting examples.
-<br>
-
+Message formatting examples. <br>
 <h3>Prefix&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/PrefixAttribute.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="PrefixAttribute.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Prepending prefix to message key.
-<br>
-
+Prepending prefix to message key. <br>
 <h3>Date&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/FormatDateTime.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FormatDateTime.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting dates and times.
-<br>
-
+Formatting dates and times. <br>
 <h3>Number&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/FormatNumber.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="FormatNumber.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting numbers.
-<br>
-
-<h3>Exception&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ThrowException.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
+Formatting numbers. <br>
+<h3>Localized Exception&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/format/ThrowException.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ThrowException.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Formatting error page exception.
-<br>
-
-<!-- #EndEditable --> 
-
+Displaying error page exception in localized format. <br>
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -113,5 +82,4 @@ Formatting error page exception.
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/import/Absolute.jsp b/examples/web/import/Absolute.jsp
index 941e88c..10c9dce 100644
--- a/examples/web/import/Absolute.jsp
+++ b/examples/web/import/Absolute.jsp
@@ -1,4 +1,5 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
+<%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
 
 <html>
 <head>
@@ -9,9 +10,9 @@
 
 <h4>CNN's RSS XML feed:</h4>
 <blockquote>
- <pre>
+<ex:escapeHtml>
   <c:import url="http://www.cnn.com/cnn.rss"/>
- </pre>
+</ex:escapeHtml>
 </blockquote>
 
 </body>
diff --git a/examples/web/import/Encode.jsp b/examples/web/import/Encode.jsp
index d1d4ffb..6441973 100644
--- a/examples/web/import/Encode.jsp
+++ b/examples/web/import/Encode.jsp
@@ -28,6 +28,6 @@
  </tr>
  <tr>
   <td>a=b</td>
-  <td><c:urlEncode>a=b</jx:urlEncode></td>        <%-- bodies work too --%>
+  <td><c:urlEncode>a=b</c:urlEncode></td>        <%-- bodies work too --%>
  </tr>
 </table>
diff --git a/examples/web/import/index.html b/examples/web/import/index.html
index d107ec4..fd043c1 100644
--- a/examples/web/import/index.html
+++ b/examples/web/import/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Import Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,19 +18,18 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>Import Tags Examples</h2>
-<p>If you are using a Proxy server, you will need to set the following System Properties when starting the VM:</p>
+<p>If you are using a Proxy server, you will need to set the following System 
+  Properties when starting the VM:</p>
 <pre>
     http.proxyHost
     http.proxyPort
@@ -45,76 +37,55 @@ function MM_callJS(jsStr) { //v2.0
     ftp.proxyPort
 </pre>
 <br>
-
-
 <h3>Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Absolute.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Absolute.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using an Absolute URL to import a resource.
-<br>
-
+Using an Absolute URL to import a resource. <br>
 <h3>Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Relative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Relative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using a Relative URL to import a resource.
-<br>
-
-<h3>Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Using a Relative URL to import a resource. <br>
+<h3>Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Importing a resource relative to a foreign context.
-<br>
-
-<h3>Absolute (FTP)&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/AbsoluteFtp.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a>
+Importing a resource relative to a foreign context. <br>
+<h3>Absolute (FTP)&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/AbsoluteFtp.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="AbsoluteFtp.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using an Absolute URL to import a resource using a different protocol other than HTTP.
-<br>
-
+Using an Absolute URL to import a resource using a different protocol other than 
+HTTP. <br>
 <h3>Encode&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Encode.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Encode.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples.
-<br>
-
+URL encoding examples. <br>
 <h3>Encode Context Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeContextRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="EncodeContextRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples using a relative context and nested param tags.
-<br>
-
+URL encoding examples using a relative context and nested param tags. <br>
 <h3>Encode Query String&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/EncodeQueryString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="EncodeQueryString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-URL encoding examples using a relative context and query string.
-<br>
-
+URL encoding examples using a relative context and query string. <br>
 <h3>String Exposure Absolute&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeString.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ExposeString.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Exposing the content of the resource as a String Object.
-<br>
-
+Exposing the content of the resource as a String Object. <br>
 <h3>String Exposure Relative&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/ExposeStringRelative.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="ExposeStringRelative.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Exposing the content of a relative URL's resource as a String Object.
-<br>
-
+Exposing the content of a relative URL's resource as a String Object. <br>
 <h3>Param&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/Param.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="Param.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-Using <param> element to specify request parameters. Also demonstrating how request parameters can be URL encoded (default). (NOTE: Returns error page that shows how request parameters are encoded)
-<br>
-
+Using <param> element to specify request parameters. Also demonstrating how request 
+parameters can be URL encoded (default). (NOTE: Returns error page that shows 
+how request parameters are encoded) <br>
 <h3>Malformed URL&nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/import/StartSlash.jsp"><img src="../images/code.gif" width="24" height="24" border="0"></a> 
   <a href="StartSlash.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
-A relative URL must start with a "/" in a foreign context. (NOTE: This example will result in a ServletException describing the error condition).
-<br>
-
-<!-- #EndEditable --> 
-
+A relative URL must start with a "/" in a foreign context. (NOTE: This example 
+will result in a ServletException describing the error condition). <br>
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -128,5 +99,4 @@ A relative URL must start with a "/" in a foreign context. (NOTE: This example w
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/index.html b/examples/web/index.html
index 924a7d2..59038c2 100644
--- a/examples/web/index.html
+++ b/examples/web/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Examples Web Application</title>
@@ -18,21 +18,16 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="index.html">Introduction</a> 
-      &#149; <a href="iterators/index.html">Iterators</a> &#149; <a href="conditionals/index.html">Conditionals</a> 
-      &#149; <a href="elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      <br />
-      &#149; </font><a href="ecmascript/index.html">EcmaScript</a></font></b></font>
-      <font color="#FFFFFF">&#149;</font> <a href="import/index.html"><b>Import</b></a><font>
-      <font color="#FFFFFF">&#149;</font> <a href="format/index.html"><b>i18n-capable formatting</b></a>
-      <font color="#FFFFFF">&#149;</font> <a href="xml/index.html"><b>XML</b></a>
-   </td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="index.html">Introduction</a> 
+      &#149; <a href="elsupport/index.html">EL Support </a> &#149; <a href="conditionals/index.html">Conditionals</a> 
+      &#149; <a href="import/index.html"></a><a href="iterators/index.html">Iterators</a> 
+      &#149; <a href="import/index.html">Import</a> &#149; <a href="format/index.html">I18N 
+      & Formatting</a> &#149; <a href="xml/index.html">XML</a> &#149; <a href="ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="misc/index.html">Misc</a> </td>
   </tr>
 </table>
-<!-- #BeginEditable "body" -->
-<h1>Welcome to the jsptl-examples web application!</h1>
+<!-- #BeginEditable "body" --> 
+<h1>Welcome to the standard-examples web application!</h1>
 <p>This web application includes a variety of sample JSP pages that showcase the 
   JSTL tags currently being specified within the <a href="http://www.jcp.org/jsr/detail/52.jsp">JSR-052 
   Expert Group</a>. 
@@ -40,10 +35,10 @@
   the community informed of the EG's progress as well as to give the community 
   a chance to experiment with the standard tag library (JSTL) early in the specification 
   process so that valuable feedback can quickly be channelled back to the Expert 
-  Group.</b>
+  Group.</b> 
 <h3>Documentation</h3>
-<p>Documentation on the JSTL tags is available at <a href="http://jakarta.apache.org/taglibs/doc/jsptl-doc">http://jakarta.apache.org/taglibs/doc/jsptl-doc</a>. 
-  It is also available as the jsptl-docs web application of the jsptl EA2 release.
+<p>Documentation on the JSTL tags is available at <a href="http://jakarta.apache.org/taglibs/doc/standard-doc">http://jakarta.apache.org/taglibs/doc/standard-doc</a>. 
+  It is also available as the standard-doc web application of the JSTL EA2 release. 
 <h3>Mailing Lists</h3>
 <p>There are three ways to obtain information from or send your comments to the 
   JSR052 Expert Group: 
@@ -61,14 +56,16 @@
     received.</li>
 </ol>
 <h3>Examples</h3>
-<p>The JSTL examples have been divided in the following category:</p>
+<p>The JSTL examples have been divided in the following categories:</p>
 <ul>
-  <li><a href="iterators/index.html">Iterator Tags</a> (&lt;forEach&gt;, &lt;forToken&gt;)</li>
-  <li><a href="conditionals/index.html">Conditional Tags</a> (&lt;if&gt;, &lt;choose&gt;)</li>
-  <li><a href="elsupport/index.html">Expression Language Support Tags</a> (&lt;expr&gt;, 
-    &lt;set&gt;, &lt;define&gt;)</li>
-  <li><a href="misc/index.html">Miscellaneous</a> (various tests)</li>
-  <li><a href="ecmascript/index.html">EcmaScript Examples</a> (examples showcasing some of EcmaScript's features)</li>
+  <li><a href="elsupport/index.html">Expression Language Support Tags</a></li>
+  <li><a href="conditionals/index.html">Conditional Tags</a></li>
+  <li><a href="iterators/index.html">Iterator Tags</a></li>
+  <li><a href="import/index.html">Import Tags</a> </li>
+  <li><a href="format/index.html">I18N &amp; Formatting Tags</a></li>
+  <li><a href="xml/index.html">XML Tags</a></li>
+  <li><a href="ecmascript/index.html">EcmaScript Examples</a></li>
+  <li><a href="misc/index.html">Miscellaneous</a></li>
 </ul>
 <p>The navigation bar at the top of each index page provides quick navigation 
   to each set of example pages.</p>
@@ -102,7 +99,7 @@
     An array of Strings</li>
   <li><code>numberMap</code><br>
     A Map instance associating Integer objects with their Spanish names</li>
-  <li><code>enum</code><br>
+  <li><code>enumeration</code><br>
     An enumeration on numberMap from above.<br>
   </li>
 </ul>
diff --git a/examples/web/iterators/Collaboration.jsp b/examples/web/iterators/Collaboration.jsp
index 1ec0f3e..c9cd856 100644
--- a/examples/web/iterators/Collaboration.jsp
+++ b/examples/web/iterators/Collaboration.jsp
@@ -1,10 +1,10 @@
 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/ea/core" %>
-<%@ taglib prefix="jr" uri="http://java.sun.com/jstl/ea/jr" %>
+<%@ taglib prefix="jr" uri="http://java.sun.com/jstl/ea/core-rt" %>
 <%@ taglib prefix="ex" uri="/jstl-examples-taglib" %>
 
 <html>
 <head>
-  <title>JSTL: Iterator Support -- Collaboration Example</title>
+  <title>JSTL: Iterator Support 2-- Collaboration Example</title>
 </head>
 <body bgcolor="#FFFFFF">
 <h3>Collaboration</h3>
diff --git a/examples/web/iterators/DataTypes.jsp b/examples/web/iterators/DataTypes.jsp
index 2d641cc..87dc764 100644
--- a/examples/web/iterators/DataTypes.jsp
+++ b/examples/web/iterators/DataTypes.jsp
@@ -21,7 +21,7 @@
 
 <h4>Enumeration (warning: this only works until enumeration is exhausted!)</h4>
 
-<c:forEach var="item" items="$enum" begin="2" end="10" step="2">
+<c:forEach var="item" items="$enumeration" begin="2" end="10" step="2">
   <c:expr value="$item"/><br>
 </c:forEach>
 
diff --git a/examples/web/iterators/SimpleRange.jsp b/examples/web/iterators/SimpleRange.jsp
index 86f5a87..de14d9d 100644
--- a/examples/web/iterators/SimpleRange.jsp
+++ b/examples/web/iterators/SimpleRange.jsp
@@ -11,6 +11,6 @@
 
 <c:forEach var="i" begin="1" end="10">
   <c:expr value="$i"/> &#149;
-</c:forEach> 
+</c:forEach>
 </body>
 </html>
diff --git a/examples/web/iterators/Status.jsp b/examples/web/iterators/Status.jsp
index c362a1d..0b9a47a 100644
--- a/examples/web/iterators/Status.jsp
+++ b/examples/web/iterators/Status.jsp
@@ -26,8 +26,8 @@
       <td><c:expr value="$status.first"/></td>
       <td><c:expr value="$status.last"/></td>
     </tr>
-	<c:if test="$status.last">
-	  <c:set var="count" value="$status.count"/>
+    <c:if test="$status.last">
+      <c:set var="count" value="$status.count"/>
     </c:if>  
   </c:forEach>
 </table>
@@ -38,9 +38,9 @@
 <h4>Iteration using range attributes</h4>
 <c:forEach var="i" begin="100" end="200" step="5" status="status">
   <c:if test="$status.first">
-    begin:<c:expr value="$status.begin">begin</jx:expr> &nbsp; &nbsp; 
-      end:<c:expr value="$status.end">end</jx:expr> &nbsp; &nbsp; 
-     step:<c:expr value="$status.step">step</jx:expr><br>
+    begin:<c:expr value="$status.begin">begin</c:expr> &nbsp; &nbsp; 
+      end:<c:expr value="$status.end">end</c:expr> &nbsp; &nbsp; 
+     step:<c:expr value="$status.step">step</c:expr><br>
     sequence: 
   </c:if>  
   <c:expr value="$i"/> 
diff --git a/examples/web/iterators/index.html b/examples/web/iterators/index.html
index cbedfdb..327ead5 100644
--- a/examples/web/iterators/index.html
+++ b/examples/web/iterators/index.html
@@ -1,9 +1,8 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Iterator Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
 <script language="JavaScript">
@@ -12,11 +11,11 @@ function MM_callJS(jsStr) { //v2.0
   return eval(jsStr)
 }
 //-->
-</script>
-</head>
+</script></head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,13 +24,12 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -71,7 +69,7 @@ Simply displays the default <code>toString()</code> value of the items in the
 <p>JSTL exposes in its API the abstract class IteratorTagSupport to facilitate 
   the implementation of custom iterator tags that leverage the standard iteration 
   behavior defined in JSTL. This example shows a custom iterator tag that ...</p>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -85,5 +83,4 @@ Simply displays the default <code>toString()</code> value of the items in the
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/examples/web/misc/index.html b/examples/web/misc/index.html
index 79b5533..1d64684 100644
--- a/examples/web/misc/index.html
+++ b/examples/web/misc/index.html
@@ -1,4 +1,4 @@
-<html><!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" -->
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: Miscellaneous Examples</title>
@@ -18,13 +18,12 @@
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="../import/index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="../xml/index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="index.html">Misc</a> </td>
   </tr>
 </table>
 <!-- #BeginEditable "body" --> 
@@ -33,7 +32,7 @@
   <a href="../misc/IteratorTest.jsp"><img src="../images/execute.gif" width="24" height="24" border="0"></a> 
 </h3>
 Some tests on the iterator tags.<br>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
diff --git a/examples/web/xml/index.html b/examples/web/xml/index.html
index 6846a11..51d15bf 100644
--- a/examples/web/xml/index.html
+++ b/examples/web/xml/index.html
@@ -1,22 +1,15 @@
-<html>
-<!-- #BeginTemplate "/web/Templates/ExamplesTemplate.dwt" --> 
+<html><!-- #BeginTemplate "/examples/web/Templates/ExamplesTemplate.dwt" -->
 <head>
 <!-- #BeginEditable "doctitle" --> 
 <title>JSTL: EcmaScript Tags Examples</title>
-<!-- #EndEditable --> 
+<!-- #EndEditable -->
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 <link rel="stylesheet" href="../global.css" type="text/css">
-<script language="JavaScript">
-<!--
-function MM_callJS(jsStr) { //v2.0
-  return eval(jsStr)
-}
-//-->
-</script>
 </head>
+
 <body bgcolor="#FFFFFF" text="#000000">
 <table width="100%" border="0" cellpadding="5">
-  <tr> 
+  <tr>
     <td height="0"><font size="-1" color="#000099"><b>JSTL Early Access</b></font></td>
     <td align="center" height="0"><font size="-1" color="#000099"> <b>Beware &#151; 
       API and Tags may/will change</b></font></td>
@@ -25,84 +18,41 @@ function MM_callJS(jsStr) { //v2.0
       <a href="mailto:jsr052-comments@sun.com">comments to JSR052 EG</a></b></font></td>
   </tr>
   <tr> 
-    <td colspan="3" bgcolor="#CCCCFF"><font color="#CCFF00"><b><font color="#000099">JSTL 
-      Examples</font><font color="#FFFFFF">&nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
-      &#149; <a href="../iterators/index.html">Iterators</a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
-      &#149; <a href="../elsupport/index.html">EL Support </a></font><font color="#CCFF00"><b><font color="#FFFFFF">&#149; 
-      <a href="../misc/index.html">Misc</a></font></b></font><font color="#FFFFFF">
-      &#149; <a href="../ecmascript/index.html">EcmaScript</a>
-      &#149; <a href="index.html">Import</a></font></b></font></td>
+    <td colspan="3" bgcolor="#CCCCFF">JSTL Examples &nbsp;&nbsp;&nbsp;&nbsp;<a href="../index.html">Introduction</a> 
+      &#149; <a href="../elsupport/index.html">EL Support </a> &#149; <a href="../conditionals/index.html">Conditionals</a> 
+      &#149; <a href="../import/index.html"></a><a href="../iterators/index.html">Iterators</a> 
+      &#149; <a href="../import/index.html">Import</a> &#149; <a href="../format/index.html">I18N 
+      & Formatting</a> &#149; <a href="index.html">XML</a> &#149; <a href="../ecmascript/index.html">EcmaScript</a> 
+      &#149; <a href="../misc/index.html">Misc</a> </td>
   </tr>
 </table>
-
 <!-- #BeginEditable "body" --> 
 <h2>XML Examples</h2>
-
 <h3>Expr &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Expr.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Expr.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<a href="../ShowSource.jsp?filename=/xml/Expr.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> 
+<a href="Expr.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a></h3>
 Retrieving a String from a parsed XML document <br />
-
-<h3>Filter  &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Filter.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Filter.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Filter &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Filter.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="Filter.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Applying a SAX XMLFilter object to a document before parsing <br />
-
-<h3>ForEach &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/ForEach.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="ForEach.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>ForEach &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/ForEach.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="ForEach.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Iterating over XML nodes <br />
-
-<h3>If &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/If.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="If.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>If &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/If.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> 
+<a href="If.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Basing a decision on the status of an XML document <br />
-
-<h3>Set &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Set.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Set.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Set &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Set.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a>
+<a href="Set.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Storing an object resulting from an XPath expression <br />
-
-<h3>Transform &nbsp;&nbsp; 
- <a href="../ShowSource.jsp?filename=/xml/Transform.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="Transform.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>Transform &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/Transform.jsp"> 
+  <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="Transform.jsp"> 
+  <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Applying XSLT transformations <br />
-
-<h3>When &nbsp;&nbsp;
- <a href="../ShowSource.jsp?filename=/xml/When.jsp">
-  <img src="../images/code.gif" width="24" height="24" border="0">
- </a> 
- <a href="When.jsp">
-  <img src="../images/execute.gif" width="24" height="24" border="0">
- </a> </h3>
+<h3>When &nbsp;&nbsp; <a href="../ShowSource.jsp?filename=/xml/When.jsp"> <img src="../images/code.gif" width="24" height="24" border="0"></a> <a href="When.jsp"> <img src="../images/execute.gif" width="24" height="24" border="0"></a> </h3>
 Mutually exclusive conditionals based on the status of an XML document <br />
-
-<!-- #EndEditable --> 
-
+<!-- #EndEditable -->
 <hr noshade color="#000099">
 <table width="100%" border="0" cellpadding="5">
   <tr> 
@@ -116,5 +66,4 @@ Mutually exclusive conditionals based on the status of an XML document <br />
   </tr>
 </table>
 </body>
-<!-- #EndTemplate -->
-</html>
+<!-- #EndTemplate --></html>
diff --git a/lib/jdbc2_0-stdext.jar b/lib/jdbc2_0-stdext.jar
new file mode 100644
index 0000000..ddafa13
Binary files /dev/null and b/lib/jdbc2_0-stdext.jar differ
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
similarity index 57%
copy from src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
copy to src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
index d6d3143..c7d7c58 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
+++ b/src/javax/servlet/jsp/jstl/core/ConditionalTagSupport.java
@@ -53,102 +53,116 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.fmt;
+package javax.servlet.jsp.jstl.core;
 
-import java.util.TimeZone;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.core.Util;
-import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * Support for tag handlers for &lt;timezone&gt;, the timezone tag in
- * JSTL 1.0.
+ * <p>ConditionalTagSupport is an abstract class that facilitates
+ * implementation of conditional tags -- specifically, tags in the style
+ * of &lt;if&gt;.</p>
  *
- * @author Jan Luehe
+ * <p>In particular, this base class provides support for:</p>
+ * 
+ * <ul>
+ *  <li> conditional execution based on an overridable <tt>condition()</tt>
+ *       method </li>
+ *  <li> scoped attributes storing the result (as a Boolean) of the
+ *       logic executed by a subclass (optionally by attribute) </li>
+ * </ul>
+ *
+ * <p>Since this method implements the behavior anticipated to be
+ * recommended by the standard (with respect to tags that support
+ * boolean logic), it is expected that it will be part of the JSTL API.
+ * </p>
+ * 
+ * @author Shawn Bayern
  */
 
-public abstract class TimeZoneSupport extends BodyTagSupport {
-
+public abstract class ConditionalTagSupport
+    extends TagSupport
+{
     //*********************************************************************
-    // Package-scoped constants
+    // Abstract methods
 
-    static final String TIMEZONE_ATTRIBUTE =
-	"javax.servlet.jsp.jsptl.i18n.timeZone";
+    /**
+     * <p>Returns a <tt>boolean</tt> representing the condition that
+     * a particular subclass uses to drive its conditional logic.
+     *
+     * @return a boolean representing the result of arbitrary logic
+     *         that will be used to drive a tag's behavior
+     */
+    protected abstract boolean condition() throws JspException;
 
 
     //*********************************************************************
-    // Protected state
+    // Constructor
+
+    /**
+     * Base constructor to initialize local state.  As with TagSupport,
+     * subclasses should not provide other constructors and are expected
+     * to call the superclass constructor.
+     */
+    public ConditionalTagSupport() {
+        super();
+        init();
+    }
 
-    protected String value;                      // 'value' attribute
-  
 
     //*********************************************************************
-    // Private state
+    // Lifecycle management and implementation of conditional behavior
 
-    private int scope;                           // 'scope' attribute
-    private String var;                          // 'var' attribute
-    private TimeZone timeZone;
+    // Includes its body if condition() evalutes to true.
+    public int doStartTag() throws JspException {
 
+        // execute our condition() method once per invocation
+        result = condition();
 
-    //*********************************************************************
-    // Constructor and initialization
+        // expose variables if appropriate
+        exposeVariables();
 
-    public TimeZoneSupport() {
-	super();
-	init();
+        // handle conditional behavior
+        if (result)
+            return EVAL_BODY_INCLUDE;
+        else
+            return SKIP_BODY;
     }
 
-    private void init() {
-	value = var = null;
-	scope = PageContext.PAGE_SCOPE;
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        init();
     }
 
+    //*********************************************************************
+    // Private state
 
-   //*********************************************************************
-    // Tag attributes known at translation time
-
-    public void setVar(String var) {
-        this.var = var;
-    }
-
-    public void setScope(String scope) {
-	this.scope = Util.getScope(scope);
-    }
+    private boolean result;             // the saved result of condition()
+    private String var;			// scoped attribute name
 
 
     //*********************************************************************
-    // Collaboration with subtags
+    // Accessors
 
-    public TimeZone getTimeZone() {
-	return timeZone;
+    // for tag attribute
+    public void setVar(String var) {
+	this.var = var;
     }
 
 
     //*********************************************************************
-    // Tag logic
+    // Utility methods
 
-    public int doStartTag() throws JspException {
-	timeZone = TimeZone.getTimeZone(value);
-	return EVAL_BODY_INCLUDE;
+    // expose attributes if we have a non-null 'var'
+    private void exposeVariables() {
+        if (var != null)
+            pageContext.setAttribute(var, new Boolean(result));
     }
 
-    public int doEndTag() throws JspException {
-	if (var != null) {
-	    pageContext.setAttribute(var, timeZone, scope);	
-	} else if (getBodyContent() == null) {
-	    /*
-	     * If no 'var' attribute and no body, we store our time zone
-	     * in the javax.servlet.jsp.jsptl.i18n.timeZone scoped attribute
-	     */
-	    pageContext.setAttribute(TIMEZONE_ATTRIBUTE, timeZone, scope);
-	}
-
-	return EVAL_PAGE;
-    }
-
-    // Releases any resources we may have (or inherit)
-    public void release() {
-	init();
+    // initializes internal state
+    private void init() {
+        result = false;                 // not really necessary
+	var = null;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java b/src/javax/servlet/jsp/jstl/core/ExpressionException.java
similarity index 75%
copy from src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
copy to src/javax/servlet/jsp/jstl/core/ExpressionException.java
index d312013..441a1c7 100644
--- a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
+++ b/src/javax/servlet/jsp/jstl/core/ExpressionException.java
@@ -53,32 +53,35 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.xml;
+package javax.servlet.jsp.jstl.core;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.xml.*;
+import javax.servlet.jsp.JspException;
 
 /**
- * <p>A handler for &lt;param&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>ExpressionException indicates an error related to the evaluation of
+ * a specific expression.  An ExpressionException should not be thrown
+ * as the result of any general expression-processing error that might
+ * affect the evaluation of other exceptions in the future.  JSTL tags
+ * and other custom-action handlers may catch ExpressionExceptions if
+ * they wish to detect the failure of a specific expression to complete
+ * evaluation satisfactorily.</p>
  *
  * @author Shawn Bayern
  */
 
-public class ParamTag extends ParamSupport {
+public class ExpressionException extends JspException {
 
-    //*********************************************************************
-    // Accessor methods
-
-    // for tag attribute
-    public void setName(String name) throws JspTagException {
-        this.name = name;
+    /**
+     * Constructs an ExpressionException with no message.
+     */
+    public ExpressionException() {
+	super();
     }
 
-    // for tag attribute
-    public void setValue(String value) throws JspTagException {
-        this.value = value;
+    /**
+     * Constructs an ExpressionException with a String message.
+     */
+    public ExpressionException(String message) {
+	super(message);
     }
-
 }
diff --git a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java b/src/javax/servlet/jsp/jstl/core/IteratorTag.java
similarity index 67%
copy from src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
copy to src/javax/servlet/jsp/jstl/core/IteratorTag.java
index d312013..254d321 100644
--- a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTag.java
@@ -53,32 +53,41 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.xml;
+package javax.servlet.jsp.jstl.core;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.xml.*;
+import javax.servlet.jsp.tagext.Tag;
 
 /**
- * <p>A handler for &lt;param&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>JSTL 1.0 allows developers to write custom iteration tags by
+ * implementing the IteratorTag interface.  (This is not to be confused
+ * with javax.servlet.jsp.tagext.IterationTag as defined in JSP 1.2.)
+ * IteratorTag establishes a mechanism for iteration tags to be recognized
+ * and for type-safe communication with custom subtags.
+ * 
+ * <p>In most cases, it will not be necessary to implement this interface
+ * manually, for a base support class (IteratorTagSupport) is provided
+ * to facilitate implementation.</p>
  *
  * @author Shawn Bayern
  */
 
-public class ParamTag extends ParamSupport {
+public interface IteratorTag extends Tag {
 
-    //*********************************************************************
-    // Accessor methods
-
-    // for tag attribute
-    public void setName(String name) throws JspTagException {
-        this.name = name;
-    }
-
-    // for tag attribute
-    public void setValue(String value) throws JspTagException {
-        this.value = value;
-    }
+    /**
+     * Retrieves the current item in the iteration.  Behaves
+     * idempotently; calling getCurrent() repeatedly should return the same
+     * Object until the iteration is advanced.  (Specifically, calling
+     * getCurrent() does <b>not</b> advance the iteration.)
+     *
+     * @return the current item as an object
+     */
+    public Object getCurrent();
 
+    /**
+     * Retrieves a 'status' object to provide information about the
+     * current round of the iteration.
+     *
+     * @return the IteratorTagStatus for the current IteratorTag
+     */
+    public IteratorTagStatus getIteratorStatus();
 }
diff --git a/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java b/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java
new file mode 100644
index 0000000..33b7e44
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTagStatus.java
@@ -0,0 +1,204 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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 javax.servlet.jsp.jstl.core;
+
+/**
+ * <p>Provides an interface for objects representing the current status of
+ * an iteration.  JSTL 1.0 provides a mechanism for IteratorTags to
+ * return information about the current index of the iteration and
+ * convenience methods to determine whether or not the current round is
+ * either the first or last in the iteration.  It also lets authors
+ * use the status object to obtain information about the iteration range,
+ * step, label, and current object.</p>
+ *
+ * <p>Environments that require more status can extend this interface.</p>
+ *
+ * @author Shawn Bayern
+ */
+
+public interface IteratorTagStatus {
+
+    /**
+     * Retrieves the current item in the iteration.  Behaves
+     * idempotently; calling getCurrent() repeatedly should return the same
+     * Object until the iteration is advanced.  (Specifically, calling
+     * getCurrent() does <b>not</b> advance the iteration.)
+     *
+     * @return the current item as an object
+     */
+    public Object getCurrent();
+
+    /**
+     * Retrieves the index of the current round of the iteration.  If
+     * iteration is being performed over a subset of an underlying
+     * array, java.lang.Collection, or other type, the index returned
+     * is absolute with respect to the underlying collection.  Indices
+     * are 0-based.
+     *
+     * @return the 0-based index of the current round of the iteration
+     */
+    public int getIndex();
+
+    /**
+     * <p>Retrieves the "count" of the current round of the iteration.  The
+     * count is a relative, 1-based sequence number identifying the
+     * current "round" of iteration (in context with all rounds the
+     * current iteration will perform).</p>
+     *
+     * <p>As an example, an iteration with begin = 5, end = 15, and step =
+     * 5 produces the counts 1, 2, and 3 in that order.</p>
+     *
+     * @return the 1-based count of the current round of the iteration
+     */
+    public int getCount();
+
+    /**
+     * Returns information about whether the current round of the
+     * iteration is the first one.  This current round may be the 'first'
+     * even when getIndex() != 0, for 'index' refers to the absolute
+     * index of the current 'item' in the context of its underlying
+     * collection.  It is always that case that a true result from
+     * isFirst() implies getCount() == 1.
+     * 
+     * @return <tt>true</tt> if the current round is the first in the
+     * iteration, <tt>false</tt> otherwise.
+     */
+    public boolean isFirst();
+
+    /**
+     * Returns information about whether the current round of the
+     * iteration is the last one.  As with isFirst(), subsetting is
+     * taken into account.  isLast() doesn't necessarily refer to the
+     * status of the underlying Iterator; it refers to whether or not
+     * the current round will be the final round of iteration for the
+     * tag associated with this IteratorTagStatus.
+     * 
+     * @return <tt>true</tt> if the current round is the last in the
+     * iteration, <tt>false</tt> otherwise.
+     */
+    public boolean isLast();
+
+    /**
+     * Returns information about whether the 'begin' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'begin' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isBeginSpecified();
+
+    /**
+     * Returns information about whether the 'end' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'end' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isEndSpecified();
+
+    /**
+     * Returns information about whether the 'step' attribute was
+     * specified.
+     *
+     * @return <tt>true</tt> if 'step' was specified, <tt>false</tt>
+     * otherwise.
+     */
+    public boolean isStepSpecified();
+
+    /**
+     * Returns the value of the 'begin' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isBeginSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'begin' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getBegin();
+
+    /**
+     * Returns the value of the 'end' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isEndSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'end' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getEnd();
+
+    /**
+     * Returns the value of the 'step' attribute for the associated tag.  
+     * If this attribute was not specified, the result is undefined.
+     * (isStepSpecified() should be called prior to this method to ensure
+     * that the result is sensible.)
+     *
+     * @return the 'step' value for the associated tag, or an undefined
+     * value if this attribute was not specified.
+     */
+    public int getStep();
+
+/*-- No labels in EA2
+    **
+     * Returns the label of the associated tag.  This label identifies
+     * this tag (against other IteratorTags in a nested chain) primarily
+     * for the benefit of subtags.
+     *
+     * @return the label of the associated tag
+     *
+    public String getLabel();
+*/
+}
diff --git a/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java b/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java
new file mode 100644
index 0000000..5fe834d
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/core/IteratorTagSupport.java
@@ -0,0 +1,657 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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 javax.servlet.jsp.jstl.core;
+
+import javax.servlet.jsp.*;
+import javax.servlet.jsp.tagext.*;
+
+/**
+ * <p>JSTL 1.0 allows developers to write custom iteration tags by
+ * implementing the IteratorTag interface.  (This is not to be confused with
+ * javax.servlet.jsp.tagext.IterationTag as defined in JSP 1.2.) 
+ * IteratorTag establishes a mechanism for iteration tags to be recognized
+ * and for type-safe communication with custom subtags.
+ * </p>
+ * 
+ * <p>Since most iteration tags will behave identically with respect to
+ * actual iterative behavior, however, JSTL 1.0 provides this
+ * base support class to facilitate implementation.  Many iteration tags
+ * will extend this and merely implement the hasNext() and next() methods
+ * to provide contents for the handler to iterate over.</p>
+ *
+ * <p>In particular, this base class provides support for:</p>
+ * 
+ * <ul>
+ *  <li> iteration control, based on protected next() and hasNext() methods
+ *  <li> subsetting (begin, end, step functionality, including validation
+ *       of subset parameters for sensibility)
+ *  <li> item retrieval (getCurrent())
+ *  <li> status retrieval (IteratorTagStatus)
+ *  <li> exposing attributes (set by 'var' and 'status' attributes)
+ * </ul>
+ *
+ * <p>In providing support for these tasks, IteratorTagSupport contains
+ * certain control variables that act to modify the iteration.  Accessors
+ * are provided for these control variables when the variables represent
+ * information needed or wanted at translation time (e.g., var, status).  For
+ * other variables, accessors cannot be provided here since subclasses
+ * may differ on their implementations of how those accessors are received.
+ * For instance, one subclass might accept a String and convert it into
+ * an object of a specific type by using an expression evaluator; others
+ * might accept objects directly.  Still others might not want to expose
+ * such information to outside control.</p>
+ *
+ * @author Shawn Bayern
+ */
+
+public abstract class IteratorTagSupport
+    extends TagSupport
+    implements IteratorTag, IterationTag, TryCatchFinally
+{
+    //*********************************************************************
+    // 'Protected' state 
+
+    /*
+     * JavaBean-style properties and other state slaved to them.  These
+     * properties can be set directly by accessors; they will not be
+     * modified by the IteratorTagSupport implementation -- and should
+     * not be modified by subclasses outside accessors unless those
+     * subclasses are perfectly aware of what they're doing.
+     * (An example where such non-accessor modification might be sensible
+     * is in the doStartTag() method of an EL-aware subclass.)
+     */
+
+    /*-- No labels in EA2
+    ** 'label' attribute *
+    protected String label;
+    --*/
+
+    /** Starting index ('begin' attribute) */
+    protected int begin;
+
+    /**
+     * Ending index ('end' attribute).  -1 internally indicates 'no end
+     * specified', although accessors for the core JSTL tags do not
+     * allow this value to be supplied directly by the user.
+     */
+    protected int end;
+
+    /** Iteration step ('step' attribute) */
+    protected int step;
+
+    /** Boolean flag indicating whether 'begin' was specified. */
+    protected boolean beginSpecified;
+
+    /** Boolean flag indicating whether 'end' was specified. */
+    protected boolean endSpecified;
+
+    /** Boolean flag indicating whether 'step' was specified. */
+    protected boolean stepSpecified;
+
+    /** Attribute-exposing control */
+    protected String itemId, statusId /*, itemType */;
+
+
+    //*********************************************************************
+    // 'Private' state (implementation details)
+
+    /*
+     * State exclusively internal to the default, reference implementation.
+     * (While this state is kept private to ensure consistency, 'status'
+     * and 'item' happen to have one-for-one, read-only, accesor methods
+     * as part of the IteratorTag interface.)
+     *
+     * 'last' is kept separately for two reasons:  (a) to avoid
+     * running a computation every time it's requested, and (b) to
+     * let IteratorTagStatus.isLast() avoid throwing any exceptions,
+     * which would complicate subtag and scripting-variable use.
+     *
+     * Our 'internal index' begins at 0 and increases by 'step' each
+     * round; this is arbitrary, but it seemed a simple way of keeping
+     * track of the information we need.  To avoid computing
+     * getIteratorStatus().getCount() by dividing index / step, we keep
+     * a separate 'count' and increment it by 1 each round (as a minor
+     * performance improvement).
+     */
+    private IteratorTagStatus status;           // our IteratorTagStatus
+    private Object item;                        // the current item
+    private int index;                          // the current internal index
+    private int count;                          // the iteration count
+    private boolean last;                       // current round == last one?
+
+
+    //*********************************************************************
+    // Constructor
+
+    /**
+     * Constructs a new IteratorTagSupport.  As with TagSupport, subclasses
+     * should not provide other constructors and are expected to call
+     * the superclass constructor
+     */
+    public IteratorTagSupport() {
+        super();
+        init();
+    }
+
+
+    //*********************************************************************
+    // Abstract methods
+
+    /**
+     * <p>Returns the next object over which the tag should iterate.  This
+     * method must be provided by concrete subclasses of IteratorTagSupport
+     * to inform the base logic about what objects it should iterate over.</p>
+     *
+     * <p>It is expected that this method will generally be backed by an
+     * Iterator, but this will not always be the case.  In particular, if
+     * retrieving the next object raises the possibility of an exception
+     * being thrown, this method allows that exception to propagate back
+     * to the JSP container as a JspTagException; a standalone Iterator
+     * would not be able to do this.  (This explains why IteratorTagSupport
+     * does not simply call for an Iterator from its subtags.)</p>
+     * 
+     * @return the java.lang.Object to use in the next round of iteration
+     * @exception NoSuchElementException
+     *            if next() is called but no new elements are available
+     * @exception javax.servlet.jsp.JspTagException
+     *            for other, unexpected exceptions
+     */
+    protected abstract Object next() throws JspTagException;
+
+    /**
+     * <p>Returns information concerning the availability of more items
+     * over which to iterate.  This method must be provided by concrete
+     * subclasses of IteratorTagSupport to assist the iterative logic
+     * provided by the supporting base class.</p>
+     *  
+     * <p>See <a href="#next()">next</a> for more information about the
+     * purpose and expectations behind this tag.</p>
+     *
+     * @return <tt>true</tt> if there is at least one more item to iterate
+     *         over, <tt>false</tt> otherwise
+     * @exception javax.servlet.jspTagException
+     * @see #next
+     */
+    protected abstract boolean hasNext() throws JspTagException;
+
+
+    //*********************************************************************
+    // Lifecycle management and implementation of iterative behavior
+
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        init();
+    }
+
+    /* Begins iterating by processing the first item. */
+    public int doStartTag() throws JspException {
+
+        // make sure 'begin' isn't greater than 'end'
+        if (end != -1 && begin > end)
+            return SKIP_BODY;                   // nothing to do
+
+        // we're beginning a new iteration, so reset our counts (etc.)
+        index = 0;
+        count = 1;
+        last = false;
+
+        // throw away the first 'begin' items (if they exist)
+        discardIgnoreSubset(begin);
+
+        // get the item we're interested in
+        if (hasNext())
+            // index is 0-based, so we don't update it for the first item
+            item = next();
+        else
+            return SKIP_BODY;
+
+        /*
+         * now discard anything we have to "step" over.
+         * (we do this in advance to support IteratorTagStatus.isLast())
+         */
+        discard(step - 1);
+
+        // prepare to include our body...
+        exposeVariables();
+        calibrateLast();
+        return EVAL_BODY_INCLUDE;
+    }
+
+    /*
+     * Continues the iteration when appropriate -- that is, if we (a) have
+     * more items and (b) don't run over our 'end' (given our 'step').
+     */
+    public int doAfterBody() throws JspException {
+
+        // re-sync the index, given our prior behind-the-scenes 'step'
+        index += step - 1;
+
+        // increment the count by 1 for each round
+        count++;
+
+        // everything's been prepared for us, so just get the next item
+        if (hasNext() && !atEnd()) {
+            index++;
+            item = next();
+        } else
+            return SKIP_BODY;
+
+        /*
+         * now discard anything we have to "step" over.
+         * (we do this in advance to support IteratorTagStatus.isLast())
+         */
+        discard(step - 1);
+
+        // prepare to re-iterate...
+        exposeVariables();
+        calibrateLast();
+        return EVAL_BODY_AGAIN;
+    }
+
+    /*
+     * Removes attributes that our tag set; these attributes are intended
+     * to support scripting variables with NESTED scope, so we don't want
+     * to pollute attribute space by leaving them lying around.
+     */
+    public void doFinally() {
+	/*
+	 * This always gets called, which introduces a minor danger:
+	 * we might destroy attributes we *didn't* set if an exception
+	 * stops us before we set those attributes.  However, since our
+	 * setting of those attributes is destructive anyway (with respect
+	 * to attributes previously stored under the names we're directed
+	 * to use), this doesn't seem like a problem.
+         */
+	unExposeVariables();
+    }
+
+    /*
+     * Be transparent with respect to exceptions: rethrow anything we get.
+     */
+    public void doCatch(Throwable t) throws Throwable {
+	throw t;
+    }
+
+    //*********************************************************************
+    // Accessor methods
+
+    /*
+     * Overview:  The getXXX() methods we provide implement the Tag
+     * contract.  setXXX() accessors are provided only for those
+     * properties (attributes) that must be known at translation time,
+     * on the premise that these accessors will vary less than the
+     * others in terms of their interface with the page author.
+     */
+
+    /*
+     * (Purposely inherit JavaDoc and semantics from IteratorTag.
+     * Subclasses can override this if necessary, but such a need is
+     * expected to be rare.)
+     */
+    public Object getCurrent() {
+        return item;
+    }
+
+    /*
+     * (Purposely inherit JavaDoc and semantics from IteratorTag.
+     * Subclasses can override this method for more fine-grained control
+     * over IteratorTagStatus, but an effort has been made to simplify
+     * implementation of subclasses that are happy with reasonable default
+     * behavior.)
+     */
+    public IteratorTagStatus getIteratorStatus() {
+
+        // local implementation with reasonable default behavior
+        class Status implements IteratorTagStatus {
+
+            /*
+             * All our methods are straightforward.  We inherit
+             * our JavaDoc from IteratorTagSupport; see that class
+             * for more information.
+             */
+
+            public Object getCurrent() {
+                /*
+                 * Access the item through getCurrent() instead of just
+                 * returning the item our containing class stores.  This
+                 * should allow a subclass of IteratorTagSupport to override
+                 * getCurrent() without having to rewrite getIteratorStatus() too.
+                 */
+                return (IteratorTagSupport.this.getCurrent());
+            }
+            public int getIndex() {
+                return (index + begin);       // our 'index' isn't getIndex()
+            }
+            public int getCount() {
+                return (count);
+            }
+            public boolean isFirst() {
+                return (index == 0);          // our 'index' isn't getIndex()
+            }
+            public boolean isLast() {
+                return (last);                // use cached value
+            }
+            public boolean isBeginSpecified() {
+                return (beginSpecified);
+            }
+            public boolean isEndSpecified() {
+                return (endSpecified);
+            }
+            public boolean isStepSpecified() {
+                return (stepSpecified);
+            }
+            public int getBegin() {
+                return (begin);
+            }
+            public int getEnd() {
+                return (end);
+            }
+            public int getStep() {
+                return (step);
+            }
+	    /*-- No labels in EA2
+            public String getLabel() {
+                return (label);
+            }
+	    --*/
+        }
+
+        /*
+         * We just need one per invocation...  Actually, for the current
+         * implementation, we just need one per instance, but I'd rather
+         * not keep the reference around once release() has been called.
+         */
+        if (status == null)
+            status = new Status();
+
+        return status;
+    }
+
+    /*
+     * We only support setter methods for attributes that need to be
+     * offered as Strings or other literals; other attributes will be
+     * handled directly by implementing classes, since there might be
+     * both rtexprvalue- and EL-based varieties, which will have
+     * different signatures.  (We can't pollute child classes by having
+     * base implementations of those setters here; child classes that
+     * have attributes with different signatures would end up having
+     * two incompatible setters, which is illegal for a JavaBean.
+     */
+
+    /*-- No labels in EA2
+    // for tag attribute
+    public void setLabel(String label) {
+        this.label = label;
+    }
+    --*/
+ 
+    // for tag attribute
+    public void setVar(String id) {
+        this.itemId = id;
+    }
+
+    /* NO LONGER NEEDED
+    // for tag attribute
+    public void setItemType(String itemType) {
+        this.itemType = itemType;
+    }
+    */
+
+    // for tag attribute
+    public void setStatus(String statusId) {
+        this.statusId = statusId;
+    }
+
+    //*********************************************************************
+    // Public static (utility) methods
+
+    /*-- No labels in EA2
+    **
+     * Locates the nearest ancestor IteratorTag with the given label,
+     * starting at the Tag given as the 'base'.  If label is null, simply
+     * locates the nearest IteratorTag ancestor to 'base'.
+     *
+     * @param  base   the Tag at which to start the search (that is, the
+     *                Tag whose ancestors to search)
+     * @param  label  the label to search for, or 'null' if any IteratorTag
+     *                is suitable
+     *
+     * @return the IteratorTag found, or 'null' if no matching IteratorTag
+     * was found
+     *
+    public static IteratorTag findIteratorAncestorWithLabel(
+            Tag base, String label) {
+
+        // find the first IteratorTag ancestor
+        IteratorTag it =
+            (IteratorTag) findAncestorWithClass(base, IteratorTag.class);
+
+        // if we want a specific label, search for it up the tree
+        while (it != null && label != null
+                && !label.equals(it.getIteratorStatus().getLabel())) {
+            it = (IteratorTag) findAncestorWithClass(it, IteratorTag.class);
+        }
+
+        // return what we've got (which might be null)
+        return it;
+    }
+    --*/
+
+    //*********************************************************************
+    // Protected utility methods
+
+    /* 
+     * These methods validate attributes common to iteration tags.
+     * Call them if your own subclassing implementation modifies them
+     * -- e.g., if you set them through an expression language.
+     */
+
+    /*
+     * Ensures the "begin" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateBegin() throws JspTagException {
+        if (begin < 0)
+            throw new JspTagException("'begin' < 0");
+    }
+
+    /*
+     * Ensures the "end" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateEnd() throws JspTagException {
+        if (begin < 0)
+            throw new JspTagException("'end' < 0");
+    }
+
+    /*
+     * Ensures the "step" property is sensible, throwing an exception
+     * expected to propagate up if it isn't
+     */
+    protected void validateStep() throws JspTagException {
+        if (step < 1)
+            throw new JspTagException("'step' <= 0");
+    }
+
+
+    //*********************************************************************
+    // Private utility methods
+
+    // (re)initializes state (during release() or construction)
+    private void init() {
+        // defaults for internal bookkeeping
+        index = 0;              // internal index always starts at 0
+        count = 1;              // internal count always starts at 1
+        status = null;          // we clear status on release()
+        item = null;            // item will be retrieved for each round
+        last = false;           // last must be set explicitly
+        beginSpecified = false; // not specified until it's specified :-)
+        endSpecified = false;   // (as above)
+        stepSpecified = false;  // (as above)
+
+        // defaults for interface with page author
+        begin = 0;              // when not specified, 'begin' is 0 by spec.
+        end = -1;               // when not specified, 'end' is not used
+        step = 1;               // when not specified, 'step' is 1
+        itemId = null;          // when not specified, no variable exported
+        // itemType = null;        // when not specified, no variable exported
+        statusId = null;        // when not specified, no variable exported
+    }
+
+    // sets 'last' appropriately
+    private void calibrateLast() throws JspTagException {
+        /*
+         * the current round is the last one if (a) there are no remaining
+         * elements, or (b) the next one is beyond the 'end'.
+         */
+        last = !hasNext() || atEnd() ||
+            (end != -1 && (begin + index + step > end));
+    }
+
+    /*
+     * Exposes attributes (formerly scripting variables, but no longer!)
+     * if appropriate.  Note that we don't really care, here, whether they're
+     * scripting variables or not.
+     */
+    private void exposeVariables() throws JspTagException {
+
+        /*
+         * We need to support null items returned from next(); we
+         * do this simply by passing such non-items through to the
+         * scripting variable as 'null' (which we ensure by calling
+         * removeAttribute()).
+         *
+         * Also, just to be defensive, we handle the case of a null
+         * 'status' object as well.
+         *
+         * We call getCurrent() and getIteratorStatus() (instead of just using
+         * 'item' and 'status') to bridge to subclasses correctly.
+         * A subclass can override getCurrent() or getIteratorStatus() but still
+         * depend on our doStartTag() and doAfterBody(), which call this
+         * method (exposeVariables()), to expose 'item' and 'status'
+         * correctly.
+         */
+
+        if (itemId != null) {
+            if (getCurrent() == null)
+                pageContext.removeAttribute(itemId);
+            else
+                pageContext.setAttribute(itemId, getCurrent());
+        }
+        if (statusId != null) {
+            if (getIteratorStatus() == null)
+                pageContext.removeAttribute(statusId);
+            else
+                pageContext.setAttribute(statusId, getIteratorStatus());
+        }
+
+    }
+
+    // removes page attributes if appropriate
+    private void unExposeVariables() {
+	if (itemId != null)
+	    pageContext.removeAttribute(itemId, PageContext.PAGE_SCOPE);
+	if (statusId != null)
+	    pageContext.removeAttribute(statusId, PageContext.PAGE_SCOPE);
+    }
+
+    /*
+     * Cycles through and discards up to 'n' items from the iteration.
+     * We only know "up to 'n'", not "exactly n," since we stop cycling
+     * if hasNext() returns false or if we hit the 'end' of the iteration.
+     * Note: this does not update the iteration index, since this method
+     * is intended as a behind-the-scenes operation.  The index must be
+     * updated separately.  (I don't really like this, but it's the simplest
+     * way to support isLast() without storing two separate inconsistent
+     * indices.  We need to (a) make sure hasNext() refers to the next
+     * item we actually *want* and (b) make sure the index refers to the
+     * item associated with the *current* round, not the next one.
+     * C'est la vie.)
+     */
+    private void discard(int n) throws JspTagException {
+        /*
+         * copy index so we can restore it, but we need to update it
+         * as we work so that atEnd() works
+         */
+        int oldIndex = index;
+        while (n-- > 0 && !atEnd() && hasNext()) {
+            index++;
+            next();
+        }
+        index = oldIndex;
+    }
+
+    /*
+     * Discards items ignoring subsetting rules.  Useful for discarding
+     * items from the beginning (i.e., to implement 'begin') where we
+     * don't want factor in the 'begin' value already.
+     */
+    private void discardIgnoreSubset(int n) throws JspTagException {
+	while (n-- > 0 && hasNext())
+	    next();
+    }
+
+    /*
+     * Returns true if the iteration has past the 'end' index (with
+     * respect to subsetting), false otherwise.  ('end' must be set
+     * for atEnd() to return true; if 'end' is not set, atEnd()
+     * always returns false.)
+     */
+    private boolean atEnd() {
+        return ((end != -1) && (begin + index >= end));
+    }
+}
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/javax/servlet/jsp/jstl/sql/Column.java
similarity index 81%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Column.java
index c4ef188..20858e0 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Column.java
@@ -53,22 +53,27 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
- *
- * @author Jan Luehe
+ * <p>A class implementing this interface encapsulates the value and all 
+ * meta data for a column in a database query result. Instances of such
+ * classes are returned as the result of the &lt;Query&gt; action.</p>
+ * 
  */
-public class MessageFormatTEI extends TagExtraInfo {
+
+public interface Column extends ColumnMetaData {
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+     * Returns the column value, or null.
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public Object getValue();
+
+    /**
+     * Returns the default <code>String</code> representation of the
+     * column's value. If the value is null, an empty String is
+     * is returned.
+     */
+    public String toString();
+
 }
diff --git a/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java b/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java
new file mode 100644
index 0000000..cfd5f59
--- /dev/null
+++ b/src/javax/servlet/jsp/jstl/sql/ColumnMetaData.java
@@ -0,0 +1,185 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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 javax.servlet.jsp.jstl.sql;
+
+import java.sql.*;
+
+/**
+ * <p>A class implementing this interface encapsulates the meta data for 
+ * a column in a database query result. 
+ * 
+ * <p>Most methods may throw an SQLException. In this case, the exception 
+ * instance may be the same instance as thrown by the corresponding
+ * <code>java.sql.ResultSetMetaData</code> method when the Column instance
+ * was created.</p>
+ *
+ * <p>Note! Currently this class contains methods corresponding to all
+ * <code>ResultSetMetaData</code> methods. We may want to remove some of them
+ * that don't make much sense in the context where this class is used.</p>
+ *
+ */
+
+public interface ColumnMetaData {
+
+    /**
+     * Get the designated column's name.
+     */
+    public String getName() throws SQLException;
+
+    /**
+     * Retrieves the column's SQL type.
+     *
+     *<p>Fix: maybe this method should return a String instead, with
+     * the name of the type based on the java.sql.Types statics names.
+     */
+    public int getType() throws SQLException;
+
+    /**
+     * Retrieves the column's database-specific type name.
+     */
+    public String getTypeName() throws SQLException;
+
+    /**
+     * Indicates whether the column is automatically numbered, 
+     * thus read-only.
+     */
+    public boolean isAutoIncrement() throws SQLException;
+
+    /**
+     * Indicates whether a column's case matters.
+     */
+    public boolean isCaseSensitive() throws SQLException;
+
+    /**
+     * Indicates whether the column can be used in a where clause.
+     */
+    public boolean isSearchable() throws SQLException;
+
+    /**
+     * Indicates whether the column is a cash value.
+     */
+    public boolean isCurrency() throws SQLException;
+
+    /**
+     * Indicates the nullability of values in the column.
+     */
+    public int isNullable() throws SQLException;
+
+    /**
+     * Indicates whether values in the column are signed numbers.
+     */
+    public boolean isSigned() throws SQLException;
+
+    /**
+     * Indicates the column's normal maximum width in characters.
+     */
+    public int getDisplaySize() throws SQLException;
+
+    /**
+     * Gets the column's suggested title for use in printouts and displays.
+     */
+    public String getLabel() throws SQLException;
+
+    /**
+     * Get the column's table's schema.
+     */
+    public String getSchemaName() throws SQLException;
+
+    /**
+     * Get the column's number of decimal digits.
+     */
+    public int getPrecision() throws SQLException;
+
+    /**
+     * Gets the column's number of digits to right of the decimal point.
+     */
+    public int getScale() throws SQLException;
+
+    /**
+     * Gets the designated column's table name.
+     */
+    public String getTableName() throws SQLException;
+
+    /**
+     * Gets the column's table's catalog name.
+     */
+    public String getCatalogName() throws SQLException;
+
+    /**
+     * Indicates whether the column is definitely not writable.
+     */
+    public boolean isReadOnly() throws SQLException;
+
+    /**
+     * Indicates whether it is possible for a write on the column to succeed.
+     */
+    public boolean isWritable() throws SQLException;
+
+    /**
+     * Indicates whether a write on the column will definitely succeed.
+     */
+    public boolean isDefinitelyWritable() throws SQLException;
+
+    /**
+     * Returns the fully-qualified name of the Java class whose instances 
+     * are manufactured if the method <code>ResultSet.getObject</code> is 
+     * called to retrieve a value from the column. 
+     * <code>ResultSet.getObject</code> may return a subclass of the class 
+     * returned by this method.
+     */
+    public String getClassName() throws SQLException;
+
+}
diff --git a/src/org/apache/taglibs/standard/tei/BundleTEI.java b/src/javax/servlet/jsp/jstl/sql/Result.java
similarity index 76%
copy from src/org/apache/taglibs/standard/tei/BundleTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Result.java
index 93403a8..1bff9d8 100644
--- a/src/org/apache/taglibs/standard/tei/BundleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Result.java
@@ -53,22 +53,38 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;bundle&gt; tag's attributes.
+ * <p>A class implementing this interface creates a cached version of 
+ * a <code>ResultSet</code>. It's represented as a <code>Result</code> 
+ * implementation, capable of returning an array of <code>Row</code> 
+ * objects containing a <code>Column</code> instance for each column 
+ * in the row.
  *
- * @author Jan Luehe
  */
-public class BundleTEI extends TagExtraInfo {
+public interface Result {
+
+    /**
+     * Returns an array of Row objects.
+     *
+     */
+    public Row[] getRows();
+
+    /**
+     * Returns the ResultMetaData object of the cached ResultSet
+     *
+     */
+    public ResultMetaData getMetaData();
+
+    /**
+     * Returns the number of rows in the cached ResultSet
+     */
+    public int getSize();
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;bundle&gt; tag.
+     * Returns true of the query was limited by a maximum row setting
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public boolean isLimitedByMaxRows();
 }
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
similarity index 83%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
index c4ef188..0bd473b 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/ResultMetaData.java
@@ -53,22 +53,31 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
+ * <p>A class implementing this interface encapsulates all 
+ * the meta data for a result set. 
  *
- * @author Jan Luehe
  */
-public class MessageFormatTEI extends TagExtraInfo {
+public interface ResultMetaData {
+
+    /**
+     * Returns the ColumnMetaData for the named column
+     *
+     */
+    public ColumnMetaData get(String name);
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+     * Returns the ColumnMetaData for the given column index
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public ColumnMetaData get(int index);
+
+    /**
+     * Returns an array of ColumnMetaData objects
+     *
+     */
+    public ColumnMetaData[] getColumns();
+
 }
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/javax/servlet/jsp/jstl/sql/Row.java
similarity index 85%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/javax/servlet/jsp/jstl/sql/Row.java
index c4ef188..1ba370b 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/Row.java
@@ -53,22 +53,31 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
+ * 
+ * <p>An implementation of this class encapsulates the columns 
+ * for a given row. 
  *
- * @author Jan Luehe
  */
-public class MessageFormatTEI extends TagExtraInfo {
+public interface Row {
+
+    /**
+     * Returns the Column object for the named column
+     *
+     */
+    public Column get(String name);
+
+    /**
+     * Returns the Column for the given column index
+     *
+     */
+    public Column get(int index);
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+     * Returns an array Column objects
+     *
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public Column[] getColumns();
 }
diff --git a/src/org/apache/taglibs/standard/tei/LocaleTEI.java b/src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
similarity index 86%
rename from src/org/apache/taglibs/standard/tei/LocaleTEI.java
rename to src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
index a3388cb..5701565 100644
--- a/src/org/apache/taglibs/standard/tei/LocaleTEI.java
+++ b/src/javax/servlet/jsp/jstl/sql/SQLExecutionTag.java
@@ -53,22 +53,18 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
-
-import javax.servlet.jsp.tagext.*;
+package javax.servlet.jsp.jstl.sql;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;locale&gt; tag's attributes.
+ * <p>A class implementing this interface exposes one method that
+ * nested elements can use to add PreparedStatement parameters.
  *
- * @author Jan Luehe
  */
-public class LocaleTEI extends TagExtraInfo {
+
+public interface SQLExecutionTag {
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;locale&gt; tag.
+     * Adds a PreparedStatement parameter value
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public void addSQLParameter(Object value);
 }
diff --git a/src/org/apache/taglibs/standard/lang/javascript/JavascriptExpressionEvaluator.java b/src/org/apache/taglibs/standard/lang/javascript/JavascriptExpressionEvaluator.java
index 6285fc0..44a3b79 100644
--- a/src/org/apache/taglibs/standard/lang/javascript/JavascriptExpressionEvaluator.java
+++ b/src/org/apache/taglibs/standard/lang/javascript/JavascriptExpressionEvaluator.java
@@ -58,6 +58,7 @@ package org.apache.taglibs.standard.lang.javascript;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*; 
 import java.util.Enumeration;
+import java.lang.Boolean;
 
 import org.apache.taglibs.standard.lang.support.ExpressionEvaluator;
 import org.apache.taglibs.standard.lang.spel.Evaluator;
@@ -100,11 +101,10 @@ public class JavascriptExpressionEvaluator implements ExpressionEvaluator {
 	Scriptable scope = cx.initStandardObjects(null);
 
         // Put PageContext attributes/parameters in Rhino Scope
-        putAttributesInScope(scope, cx, pageContext, PageContext.PAGE_SCOPE);
-        putAttributesInScope(scope, cx, pageContext, PageContext.REQUEST_SCOPE);
-        putAttributesInScope(scope, cx, pageContext, PageContext.SESSION_SCOPE);
         putAttributesInScope(scope, cx, pageContext, PageContext.APPLICATION_SCOPE);
-        putParametersInScope(scope, cx, pageContext);
+        putAttributesInScope(scope, cx, pageContext, PageContext.SESSION_SCOPE);
+        putAttributesInScope(scope, cx, pageContext, PageContext.REQUEST_SCOPE);
+        putAttributesInScope(scope, cx, pageContext, PageContext.PAGE_SCOPE);
 
 
 	// Evaluate string
@@ -122,9 +122,11 @@ public class JavascriptExpressionEvaluator implements ExpressionEvaluator {
 
             if (result instanceof NativeString)
                 result = result.toString();
+            if (result instanceof NativeBoolean)
+                result = new Boolean(result.toString());
 
 	} catch (JavaScriptException jse) {
-	    throw new JspException(jse.getMessage());
+	    throw new JspException(jse.getMessage(), jse);
 	}
 
 	//System.out.println("RHINO result: " + result + ":");
diff --git a/src/org/apache/taglibs/standard/lang/jpath/JPathExpressionEvaluator.java b/src/org/apache/taglibs/standard/lang/jpath/JPathExpressionEvaluator.java
index 142ce23..41cdc1b 100644
--- a/src/org/apache/taglibs/standard/lang/jpath/JPathExpressionEvaluator.java
+++ b/src/org/apache/taglibs/standard/lang/jpath/JPathExpressionEvaluator.java
@@ -116,9 +116,9 @@ public class JPathExpressionEvaluator implements ExpressionEvaluator {
 	    } else
 	      result = new String(expression);			// lit.
         } catch (ParseException e) {
-            throw new JspException(e.getMessage());
+            throw new JspException(e.getMessage(), e);
         } catch (EvaluationException e) {
-            throw new JspException(e.getMessage());
+            throw new JspException(e.getMessage(), e);
         }
         if (result != null && !expectedType.isInstance(result)) {
             throw new JspException("The tag expected an object of type ["
diff --git a/src/org/apache/taglibs/standard/lang/jxpath/JXPathExpressionEvaluator.java b/src/org/apache/taglibs/standard/lang/jxpath/JXPathExpressionEvaluator.java
index a6d6c09..edb9e4d 100644
--- a/src/org/apache/taglibs/standard/lang/jxpath/JXPathExpressionEvaluator.java
+++ b/src/org/apache/taglibs/standard/lang/jxpath/JXPathExpressionEvaluator.java
@@ -116,7 +116,7 @@ public class JXPathExpressionEvaluator implements ExpressionEvaluator {
         }
         catch (Exception ex) {
             // ex.printStackTrace();
-            throw new JspException(ex.getMessage());
+            throw new JspException(ex.getMessage(), ex);
         }
     }
 }
diff --git a/src/org/apache/taglibs/standard/lang/support/ExpressionEvaluatorManager.java b/src/org/apache/taglibs/standard/lang/support/ExpressionEvaluatorManager.java
index 2428451..99015da 100644
--- a/src/org/apache/taglibs/standard/lang/support/ExpressionEvaluatorManager.java
+++ b/src/org/apache/taglibs/standard/lang/support/ExpressionEvaluatorManager.java
@@ -90,10 +90,10 @@ public class ExpressionEvaluatorManager {
     //*********************************************************************
     // Constants
 
+    public static final String DEFAULT_EVALUATOR_CLASS =
+        "org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator";
     private static final String EVALUATOR_PARAMETER =
         "javax.servlet.jsp.jstl.temp.ExpressionEvaluatorClass";
-    private static final String DEFAULT_EVALUATOR_CLASS =
-        "org.apache.taglibs.standard.lang.javascript.JavascriptExpressionEvaluator";
 
     //*********************************************************************
     // Internal, static state
@@ -226,17 +226,17 @@ public class ExpressionEvaluatorManager {
         } catch (ClassCastException ex) {
             // just to display a better error message
             throw new JspException("invalid ExpressionEvaluator: " +
-                ex.getMessage());
+                ex.getMessage(), ex);
         } catch (ClassNotFoundException ex) {
             throw new JspException("couldn't find ExpressionEvaluator: " +
-                ex.getMessage());
+                ex.getMessage(), ex);
         } catch (IllegalAccessException ex) {
             throw new JspException("couldn't access ExpressionEvaluator: " +
-                ex.getMessage());
+                ex.getMessage(), ex);
         } catch (InstantiationException ex) {
             throw new JspException(
                 "couldn't instantiate ExpressionEvaluator: " +
-                ex.getMessage());
+                ex.getMessage(), ex);
         }
     }
 
diff --git a/src/org/apache/taglibs/standard/resources/Resources.properties b/src/org/apache/taglibs/standard/resources/Resources.properties
index 948a7ba..c5951c7 100644
--- a/src/org/apache/taglibs/standard/resources/Resources.properties
+++ b/src/org/apache/taglibs/standard/resources/Resources.properties
@@ -118,6 +118,10 @@ PARSE_NO_SAXTRANSFORMER=\
     Filter supplied to &lt;parse&gt;, but default TransformerFactory \
     does not support SAX.
 
+TRANSFORM_NO_TRANSFORMER=\
+    &lt;transform&gt; needs either an 'xslt' attribute or a \
+    'transformer' attribute
+
 
 #########################################################################
 # JSTL core TLV messages
@@ -143,6 +147,8 @@ TLV_ILLEGAL_CHILD_TAG=\
 TLV_ILLEGAL_TEXT_BODY=\
     Illegal text inside &lt;{0}:{1}&gt;: "{2}...".
 
+TLV_INVALID_ATTRIBUTE=\
+    Invalid "{0}" attribute in &lt;{1}&gt; tag: "{2}"
 
 # Errors customized to particular tags (sort of)  :-)
 
diff --git a/src/org/apache/taglibs/standard/tag/common/xml/TransformerSupport.java b/src/org/apache/taglibs/standard/tag/common/core/ChooseTag.java
similarity index 65%
copy from src/org/apache/taglibs/standard/tag/common/xml/TransformerSupport.java
copy to src/org/apache/taglibs/standard/tag/common/core/ChooseTag.java
index dade7e7..8632791 100644
--- a/src/org/apache/taglibs/standard/tag/common/xml/TransformerSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/ChooseTag.java
@@ -53,89 +53,87 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.xml;
+package org.apache.taglibs.standard.tag.common.core;
 
-import java.io.*;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import javax.xml.transform.*;
-import javax.xml.transform.stream.*;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * <p>Support for tag handlers for &lt;transformer&gt;, a tag that exposes
- * a reusable transformer.</p>
+ * <p>Tag handler for &lt;choose&gt; in JSTL.</p>
+ * 
+ * <p>&lt;choose&gt; is a very simple tag that acts primarily as a container;
+ * it always includes its body and allows exactly one of its child
+ * &lt;when&gt; tags to run.  Since this tag handler doesn't have any
+ * attributes, it is common.core to both the rtexprvalue and expression-
+ * evaluating versions of the JSTL library.
  *
  * @author Shawn Bayern
  */
-public abstract class TransformerSupport extends BodyTagSupport {
+
+public class ChooseTag extends TagSupport {
 
     //*********************************************************************
-    // Protected state
+    // Constructor and lifecycle management
+
+    // initialize inherited and local state
+    public ChooseTag() {
+        super();
+        init();
+    }
+
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        init();
+    }
 
-    protected Object xslt;                      // 'xslt' attribute
 
     //*********************************************************************
     // Private state
 
-    private String var;                         // 'var' attribute
-    private TransformerFactory tf;		// reusable TransformerFactory
+    private boolean subtagGateClosed;      // has one subtag already executed?
 
 
     //*********************************************************************
-    // Constructor and initialization
-
-    public TransformerSupport() {
-	super();
-	init();
+    // Public methods implementing exclusivity checks
+
+    /**
+     * Returns status indicating whether a subtag should run or not.
+     *
+     * @return <tt>true</tt> if the subtag should evaluate its condition
+     *         and decide whether to run, <tt>false</tt> otherwise.
+     */
+    public synchronized boolean gainPermission() {
+        return (!subtagGateClosed);
     }
 
-    private void init() {
-	xslt = null;
-	var = null;
-	tf = null;
+    /**
+     * Called by a subtag to indicate that it plans to evaluate its
+     * body.
+     */
+    public synchronized void subtagSucceeded() {
+        if (subtagGateClosed)
+            throw new IllegalStateException(
+		Resources.getMessage("CHOOSE_EXCLUSIVITY"));
+        subtagGateClosed = true;
     }
 
 
     //*********************************************************************
     // Tag logic
 
-    // retrieves XSLT from body or attribute; exposes Transformer
-    public int doEndTag() throws JspException {
-      try {
-	
-        if (tf == null)
-            tf = TransformerFactory.newInstance();
-
-
-	// if we haven't gotten an XSLT stylesheet, use the body
-	Object xslt = this.xslt;
-	if (xslt == null)
-	    xslt = bodyContent.getString();
-
-	// get a Source and feed it to our factory
-	Source s = TransformSupport.getSource(xslt);
-	Transformer t = tf.newTransformer(s);
-
-	// expose the Transformer
-	pageContext.setAttribute(var, t);
-
-	return EVAL_PAGE;
-      } catch (TransformerConfigurationException ex) {
-	throw new JspTagException(ex.toString());
-      }
-    }
-
-    // Releases any resources we may have (or inherit)
-    public void release() {
-	init();
+    // always include body
+    public int doStartTag() throws JspException {
+        subtagGateClosed = false;	// when we start, no children have run
+        return EVAL_BODY_INCLUDE;
     }
 
 
     //*********************************************************************
-    // Tag attributes
+    // Private utility methods
 
-    public void setVar(String var) {
-	this.var = var;
+    private void init() {
+        subtagGateClosed = false;                          // reset flag
     }
 }
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/org/apache/taglibs/standard/tag/common/core/DeclareTag.java
similarity index 82%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/org/apache/taglibs/standard/tag/common/core/DeclareTag.java
index c4ef188..081e5cd 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/DeclareTag.java
@@ -53,22 +53,25 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
+package org.apache.taglibs.standard.tag.common.core;
 
+import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
- *
- * @author Jan Luehe
+ * <p>Tag handler for &lt;declaregt; in JSTL.  This tag handler is
+ * essentially a runtime no-op as far as tag logic is concerned; the
+ * only important functionality of the tag is to expose a scripting
+ * variable for an existing scoped attribute.</p>
+ * 
+ * @author Shawn Bayern
  */
-public class MessageFormatTEI extends TagExtraInfo {
 
-    /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+public class DeclareTag extends TagSupport {
+
+    /*
+     * We're not identical to TagSupport only because we need to
+     * accept an additional "type" attribute.
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
-    }
+    public void setType(String x) { }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/core/ForEachSupport.java b/src/org/apache/taglibs/standard/tag/common/core/ForEachSupport.java
new file mode 100644
index 0000000..21a0cc4
--- /dev/null
+++ b/src/org/apache/taglibs/standard/tag/common/core/ForEachSupport.java
@@ -0,0 +1,435 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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.taglibs.standard.tag.common.core;
+
+import java.util.*;
+import javax.servlet.*;
+import javax.servlet.jsp.*;
+import javax.servlet.jsp.tagext.*;
+import java.sql.ResultSet;
+import javax.servlet.jsp.jstl.core.IteratorTagSupport;
+import org.apache.taglibs.standard.resources.Resources;
+
+/**
+ * <p>Support for tag handlers for &lt;forEach&gt;, the core iteration
+ * tag in JSTL 1.0.  This class extends IteratorTagSupport and provides
+ * ForEach-specific functionality.  The rtexprvalue library and the
+ * expression-evaluating library each have handlers that extend this
+ * class.</p>
+ *
+ * <p>Localized here is the logic for handling the veritable smorgasbord
+ * of types supported by &lt;forEach&gt;, including arrays,
+ * Collections, and others.  To see how the actual iteration is controlled,
+ * review the javax.servlet.jsp.jstl.core.IteratorTagSupport class instead.
+ * </p>
+ *
+ * @see javax.servlet.jsp.jstl.core.IteratorTagSupport
+ * @author Shawn Bayern
+ */
+
+public abstract class ForEachSupport extends IteratorTagSupport {
+
+    //*********************************************************************
+    // Implementation overview
+
+    /*
+     * This particular handler is essentially a large switching mechanism
+     * to support the various types that the <forEach> tag handles.  The
+     * class is organized around the private ForEachIterator interface,
+     * which serves as the basis for relaying information to the iteration
+     * implementation we inherit from IteratorTagSupport.
+     *
+     * We expect to receive our 'items' from one of our subclasses
+     * (presumably from the rtexprvalue or expression-evaluating libraries).
+     * If 'items' is missing, we construct an Integer[] array representing
+     * iteration indices, in line with the spec draft.  From doStartTag(),
+     * we analyze and 'digest' the data we're passed.  Then, we simply
+     * relay items as necessary to the iteration implementation that
+     * we inherit from IteratorTagSupport.
+     */
+
+
+    //*********************************************************************
+    // Internal, supporting classes and interfaces
+
+    /*
+     * Acts as a focal point for converting the various types we support.
+     * It would have been ideal to use Iterator here except for one problem:
+     * Iterator.hasNext() and Iterator.next() can't throw the JspTagException
+     * we want to throw.  So instead, we'll encapsulate the hasNext() and
+     * next() methods we want to provide inside this local class.
+     * (Other implementations are more than welcome to implement hasNext()
+     * and next() explicitly, not in terms of a back-end supporting class.
+     * For the forEach tag handler, however, this class acts as a convenient
+     * organizational mechanism, for we support so many different classes.
+     * This encapsulation makes it easier to localize implementations
+     * in support of particular types -- e.g., changing the implementation
+     * of primitive-array iteration to wrap primitives only on request,
+     * instead of in advance, would involve changing only those methods that
+     * handle primitive arrays.
+     */
+    protected static interface ForEachIterator {
+        public boolean hasNext() throws JspTagException;
+        public Object next() throws JspTagException;
+    }
+
+    /*
+     * Simple implementation of ForEachIterator that adapts from
+     * an Iterator.  This is appropriate for cases where hasNext() and
+     * next() don't need to throw JspTagException.  Such cases are common.core.
+     */
+    protected class SimpleForEachIterator implements ForEachIterator {
+        private Iterator i;
+        public SimpleForEachIterator(Iterator i) {
+            this.i = i;
+        }
+        public boolean hasNext() {
+            return i.hasNext();
+        }
+        public Object next() {
+            return i.next();
+        }
+    }
+
+
+    //*********************************************************************
+    // ForEach-specifc state (protected)
+
+    protected ForEachIterator items;              // our 'digested' items
+    protected Object rawItems;                    // our 'raw' items
+
+
+    //*********************************************************************
+    // Iteration control methods (based on processed 'items' object)
+
+    protected boolean hasNext() throws JspTagException {
+        return items.hasNext();
+    }
+
+    protected Object next() throws JspTagException {
+        return items.next();
+    }
+
+
+    //*********************************************************************
+    // Tag logic and lifecycle management
+
+    // Releases any resources we may have (or inherit)
+    public void release() {
+        super.release();
+        items = null;
+        rawItems = null;
+    }
+
+    /*
+     * Produces and stores an appropriate ForEachIterator and performs
+     * some custom checks, then defers to the parent's implementation.
+     */
+    public int doStartTag() throws JspException {
+
+        // produce the right sort of ForEachIterator
+        if (rawItems != null) {
+            // extract an iterator over the 'items' we've got
+            items = supportedTypeForEachIterator(rawItems);
+        } else {
+            // no 'items', so use 'begin' and 'end'
+            items = beginEndForEachIterator();
+        }
+
+        // step must be 1 when ResultSet is passed in
+        if (rawItems instanceof ResultSet && step != 1)
+            throw new JspTagException(
+		Resources.getMessage("FOREACH_STEP_NO_RESULTSET"));
+
+        // now we're ready...
+        return super.doStartTag();
+    }
+
+
+    //*********************************************************************
+    // Private generation methods for the ForEachIterators we produce
+
+    /* Extracts a ForEachIterator given an object of a supported type. */
+    protected ForEachIterator supportedTypeForEachIterator(Object o)
+            throws JspTagException {
+
+        /*
+         * This is, of necessity, just a big, simple chain, matching in
+         * order.  Since we are passed on Object because of all the
+         * various types we support, we cannot rely on the language's
+         * mechanism for resolving overloaded methods.  (Method overloading
+         * resolves via early binding, so the type of the 'o' reference,
+         * not the type of the eventual value that 'o' references, is
+         * all that's available.)
+         *
+         * Currently, we 'match' on the object we have through an
+         * if/else chain that picks the first interface (or class match)
+         * found for an Object.
+         */
+
+        ForEachIterator items;
+
+        if (o instanceof Object[])
+            items = toForEachIterator((Object[]) o);
+        else if (o instanceof boolean[])
+            items = toForEachIterator((boolean[]) o);
+        else if (o instanceof byte[])
+            items = toForEachIterator((byte[]) o);
+        else if (o instanceof char[])
+            items = toForEachIterator((char[]) o);
+        else if (o instanceof short[])
+            items = toForEachIterator((short[]) o);
+        else if (o instanceof int[])
+            items = toForEachIterator((int[]) o);
+        else if (o instanceof long[])
+            items = toForEachIterator((long[]) o);
+        else if (o instanceof float[])
+            items = toForEachIterator((float[]) o);
+        else if (o instanceof double[])
+            items = toForEachIterator((double[]) o);
+        else if (o instanceof Collection)
+            items = toForEachIterator((Collection) o);
+        else if (o instanceof Iterator)
+            items = toForEachIterator((Iterator) o);
+        else if (o instanceof Enumeration)
+            items = toForEachIterator((Enumeration) o);
+        else if (o instanceof Map)
+            items = toForEachIterator((Map) o);
+        else if (o instanceof ResultSet)
+            items = toForEachIterator((ResultSet) o);
+        else if (o instanceof String)
+            items = toForEachIterator((String) o);
+        else
+            items = toForEachIterator(o);
+
+        return (items);
+    }
+
+    /*
+     * Creates a ForEachIterator of Integers from 'begin' to 'end'
+     * in support of cases where our tag handler isn't passed an
+     * explicit collection over which to iterate.
+     */
+    private ForEachIterator beginEndForEachIterator() {
+        /*
+         * To plug into existing support, we need to keep 'begin', 'end',
+         * and 'step' as they are.  So we'll simply create an Integer[]
+         * from 0 to 'end', inclusive, and let the existing implementation
+         * handle the subsetting and stepping operations.  (Other than
+         * localizing the cost of creating this Integer[] to the start
+         * of the operation instead of spreading it out over the lifetime
+         * of the iteration, this implementation isn't worse than one that
+         * created new Integers() as needed from next().  Such an adapter
+         * to ForEachIterator could easily be written but, like I said,
+         * wouldn't provide much benefit.)
+         */
+        Integer[] ia = new Integer[end + 1];
+        for (int i = 0; i <= end; i++)
+            ia[i] = new Integer(i);
+        return new SimpleForEachIterator(Arrays.asList(ia).iterator());
+    }
+
+
+    //*********************************************************************
+    // Private conversion methods to handle the various types we support
+
+    // catch-all method whose invocation currently signals a 'matching error'
+    protected ForEachIterator toForEachIterator(Object o)
+            throws JspTagException {
+        throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS"));
+    }
+
+    // returns an iterator over an Object array (via List)
+    protected ForEachIterator toForEachIterator(Object[] a) {
+        return new SimpleForEachIterator(Arrays.asList(a).iterator());
+    }
+
+    // returns an iterator over a boolean[] array, wrapping items in Boolean
+    protected ForEachIterator toForEachIterator(boolean[] a) {
+        Boolean[] wrapped = new Boolean[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Boolean(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a byte[] array, wrapping items in Byte
+    protected ForEachIterator toForEachIterator(byte[] a) {
+        Byte[] wrapped = new Byte[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Byte(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a char[] array, wrapping items in Character
+    protected ForEachIterator toForEachIterator(char[] a) {
+        Character[] wrapped = new Character[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Character(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a short[] array, wrapping items in Short
+    protected ForEachIterator toForEachIterator(short[] a) {
+        Short[] wrapped = new Short[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Short(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over an int[] array, wrapping items in Integer
+    protected ForEachIterator toForEachIterator(int[] a) {
+        Integer[] wrapped = new Integer[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Integer(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a long[] array, wrapping items in Long
+    protected ForEachIterator toForEachIterator(long[] a) {
+        Long[] wrapped = new Long[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Long(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a float[] array, wrapping items in Float
+    protected ForEachIterator toForEachIterator(float[] a) {
+        Float[] wrapped = new Float[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Float(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // returns an iterator over a double[] array, wrapping items in Double
+    protected ForEachIterator toForEachIterator(double[] a) {
+        Double[] wrapped = new Double[a.length];
+        for (int i = 0; i < a.length; i++)
+            wrapped[i] = new Double(a[i]);
+        return new SimpleForEachIterator(Arrays.asList(wrapped).iterator());
+    }
+
+    // retrieves an iterator from a Collection
+    protected ForEachIterator toForEachIterator(Collection c) {
+        return new SimpleForEachIterator(c.iterator());
+    }
+
+    // simply passes an Iterator through...
+    protected ForEachIterator toForEachIterator(Iterator i) {
+        return new SimpleForEachIterator(i);
+    }
+
+    // converts an Enumeration to an Iterator via a local adapter
+    protected ForEachIterator toForEachIterator(Enumeration e) {
+
+        // local adapter
+        class EnumerationAdapter implements ForEachIterator {
+            private Enumeration e;
+            public EnumerationAdapter(Enumeration e) {
+                this.e = e;
+            }
+            public boolean hasNext() {
+                return e.hasMoreElements();
+            }
+            public Object next() {
+                return e.nextElement();
+            }
+        }
+
+        return new EnumerationAdapter(e);
+    }
+
+    // retrieves an iterator over the Map.Entry items in a Map
+    protected ForEachIterator toForEachIterator(Map m) {
+        return new SimpleForEachIterator(m.entrySet().iterator());
+    }
+
+    // thinly wraps a ResultSet in an appropriate Iterator
+    protected ForEachIterator toForEachIterator(ResultSet rs)
+            throws JspTagException {
+
+        // local adapter
+        class ResultSetAdapter implements ForEachIterator {
+            private ResultSet rs;
+            public ResultSetAdapter(ResultSet rs) {
+                this.rs = rs;
+            }
+            public boolean hasNext() throws JspTagException {
+                try {
+                    return !(rs.isLast());      // dependent on JDBC 2.0
+                } catch (java.sql.SQLException ex) {
+                    throw new JspTagException(ex.getMessage());
+                }
+            }
+            public Object next() throws JspTagException {
+                try {
+                    rs.next();
+                    return rs;
+                } catch (java.sql.SQLException ex) {
+                    throw new JspTagException(ex.getMessage());
+                }
+            }
+        }
+
+        return new ResultSetAdapter(rs);
+    }
+
+    // tokenizes a String as a CSV and returns an iterator over it
+    protected ForEachIterator toForEachIterator(String s) {
+        StringTokenizer st = new StringTokenizer(s, ",");
+        return toForEachIterator(st);           // convert from Enumeration
+    }
+
+}
diff --git a/src/org/apache/taglibs/standard/tag/common/xml/SetTag.java b/src/org/apache/taglibs/standard/tag/common/core/ForTokensSupport.java
similarity index 65%
copy from src/org/apache/taglibs/standard/tag/common/xml/SetTag.java
copy to src/org/apache/taglibs/standard/tag/common/core/ForTokensSupport.java
index d98fc15..9cef79c 100644
--- a/src/org/apache/taglibs/standard/tag/common/xml/SetTag.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/ForTokensSupport.java
@@ -53,75 +53,75 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.xml;
+package org.apache.taglibs.standard.tag.common.core;
 
+import java.util.*;
+import javax.servlet.*;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
+import javax.servlet.jsp.jstl.core.IteratorTagSupport;
 
 /**
- * <p>Tag handler for &lt;set&gt; in JSTL's XML library.</p>
+ * <p>Support for tag handlers for &lt;forTokens&gt;, the tokenizing
+ * iteration tag in JSTL 1.0.  This class extends IteratorTagSupport and
+ * provides ForTokens-specific functionality.  The rtexprvalue and
+ * expression-evaluating libraries each have handlers that extend this
+ * class.</p>
  *
+ * @see javax.servlet.jsp.jstl.core.IteratorTagSupport
  * @author Shawn Bayern
  */
 
-public class SetTag extends TagSupport {
+public abstract class ForTokensSupport extends IteratorTagSupport {
 
     //*********************************************************************
-    // Internal state
+    // Implementation overview
+
+    /*
+     * This handler simply constructs a StringTokenizer based on its input
+     * and relays tokens to the iteration implementation that it inherits.
+     * The 'items' and 'delims' attributes are expected to be provided by
+     * a subtag (presumably in the rtexprvalue or expression-evaluating
+     * versions of the JSTL library).
+     */
 
-    private String select;                    // tag attribute
-    private String var;                       // tag attribute
 
     //*********************************************************************
-    // Construction and initialization
+    // ForEachTokens-specific state (protected)
 
-    /**
-     * Constructs a new handler.  As with TagSupport, subclasses should
-     * not provide other constructors and are expected to call the
-     * superclass constructor.
-     */
-    public SetTag() {
-        super();
-        init();
+    protected String items;                       // 'items' attribute
+    protected String delims;                      // 'delims' attribute
+    protected StringTokenizer st;                 // digested tokenizer
+
+
+    //*********************************************************************
+    // Iteration control methods
+
+    /* These just use the StringTokenizer we've created. */
+
+    protected boolean hasNext() throws JspTagException {
+        return st.hasMoreElements();
     }
 
-    // resets local state
-    private void init() {
-	select = null;
+    protected Object next() throws JspTagException {
+        return st.nextElement();
     }
 
 
     //*********************************************************************
     // Tag logic
 
-    // applies XPath expression from 'select' and stores the result in 'var'
+    // constructs our StringTokenizer and then defers to parent
     public int doStartTag() throws JspException {
-        try {
-	    XPathUtil xu = new XPathUtil(pageContext);
-	    Object result = 
-		xu.selectNodes(XPathUtil.getContext(this), select);
-	    pageContext.setAttribute(var, result);
-	    return SKIP_BODY;
-        } catch (org.saxpath.SAXPathException ex) {
-	    throw new JspTagException(ex.toString());
-        }
+        st = new StringTokenizer(items, delims);
+        return super.doStartTag();
     }
 
     // Releases any resources we may have (or inherit)
     public void release() {
         super.release();
-        init();
+        items = delims = null;
+        st = null;
     }
 
-
-    //*********************************************************************
-    // Attribute accessors
-
-    public void setSelect(String select) {
-	this.select = select;
-    }
-
-    public void setVar(String var) {
-	this.var = var;
-    }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/core/ImportSupport.java b/src/org/apache/taglibs/standard/tag/common/core/ImportSupport.java
new file mode 100644
index 0000000..10090c9
--- /dev/null
+++ b/src/org/apache/taglibs/standard/tag/common/core/ImportSupport.java
@@ -0,0 +1,487 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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.taglibs.standard.tag.common.core;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.servlet.jsp.*;
+import javax.servlet.jsp.tagext.*;
+import org.apache.taglibs.standard.resources.Resources;
+
+/**
+ * <p>Support for tag handlers for &lt;import&gt;, the general-purpose
+ * text-importing mechanism for JSTL 1.0.  The rtexprvalue and expression-
+ * evaluating libraries each have handlers that extend this class.</p>
+ *
+ * @author Shawn Bayern
+ */
+
+public abstract class ImportSupport extends BodyTagSupport 
+        implements TryCatchFinally {
+
+    //*********************************************************************
+    // Public constants
+    
+    /** <p>Valid characters in a scheme.</p>
+     *  <p>RFC 1738 says the following:</p>
+     *  <blockquote>
+     *   Scheme names consist of a sequence of characters. The lower
+     *   case letters "a"--"z", digits, and the characters plus ("+"),
+     *   period ("."), and hyphen ("-") are allowed. For resiliency,
+     *   programs interpreting URLs should treat upper case letters as
+     *   equivalent to lower case in scheme names (e.g., allow "HTTP" as
+     *   well as "http").
+     *  </blockquote>
+     * <p>We treat as absolute any URL that begins with such a scheme name,
+     * followed by a colon.</p>
+     */
+    public static final String VALID_SCHEME_CHARS =
+	"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-";
+
+    /** Default character encoding for response. */
+    public static final String DEFAULT_ENCODING = "ISO-8859-1";
+
+    //*********************************************************************
+    // Protected state
+
+    protected String url;                         // 'url' attribute
+    protected String context;			  // 'context' attribute
+    protected String charEncoding;                // 'charEncoding' attrib.
+
+    //*********************************************************************
+    // Private state (implementation details)
+
+    private String var;                 // 'var' attribute
+    private int scope;			// processed 'scope' attribute
+    private String varReader;           // 'varReader' attribute
+    private Reader r;	 		// exposed reader, if relevant
+    private Object oldVarReader;	// overwritten attribute
+    private boolean isAbsoluteUrl;	// is our URL absolute?
+    private String urlWithParams;	// URL with <param>-added text
+
+    //*********************************************************************
+    // Constructor and initialization
+
+    public ImportSupport() {
+	super();
+	init();
+    }
+
+    private void init() {
+	url = var = varReader = context = charEncoding = urlWithParams = null;
+        scope = PageContext.PAGE_SCOPE;
+    }
+
+
+    //*********************************************************************
+    // Tag logic
+
+    // determines what kind of import and variable exposure to perform 
+    public int doStartTag() throws JspException {
+	// Sanity check
+	if (context != null
+	        && (!context.startsWith("/") || !url.startsWith("/"))) {
+	    throw new JspTagException(
+		Resources.getMessage("IMPORT_BAD_RELATIVE"));
+	}
+
+	// Record whether our URL is absolute or relative
+	isAbsoluteUrl = isAbsoluteUrl();
+
+	try {
+	    // If we need to expose a Reader, we've got to do it right away
+	    if  (varReader != null) {
+	        r = acquireReader();
+	        Object oldVarReader =
+		    pageContext.getAttribute(varReader, scope);
+	        pageContext.setAttribute(varReader, r, scope);
+	    }
+	} catch (IOException ex) {
+	    throw new JspTagException(ex.toString());
+	} catch (ServletException ex) {
+	    throw new JspTagException(ex.toString());
+	}
+
+	return EVAL_BODY_INCLUDE;
+    }
+
+    // manages connections as necessary (creating or destroying)
+    public int doEndTag() throws JspException {
+        try {
+	    // If we didn't expose a Reader earlier...
+	    if (varReader == null) {
+	        // ... store it in 'var', if available ...
+	        if (var != null)
+	            pageContext.setAttribute(var, acquireString(), scope);
+                // ... or simply output it, if we have nowhere to expose it
+	        else
+	            pageContext.getOut().print(acquireString());
+	    }
+	    return EVAL_PAGE;
+        } catch (IOException ex) {
+	    throw new JspTagException(ex.toString());
+        } catch (ServletException ex) {
+	    throw new JspTagException(ex.toString());
+        }
+    }
+
+    // simply rethrows its exception
+    public void doCatch(Throwable t) throws Throwable {
+	throw t;
+    }
+
+    // cleans up if appropriate
+    public void doFinally() { 
+        try {
+	    // If we exposed a Reader in doStartTag(), close it.
+	    if (varReader != null) {
+		// 'r' can be null if an exception was thrown...
+	        if (r != null)
+		    r.close();
+	        if (oldVarReader != null)
+		    pageContext.setAttribute(varReader, oldVarReader, scope);
+		else
+		    pageContext.removeAttribute(varReader, scope);
+	    }
+        } catch (IOException ex) {
+	    // ignore it; close() failed, but there's nothing more we can do
+        }
+    }
+
+    // Releases any resources we may have (or inherit)
+    public void release() {
+	init();
+        super.release();
+    }
+
+    //*********************************************************************
+    // Tag attributes known at translation time
+
+    public void setVar(String var) {
+	this.var = var;
+    }
+
+    public void setVarReader(String varReader) {
+	this.varReader = varReader;
+    }
+
+    public void setScope(String scope) {
+	this.scope = Util.getScope(scope);
+    }
+
+
+    //*********************************************************************
+    // Collaboration with subtags
+
+    /**
+     * Adds a parameter to this tag's URL.  The intent is that the
+     * &lt;param&gt; subtag will call this to register URL parameters.
+     * Assumes that 'name' and 'value' are appropriately encoded and do
+     * not contain any meaningful metacharacters; in order words, escaping
+     * is the responsibility of the caller.
+     *
+     * @see ParamSupport
+     */
+    public void addParameter(String name, String value) {
+	// copy base url since we don't want to modify it
+	// (it might be an attribute)
+	if (urlWithParams == null)
+	    urlWithParams = url;
+
+	// append a '?' or '&' as appropriate, followed by name=value
+	boolean firstParameter = urlWithParams.indexOf('?') == -1;
+	if (firstParameter)
+	    urlWithParams += "?" + name + "=" + value;
+	else
+	    urlWithParams += "&" + name + "=" + value;
+    }
+
+    //*********************************************************************
+    // Actual URL importation logic
+
+    /*
+     * Overall strategy:  we have two entry points, acquireString() and
+     * acquireReader().  The latter passes data through unbuffered if
+     * possible (but note that it is not always possible -- specifically
+     * for cases where we must use the RequestDispatcher.  The remaining
+     * methods handle the common.core logic of loading either a URL or a local
+     * resource.
+     *
+     * We consider the 'natural' form of absolute URLs to be Readers and
+     * relative URLs to be Strings.  Thus, to avoid doing extra work,
+     * acquireString() and acquireReader() delegate to one another as
+     * appropriate.  (Perhaps I could have spelled things out more clearly,
+     * but I thought this implementation was instructive, not to mention
+     * somewhat cute...)
+     */
+
+    private String acquireString() throws IOException, JspTagException,
+	    ServletException {
+	if (isAbsoluteUrl) {
+	    // for absolute URLs, delegate to our peer
+	    BufferedReader r = new BufferedReader(acquireReader());
+	    StringBuffer sb = new StringBuffer();
+	    int i;
+
+	    // under JIT, testing seems to show this simple loop is as fast
+	    // as any of the alternatives
+	    while ((i = r.read()) != -1)
+	        sb.append((char)i);
+
+	    return sb.toString();
+	} else { 
+	    // handle relative URLs ourselves
+
+	    // URL is relative, so we must be an HTTP request
+	    if (!(pageContext.getRequest() instanceof HttpServletRequest
+		  && pageContext.getResponse() instanceof HttpServletResponse))
+		throw new JspTagException(
+		    Resources.getMessage("IMPORT_REL_WITHOUT_HTTP"));
+
+	    // retrieve an appropriate ServletContext
+	    ServletContext c = null;
+	    String targetUrl = targetUrl();
+	    if (context != null)
+	        c = pageContext.getServletContext().getContext(context);
+	    else {
+	        c = pageContext.getServletContext();
+
+		// normalize the URL if we have an HttpServletRequest
+		if (!targetUrl.startsWith("/")) {
+		    String sp = ((HttpServletRequest) 
+			pageContext.getRequest()).getServletPath();
+		    targetUrl = sp.substring(0, sp.lastIndexOf('/'))
+			+ '/' + targetUrl;
+		}
+	    }
+
+	    // from this context, get a dispatcher
+	    RequestDispatcher rd = c.getRequestDispatcher(targetUrl);
+
+	    // include the resource, using our custom wrapper
+	    ImportResponseWrapper irw = 
+		new ImportResponseWrapper(
+		    (HttpServletResponse) pageContext.getResponse());
+	    rd.include(pageContext.getRequest(), irw);
+
+	    // recover the response String from our wrapper
+	    return irw.getString();
+	}
+    }
+
+    private Reader acquireReader() throws IOException, ServletException,
+	    JspTagException {
+	if (!isAbsoluteUrl) {
+	    // for relative URLs, delegate to our peer
+	    return new StringReader(acquireString());
+	} else {
+	    try {
+	        // handle absolute URLs ourselves, using java.net.URL
+	        URL u = new URL(targetUrl());
+                URLConnection uc = u.openConnection();
+                InputStream i = uc.getInputStream();
+
+	        // okay, we've got a stream; encode it appropriately
+	        Reader r = null;
+	        if (charEncoding != null)
+		    r = new InputStreamReader(i, charEncoding);
+	        else {
+		    String responseAdvisoryEncoding = uc.getContentEncoding();
+		    if (responseAdvisoryEncoding != null)
+		        r = new InputStreamReader(i, responseAdvisoryEncoding);
+		    else
+		        r = new InputStreamReader(i, DEFAULT_ENCODING);
+	        }
+	        return r;
+	    } catch (IOException ex) {
+		throw new JspTagException(
+		    Resources.getMessage("IMPORT_IO", targetUrl())
+		    + " [" + ex + "]");
+	    }
+	}
+    }
+
+    /** Wraps responses to allow us to retrieve results as Strings. */
+    private class ImportResponseWrapper extends HttpServletResponseWrapper {
+
+	//************************************************************
+	// Overview
+
+	/*
+	 * We provide either a Writer or an OutputStream as requested.
+	 * We actually have a true Writer and an OutputStream backing
+	 * both, since we don't want to use a character encoding both
+	 * ways (Writer -> OutputStream -> Writer).  So we use no
+	 * encoding at all (as none is relevant) when the target resource
+	 * uses a Writer.  And we decode the OutputStream's bytes
+	 * using OUR tag's 'charEncoding' attribute, or ISO-8859-1
+	 * as the default.  We thus ignore setLocale() and setContentType()
+	 * in this wrapper.
+	 *
+	 * In other words, the target's asserted encoding is used
+	 * to convert from a Writer to an OutputStream, which is typically
+	 * the medium through with the target will communicate its
+	 * ultimate response.  Since we short-circuit that mechanism
+	 * and read the target's characters directly if they're offered
+	 * as such, we simply ignore the target's encoding assertion.
+	 */
+
+	//************************************************************
+	// Data
+
+	/** The Writer we convey. */
+	private StringWriter sw = new StringWriter();
+
+	/** A buffer, alternatively, to accumulate bytes. */
+	private ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+	/** A ServletOutputStream we convey, tied to this Writer. */
+	private ServletOutputStream sos = new ServletOutputStream() {
+	    public void write(int b) throws IOException {
+		bos.write(b);
+	    }
+	};
+
+	/** 'True' if getWriter() was called; false otherwise. */
+	private boolean isWriterUsed;
+
+	/** 'True if getOutputStream() was called; false otherwise. */
+	private boolean isStreamUsed;
+	
+	//************************************************************
+	// Constructor and methods
+
+	/** Constructs a new ImportResponseWrapper. */
+	public ImportResponseWrapper(HttpServletResponse response) {
+	    super(response);
+	}
+	
+	/** Returns a Writer designed to buffer the output. */
+	public PrintWriter getWriter() {
+	    if (isStreamUsed)
+		throw new IllegalStateException(
+		    Resources.getMessage("IMPORT_ILLEGAL_STREAM"));
+	    isWriterUsed = true;
+	    return new PrintWriter(sw);
+	}
+	
+	/** Returns a ServletOutputStream designed to buffer the output. */
+	public ServletOutputStream getOutputStream() {
+	    if (isWriterUsed)
+		throw new IllegalStateException(
+		    Resources.getMessage("IMPORT_ILLEGAL_WRITER"));
+	    isStreamUsed = true;
+	    return sos;
+	}
+
+	/** Has no effect. */
+	public void setContentType(String x) {
+	   // ignore
+	}
+
+	/** Has no effect. */
+	public void setLocale(Locale x) {
+	   // ignore
+	}
+
+	/** 
+	 * Retrieves the buffered output, using the containing tag's 
+	 * 'charEncoding' attribute, or the tag's default encoding,
+	 * <b>if necessary</b>.
+         */
+	// notsimpley toString() because we need to throw
+	// UnsupportedEncodingException
+	public String getString() throws UnsupportedEncodingException {
+	    if (isWriterUsed)
+		return sw.toString();
+	    else if (isStreamUsed) {
+		if (charEncoding != null)
+		    return bos.toString(charEncoding);
+		else
+		    return bos.toString(DEFAULT_ENCODING);
+	    } else
+		return "";		// target didn't write anything
+	}
+    }
+
+    /**
+     * Returns <tt>true</tt> if our current URL is absolute,
+     * <tt>false</tt> otherwise.
+     */
+    private boolean isAbsoluteUrl() {
+	// do a fast, simple check first
+	int colonPos;
+	if ((colonPos = url.indexOf(":")) == -1)
+	    return false;
+
+	// if we DO have a colon, make sure that every character
+	// leading up to it is a valid scheme character
+	for (int i = 0; i < colonPos; i++)
+	    if (VALID_SCHEME_CHARS.indexOf(url.charAt(i)) == -1)
+		return false;
+
+	// if so, we've got an absolute url
+	return true;
+    }
+
+    /** Returns our URL (potentially with parameters) */
+    private String targetUrl() {
+	return ((urlWithParams != null) ? urlWithParams : url);
+    }
+}
diff --git a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java b/src/org/apache/taglibs/standard/tag/common/core/NullAttributeException.java
similarity index 78%
copy from src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
copy to src/org/apache/taglibs/standard/tag/common/core/NullAttributeException.java
index d312013..c2870d0 100644
--- a/src/org/apache/taglibs/standard/tag/rt/xml/ParamTag.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/NullAttributeException.java
@@ -53,32 +53,28 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.xml;
+package org.apache.taglibs.standard.tag.common.core;
 
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.xml.*;
+import javax.servlet.jsp.JspTagException;
+import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * <p>A handler for &lt;param&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>NullAttributeException is a JspTagException that will be thrown
+ * by the JSTL RI handlers when a tag attribute illegally evaluates
+ * to 'null'.</p>
  *
  * @author Shawn Bayern
  */
 
-public class ParamTag extends ParamSupport {
+public class NullAttributeException extends JspTagException {
 
-    //*********************************************************************
-    // Accessor methods
-
-    // for tag attribute
-    public void setName(String name) throws JspTagException {
-        this.name = name;
-    }
-
-    // for tag attribute
-    public void setValue(String value) throws JspTagException {
-        this.value = value;
+    /**
+     * Constructs a NullAttributeException with appropriate information.
+     *
+     * @param tag The name of the tag in which the error occurred.
+     * @param att The attribute value for which the error occurred.
+     */
+    public NullAttributeException(String tag, String att) {
+	super(Resources.getMessage("TAG_NULL_ATTRIBUTE", att, tag));
     }
-
 }
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/org/apache/taglibs/standard/tag/common/core/OtherwiseTag.java
similarity index 85%
copy from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
copy to src/org/apache/taglibs/standard/tag/common/core/OtherwiseTag.java
index c4ef188..430c699 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/OtherwiseTag.java
@@ -53,22 +53,26 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
+package org.apache.taglibs.standard.tag.common.core;
 
+import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
+ * <p>Tag handler for &lt;otherwise&gt; in JSTL.</p>
  *
- * @author Jan Luehe
+ * @author Shawn Bayern
  */
-public class MessageFormatTEI extends TagExtraInfo {
 
-    /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+public class OtherwiseTag extends WhenTagSupport {
+
+    /*
+     * <otherwise> is just a <when> that always tries to evaluate its body
+     * if it has permission from its parent tag.
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
+
+    // Don't let the condition stop us... :-)
+    protected boolean condition() {
+        return true;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java b/src/org/apache/taglibs/standard/tag/common/core/ParamSupport.java
similarity index 80%
copy from src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
copy to src/org/apache/taglibs/standard/tag/common/core/ParamSupport.java
index 20ae875..b88965e 100644
--- a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/ParamSupport.java
@@ -53,7 +53,7 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.xml;
+package org.apache.taglibs.standard.tag.common.core;
 
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
@@ -61,20 +61,21 @@ import java.net.URLEncoder;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * <p>Support for tag handlers for &lt;param&gt;, the XML parameter
- * subtag for &lt;transformt&lt;.</p>
+ * <p>Support for tag handlers for &lt;param&gt;, the URL parameter
+ * subtag for &lt;import&gt; in JSTL 1.0.</p>
  *
- * @see TransformSupport
+ * @see ImportSupport
  * @author Shawn Bayern
  */
 
-public abstract class ParamSupport extends BodyTagSupport {
+public abstract class ParamSupport extends TagSupport {
 
     //*********************************************************************
     // Protected state
 
     protected String name;                       // 'name' attribute
     protected String value;                      // 'value' attribute
+    protected boolean encode;			 // 'encode' attribute
 
     //*********************************************************************
     // Constructor and initialization
@@ -86,29 +87,26 @@ public abstract class ParamSupport extends BodyTagSupport {
 
     private void init() {
 	name = value = null;
+	encode = true;				// encode by default
     }
 
 
     //*********************************************************************
     // Tag logic
 
-    // simply send our name and value to our parent <transform> tag
-    public int doEndTag() throws JspException {
-	Tag t = findAncestorWithClass(this, TransformSupport.class);
+    // simply send our name and value to our parent <import> tag
+    public int doStartTag() throws JspException {
+	Tag t = findAncestorWithClass(this, ImportSupport.class);
 	if (t == null)
 	    throw new JspTagException(
-		Resources.getMessage("PARAM_OUTSIDE_TRANSFORM"));
-	TransformSupport parent = (TransformSupport) t;
-
-	String value = this.value;
-	if (value == null) {
-            String bcs = getBodyContent().getString();
-            if (bcs == null || (value = bcs.trim()).equals(""))
-                throw new JspTagException(
-                    Resources.getMessage("PARAM_NO_VALUE"));
-	}
-	parent.setParameter(name, value);
-	return EVAL_PAGE;
+		Resources.getMessage("PARAM_OUTSIDE_IMPORT"));
+	ImportSupport parent = (ImportSupport) t;
+	if (encode) {
+	    parent.addParameter(
+		URLEncoder.encode(name), URLEncoder.encode(value));
+	} else
+	    parent.addParameter(name, value);
+	return SKIP_BODY;
     }
 
     // Releases any resources we may have (or inherit)
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java b/src/org/apache/taglibs/standard/tag/common/core/URLEncodeSupport.java
similarity index 75%
copy from src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
copy to src/org/apache/taglibs/standard/tag/common/core/URLEncodeSupport.java
index d6d3143..8aad371 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/URLEncodeSupport.java
@@ -53,48 +53,37 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.fmt;
+package org.apache.taglibs.standard.tag.common.core;
 
-import java.util.TimeZone;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.core.Util;
+import java.net.URLEncoder;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * Support for tag handlers for &lt;timezone&gt;, the timezone tag in
- * JSTL 1.0.
+ * <p>Support for tag handlers for &lt;urlEncode&gt;, the URL parameter
+ * encoding tag in JSTL 1.0.</p>
  *
- * @author Jan Luehe
+ * @author Shawn Bayern
  */
 
-public abstract class TimeZoneSupport extends BodyTagSupport {
-
-    //*********************************************************************
-    // Package-scoped constants
-
-    static final String TIMEZONE_ATTRIBUTE =
-	"javax.servlet.jsp.jsptl.i18n.timeZone";
-
+public abstract class URLEncodeSupport extends BodyTagSupport {
 
     //*********************************************************************
     // Protected state
 
     protected String value;                      // 'value' attribute
-  
 
     //*********************************************************************
     // Private state
 
-    private int scope;                           // 'scope' attribute
     private String var;                          // 'var' attribute
-    private TimeZone timeZone;
-
+    private int scope;				 // processed 'scope' attr
 
     //*********************************************************************
     // Constructor and initialization
 
-    public TimeZoneSupport() {
+    public URLEncodeSupport() {
 	super();
 	init();
     }
@@ -116,32 +105,34 @@ public abstract class TimeZoneSupport extends BodyTagSupport {
 	this.scope = Util.getScope(scope);
     }
 
-
-    //*********************************************************************
-    // Collaboration with subtags
-
-    public TimeZone getTimeZone() {
-	return timeZone;
-    }
-
-
     //*********************************************************************
     // Tag logic
 
-    public int doStartTag() throws JspException {
-	timeZone = TimeZone.getTimeZone(value);
-	return EVAL_BODY_INCLUDE;
-    }
-
+    // gets the right value, encodes it, and prints or stores it
     public int doEndTag() throws JspException {
-	if (var != null) {
-	    pageContext.setAttribute(var, timeZone, scope);	
-	} else if (getBodyContent() == null) {
-	    /*
-	     * If no 'var' attribute and no body, we store our time zone
-	     * in the javax.servlet.jsp.jsptl.i18n.timeZone scoped attribute
-	     */
-	    pageContext.setAttribute(TIMEZONE_ATTRIBUTE, timeZone, scope);
+	String operand = null;
+	// get operand from 'value' attribute or our body, as appropriate
+        if (value != null)
+	    operand = value;
+	else {
+	    String bcs = getBodyContent().getString();
+	    if (bcs == null || (operand = bcs.trim()).equals(""))
+		throw new JspTagException(
+		    Resources.getMessage("URLENCODE_NO_VALUE"));
+	}
+
+	// encode the input
+	String result = URLEncoder.encode(operand);
+
+	// store or print the output
+	if (var != null)
+	    pageContext.setAttribute(var, result, scope);
+	else {
+	    try {
+	        pageContext.getOut().print(result);
+	    } catch (java.io.IOException ex) {
+		throw new JspTagException(ex.getMessage());
+	    }
 	}
 
 	return EVAL_PAGE;
diff --git a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java b/src/org/apache/taglibs/standard/tag/common/core/Util.java
similarity index 79%
copy from src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
copy to src/org/apache/taglibs/standard/tag/common/core/Util.java
index f766759..1d4022d 100644
--- a/src/org/apache/taglibs/standard/tag/rt/fmt/MessageTag.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/Util.java
@@ -53,32 +53,31 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.rt.fmt;
+package org.apache.taglibs.standard.tag.common.core;
 
-import java.util.*;
 import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import org.apache.taglibs.standard.tag.common.fmt.*;
 
 /**
- * <p>A handler for &lt;message&gt; that supports rtexprvalue-based
- * attributes.</p>
+ * <p>Utilities in support of tag-handler classes.</p>
  *
  * @author Jan Luehe
  */
+public class Util {
 
-public class MessageTag extends MessageSupport {
+    private static final String REQUEST_STRING = "request";   
+    private static final String SESSION_STRING = "session";   
+    private static final String APPLICATION_STRING = "application"; 
 
-    //*********************************************************************
-    // Accessor methods
+    public static int getScope(String scope) {
+	int ret = PageContext.PAGE_SCOPE; // default
 
-    // for tag attribute
-    public void setKey(String key) throws JspTagException {
-        this.key = key;
-    }
+	if (REQUEST_STRING.equalsIgnoreCase(scope))
+	    ret = PageContext.REQUEST_SCOPE;
+	else if (SESSION_STRING.equalsIgnoreCase(scope))
+	    ret = PageContext.SESSION_SCOPE;
+	else if (APPLICATION_STRING.equalsIgnoreCase(scope))
+	    ret = PageContext.APPLICATION_SCOPE;
 
-    // for tag attribute
-    public void setBundle(ResourceBundle bundle) throws JspTagException {
-        this.bundle = bundle;
+	return ret;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java b/src/org/apache/taglibs/standard/tag/common/core/WhenTagSupport.java
similarity index 65%
copy from src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
copy to src/org/apache/taglibs/standard/tag/common/core/WhenTagSupport.java
index 20ae875..c7b3e40 100644
--- a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/core/WhenTagSupport.java
@@ -53,66 +53,56 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.xml;
+package org.apache.taglibs.standard.tag.common.core;
 
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import java.net.URLEncoder;
+import javax.servlet.jsp.jstl.core.ConditionalTagSupport;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * <p>Support for tag handlers for &lt;param&gt;, the XML parameter
- * subtag for &lt;transformt&lt;.</p>
+ * <p>WhenTagSupport is an abstract class that facilitates
+ * implementation of &lt;when&gt;-style tags in both the rtexprvalue
+ * and expression-evaluating libraries.  It also supports
+ * &lt;otherwise&gt;.</p>
+ *
+ * <p>In particular, this base class does the following:</p>
+ * 
+ * <ul>
+ *  <li> overrides ComparisonTagSupport.doStartTag() to implement the
+ *       appropriate semantics of subtags of &lt;choose&gt; </li>
+ * </ul>
  *
- * @see TransformSupport
  * @author Shawn Bayern
  */
-
-public abstract class ParamSupport extends BodyTagSupport {
-
-    //*********************************************************************
-    // Protected state
-
-    protected String name;                       // 'name' attribute
-    protected String value;                      // 'value' attribute
-
+public abstract class WhenTagSupport extends ConditionalTagSupport
+{
     //*********************************************************************
-    // Constructor and initialization
+    // Implementation of exclusive-conditional behavior
 
-    public ParamSupport() {
-	super();
-	init();
-    }
-
-    private void init() {
-	name = value = null;
-    }
+    /*
+     * Includes its body if condition() evalutes to true AND its parent
+     * ChooseTag wants it to do so.  The condition will not even be
+     * evaluated if ChooseTag instructs us not to run.
+     */
+    public int doStartTag() throws JspException {
 
+        Tag parent;
 
-    //*********************************************************************
-    // Tag logic
-
-    // simply send our name and value to our parent <transform> tag
-    public int doEndTag() throws JspException {
-	Tag t = findAncestorWithClass(this, TransformSupport.class);
-	if (t == null)
-	    throw new JspTagException(
-		Resources.getMessage("PARAM_OUTSIDE_TRANSFORM"));
-	TransformSupport parent = (TransformSupport) t;
+        // make sure we're contained properly
+        if (!((parent = getParent()) instanceof ChooseTag))
+            throw new JspTagException(
+		Resources.getMessage("WHEN_OUTSIDE_CHOOSE"));
 
-	String value = this.value;
-	if (value == null) {
-            String bcs = getBodyContent().getString();
-            if (bcs == null || (value = bcs.trim()).equals(""))
-                throw new JspTagException(
-                    Resources.getMessage("PARAM_NO_VALUE"));
-	}
-	parent.setParameter(name, value);
-	return EVAL_PAGE;
-    }
+        // make sure our parent wants us to continue
+        if (!((ChooseTag) parent).gainPermission())
+            return SKIP_BODY;                   // we've been reeled in
 
-    // Releases any resources we may have (or inherit)
-    public void release() {
-	init();
+        // handle conditional behavior
+        if (condition()) {
+            ((ChooseTag) parent).subtagSucceeded();
+            return EVAL_BODY_INCLUDE;
+        } else
+            return SKIP_BODY;
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/BundleSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/BundleSupport.java
index 637e621..002d845 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/BundleSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/BundleSupport.java
@@ -55,6 +55,7 @@
 
 package org.apache.taglibs.standard.tag.common.fmt;
 
+import java.io.IOException;
 import java.util.*;
 import javax.servlet.ServletContext;
 import javax.servlet.jsp.*;
@@ -75,21 +76,21 @@ public abstract class BundleSupport extends BodyTagSupport {
     // Public constants
 
     public static final String DEFAULT_BASENAME =
-	"javax.servlet.jsp.jsptl.i18n.basename";
+	"javax.servlet.jsp.jstl.i18n.basename";
 
 
     //*********************************************************************
     // Package-scoped constants
 
     static final String DEFAULT_EXCEPTION_BASENAME =
-	"javax.servlet.jsp.jsptl.i18n.exception.basename";
+	"javax.servlet.jsp.jstl.i18n.exception.basename";
 
 
     //*********************************************************************
     // Private constants
 
     private static final String FALLBACK_LOCALE =
-	"javax.servlet.jsp.jsptl.i18n.fallbackLocale";
+	"javax.servlet.jsp.jstl.i18n.fallbackLocale";
 
 
     //*********************************************************************
@@ -161,7 +162,7 @@ public abstract class BundleSupport extends BodyTagSupport {
 
     public int doStartTag() throws JspException {
 	bundle = getBundle(pageContext, basename);
-	return EVAL_BODY_INCLUDE;
+	return EVAL_BODY_BUFFERED;
     }
 
     public int doEndTag() throws JspException {
@@ -172,10 +173,16 @@ public abstract class BundleSupport extends BodyTagSupport {
 		pageContext.setAttribute(var, emptyResourceBundle, scope);
 	} else if (getBodyContent() == null) {
 	    /*
-	     * If no 'var' attribute and no body, we store our base name
-	     * in the javax.servlet.jsp.jsptl.i18n.basename scoped attribute
+	     * If no 'var' attribute and empty body, we store our base name
+	     * in the javax.servlet.jsp.jstl.i18n.basename scoped attribute
 	     */
 	    pageContext.setAttribute(DEFAULT_BASENAME, basename, scope);
+	} else {
+	    try {
+		pageContext.getOut().print(getBodyContent().getString());
+	    } catch (IOException ioe) {
+		throw new JspTagException(ioe.getMessage());
+	    }
 	}
 
 	return EVAL_PAGE;
@@ -196,7 +203,7 @@ public abstract class BundleSupport extends BodyTagSupport {
      * <p> The resource bundle's locale is determined as follows:
      *
      * <ul>
-     * <li> If the <tt>javax.servlet.jsp.jsptl.i18n.locale</tt> scoped 
+     * <li> If the <tt>javax.servlet.jsp.jstl.i18n.locale</tt> scoped 
      * attribute exists, use the locale stored as its value.
      *
      * <li> Otherwise, compare the client's preferred locales (in order of
@@ -204,7 +211,7 @@ public abstract class BundleSupport extends BodyTagSupport {
      * use the best matching locale.
      *
      * <li> If no match is found, use the fallback locale given by the
-     * <tt>javax.servlet.jsp.jsptl.i18n.fallbackLocale</tt> scoped attribute,
+     * <tt>javax.servlet.jsp.jstl.i18n.fallbackLocale</tt> scoped attribute,
      * if it exists.
      *
      * <li> Otherwise, use the runtime's default locale.
@@ -223,29 +230,35 @@ public abstract class BundleSupport extends BodyTagSupport {
 	ResourceBundle ret = null;
 	    
 	try {
+
 	    loc = (Locale)
 		pageContext.findAttribute(LocaleSupport.LOCALE_ATTRIBUTE);
 	    if (loc != null) {
+		// use resource bundle with specified locale
 		ret = ResourceBundle.getBundle(basename, loc);
 	    } else {
-		// use best matching client locale
+		// use resource bundle with best matching locale
 		ret = getBestMatch(pageContext, basename);
 		if (ret == null) {
-		    // use fallback locale
+		    // no match available, check if fallback locale exists
 		    String fallback = (String)
 			pageContext.findAttribute(FALLBACK_LOCALE);
 		    if (fallback == null)
 			fallback = pageContext.getServletContext().
 			    getInitParameter(FALLBACK_LOCALE);
 		    if (fallback != null) {
+			// use resource bundle with fallback locale
 			loc = LocaleSupport.parseLocale(fallback, null);
 			ret = ResourceBundle.getBundle(basename, loc);
 		    } else {
-			// use runtime's default locale
+			// use resource bundle with runtime's default locale
 			ret = ResourceBundle.getBundle(basename);
 		    }
 		}
 	    }
+
+	    LocaleSupport.setResponseLocale(pageContext, ret.getLocale());
+
 	} catch (MissingResourceException mre) {
 	    ServletContext sc = pageContext.getServletContext();
 	    sc.log(Resources.getMessage("MISSING_RESOURCE_BUNDLE", basename));
@@ -291,7 +304,8 @@ public abstract class BundleSupport extends BodyTagSupport {
      *
      * <p> The best matching locale is a client's preferred locale that matches
      * both the language and country components of an available locale for the
-     * given base name. This is considered an exact match.
+     * given base name. This is considered an exact match. An exact match may
+     * exist only if the client's preferred locale specifies a country.
      *
      * <p> If no exact match exists, the first client locale that matches 
      * (just) the language component of an available locale is used.
@@ -324,8 +338,9 @@ public abstract class BundleSupport extends BodyTagSupport {
 	    Locale pref = (Locale) enum.nextElement();
 	    ResourceBundle bundle = ResourceBundle.getBundle(basename, pref);
 	    Locale avail = bundle.getLocale();
-	    if (avail.getLanguage().equals(pref.getLanguage())) {
-		if (avail.getCountry().equals(pref.getCountry())) {
+	    if (pref.getLanguage().equals(avail.getLanguage())) {
+		if (pref.getCountry().length() > 0
+		    && pref.getCountry().equals(avail.getCountry())) {
 		    // exact match
 		    ret = bundle;
 		    break;
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java
index ac6654a..8feda3d 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java
@@ -144,9 +144,12 @@ public abstract class ExceptionSupport extends TagSupport {
 	}
 
 	try {
-	    pageContext.getOut().print(message);
-	    if (stackTrace)
-		value.printStackTrace(new PrintWriter(pageContext.getOut()));
+	    JspWriter writer = pageContext.getOut();
+	    writer.print(message);
+	    if (stackTrace) {
+		writer.newLine();
+		value.printStackTrace(new PrintWriter(writer));
+	    }
 	} catch (IOException ioe) {
 	    throw new JspTagException(ioe.getMessage());
 	}
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
index 3521fd3..6c50fb6 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/FormatDateSupport.java
@@ -100,6 +100,7 @@ public abstract class FormatDateSupport extends TagSupport {
     protected Object value;                      // 'value' attribute
     protected String pattern;                    // 'pattern' attribute
     protected TimeZone timeZone;                 // 'timeZone' attribute
+    protected Locale parseLocale;                // 'parseLocale' attribute
 
 
     //*********************************************************************
@@ -127,6 +128,7 @@ public abstract class FormatDateSupport extends TagSupport {
 	type = DATE_TYPE;
 	dateStyle = timeStyle = DateFormat.DEFAULT;
 	scope = PageContext.PAGE_SCOPE;
+	parseLocale = null;
     }
 
 
@@ -164,34 +166,41 @@ public abstract class FormatDateSupport extends TagSupport {
      * Formats the given date and time.
      */
     public int doEndTag() throws JspException {
-	DateFormat formatter = null;
-
-	Locale locale = LocaleSupport.getFormattingLocale(
-            pageContext,
-	    this,
-	    DateFormat.getAvailableLocales());
 
 	/*
 	 * If no date or time is given, the current date and time are used.
 	 * If the date and/or time is given as a string literal, it is first
 	 * parsed into an instance of java.util.Date according to the default
-	 * pattern of the page's locale.
+	 * pattern of the locale given via the 'parseLocale' attribute. If this
+	 * attribute is missing, the default ("en") locale is used.
 	 */
 	if (value == null) {
 	    value = new Date();
 	} else if (value instanceof String) {
-	    formatter = DateFormat.getDateInstance(dateStyle, locale);
+	    DateFormat parser = null;
+	    if (parseLocale != null)
+		parser = DateFormat.getDateInstance(DateFormat.DEFAULT,
+						    parseLocale);
+	    else
+		parser = DateFormat.getDateInstance(DateFormat.DEFAULT,
+						    Locale.ENGLISH);
 	    try {
-		value = formatter.parse((String) value);
+		value = parser.parse((String) value);
 	    } catch (ParseException pe) {
 		throw new JspTagException(pe.getMessage());
 	    }
 	}
 
+	// Create date formatter using page's locale
+	DateFormat formatter = null;
+	Locale locale = LocaleSupport.getFormattingLocale(
+            pageContext,
+	    this,
+	    true,
+	    DateFormat.getAvailableLocales());
 	switch (type) {
 	case DATE_TYPE:
-	    if (formatter == null)
-		formatter = DateFormat.getDateInstance(dateStyle, locale);
+	    formatter = DateFormat.getDateInstance(dateStyle, locale);
 	    break;
 	case TIME_TYPE:
 	    formatter = DateFormat.getTimeInstance(timeStyle, locale);
@@ -202,6 +211,7 @@ public abstract class FormatDateSupport extends TagSupport {
 	    break;
 	} // switch
 
+	// Apply pattern, if present
 	if (pattern != null) {
 	    try {
 		((SimpleDateFormat) formatter).applyPattern(pattern);
@@ -210,25 +220,9 @@ public abstract class FormatDateSupport extends TagSupport {
 	    }
 	}
 
-	if (timeZone == null) {
-	    Tag t = findAncestorWithClass(this, TimeZoneSupport.class);
-	    if (t != null) {
-		// use time zone from parent <timeZone> tag
-		TimeZoneSupport parent = (TimeZoneSupport) t;
-		timeZone = parent.getTimeZone();
-	    } else {
-		// get time zone from scoped attribute
-		timeZone = (TimeZone) pageContext.findAttribute(
-                    TimeZoneSupport.TIMEZONE_ATTRIBUTE);
-		if (timeZone == null) {
-		    String tz =
-			pageContext.getServletContext().getInitParameter(
-			    TimeZoneSupport.TIMEZONE_ATTRIBUTE);
-		    if (tz != null)
-			timeZone = TimeZone.getTimeZone(tz);
-		}
-	    }
-	}
+	// Set time zone
+	if (timeZone == null)
+	    timeZone = TimeZoneSupport.getTimeZone(pageContext, this);
 	if (timeZone != null)
 	    formatter.setTimeZone(timeZone);
 
@@ -253,9 +247,9 @@ public abstract class FormatDateSupport extends TagSupport {
 
 
     //*********************************************************************
-    // Private utility methods
+    // Package-scoped utility methods
 
-    private int getStyle(String style) {
+    static int getStyle(String style) {
 	int ret = DateFormat.DEFAULT;
 
 	if (SHORT_STYLE.equalsIgnoreCase(style))
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
index f8bd0f1..381d6b8 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/FormatNumberSupport.java
@@ -93,6 +93,7 @@ public abstract class FormatNumberSupport extends TagSupport {
 
     protected Object value;                      // 'value' attribute
     protected String pattern;                    // 'pattern' attribute
+    protected Locale parseLocale;                // 'parseLocale' attribute
 
 
     //*********************************************************************
@@ -116,6 +117,7 @@ public abstract class FormatNumberSupport extends TagSupport {
 	value = null;
 	type = NUMBER_TYPE;
 	scope = PageContext.PAGE_SCOPE;
+	parseLocale = null;
     }
 
 
@@ -142,31 +144,36 @@ public abstract class FormatNumberSupport extends TagSupport {
     // Tag logic
 
     public int doEndTag() throws JspException {
-	NumberFormat formatter = null;
-
-	Locale locale = LocaleSupport.getFormattingLocale(
-            pageContext,
-	    this,
-	    NumberFormat.getAvailableLocales());
 
 	/*
 	 * If the value given is a string literal, it is first parsed into an
 	 * instance of java.lang.Number according to the default pattern of
-	 * the page's locale.
+	 * the locale given via the 'parseLocale' attribute. If this attribute
+	 * is missing, the default ("en") locale is used.
 	 */
 	if (value instanceof String) {
-	    formatter = NumberFormat.getNumberInstance(locale);
+	    NumberFormat parser = null;
+	    if (parseLocale != null)
+		parser = NumberFormat.getNumberInstance(parseLocale);
+	    else
+		parser = NumberFormat.getNumberInstance(Locale.ENGLISH);
 	    try {
-		value = formatter.parse((String) value);
+		value = parser.parse((String) value);
 	    } catch (ParseException pe) {
 		throw new JspTagException(pe.getMessage());
 	    }
 	}
 
+	// Create number formatter using page's locale
+	NumberFormat formatter = null;
+	Locale locale = LocaleSupport.getFormattingLocale(
+            pageContext,
+	    this,
+	    true,
+	    NumberFormat.getAvailableLocales());
 	switch (type) {
 	case NUMBER_TYPE:
-	    if (formatter == null)
-		formatter = NumberFormat.getNumberInstance(locale);
+	    formatter = NumberFormat.getNumberInstance(locale);
 	    if (pattern != null) {
 		DecimalFormat df = (DecimalFormat) formatter;
 		df.applyPattern(pattern);
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/LocaleSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/LocaleSupport.java
index df5611f..28d5483 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/LocaleSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/LocaleSupport.java
@@ -56,6 +56,7 @@
 package org.apache.taglibs.standard.tag.common.fmt;
 
 import java.util.*;
+import javax.servlet.ServletResponse;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
 import org.apache.taglibs.standard.tag.common.core.Util;
@@ -74,9 +75,9 @@ public abstract class LocaleSupport extends TagSupport {
     // Package-scoped constants
 
     static final String LOCALE_ATTRIBUTE =
-	"javax.servlet.jsp.jsptl.i18n.locale";
-
+	"javax.servlet.jsp.jstl.i18n.locale";
 
+    
     //*********************************************************************
     // Private constants
 
@@ -123,8 +124,10 @@ public abstract class LocaleSupport extends TagSupport {
     // Tag logic
 
     public int doEndTag() throws JspException {
-	pageContext.setAttribute(LOCALE_ATTRIBUTE, parseLocale(value, variant),
-				 scope);
+	Locale locale = parseLocale(value, variant);
+	pageContext.setAttribute(LOCALE_ATTRIBUTE, locale, scope);
+	setResponseLocale(pageContext, locale);
+
 	return EVAL_PAGE;
     }
 
@@ -135,22 +138,98 @@ public abstract class LocaleSupport extends TagSupport {
 
 
     //*********************************************************************
+    // Public utility methods
+
+    /**
+     * Parses the given locale string into its language and (optionally)
+     * country components, and returns the corresponding
+     * <tt>java.util.Locale</tt> object.
+     *
+     * @param locale the locale string 
+     * @param variant the variant
+     *
+     * @return the corresponding <tt>java.util.Locale</tt> object
+     *
+     * @throws IllegalArgumentException if the given locale does not have a
+     * language component or has an empty country component
+     */
+    public static Locale parseLocale(String locale, String variant) {
+
+	Locale ret = null;
+	String language = locale;
+	String country = null;
+	int index = -1;
+
+	if (((index = locale.indexOf(HYPHEN)) > -1) ||
+	    ((index = locale.indexOf(UNDERSCORE)) > -1)) {
+	    language = locale.substring(0, index);
+	    country = locale.substring(index+1);
+	}
+
+	if ((language == null) || (language.length() == 0))
+	    throw new IllegalArgumentException(
+		Resources.getMessage("LOCALE_NO_LANGUAGE"));
+
+	if (country == null) {
+	    if (variant != null)
+		ret = new Locale(language, "", variant);
+	    else
+		ret = new Locale(language, "");
+	} else if (country.length() > 0) {
+	    if (variant != null)
+		ret = new Locale(language, country, variant);
+	    else
+		ret = new Locale(language, country);
+	} else
+	    throw new IllegalArgumentException(
+		Resources.getMessage("LOCALE_EMPTY_COUNTRY"));
+
+	return ret;
+    }
+
+
+    //*********************************************************************
     // Package-scoped utility methods
 
     /*
+     * Stores the given locale in the response object of the given page
+     * context, and stores the locale's associated charset in the
+     * javax.servlet.jsp.jstl.i18n.request.charset session attribute, which
+     * may be used by the <requestEncoding> action in a page invoked by a
+     * form included in the response to set the request charset to the same as
+     * the response charset (this makes it possible for the container to
+     * decode the form parameter values properly, since browsers typically
+     * encode form field values using the response's charset).
+     *
+     * @param pageContext the page context whose response object is assigned
+     * the given locale
+     * @param locale the response locale
+     */
+    static void setResponseLocale(PageContext pageContext, Locale locale) {
+	// set response locale
+	ServletResponse response = pageContext.getResponse();
+	response.setLocale(locale);
+	
+	// get response character encoding and store it in session attribute
+	pageContext.setAttribute(RequestEncodingSupport.REQUEST_CHAR_SET,
+				 response.getCharacterEncoding(),
+				 PageContext.SESSION_SCOPE);
+    }
+ 
+    /*
      * Determines the formatting locale to use with the given formatting
      * action in the given page.
      *
      * <p> The formatting locale is determined as follows:
      *
      * <ul>
-     * <li> If the <tt>javax.servlet.jsp.jsptl.i18n.locale</tt> scoped
+     * <li> If the <tt>javax.servlet.jsp.jstl.i18n.locale</tt> scoped
      * attribute exists, use its locale.
      *
      * <li> If the formatting action is enclosed within a <bundle> action, use
      * the locale of the parent bundle.
      *
-     * <li> If the <tt>javax.servlet.jsp.jsptl.i18n.basename</tt> scoped
+     * <li> If the <tt>javax.servlet.jsp.jstl.i18n.basename</tt> scoped
      * attribute exists, retrieve the default base name from it and use the
      * best matching locale for the resource bundle with this base name.
      *
@@ -163,14 +242,16 @@ public abstract class LocaleSupport extends TagSupport {
      *
      * @param pageContext the page containing the formatting action
      * @param fromTag the formatting action
+     * @param format <tt>true</tt> if the formatting action is of type
+     * <formatXXX> (as opposed to <parseXXX>), and <tt>false</tt> otherwise
      * @param avail the array of available locales
      *
      * @return the formatting locale to use
      */
     static Locale getFormattingLocale(PageContext pageContext,
 				      Tag fromTag,
+				      boolean format,
 				      Locale[] avail) {
-
 	Locale ret = (Locale) pageContext.findAttribute(LOCALE_ATTRIBUTE);
 	if (ret == null) {
 	    Tag t = findAncestorWithClass(fromTag, BundleSupport.class);
@@ -182,63 +263,25 @@ public abstract class LocaleSupport extends TagSupport {
 		ResourceBundle bundle = BundleSupport.getDefaultBundle(
                     pageContext, BundleSupport.DEFAULT_BASENAME);
 		if (bundle != null) {
+		    // use locale from bundle with default base name
 		    ret = bundle.getLocale();
 		} else {
+		    // get best matching formatting locale
 		    ret = getBestMatch(pageContext, avail);
 		    if (ret == null) {
-			// no match, use runtime's default locale
+			// no match available, use runtime's default locale
 			ret = Locale.getDefault();
 		    }
 		}
 	    }
 	}
 	
-	return ret;
-    }
-
-    /*
-     * Parses the given locale string into its language and (optionally)
-     * country components, and returns the corresponding
-     * <tt>java.util.Locale</tt> object.
-     *
-     * @param locale the locale string 
-     * @param variant the variant
-     *
-     * @return the corresponding <tt>java.util.Locale</tt> object
-     *
-     * @throws IllegalArgumentException if the given locale does not have a
-     * language component or has an empty country component
-     */
-    static Locale parseLocale(String locale, String variant) {
-
-	Locale ret = null;
-	String language = locale;
-	String country = null;
-	int index = -1;
-
-	if (((index = locale.indexOf(HYPHEN)) > -1) ||
-	    ((index = locale.indexOf(UNDERSCORE)) > -1)) {
-	    language = locale.substring(0, index);
-	    country = locale.substring(index+1);
-	}
-
-	if ((language == null) || (language.length() == 0))
-	    throw new IllegalArgumentException(
-		Resources.getMessage("LOCALE_NO_LANGUAGE"));
-
-	if (country == null) {
-	    if (variant != null)
-		ret = new Locale(language, "", variant);
-	    else
-		ret = new Locale(language, "");
-	} else if (country.length() > 0) {
-	    if (variant != null)
-		ret = new Locale(language, country, variant);
-	    else
-		ret = new Locale(language, country);
-	} else
-	    throw new IllegalArgumentException(
-		Resources.getMessage("LOCALE_EMPTY_COUNTRY"));
+	/*
+	 * If this is a <formatXXX> (as opposed to a <parseXXX>) action,
+	 * set the response locale
+	 */
+	if (format)
+	    LocaleSupport.setResponseLocale(pageContext, ret);
 
 	return ret;
     }
@@ -253,7 +296,8 @@ public abstract class LocaleSupport extends TagSupport {
      *
      * <p> The best matching locale is a client's preferred locale that matches
      * both the language and country components of an available formatting
-     * locale. This is considered an exact match.
+     * locale. This is considered an exact match. An exact match may exist only
+     * if the client's preferred locale specifies a country.
      *
      * <p> If no exact match exists, the first client locale that matches 
      * (just) the language component of an available locale is chosen.
@@ -277,7 +321,8 @@ public abstract class LocaleSupport extends TagSupport {
 	    Locale pref = (Locale) enum.nextElement();
 	    for (int i=0; i<avail.length; i++) {
 		if (pref.getLanguage().equals(avail[i].getLanguage())) {
-		    if (pref.getCountry().equals(avail[i].getCountry())) {
+		    if (pref.getCountry().length() > 0
+			&& pref.getCountry().equals(avail[i].getCountry())) {
 			// exact match
 			ret = avail[i];
 			foundExactMatch = true;	
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
index ddc8015..51d5c4d 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/MessageSupport.java
@@ -82,8 +82,9 @@ public abstract class MessageSupport extends BodyTagSupport {
     //*********************************************************************
     // Protected state
 
-    protected String key;                              // 'key' attribute
-    protected ResourceBundle bundle;                   // 'bundle' attribute
+    protected String key;                         // 'key' attribute
+    protected ResourceBundle bundle;              // 'bundle' attribute
+    protected Object[] messageArgs;               // 'messageArgs' attribute
 
 
     //*********************************************************************
@@ -106,12 +107,13 @@ public abstract class MessageSupport extends BodyTagSupport {
     private void init() {
 	key = var = null;
 	bundle = null;
+	messageArgs = null;
 	scope = PageContext.PAGE_SCOPE;
 	arguments.clear();
     }
 
 
-   //*********************************************************************
+    //*********************************************************************
     // Tag attributes known at translation time
 
     public void setVar(String var) {
@@ -165,11 +167,14 @@ public abstract class MessageSupport extends BodyTagSupport {
 		if (prefix != null)
 		    key = prefix + key;
 		message = bundle.getString(key);
-		if (!arguments.isEmpty()) {
+		// Perform parametric replacement if required
+		if (!arguments.isEmpty())
+		    messageArgs = arguments.toArray();
+		if (messageArgs != null) {
 		    MessageFormat formatter = new MessageFormat("");
 		    formatter.setLocale(bundle.getLocale());
 		    formatter.applyPattern(message);
-		    message = formatter.format(arguments.toArray());
+		    message = formatter.format(messageArgs);
 		}
 	    } catch (MissingResourceException mre) {
 		ServletContext sc = pageContext.getServletContext();
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/ParseDateSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/ParseDateSupport.java
index ff24afc..5fe7ec2 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/ParseDateSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/ParseDateSupport.java
@@ -77,12 +77,16 @@ public abstract class ParseDateSupport extends TagSupport {
 
     protected String value;                      // 'value' attribute
     protected String pattern;                    // 'pattern' attribute
+    protected TimeZone timeZone;                 // 'timeZone' attribute
+    protected Locale parseLocale;                // 'parseLocale' attribute
 
 
     //*********************************************************************
     // Private state
 
     private int type;                            // 'type' attribute
+    private int dateStyle;                       // 'dateStyle' attribute
+    private int timeStyle;                       // 'timeStyle' attribute
     private String var;                          // 'var' attribute
     private int scope;                           // 'scope' attribute
 
@@ -97,8 +101,11 @@ public abstract class ParseDateSupport extends TagSupport {
 
     private void init() {
 	value = pattern = var = null;
+	timeZone = null;
 	type = FormatDateSupport.DATE_TYPE;
+	dateStyle = timeStyle = DateFormat.DEFAULT;
 	scope = PageContext.PAGE_SCOPE;
+	parseLocale = null;
     }
 
 
@@ -112,6 +119,14 @@ public abstract class ParseDateSupport extends TagSupport {
 	    this.type = FormatDateSupport.DATETIME_TYPE;
     }
 
+    public void setDateStyle(String dateStyle) {
+        this.dateStyle = FormatDateSupport.getStyle(dateStyle);
+    }
+
+    public void setTimeStyle(String timeStyle) {
+        this.timeStyle = FormatDateSupport.getStyle(timeStyle);
+    }
+
     public void setVar(String var) {
         this.var = var;
     }
@@ -127,25 +142,32 @@ public abstract class ParseDateSupport extends TagSupport {
     public int doEndTag() throws JspException {
 	DateFormat formatter = null;
 
-	Locale locale = LocaleSupport.getFormattingLocale(
-            pageContext,
-	    this,
-	    DateFormat.getAvailableLocales());
+	/*
+	 * Use parsing locale specified via the 'parseLocale' attribute.
+	 * If no such attribute, use page's locale.
+	 */
+	Locale locale = parseLocale;
+	if (locale == null)
+	    locale = LocaleSupport.getFormattingLocale(
+                pageContext,
+	        this,
+		false,
+	        DateFormat.getAvailableLocales());
 
 	switch (type) {
 	case FormatDateSupport.DATE_TYPE:
-	    formatter = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);
+	    formatter = DateFormat.getDateInstance(dateStyle, locale);
 	    break;
 	case FormatDateSupport.TIME_TYPE:
-	    formatter = DateFormat.getTimeInstance(DateFormat.DEFAULT, locale);
+	    formatter = DateFormat.getTimeInstance(timeStyle, locale);
 	    break;
 	case FormatDateSupport.DATETIME_TYPE:
-	    formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT,
-						       DateFormat.DEFAULT,
+	    formatter = DateFormat.getDateTimeInstance(dateStyle, timeStyle,
 						       locale);
 	    break;
 	} // switch
 
+	// Apply pattern, if present
 	if (pattern != null) {
 	    try {
 		((SimpleDateFormat) formatter).applyPattern(pattern);
@@ -154,6 +176,12 @@ public abstract class ParseDateSupport extends TagSupport {
 	    }
 	}
 
+	// Set time zone
+	if (timeZone == null)
+	    timeZone = TimeZoneSupport.getTimeZone(pageContext, this);
+	if (timeZone != null)
+	    formatter.setTimeZone(timeZone);
+
 	Date parsed = null;
 	try {
 	    parsed = formatter.parse(value);
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/ParseNumberSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/ParseNumberSupport.java
index cffd2e0..ca0e565 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/ParseNumberSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/ParseNumberSupport.java
@@ -77,6 +77,7 @@ public abstract class ParseNumberSupport extends TagSupport {
 
     protected String value;                      // 'value' attribute
     protected String pattern;                    // 'pattern' attribute
+    protected Locale parseLocale;                // 'parseLocale' attribute
 
 
     //*********************************************************************
@@ -99,6 +100,7 @@ public abstract class ParseNumberSupport extends TagSupport {
 	value = pattern = var = null;
 	type = FormatNumberSupport.NUMBER_TYPE;
 	scope = PageContext.PAGE_SCOPE;
+	parseLocale = null;
     }
 
 
@@ -127,10 +129,17 @@ public abstract class ParseNumberSupport extends TagSupport {
     public int doEndTag() throws JspException {
 	NumberFormat formatter = null;
 
-	Locale locale = LocaleSupport.getFormattingLocale(
-            pageContext,
-	    this,
-	    NumberFormat.getAvailableLocales());
+	/*
+	 * Use parsing locale specified via the 'parseLocale' attribute.
+	 * If no such attribute, use page's locale.
+	 */
+	Locale locale = parseLocale;
+	if (locale == null)
+	    locale = LocaleSupport.getFormattingLocale(
+                pageContext,
+	        this,
+		false,
+	        NumberFormat.getAvailableLocales());
 
 	switch (type) {
 	case FormatNumberSupport.NUMBER_TYPE:
diff --git a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/RequestEncodingSupport.java
similarity index 75%
copy from src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
copy to src/org/apache/taglibs/standard/tag/common/fmt/RequestEncodingSupport.java
index 20ae875..13c82df 100644
--- a/src/org/apache/taglibs/standard/tag/common/xml/ParamSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/RequestEncodingSupport.java
@@ -53,61 +53,71 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.xml;
+package org.apache.taglibs.standard.tag.common.fmt;
 
+import java.io.*;
+import java.util.TimeZone;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
-import java.net.URLEncoder;
+import org.apache.taglibs.standard.tag.common.core.Util;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * <p>Support for tag handlers for &lt;param&gt;, the XML parameter
- * subtag for &lt;transformt&lt;.</p>
+ * Support for tag handlers for &lt;requestEncoding&gt;, the tag for setting
+ * the request character encoding in JSTL 1.0.
  *
- * @see TransformSupport
- * @author Shawn Bayern
+ * @author Jan Luehe
  */
 
-public abstract class ParamSupport extends BodyTagSupport {
+public abstract class RequestEncodingSupport extends TagSupport {
+
+    //*********************************************************************
+    // Package-scoped constants
+
+    static final String REQUEST_CHAR_SET =
+	"javax.servlet.jsp.jstl.i18n.request.charset";
+
 
     //*********************************************************************
     // Protected state
 
-    protected String name;                       // 'name' attribute
     protected String value;                      // 'value' attribute
+  
 
     //*********************************************************************
     // Constructor and initialization
 
-    public ParamSupport() {
+    public RequestEncodingSupport() {
 	super();
 	init();
     }
 
     private void init() {
-	name = value = null;
+	value = null;
     }
 
 
     //*********************************************************************
     // Tag logic
 
-    // simply send our name and value to our parent <transform> tag
     public int doEndTag() throws JspException {
-	Tag t = findAncestorWithClass(this, TransformSupport.class);
-	if (t == null)
-	    throw new JspTagException(
-		Resources.getMessage("PARAM_OUTSIDE_TRANSFORM"));
-	TransformSupport parent = (TransformSupport) t;
-
-	String value = this.value;
-	if (value == null) {
-            String bcs = getBodyContent().getString();
-            if (bcs == null || (value = bcs.trim()).equals(""))
-                throw new JspTagException(
-                    Resources.getMessage("PARAM_NO_VALUE"));
+	if ((value == null)
+	      && (pageContext.getRequest().getCharacterEncoding() == null)) {
+	    /*
+	     * no charset specified in tag or defined in request Content-Type
+	     * header
+	     */
+	    value = (String) pageContext.findAttribute(REQUEST_CHAR_SET);
 	}
-	parent.setParameter(name, value);
+
+	if (value != null) {
+	    try {
+		pageContext.getRequest().setCharacterEncoding(value);
+	    } catch (UnsupportedEncodingException uee) {
+		throw new JspTagException(uee.getMessage());
+	    }
+	}
+
 	return EVAL_PAGE;
     }
 
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java b/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
index d6d3143..4fc023b 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/fmt/TimeZoneSupport.java
@@ -55,6 +55,7 @@
 
 package org.apache.taglibs.standard.tag.common.fmt;
 
+import java.io.IOException;
 import java.util.TimeZone;
 import javax.servlet.jsp.*;
 import javax.servlet.jsp.tagext.*;
@@ -62,7 +63,7 @@ import org.apache.taglibs.standard.tag.common.core.Util;
 import org.apache.taglibs.standard.resources.Resources;
 
 /**
- * Support for tag handlers for &lt;timezone&gt;, the timezone tag in
+ * Support for tag handlers for &lt;timeZone&gt;, the time zone tag in
  * JSTL 1.0.
  *
  * @author Jan Luehe
@@ -74,7 +75,7 @@ public abstract class TimeZoneSupport extends BodyTagSupport {
     // Package-scoped constants
 
     static final String TIMEZONE_ATTRIBUTE =
-	"javax.servlet.jsp.jsptl.i18n.timeZone";
+	"javax.servlet.jsp.jstl.i18n.timeZone";
 
 
     //*********************************************************************
@@ -130,7 +131,7 @@ public abstract class TimeZoneSupport extends BodyTagSupport {
 
     public int doStartTag() throws JspException {
 	timeZone = TimeZone.getTimeZone(value);
-	return EVAL_BODY_INCLUDE;
+	return EVAL_BODY_BUFFERED;
     }
 
     public int doEndTag() throws JspException {
@@ -138,10 +139,16 @@ public abstract class TimeZoneSupport extends BodyTagSupport {
 	    pageContext.setAttribute(var, timeZone, scope);	
 	} else if (getBodyContent() == null) {
 	    /*
-	     * If no 'var' attribute and no body, we store our time zone
-	     * in the javax.servlet.jsp.jsptl.i18n.timeZone scoped attribute
+	     * If no 'var' attribute and empty body, we store our time zone
+	     * in the javax.servlet.jsp.jstl.i18n.timeZone scoped attribute
 	     */
 	    pageContext.setAttribute(TIMEZONE_ATTRIBUTE, timeZone, scope);
+	} else {
+	    try {
+		pageContext.getOut().print(getBodyContent().getString());
+	    } catch (IOException ioe) {
+		throw new JspTagException(ioe.getMessage());
+	    }
 	}
 
 	return EVAL_PAGE;
@@ -151,4 +158,50 @@ public abstract class TimeZoneSupport extends BodyTagSupport {
     public void release() {
 	init();
     }
+
+
+    //*********************************************************************
+    // Package-scoped utility methods
+
+    /*
+     * Returns the time zone.
+     *
+     * <p> If the given action is nested inside a &lt;timeZone&gt; tag,
+     * the time zone is taken from the enclosing &lt;timeZone&gt; tag.
+     *
+     * <p> Otherwise, the default time zone given by the
+     * <tt>javax.servlet.jsp.jstl.i18n.timeZone</tt> scoped attribute is used,
+     * which is searched in the page, request, session (if valid),
+     * and application scope(s) (in this order).
+     * 
+     * <p> If still not found, the JSP container's time zone is used.
+     *
+     * @param pageContext the page containing the action that requires the
+     * time zone
+     * @param fromTag the action that requires the time zone
+     *
+     * @return the time zone
+     */
+    static TimeZone getTimeZone(PageContext pageContext, Tag fromTag) {
+	TimeZone ret = null;
+
+	Tag t = findAncestorWithClass(fromTag, TimeZoneSupport.class);
+	if (t != null) {
+	    // use time zone from parent <timeZone> tag
+	    TimeZoneSupport parent = (TimeZoneSupport) t;
+	    ret = parent.getTimeZone();
+	} else {
+	    // get time zone from scoped attribute
+	    ret = (TimeZone)
+		pageContext.findAttribute(TIMEZONE_ATTRIBUTE);
+	    if (ret == null) {
+		String tz = pageContext.getServletContext().getInitParameter(
+		    TIMEZONE_ATTRIBUTE);
+		if (tz != null)
+		    ret = TimeZone.getTimeZone(tz);
+	    }
+	}
+
+	return ret;
+    }
 }
diff --git a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java b/src/org/apache/taglibs/standard/tag/common/sql/ColumnImpl.java
similarity index 70%
rename from src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
rename to src/org/apache/taglibs/standard/tag/common/sql/ColumnImpl.java
index c4ef188..ccd323a 100644
--- a/src/org/apache/taglibs/standard/tei/MessageFormatTEI.java
+++ b/src/org/apache/taglibs/standard/tag/common/sql/ColumnImpl.java
@@ -53,22 +53,54 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tei;
+package org.apache.taglibs.standard.tag.common.sql;
 
-import javax.servlet.jsp.tagext.*;
+import java.sql.*;
+import javax.servlet.jsp.jstl.sql.*;
 
 /**
- * An implementation of TagExtraInfo that implements validation for
- * &lt;messageFormat&gt; tag's attributes.
- *
- * @author Jan Luehe
+ * <p>This class encapsulates the value and all meta data for a column
+ * in a database query result. Instances of this class are returned
+ * as the result of the &lt;Query&gt; action.</p>
+ * 
+ * @author Hans Bergsten
  */
-public class MessageFormatTEI extends TagExtraInfo {
+
+public class ColumnImpl extends ColumnMetaDataImpl implements Column {
+    private Object value;
+    private ColumnMetaData md;
+
+    public ColumnImpl(Object value, ColumnMetaData md) {
+	this.value = value;
+	this.md = md;
+    }
+
+    /**
+     * Returns the column value, or null.
+     */
+    public Object getValue() {
+	return value;
+    }
+
+    /**
+     * Returns the default <code>String</code> representation of the
+     * column's value.
+     */
+    public String toString() {
+	String stringValue = null;
+	if (value == null) {
+	    stringValue = "";
+	}
+	else {
+	    stringValue = value.toString();
+	}
+	return stringValue;
+    }
 
     /**
-     * Validates the <tt>scope</tt> attribute of the &lt;messageFormat&gt; tag.
+     * Returns the ColumnMetaDataName
      */
-    public boolean isValid(TagData data) {
-	return Util.isValidScope(data);
+    public String getName() throws SQLException {
+        return md.getName();
     }
 }
diff --git a/src/org/apache/taglibs/standard/tag/common/sql/ColumnMetaDataImpl.java b/src/org/apache/taglibs/standard/tag/common/sql/ColumnMetaDataImpl.java
new file mode 100644
index 0000000..fde16c4
--- /dev/null
+++ b/src/org/apache/taglibs/standard/tag/common/sql/ColumnMetaDataImpl.java
@@ -0,0 +1,489 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 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", "Tomcat", 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.taglibs.standard.tag.common.sql;
+
+import java.sql.*;
+import javax.servlet.jsp.jstl.sql.ColumnMetaData;
+
+/**
+ * <p>This class encapsulates all meta data for a column in a database query 
+ * result. Instances of this class are used by the <code>ColumnImpl</code>
+ * instances representing specific column values.
+ * 
+ * <p>All methods may throw an SQLException. In this case, the exception 
+ * instance may be the same instance as thrown by the corresponding
+ * <code>java.sql.ResultSetMetaData</code> method when the Column instance
+ * was created.</p>
+ *
+ * <p>Note! Currently this class contains methods corresponding to all
+ * <code>ResultSetMetaData</code> methods. We may want to remove some of them
+ * that don't make much sense in the context where this class is used.</p>
+ *
+ * @author Hans Bergsten
+ */
+
+public class ColumnMetaDataImpl implements ColumnMetaData {
+
+    private boolean isAutoIncrement;
+    private SQLException isAutoIncrementException;
+    private boolean isCaseSensitive;
+    private SQLException isCaseSensitiveException;
+    private boolean isSearchable;
+    private SQLException isSearchableException;
+    private boolean isCurrency;
+    private SQLException isCurrencyException;
+    private int isNullable;
+    private SQLException isNullableException;
+    private boolean isSigned;
+    private SQLException isSignedException;
+    private int displaySize;
+    private SQLException displaySizeException;
+    private String label;
+    private SQLException labelException;
+    private String name;
+    private SQLException nameException;
+    private String schemaName;
+    private SQLException schemaNameException;
+    private int precision;
+    private SQLException precisionException;
+    private int scale;
+    private SQLException scaleException;
+    private String tableName;
+    private SQLException tableNameException;
+    private String catalogName;
+    private SQLException catalogNameException;
+    private int type;
+    private SQLException typeException;
+    private String typeName;
+    private SQLException typeNameException;
+    private boolean isReadOnly;
+    private SQLException isReadOnlyException;
+    private boolean isWritable;
+    private SQLException isWritableException;
+    private boolean isDefinitelyWritable;
+    private SQLException isDefinitelyWritableException;
+    private String className;
+    private SQLException classNameException;
+
+
+    /**
+     * Indicates whether the column is automatically numbered, 
+     * thus read-only.
+     */
+    public boolean isAutoIncrement() throws SQLException {
+	if (isAutoIncrementException != null) {
+	    throw isAutoIncrementException;
+	}
+	return isAutoIncrement;
+    }
+
+    public void setAutoIncrement(boolean value) {
+	isAutoIncrement = value;
+    }
+
+    public void setAutoIncrementException(SQLException e) {
+	isAutoIncrementException = e;
+    }
+
+    /**
+     * Indicates whether a column's case matters.
+     */
+    public boolean isCaseSensitive() throws SQLException {
+	if (isCaseSensitiveException != null) {
+	    throw isCaseSensitiveException;
+	}
+	return isCaseSensitive;
+    }
+
+    void setCaseSensitive(boolean value) {
+	isCaseSensitive = value;
+    }
+
+    void setCaseSensitiveException(SQLException e) {
+	isCaseSensitiveException = e;
+    }
+
+    /**
+     * Indicates whether the column can be used in a where clause.
+     */
+    public boolean isSearchable() throws SQLException {
+	if (isSearchableException != null) {
+	    throw isSearchableException;
+	}
+	return isSearchable;
+    }
+
+    void setSearchable(boolean value) {
+	isSearchable = value;
+    }
+
+    void setSearchableException(SQLException e) {
+	isSearchableException = e;
+    }
+
+    /**
+     * Indicates whether the column is a cash value.
+     */
+    public boolean isCurrency() throws SQLException {
+	if (isCurrencyException != null) {
+	    throw isCurrencyException;
+	}
+	return isCurrency;
+    }
+
+    void setCurrency(boolean value) {
+	isCurrency = value;
+    }
+
+    void setCurrencyException(SQLException e) {
+	isCurrencyException = e;
+    }
+
+    /**
+     * Indicates the nullability of values in the column.
+     */
+    public int isNullable() throws SQLException {
+	if (isNullableException != null) {
+	    throw isNullableException;
+	}
+	return isNullable;
+    }
+
+    void setNullable(int value) {
+	isNullable = value;
+    }
+
+    void setNullableException(SQLException e) {
+	isNullableException = e;
+    }
+
+    /**
+     * Indicates whether values in the column are signed numbers.
+     */
+    public boolean isSigned() throws SQLException {
+	if (isSignedException != null) {
+	    throw isSignedException;
+	}
+	return isSigned;
+    }
+
+    void setSigned(boolean value) {
+	isSigned = value;
+    }
+
+    void setSignedException(SQLException e) {
+	isSignedException = e;
+    }
+
+    /**
+     * Indicates the column's normal maximum width in characters.
+     */
+    public int getDisplaySize() throws SQLException {
+	if (displaySizeException != null) {
+	    throw displaySizeException;
+	}
+	return displaySize;
+    }
+
+    void setDisplaySize(int value) {
+	displaySize = value;
+    }
+
+    void setDisplaySizeException(SQLException e) {
+	displaySizeException = e;
+    }
+
+    /**
+     * Gets the column's suggested title for use in printouts and displays.
+     */
+    public String getLabel() throws SQLException {
+	if (labelException != null) {
+	    throw labelException;
+	}
+	return label;
+    }
+
+    void setLabel(String value) {
+	label = value;
+    }
+
+    void setLabelException(SQLException e) {
+	labelException = e;
+    }
+
+    /**
+     * Get the designated column's name.
+     */
+    public String getName() throws SQLException {
+	if (nameException != null) {
+	    throw nameException;
+	}
+	return name;
+    }
+
+    void setName(String value) {
+	name = value;
+    }
+
+    void setNameException(SQLException e) {
+	nameException = e;
+    }
+
+    /**
+     * Get the column's table's schema.
+     */
+    public String getSchemaName() throws SQLException {
+	if (schemaNameException != null) {
+	    throw schemaNameException;
+	}
+	return schemaName;
+    }
+
+    void setSchemaName(String value) {
+	schemaName = value;
+    }
+
+    void setSchemaNameException(SQLException e) {
+	schemaNameException = e;
+    }
+
+    /**
+     * Get the column's number of decimal digits.
+     */
+    public int getPrecision() throws SQLException {
+	if (precisionException != null) {
+	    throw precisionException;
+	}
+	return precision;
+    }
+
+    void setPrecision(int value) {
+	precision = value;
+    }
+
+    void setPrecisionException(SQLException e) {
+	precisionException = e;
+    }
+
+    /**
+     * Gets the column's number of digits to right of the decimal point.
+     */
+    public int getScale() throws SQLException {
+	if (scaleException != null) {
+	    throw scaleException;
+	}
+	return scale;
+    }
+
+    void setScale(int value) {
+	scale = value;
+    }
+
+    void setScaleException(SQLException e) {
+	scaleException = e;
+    }
+
+    /**
+     * Gets the designated column's table name.
+     */
+    public String getTableName() throws SQLException {
+	if (tableNameException != null) {
+	    throw tableNameException;
+	}
+	return tableName;
+    }
+
+    void setTableName(String value) {
+	tableName = value;
+    }
+
+    void setTableNameException(SQLException e) {
+	tableNameException = e;
+    }
+
+    /**
+     * Gets the column's table's catalog name.
+     */
+    public String getCatalogName() throws SQLException {
+	if (catalogNameException != null) {
+	    throw catalogNameException;
+	}
+	return catalogName;
+    }
+
+    void setCatalogName(String value) {
+	catalogName = value;
+    }
+
+    void setCatalogNameException(SQLException e) {
+	catalogNameException = e;
+    }
+
+    /**
+     * Retrieves the column's SQL type.
+     *
+     *<p>Fix: maybe this method should return a String instead, with
+     * the name of the type based on the java.sql.Types statics names.
+     */
+    public int getType() throws SQLException {
+	if (typeException != null) {
+	    throw typeException;
+	}
+	return type;
+    }
+
+    void setType(int value) {
+	type = value;
+    }
+
+    void setTypeException(SQLException e) {
+	typeException = e;
+    }
+
+    /**
+     * Retrieves the column's database-specific type name.
+     */
+    public String getTypeName() throws SQLException {
+	if (typeNameException != null) {
+	    throw typeNameException;
+	}
+	return typeName;
+    }
+
+    void setTypeName(String value) {
+	typeName = value;
+    }
+
+    void setTypeNameException(SQLException e) {
+	typeNameException = e;
+    }
+
+    /**
+     * Indicates whether the column is definitely not writable.
+     */
+    public boolean isReadOnly() throws SQLException {
+	if (isReadOnlyException != null) {
+	    throw isReadOnlyException;
+	}
+	return isReadOnly;
+    }
+
+    void setReadOnly(boolean value) {
+	isReadOnly = value;
+    }
+
+    void setReadOnlyException(SQLException e) {
+	isReadOnlyException = e;
+    }
+
+    /**
+     * Indicates whether it is possible for a write on the column to succeed.
+     */
+    public boolean isWritable() throws SQLException {
+	if (isWritableException != null) {
+	    throw isWritableException;
+	}
+	return isWritable;
+    }
+
+    void setWritable(boolean value) {
+	isWritable = value;
+    }
+
+    void setWritableException(SQLException e) {
+	isWritableException = e;
+    }
+
+    /**
+     * Indicates whether a write on the column will definitely succeed.
+     */
+    public boolean isDefinitelyWritable() throws SQLException {
+	if (isDefinitelyWritableException != null) {
+	    throw isDefinitelyWritableException;
+	}
+	return isDefinitelyWritable;
+    }
+
+    void setDefinitelyWritable(boolean value) {
+	isDefinitelyWritable = value;
+    }
+
+    void setDefinitelyWritableException(SQLException e) {
+	isDefinitelyWritableException = e;
+    }
+
+    /**
+     * Returns the fully-qualified name of the Java class whose instances 
+     * are manufactured if the method <code>ResultSet.getObject</code> is 
+     * called to retrieve a value from the column. 
+     * <code>ResultSet.getObject</code> may return a subclass of the class 
+     * returned by this method.
+     */
+    public String getClassName() throws SQLException {
+	if (classNameException != null) {
+	    throw classNameException;
+	}
+	return className;
+    }
+
+    void setClassName(String value) {
+	className = value;
+    }
+
+    void setClassNameException(SQLException e) {
+	classNameException = e;
+    }
+}
diff --git a/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java b/src/org/apache/taglibs/standard/tag/common/sql/DataSourceWrapper.java
similarity index 50%
copy from src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java
copy to src/org/apache/taglibs/standard/tag/common/sql/DataSourceWrapper.java
index ac6654a..4d711c6 100644
--- a/src/org/apache/taglibs/standard/tag/common/fmt/ExceptionSupport.java
+++ b/src/org/apache/taglibs/standard/tag/common/sql/DataSourceWrapper.java
@@ -53,109 +53,111 @@
  *
  */ 
 
-package org.apache.taglibs.standard.tag.common.fmt;
+package org.apache.taglibs.standard.tag.common.sql;
 
-import java.util.*;
-import java.text.*;
 import java.io.*;
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.*;
-import javax.servlet.jsp.tagext.*;
-import javax.servlet.jsp.jstl.fmt.LocalizableException;
-import org.apache.taglibs.standard.resources.Resources;
+import java.sql.*;
+import java.util.*;
+import javax.sql.*;
 
 /**
- * Support for tag handlers for &lt;exception&gt;, the exception formatting tag
- * in JSTL 1.0.
- *
- * @author Jan Luehe
+ * <p>A simple <code>DataSource</code> wrapper for the standard
+ * <code>DriverManager</code> class.
+ * 
+ * @author Hans Bergsten
  */
+public class DataSourceWrapper implements DataSource {
+    private static Map loadedDrivers = new HashMap();
 
-public abstract class ExceptionSupport extends TagSupport {
-
-    //*********************************************************************
-    // Protected state
-
-    protected Exception value;                       // 'value' attribute
-    protected ResourceBundle bundle;                 // 'bundle' attribute
-    protected boolean stackTrace;		     // 'stackTrace' attribute
-
+    private String driverClassName;
+    private String jdbcURL;
+    private String userName;
+    private String password;
 
-    //*********************************************************************
-    // Constructor and initialization
+    public void setDriverClassName(String driverClassName) 
+	throws ClassNotFoundException, InstantiationException, 
+	       IllegalAccessException {
 
-    public ExceptionSupport() {
-	super();
-	init();
+	this.driverClassName = driverClassName;
+	if (!isDriverLoaded(driverClassName)) {
+	    Class.forName(driverClassName).newInstance();
+	}
     }
 
-    private void init() {
-	value = null;
-	bundle = null;
-	stackTrace = false;
+    public void setJdbcURL(String jdbcURL) {
+	this.jdbcURL = jdbcURL;
     }
 
+    public void setUserName(String userName) {
+	this.userName = userName;
+    }
 
-    //*********************************************************************
-    // Tag logic
-
-    public int doStartTag() throws JspException {
-	Object[] messageArgs = null;
+    public void setPassword(String password) {
+	this.password = password;
+    }
 
-	if (value == null) {
-	    value = pageContext.getException();
-	    if (value == null)
-		throw new JspTagException(
-		    Resources.getMessage("EXCEPTION_NOT_IN_ERROR_PAGE"));
+    /**
+     * Returns a Connection using the DriverManager and all
+     * set properties.
+     */
+    public Connection getConnection() throws SQLException {
+	Connection conn = null;
+	if (userName != null) {
+	    conn = DriverManager.getConnection(jdbcURL, userName, password);
 	}
-
-	if (bundle == null) {
-	    Tag t = findAncestorWithClass(this, BundleSupport.class);
-	    if (t != null) {
-		// use resource bundle from parent <bundle> tag
-		BundleSupport parent = (BundleSupport) t;
-		bundle = parent.getBundle();
-	    } else {
-		bundle = BundleSupport.getDefaultBundle(
-                    pageContext, BundleSupport.DEFAULT_EXCEPTION_BASENAME);
-	    }
+	else {
+	    conn = DriverManager.getConnection(jdbcURL);
 	}
+	return conn;
+    }
 
-	String key = value.getClass().getName();
-	if (value instanceof LocalizableException) {
-	    LocalizableException le = (LocalizableException) value;
-	    if (le.getMessageKey() != null)
-		key = le.getMessageKey();
-	    messageArgs = le.getMessageArgs();
-	}
+    /**
+     * Always throws a SQLException. Username and password are set
+     * in the constructor and can not be changed.
+     */
+    public Connection getConnection(String username, String password) 
+            throws SQLException {
+        throw new SQLException("Not supported");
+    }
+    
+    /**
+     * Always throws a SQLException. Not supported.
+     */
+    public int getLoginTimeout() throws SQLException {
+        throw new SQLException("Not supported");
+    }
+    
+    /**
+     * Always throws a SQLException. Not supported.
+     */
+    public PrintWriter getLogWriter() throws SQLException {
+        throw new SQLException("Not supported");
+    }
+    
+    /**
+     * Always throws a SQLException. Not supported.
+     */
+    public void setLoginTimeout(int seconds) throws SQLException {
+        throw new SQLException("Not supported");
+    }
+    
+    /**
+     * Always throws a SQLException. Not supported.
+     */
+    public synchronized void setLogWriter(PrintWriter out) throws SQLException {
+        throw new SQLException("Not supported");
+    }
 
-	String message = value.getLocalizedMessage();
-	if (bundle != null) {
-	    try {
-		message = bundle.getString(key);
-		if (messageArgs != null) {
-		    MessageFormat formatter = new MessageFormat("");
-		    formatter.setLocale(bundle.getLocale());
-		    formatter.applyPattern(message);
-		    message = formatter.format(messageArgs);
-		}
-	    } catch (MissingResourceException mre) {
-	    }
+    /**
+     * Returns true if the specified driver class has already been
+     * loaded.
+     */
+    private boolean isDriverLoaded(String driverClassName) {
+	if (loadedDrivers.get(driverClassName) != null) {
+	    return true;
 	}
-
-	try {
-	    pageContext.getOut().print(message);
-	    if (stackTrace)
-		value.printStackTrace(new PrintWriter(pageContext.getOut()));
-	} catch (IOException ioe) {
-	    throw new JspTagException(ioe.getMessage());
+	else {
... 5403 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org