Copying over old 3.0.4 branch to new root tapestry3 svn path.


git-svn-id: https://svn.apache.org/repos/asf/tapestry/tapestry3/trunk@670581 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/3.0.4/.checkstyle b/3.0.4/.checkstyle
new file mode 100644
index 0000000..2e8139b
--- /dev/null
+++ b/3.0.4/.checkstyle
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fileset-config file-format-version="1.2.0" simple-config="true">
+    <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false">
+        <file-match-pattern match-pattern="." include-pattern="true"/>
+    </fileset>
+</fileset-config>
diff --git a/3.0.4/.classpath b/3.0.4/.classpath
new file mode 100644
index 0000000..8842b6c
--- /dev/null
+++ b/3.0.4/.classpath
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="lib" path="config"/>
+	<classpathentry kind="src" path="framework/src"/>
+	<classpathentry kind="src" path="contrib/src"/>
+	<classpathentry kind="src" path="junit/src"/>
+	<classpathentry kind="src" path="examples/VlibBeans/src"/>
+	<classpathentry kind="src" path="examples/Vlib/src"/>
+	<classpathentry kind="src" path="examples/Workbench/src"/>
+	<classpathentry kind="src" path="examples/wap/src"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/jakarta-oro-2.0.6.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/commons-logging-1.0.2.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/commons-lang-1.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/bsf-2.3.0.jar"/>
+	<classpathentry kind="lib" path="ext-dist/junit.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/commons-beanutils-1.6.1.jar"/>
+	<classpathentry kind="lib" path="examples/Workbench/lib/jCharts-0.6.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/commons-collections-2.1.jar"/>
+	<classpathentry kind="lib" path="lib/ext/commons-fileupload-1.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/javassist-2.5.1.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ext/commons-digester-1.5.jar"/>
+	<classpathentry kind="lib" path="lib/ext/commons-codec-1.2.jar"/>
+	<classpathentry kind="lib" path="lib/j2ee/geronimo-ejb.jar"/>
+	<classpathentry kind="lib" path="lib/j2ee/jsp-api.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/j2ee/servlet-api.jar"/>
+	<classpathentry kind="lib" path="lib/runtime/log4j-1.2.6.jar"/>
+	<classpathentry kind="lib" path="ext-dist/jdom-1.0.jar"/>
+	<classpathentry kind="lib" path="lib/ext/ognl-2.6.7.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre-1.4"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/3.0.4/.cvsignore b/3.0.4/.cvsignore
new file mode 100644
index 0000000..ce9ad11
--- /dev/null
+++ b/3.0.4/.cvsignore
@@ -0,0 +1,13 @@
+bin

+private

+dist

+.temp

+target

+maven.log

+velocity.log

+*.out

+build

+${destdir}

+cachedir

+ext-package

+.settings

diff --git a/3.0.4/.project b/3.0.4/.project
new file mode 100644
index 0000000..54808f1
--- /dev/null
+++ b/3.0.4/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>Tapestry</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+	</natures>

+</projectDescription>

diff --git a/3.0.4/KEYS b/3.0.4/KEYS
new file mode 100644
index 0000000..b61702f
--- /dev/null
+++ b/3.0.4/KEYS
@@ -0,0 +1,115 @@
+This file contains the PGP keys of various developers.
+
+Users: pgp < KEYS
+       gpg --import KEYS
+Developers: 
+        pgp -kxa <your name> and append it to this file.
+        (pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
+        (gpg --list-sigs <your name>
+             && gpg --armor --export <your name>) >> this file.
+
+
+
+
+
+pub  1024D/2DDB17D0 2003-06-01 Howard M. Lewis Ship <hlship@apache.org>
+sig 3       2DDB17D0 2003-06-01   Howard M. Lewis Ship <hlship@apache.org>
+sub  1024g/7837388C 2003-06-01
+sig         2DDB17D0 2003-06-01   Howard M. Lewis Ship <hlship@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.2 (Cygwin)
+
+mQGiBD7aKV8RBACd181gddOl6a2AM57Ae1r14d3u2TOXDvZRICl4wH8TjJO/+M/4
+K27+3X2ENLo3zuI5aVnDo1png/KVVx7PzRdyru1O4D3TDNLKKahmN/eAW2MvnLBK
+SCaEz+FjSt16M+wGoOkd0M2JMIXGD44r6k74e7lCvj/wnsBVaIcB/y7HtwCglqYe
+DtMa0lmDAZW0vZ5G2zqL/vkD/0cnfWXyL+a+GobHzXKc245UmPpfSzCPqjYFyr+W
+UjU4qQrmod+CoTRADmu+qdeHJSX9Bs0y6HKSFYalEOfl7m90xvH+pdKvdPOsu2LU
+SMH0cpmZHt7NJmXOUeaaTNJ2fcO+exRhqiijSREgBDiVO8YsBTHXiNxTaJREHIeN
+0RRiA/9fw8GzIN6Nez8ikKHanvuKojNE68GfIlJqCrJBNB2/rPBIQgCnKuwjwQpX
+73EalqEfQiIAI/Ekq6TZ9rzoxICaO0CdMDCGuStdL74Vq7XKQvX5ifuQzXgZ1jdf
+3CAZo5vrMDc5b6p+Mt8Gw/uSjK+Sl8tg6PkC1pTcxjCbAm1T8LQoSG93YXJkIE0u
+IExld2lzIFNoaXAgPGhsc2hpcEBhcGFjaGUub3JnPohbBBMRAgAbBQI+2ilfBgsJ
+CAcDAgMVAgMDFgIBAh4BAheAAAoJEIa00not2xfQIjYAn2V6U4zBa5FT0gPSJgCt
+6ZZBBLNxAJ9sPcjK2OS8TL5OvbN9J5BUuReNKbkBDQQ+2ilhEAQAu5TtBmHvKB1T
+7xrTMBJxEmdfxZodrCqR11tZOqRrvT/RcLLZbDQ3ntscZNoiAxoGrGv1vpeO4FwD
+t5T2G93Hza7aYuVV3ucNMAiWUCnkXzLVvVxZ9xK1hnhKDkeQyIyyIjaoiRyq19bi
+2j0NBaG2QNMQpcDSkwy1vHO2SPW8GNMAAwUD/Atf6puXOZn7vj0My580uy5PczQh
+f6EazspE7hqTxuTR8Um6mznAlaFiEjXoprTk6vBpiRzihYHXWhdsOTcLzxVxK+TW
+7Ve2OJGc8jwEWWXfXImorvvlH3HTadV0d63+Sw4oLgO9etUamlM3vVOYavBCfC81
+FVh4vOvy4cKKizOFiEYEGBECAAYFAj7aKWEACgkQhrTSei3bF9CZowCdEiyvPimY
+D3G2EeSaq1C4qb2iqREAn2qZk6Dlf4XrWJiZG+27KvdyaA5N
+=p680
+-----END PGP PUBLIC KEY BLOCK-----
+pub   1024D/FD6C524C 2005-03-29
+uid                  Paul Ferraro <pferraro@apache.org>
+sig 3        FD6C524C 2005-03-29  Paul Ferraro <pferraro@apache.org>
+sub   2048g/B89AF99B 2005-03-29
+sig          FD6C524C 2005-03-29  Paul Ferraro <pferraro@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.0 (Cygwin)
+
+mQGiBEJInnIRBADLh6hjNRNPUDshPXl4iuzmVU2tGYfjYfOoAitU6AtAl5astuwe
+0EprzpTXrf1axd84CWlWmx/iI244UhAljEbHoZ5kI/MMJm6P0DoQRIWj3nvtdbJw
+jlgjwij1gWb3c3o3GwIwZx5onB252Np9whhG33lTmq3gVnPi528DxXpQwwCg71l8
+ZQfCR4bIGrmptM7iF2HpdJ0D/Avik9oyxvKqb8rvM72/UhP6WPl/W/6PGe7zDdzM
+9zAUdkXDmSRD4pHS2lOARHGIT3dZ/L2/Hwgc2U9IaWGnxr64WM8VqyKLF8Fx89/5
+NjvwDAwXWTdyDojvg4TamVF4xycQhSLtAyWxXp983OPp4eBGjMlAGV7SH9RtaNGw
+bQfDBACRIT3QXGQPN4ZA9osVvudo3v1OLV7whbvyPVZoRz85dtSNrDquXGmsmsLm
+g/qBMHV++QiNKF0zCR3LgSKMgBXNLKiYrKZAP+ITXn1PWDZDqHGrst58qJ1AcAe3
+JnPsqqMKzY50bd1P7lQjq9ZQM0FL29imwjiM4YhdZvT/r+PQFrQiUGF1bCBGZXJy
+YXJvIDxwZmVycmFyb0BhcGFjaGUub3JnPoheBBMRAgAeBQJCSJ5yAhsDBgsJCAcD
+AgMVAgMDFgIBAh4BAheAAAoJENoTCsn9bFJM9l0AoL+sj2ysb0pdwEHlIejG54ZW
+GV9vAKDU3+oVU0xxnd+R9yWkG7Ys32i5+LkCDQRCSJ6hEAgAx+a5d4krGWo+BFsC
+EeNDPI/3anJhvACuMwoYbWpResZH1G39UA9mUG/kI2A7Gbm96DGiPpsB9KKJWBfE
+SuXEBLjp8ukXZvrmS8NLrH0bLajptTrjlq8P49AK6C1CFPZRaoq+yd/zA+9ZlM6z
+gPFypK/WoTCQtng0ej4YGA/KEZEIE4FwU+2i9UieVcWJOarggStibPclfY+wZy6p
+YPmkHcUtKTjDTzkdileT11DahACDPAnfjVMvAb3JrkdAqTEapEMkB8TpgZx9NZKB
+yqilxfxDGKAL079exx8ats5XowBQ4/arisHc9AA26MwtoqJowsqpMUPutJ4Rskw8
+59KQCwADBgf/ZliG2GwY7SnE5jujECBGSLJLFb5CuZc/M+RyjqlhnMQsQYmj9GZT
+92I5r5jlydB3tKZ//pkA/YUqHPgKNR4VFO46SAO1QFtau3Sd6Plz82v4KVBt4HUr
+P3w4xl5p1NY/T03qij3Mn/ly6Gkn+b1CmJBBa0+ebaT63bgpRa5MaazWGf+WXx/Y
+BoBBTOOSkKrLJ6YlTQOzIKlknSlQvEuLVdAY+MNetYXpkjW0cjI0Yt9f+obSrsI6
+SeiqO57xRBK+aeDcQMVLrzAdVNkV4UMiLjLc/quLTJ3ShbO8t9RU2JIBZrppplog
+LFSMO33g6znCNXXsmzeMVHxKyrAnDzDI1ohJBBgRAgAJBQJCSJ6hAhsMAAoJENoT
+Csn9bFJMUZEAn2VCJH3MjoV6rVAt5Df892iX0zsMAJ96iBYmm/1KV2NaaqWb7XjY
+YBlFKw==
+=xwwi
+-----END PGP PUBLIC KEY BLOCK-----
+pub   1024D/3E6D26D2 2006-01-26
+uid                  Jesse Kuhnert <jkuhnert@apache.org>
+sig 3        3E6D26D2 2006-01-26  Jesse Kuhnert <jkuhnert@apache.org>
+sub   2048g/BFF7F76A 2006-01-26
+sig          3E6D26D2 2006-01-26  Jesse Kuhnert <jkuhnert@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEPYLjoRBACa783DbiuMCc1LlbRDHbD8SYXz6zMMS3zSZ698yk91HG15mejQ
+hLXjenuH7PWuh83m5YyqRz3s2tuEROng5iXwn+A6iVJwnHNNMAA9l+Jy0Z9u5eFN
+29Dwd37GW0yF3tfivN/Y6b2fJzsQh6mTIwuSp6wfLtIvnBwXcDwsIQYgvwCgqX8w
+x3+fLdhPUj5VkYh9CqtBF60EAILCIaiUwk1TH6nFCfPg+UJQLLXpD6YaPItlkEdO
+OIM6P8mfYNraO8O2ZnZtdATRImaOIQ5pSbbQ44d2rGEwr7johU3B8KWb0r0RwLEE
+KAksAgdVZQ4HH9HIL3OYH7b2ED4KyhHG3TTQBmz7h6k4zNgTW3I5GHRVmoM1+x2q
++BY2A/9Z24Oixhq2hbHPbl3YceYJE8W9l4hV+e/a9jP0G4WcvOGxMpj7yO7I/eaf
+ARCr+TjCHEMBEaZXjXe3w1F8iHyf3w5XMVbYCbhPRYUle0Z+690Lz2+hPwXOXFI5
+yVxK2J0xDrQ24CjMAZxdOlzxscIEvPkif2FlIlcElaCaw8NsbLQjSmVzc2UgS3Vo
+bmVydCA8amt1aG5lcnRAYXBhY2hlLm9yZz6IYAQTEQIAIAUCQ9guOgIbAwYLCQgH
+AwIEFQIIAwQWAgMBAh4BAheAAAoJEMB0lGc+bSbShlAAmwe4+Uexyc35UaNWAVhz
+6kiiEQbeAJ97yOFs2rpg5D3jLjK+Oowp6nvKmrkCDQRD2C5EEAgA6SBt6HRmAT0h
+hZJYmmjQZZ4FTxHHxwoIBxbnB/UcrtmavPMTSmaTwmq/EtbCWk4L/IonDXTLtLMa
+Q2UhXrBUIuK2mzOMQ4D96Dcga/M/PiR8Gtnr8t0jDimah/6IVDyKU3cyJ5LfXxP2
+/uIOcAdbwXmR/Pq64SRQx6ub3kkU/5gDGf/B8OmYTRPT+MsfkrS9V2Uo6QDx2nFq
+zel7a3KD4g4s+wybTMSC1W3pYGUeyUgRRMOIJ3MG0zJi//zkohj4QdSgnZvNciwk
+Cud0v6F+OkuMEF8rprJPCDWHrE3mbYjmVVmoVkmsjWpNEvZXuGZnfhw9RE9L2awo
+1bE6PcyXSwADBggAsJ/Rxk49qrn77X/7iOukDQHEz98yDqXxxM/l2edeyjURFbWE
+elu3BLUNGgaUVAMT+/W6dxrH4S9G8K5xLVwiNSelTtOLylYOjiO16InPpZ6I8HcX
+u9CkONthpaj7Es4hGpXxmYpnIkBN0EFA/cEK3GfPX2OiFKJ0CxOAlIkT0wMbFdpU
+tpvyltlD7KMglUJobOtFYjq5wfMyROWnJ4XLIc2XtiiT9Bzgw2blxVtfjCJ4uUUf
+c0JJ8UT+5w7/2QB3RdiSocKpS5FAkemH1gknpHhEeG8cItY0DTNDB39aa8jOIm+1
+Al0KHk4S6kedJEz4t0xcGo5NzZU323Xcl4UEPohJBBgRAgAJBQJD2C5EAhsMAAoJ
+EMB0lGc+bSbS1okAnR498zEVDPUHFMoT3kGd+xkPyf0FAJ44KZYBZLXHFIwiwuMb
+FrdorwKsLQ==
+=1t0m
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/3.0.4/LICENSE-2.0.txt b/3.0.4/LICENSE-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/3.0.4/LICENSE-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/3.0.4/NOTICE.txt b/3.0.4/NOTICE.txt
new file mode 100644
index 0000000..3f59805
--- /dev/null
+++ b/3.0.4/NOTICE.txt
@@ -0,0 +1,2 @@
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/3.0.4/Readme.html b/3.0.4/Readme.html
new file mode 100644
index 0000000..cc4949f
--- /dev/null
+++ b/3.0.4/Readme.html
@@ -0,0 +1,230 @@
+<html>
+<!-- $Id$ -->
+<head>
+<title>Tapestry: Java Web Components</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css">
+</head>
+
+<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
+<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="white">
+	<tr>
+		<td height="5"><IMG height=1 src="web/images/spacer.gif" width=1 border=0>
+		</td>
+	</tr>
+	<tr>
+		<td align="left" valign="top" height="20"><span class="release">Release @VERSION@</RELEASE></span>
+		</td>
+	</tr>
+	<tr bgcolor="#4b5887">
+		<td colspan="3" height="20"><IMG height=1 src="web/images/spacer.gif" width=1 border=0>
+		</td>
+	</tr>
+</table>
+
+<table width="100%" border="0" cellspacing="0" cellpadding="2">
+	<tr>
+		<td><IMG src="web/images/Tapestry-Banner.png" align=absMiddle border=0>
+<p>Tapestry is a component based framework for creating sophisticated web applications.
+It's used with existing application servers, acting as a kind of "super servlet". 
+Tapestry applications are built by configuring and combining components to form pages.  You
+get surprisingly large amounts of robust functionality for
+startingly small amounts of effort and code!
+
+
+<p>The JARs were created on 
+@OS_NAME@ @OS_VERSION@
+using the 
+@JAVA_VENDOR@ JDK @JAVA_VM_VERSION@ 
+compiler.
+
+<p>This product includes software developed by the Apache Software Foundation 
+(<a href="http://www.apache.org/">http://www.apache.org/</a>).
+
+<br><br>.....................................................<br><br>
+<h2>Non-ASL Libraries</h2>
+
+<p>
+Tapestry depends on a handful of non-ASL libraries. Because these libraries are not distributed under the terms
+of the Apache Software License, they may not be redistributed with as part of Tapestry. Tapestry's build scripts will
+automatically download the libraries as needed. Several libraries are only needed at build time, but
+some are needed at runtime (and are typically copied into <code>WEB-INF/lib</code>). The two runtime libraries are:
+<ul>
+<li><a href="http://www.ognl.org/">OGNL</a> (Object Graph Navigation Library), version @OGNL_VERSION@
+<li><a href="http://jboss.org/developers/projects/javassist.html">Javassist</a> (byte code enhancement library), version @JAVASSIST_VERSION@
+</ul>
+
+<p>
+The necessary libraries will automatically be downloaded when building the examples. The
+Ant target <code>download-ext-framework</code> will also download the libraries. If you
+are behind a firewall, you may need to <a href="ext-dist/README.html">provide some additional properties</a> in
+<code>config/build.properties</code>.
+
+<br><br>.....................................................<br><br>
+<h2>Configuration</h2>
+
+<p>
+In order to run the Tapestry demos, you need only the <b>binary</b> distribution (it includes the source code
+for the examples). The Ant build scripts will compile and build the Workbench and the Virtual Library example
+applications on your workstation, then deploy them into Jetty, Tomcat or JBoss.
+
+<pTo run these Tapestry applications please ensure:
+			<ul>
+				<li>JDK 1.3 or newer JVM is installed, and the <tt>JAVA_HOME</tt> environment variable is set.</B>
+				<li><b><a href="http://jakarta.apache.org/ant">Ant</a></b> 1.5 or newer is installed, and is added 
+to the system <tt>PATH</tt>.</li>
+<li>You have both the <b>binary</b> and the <b>source</b> Tapestry distributions installed
+			</ul>
+			
+<p>
+Basic setup:  The demos require several external dependencies that cannot be distributed with Tapestry
+because of licensing conflicts.  You will need one of the following:
+<ul>
+<li><a href="http://sf.net/projects/jetty">Jetty</a> servlet container, release 4.2 or above.
+<li><a href="http://jakarta.apache.org/tomcat/index.html">Tomcat</a> servlet container, release 4.1 or above.
+<li><a href="http://www.jboss.org">JBoss</a> application server, release 3.0.6. 
+        Running the Virtual Library application requires JBoss.</li>         
+
+</ul>
+
+<p>
+In each case you will create the file 
+<code>config/build.properties</code>
+and put an <em>absolute path</em> to the installation directory (of Jetty, JBoss or Tomcat).
+<b>Always use only forward slashes in the path name.</b>
+
+<p>
+A sample file, <code>config/build.properties.template</code>, is provided.  You may  edit
+and rename this file.
+
+<p>
+The build process downloads a number of extra files into the
+<code>ext-dist</code> and <code>lib/ext</code>
+directories.  See the <A href="ext-dist/README.html">README.html</a> in that directory
+for more details.
+
+<h3>Configuring JBoss</h3>
+
+<p>To run the Tapestry Workbench and the Virtual Library applications with the 
+<a href="http://sourceforge.net/projects/jboss">JBoss</a> server:
+			<ul>
+				<li>Download and install <a href="http://prdownloads.sourceforge.net/jboss/jboss-3.0.6.zip?download">JBoss 3.0.6</a>.
+				<br>JBoss is an open-source application server, used to run the database and Enterprise JavaBeans in the Virtual Library.
+<p><span class="hyper-em">This auto-configuration requires JBoss 3.0.6 exactly, not a later release.  
+This only affects these turn-key
+demos, not deployment of your own Tapestry applications.</span></p>
+				<li>
+			Update <code>config/build.properties</code>
+			and set property
+			<b><code>jboss.dir</code></b>
+			to the absolute path name
+			of the JBoss installation directory.
+				<li>Download the external dependencies.
+				<li>Execute the command:
+				<br>
+			<b><code>ant -emacs configure run-jboss</code></b>
+			
+			<br>This will build, copy and configure the necessary files in the JBoss installation directory, then
+run the JBoss server, automatically deploying the example applications. 
+ (The
+			<code>-emacs</code> option 
+        changes the Ant output format to be less verbose).</li>
+			</ul>
+			
+		<blockquote>You can now run the 
+<a href="http://localhost/workbench">Tapestry Workbench</a>
+or the
+<a href="http://localhost">Virtual Library</a> applications.</blockquote>
+
+
+<h3>Configuring Jetty</h3>
+
+<p>To run the Tapestry Workbench application with 
+Jetty servlet container:
+			<ul>
+				<li>Obtain and install a copy of Jetty.
+				<li>
+			Update <code>config/build.properties</code>
+			and set property
+			<b><code>jetty.dir</code></b>
+			to the absolute path name
+			of the Jetty installation directory.
+	
+				<li>Execute the command:
+				<br>
+				<b>
+			<code>ant -emacs run-workbench</code></b><br>This will run the embedded 
+			Jetty server. 
+			<br></li>
+			</ul>
+			
+		<blockquote>You can now run the 
+<a href="http://localhost:8080/workbench">Tapestry Workbench</a> application.
+</blockquote>
+
+			<h3>Configuring Tomcat</h3>
+			
+<p>To deploy the Tapestry Workbench application onto an existing 
+Tomcat installation:
+
+<p>To run the Tapestry Workbench application with 
+Tomcat servlet container:
+			<ul>
+				<li>Obtain and install a copy of Tomcat.
+				<li>
+			Update <code>config/build.properties</code>
+			and set property
+			<b><code>tomcat.dir</code></b>
+			to the absolute path name
+			of the Tomcat installation directory, for example <code>C:/Program Files/Apache Group/Tomcat 4.1</code>.
+
+				<li>Execute the command:
+				<br>
+				<b>
+			<code>ant -emacs deploy-tomcat</code></b>
+			
+			<br>This will deploy the Workbench application into Tomcat.  If Tomcat is running, you will
+			be able to access the application immediately. 
+			<br></li>
+			</ul>
+			
+		<blockquote>You can then run the 
+<a href="http://localhost:8080/workbench">Tapestry Workbench</a> application.
+</blockquote>
+
+<br><br>.....................................................<br><br>
+<h2>Building from Source</h2>
+
+<p>
+The source distribution includes the source code for the framework and the contrib library. You should extract
+the source distribution to the same directory as the binary distribution.
+You may then execute <b><code>ant install</code></b> to compile all the frameworks and examples.
+Building documentation and running the unit tests requires some additional
+setup that is discussed in
+the <A href="web/doc/ContributorsGuide/ContributorsGuide.html">Tapestry Contributor's Guide</A>.
+</p>
+			
+<br><br>.....................................................<br><br>
+<h2>Documentation</h2>
+
+A complete set of <a href="web/doc.html">documentation</a> is distributed with Tapestry.
+
+
+		<br><br>
+		.....................................................
+		<br><br>
+
+<p>Tapestry is an open source project, hosted by
+ <a href="http://jakarta.apache.org">The Jakarta Project</a> 
+       and distributed under the terms
+of the <A href="LICENSE-2.0.txt">Apache Software License 2.0</A>.</p></td></tr></table>
+
+<p>
+<a href="http://jakarta.apache.org"><IMG alt="Jakarta Banner" src="web/images/jakarta.png" border=0 ></a>
+<br>© 
+2003-2004 Apache Software Foundation.</p>    
+
+
+</body>
+
+</html>
+
diff --git a/3.0.4/STATUS.html b/3.0.4/STATUS.html
new file mode 100644
index 0000000..6178a75
--- /dev/null
+++ b/3.0.4/STATUS.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>Tapestry Status</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css"/>
+</head>
+<body>
+
+$Id$
+
+<br/>
+
+Status documentation (including committer votes) are now recorded inside status.xml.
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/3.0.4/TODO.html b/3.0.4/TODO.html
new file mode 100644
index 0000000..eda0ac0
--- /dev/null
+++ b/3.0.4/TODO.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>Tapestry TODO List</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css"/>
+</head>
+<body>
+<h1>Release 3.0</h1>
+<br/>
+$Id$
+<p>   Some of these items overlap requests Bugzilla.</p>
+<p><i>This list is anything but final! Not in any (prioritized) order.</i></p>
+<ul>
+	<li>Decide on final release number for "NextGen"</li>
+	<li>Bugzilla or Scarab?</li>
+	<li>Deal with character sets and localization properly</li>
+	<li>Handle change of locale correctly, by reloading new 
+  instance of page in proper locale</li>
+	<li>Improved User's Guide to replace existing Developer's 
+  Guide</li>
+	<li>Replace the current tutorial with Neil Clayton's 
+  Tutorial2</li>
+	<li>Reoganize directory structure to more standard format 
+  (compatible with Maven)</li>
+	<li>Use Forrest, or somesuch, for documentation 
+  (possibly, convert User's Guide and friends to alternate format)</li>
+	<li>Get Tapestry compiling under Maven, have nightly 
+  builds</li>
+	<li>Fill out the test suite and code coverage, reach 85% 
+  or better</li>
+	<li>Fix all the Component Reference pages to use the 3.0 
+  syntax</li>
+	<li>Unit testing stategy for the JSP tags and tagsupport 
+  service</li>
+	<li>Allow auto parameters to not be required</li>
+</ul>
+<h2>Completed items in 3.0</h2>
+<ul>
+	<li>Declarative transient properties - define transient properties in spec, 
+  Tapestry builds subclass with instance variables, accessors and 
+  initialize() <b>HLS</b></li>
+	<li>Declarative persistant properties - as with transient, but properties are 
+  made persistant <b>HLS</b></li>
+	<li>Traditional bin/src distros <b>HLS</b></li>
+	<li>Rename packages from net.sf.tapestry to org.apache.tapestry <b>HLS</b></li>
+	<li>Resolve GPL issues around McKoiDBMBean <b>HLS</b></li>
+	<li>Tapestry JSP tag library <b>HLS</b></li>
+	<li>Support array types for declared properties and connected parameters <b>HLS</b></li>
+	<li>Support primitive types for connected parameters <b>HLS</b></li>
+	<li>Integrate David Solis' WML component contributions <b>DS</b></li>
+		<li>Get Tapestry building under Gump <b>HLS</b></li>
+			<li>Properly sign the distribution and have it mirrored 
+  with the other Jakarta downloads <b>HLS</b></li>
+  	<li>New features for Script Specification: <b>HLS</b>
+  <ul>
+  	<li>Improve the "include script" element to support </li>
+    relative scripts, scripts in context, script in classpath</li>
+  	<li>Some kind of "include only once" block</li>
+  	<li>Name uniquer</li>
+  	<li>New DTD w/Jakarta public/system ids</li>
+  </ul></li>
+  	<li>Change build environment to NOT compile against LGPL 
+  frameworks (J2EE from JBoss) <b>HLS</b></li>
+</ul>
+<h2>Rejected items in 3.0</h2>
+<ul>
+	<li>Change &lt;extension&gt; initializers to use OGNL 
+  expressions <b>HLS<BR></b><i>
+  <br/>Need an "object" for OGNL expressions, not clear what that would be.</i></li>
+</ul>
+<h1>Release 3.1</h1>
+<ul>
+	<li>Intersertials</li>
+	<li>Extend listener methods to take parameters (matching service parameters to actual method parameters)</li>
+</ul>
+</body>
+</html>
diff --git a/3.0.4/build.xml b/3.0.4/build.xml
new file mode 100644
index 0000000..42eed76
--- /dev/null
+++ b/3.0.4/build.xml
@@ -0,0 +1,762 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+<!-- Top-level buildfile for the Tapestry module. -->
+<project name="Tapestry Web Application Framework" default="install">
+	<property name="root.dir" value="./"/>
+	<property name="config.dir" value="${root.dir}/config"/>
+	<property file="${config.dir}/Version.properties"/>
+	<property file="${config.dir}/build.properties"/>
+	<property file="${config.dir}/common.properties"/>
+	<property name="javadoc.dir" value="web/doc/api"/>
+	<property name="private.dir" value="private"/>
+	
+	<!-- Forrest prefers to put stuff in here. -->
+	
+	<property name="build.dir" value="build"/>
+	
+	<property environment="env"/>
+	
+	<path id="jetty.classpath">
+		<fileset dir="${jetty.dir}">
+			<include name="lib/javax.servlet.jar"/>
+			<include name="lib/org.mortbay.jetty.jar"/>
+			<include name="ext/*.jar"/>
+		</fileset>
+		<!-- Needed to support JSP compilation -->
+		<pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+	</path>
+	
+	<path id="ext.dist.classpath">
+		<fileset dir="${ext.dist.dir}">
+			<include name="*.jar"/>
+		</fileset>
+	</path>
+	
+	<path id="workbench.classpath">
+		<fileset dir="${root.lib.dir}">
+			<include name="${framework.jar}"/>
+			<include name="${contrib.jar}"/>
+			<include name="${ext.dir}/*.jar"/>
+			<include name="${runtime.dir}/*.jar"/>
+		</fileset>
+		<pathelement location="config"/>
+	</path>
+	
+	<path id="vlib.classpath">
+		<pathelement location="${vlibbeans.jar}"/>
+		<pathelement location="examples/VlibBeans/jboss"/>
+		<pathelement location="${jboss.client.dir}/jboss-j2ee.jar"/>
+		<pathelement location="${jboss.client.dir}/jboss-client.jar"/>
+		<pathelement location="${jboss.client.dir}/jnp-client.jar"/>
+		<path refid="workbench.classpath"/>
+	</path>
+	
+	<target name="clean" description="Cleans all sub-projects.">
+		<ant dir="framework" target="clean"/>
+		<ant dir="contrib" target="clean"/>
+		<ant dir="junit" target="clean"/>
+		<ant dir="examples" target="clean"/>
+		<ant dir="doc/src" target="clean"/>
+		<delete dir="${private.dir}" quiet="true"/>		
+	</target>
+	
+	<target name="clean-all" depends="clean"
+		description="Cleans all subprojects and deletes installed frameworks, WARs and generated documentation."
+		>
+		<delete quiet="true">
+			<fileset dir="${root.lib.dir}">
+				<include name="*.jar"/>
+				<include name="examples/**"/>
+			</fileset>
+		</delete>
+		<delete dir="web/doc" quiet="true"/>
+		<delete dir="${build.dir}" quiet="true"/>
+	</target>
+	
+	<target name="install" description="Builds all frameworks and examples." 
+		depends="download-ext-install">
+		<!-- Each project has its own definitions for many properties.
+     	 inheritAll="false" ensures that definitions in this buildfile
+     	 doesn't override definitions in each project's buildfile. -->
+		<ant dir="framework" target="install" inheritAll="false"/>
+		<ant dir="contrib" target="install" inheritAll="false"/>
+		<ant dir="examples" target="install" inheritAll="false"/>
+	</target>
+	
+	<target name="build-workbench" description="Builds and installs the Workbench demo."
+		depends="download-ext-framework">
+		<ant dir="examples/Workbench" target="install" inheritAll="false"/>
+	</target>
+	
+	<target name="build-vlib" description="Builds and installs the Virtual Library demo."
+		depends="download-ext-framework,check-for-jboss-dir">
+		<ant dir="examples/VlibBeans" target="install" inheritAll="false"/>
+		<ant dir="examples/Vlib" target="install" inheritAll="false"/>
+		<ant dir="examples/VlibEAR" target="install" inheritAll="false"/>		
+	</target>
+	
+	<target name="documentation" depends="download-ext-doc"
+		description="Builds the Tapestry documentation.">
+		
+		<ant dir="doc/src" target="install" inheritAll="false">
+		  <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+		</ant>
+		
+		<echo>Building site documentation using Forrest ...</echo>
+		
+		<antcall target="site" inheritall="true"/>
+	</target>
+
+	<target name="junit" depends="check-for-jython-dir,download-ext-junit"
+		description="Run the JUnit test suite for Tapestry.">
+		<ant dir="junit" target="run" inheritAll="false">
+		  <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+		</ant>		
+	</target>
+	
+	<target name="clover" depends="check-for-clover-dir,check-for-jython-dir"
+		description="Execute the JUnit tests and generate Code Coverage report."
+		>
+		<ant dir="junit" target="clover" inheritAll="false">
+		  <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+		</ant>		
+	</target>
+	
+	<target name="dist"
+		description="Builds the Tapestry distribution from scratch."
+		depends="clean-all,install,junit,documentation,clover,javadoc">
+		<!-- After building, clean all the subprojects. -->
+		<antcall target="clean"/>
+		<!-- Now, build that actual distribution. -->
+		<antcall target="build-dist"/>
+	</target>
+	
+	<property name="dist.root.dir" value="dist"/>
+	<property name="dist.base" value="Tapestry-${framework.version}"/>
+	<property name="dist.dir" value="${dist.root.dir}/${dist.base}"/>
+	
+	<target name="build-dist"
+		description="Builds the Tapestry distribution files.">
+		<!-- Delete the base directory. -->
+		<delete dir="${dist.root.dir}" quiet="true"/>
+		<antcall target="build-dist-tarball"/>
+	</target>
+	
+	<target name="build-dist-copy">
+		<echo>Copying to ${dist.dir} ...</echo>
+		<!-- Copy all the relevant files to the base directory. -->
+		<echo>  Copying documentation ...</echo>
+		<copy todir="${dist.dir}" includeEmptyDirs="false">
+			<fileset dir=".">
+				<include name="build.xml"/>
+				<include name="*.html"/>
+				<include name="*.txt"/>
+				<include name="KEYS"/>
+				<!-- Skip HTML files in web, since those need
+				 a seperate path, to provide filtering. -->
+				<exclude name="Readme.html"/>
+				<include name="config/**"/>
+				<include name="ext-dist/README.html"/>
+				<exclude name="lib/*"/>
+				<exclude name="lib/**"/>
+				<!-- Exclude Paint Shop Pro files (used to generate images
+			  in various places) -->
+				<exclude name="**/*.psp"/>
+				<exclude name="**/*.jbf"/>
+				<!-- Don't include build.properties; that's specific to this build
+			     environment.  We ship a sample file instead. -->
+				<exclude name="config/build.properties"/>
+				<!-- This is where Eclipse puts classes. -->
+				<exclude name="bin/**"/>
+				<exclude name="${build.dir}"/>
+				<!-- It isn't a good idea to generate a distribution from a normal working
+			     directory, since the <copy> will include things like backup files created
+			     while editting.  Better to check out the Tapestry module via anon CVS to
+			     a temporary directory, configure build.properties, and build the
+			     release there. -->
+			</fileset>
+		</copy>
+		<!-- The Readme.html file and several of the web pages
+		 include a version number; copy w/ filtering. -->
+		<echo>  Copying (and filtering) Readme.html ...</echo>
+		<copy todir="${dist.dir}" includeEmptyDirs="false">
+			<fileset dir=".">
+				<include name="Readme.html"/>
+			</fileset>
+			
+			<filterset>
+				<filter token="VERSION" value="${framework.version}"/>
+				<filter token="OS_NAME" value="${os.name}"/>
+				<filter token="OS_VERSION" value="${os.version}"/>
+				<filter token="JAVA_VENDOR" value="${java.vendor}"/>
+				<filter token="JAVA_VM_VERSION" value="${java.vm.version}"/>
+				<filter token="COPY_YEARS" value="${copyright.years}"/>
+				<filter token="HOME_PAGE_URL"
+					value="http://jakarta.apache.org/tapestry"/>
+				<filter token="OGNL_VERSION" value="${ognl.version}"/>
+				<filter token="JAVASSIST_VERSION" value="${javassist.version}"/>
+			</filterset>
+		</copy>
+		
+		<echo>  Copying compiled and redistributable libraries ...</echo>
+		<copy todir="${dist.dir}/lib">
+			<fileset dir="${root.lib.dir}">
+				<include name="**/*.jar"/>
+				<exclude name="examples/*"/>
+				<exclude name="${ext.dir}/ognl-*.jar"/>
+				<exclude name="${ext.dir}/javassist-*.jar"/>
+				<include name="**/LICENSE*"/>
+			</fileset>
+		</copy>
+		
+		<echo>  Copying Tapestry Tag Library Descriptor ...</echo>
+		<copy 
+			file="framework/META-INF/taglib.tld"
+			tofile="${dist.dir}/lib/tapestry-${framework.version}.tld"/>
+		
+		<echo>  Copying framework and examples source code ...</echo>
+		<copy todir="${dist.dir}" includeEmptyDirs="false">
+			<fileset dir=".">
+				<include name="framework/**"/>
+				<include name="contrib/**"/>
+				<include name="examples/**"/>
+				
+				<!-- These two aren't quite ready for primetime.  -->
+				<exclude name="examples/DevelopmentEnvironment/**"/>
+				<exclude name="examples/Tutorial2/**"/>
+				
+				<!-- These are thumnail files that turn up in directories that contain images. These
+				     are not stored in CVS and should not be part of the distribution. -->
+				<exclude name="**/Thumbs.db"/>
+				<exclude name="**/pspbrwse.jbf"/>
+        <exclude name="**/classes/"/>        
+			</fileset>
+		</copy>
+		
+		<property name="web.dir" value="${dist.dir}/web"/>
+		<property name="dtd.dir" value="${web.dir}/dtd"/>
+		
+		<echo>  Copying Tapestry DTDs ...</echo>
+		<copy todir="${dtd.dir}" flatten="true">
+			<fileset dir="framework/src">
+				<include name="**/*.dtd"/>
+			</fileset>
+		</copy>
+		
+		<!-- Copy over javadoc, component references, and docs generated from docbook.
+		     We tend to copy the same files too many times (i.e., the builds for the
+		     TapestryUsersGuide could generate the HTML files directly into the dist), but
+		     it's still fast *enough* so not to fiddle. -->
+		     
+		<echo>  Copying documentation, JavaDoc, Clover report ...</echo>
+		<copy todir="${web.dir}" includeEmptyDirs="false">
+		  <fileset dir="web">
+		    <!-- Exclude the top level stuff (any remnants of the old, static web site).
+		         Include all the docs and reports generated below. -->
+		    <exclude name="*.html"/>
+		    <include name="**/*"/>
+		  </fileset>
+		  <fileset dir="${build.dir}/site"/>
+		</copy>
+	</target>
+	
+	<target name="build-dist-tarball"
+		description="Builds the tarball distributions."
+		depends="build-dist-copy">
+
+		<property name="bin.tar.gz" value="${dist.dir}-bin.tar.gz"/>
+		<property name="src.tar.gz" value="${dist.dir}-src.tar.gz"/>
+		<tar tarfile="${bin.tar.gz}" longfile="gnu" compression="gzip">
+			<tarfileset dir="${dist.root.dir}" id="dist.bin.set">
+				<include name="${dist.base}/*"/>
+				<include name="${dist.base}/config/**"/>
+				<include name="${dist.base}/lib/**"/>
+				<!-- Have to include a lot of Workbench source in the binary distro, because
+				     it has to be compiled and built using the dynamically downloaded non-ASL
+				     libraries (such as OGNL). -->
+				<include name="${dist.base}/examples/Workbench/**"/>
+				<exclude name="${dist.base}/examples/Workbench/.build/**"/>
+				<exclude name="${dist.base}/examples/Workbench/image-src/**"/>
+				
+				<include name="${dist.base}/examples/Vlib/**"/>
+				<include name="${dist.base}/examples/VlibBeans/**"/>
+				<include name="${dist.base}/examples/VlibEAR/**"/>
+				
+				<include name="${dist.base}/examples/wap/**"/>
+				
+				<include name="${dist.base}/examples/build.xml"/>
+				
+				<!-- Don't ship the code coverage report; it's huge. -->
+				<include name="${dist.base}/web/**"/>
+				<exclude name="${dist.base}/web/doc/clover/**"/>
+			</tarfileset>
+		</tar>
+		<tar tarfile="${src.tar.gz}" longfile="gnu" compression="gzip">
+			<tarfileset dir="${dist.root.dir}" id="dist.src.set">
+				<!-- Include the sub-projects excluded from the -bin distro. -->
+				<include name="${dist.base}/framework/**"/>
+				<include name="${dist.base}/contrib/**"/>
+			</tarfileset>
+		</tar>
+		
+		<property name="bin.zip" value="${dist.dir}-bin.zip"/>
+		<property name="src.zip" value="${dist.dir}-src.zip"/>
+		
+		<zip destfile="${bin.zip}">
+			<zipfileset refid="dist.bin.set"/>
+		</zip>
+		
+		<zip destfile="${src.zip}">
+			<zipfileset refid="dist.src.set"/>	
+		</zip>
+		
+		<!-- Create the web distribution (to be put up on the web site).  This *does*
+	     include the code coverage report.  -->
+		<property name="web.tar.gz"
+			value="${dist.root.dir}/Tapestry-Web-${framework.version}.tar.gz"/>
+		<tar basedir="${web.dir}" tarfile="${web.tar.gz}" longfile="gnu"
+			compression="gzip"/>
+	</target>
+	
+	<target name="javadoc"
+		description="Generate API documentation for the framework and examples."
+		>
+		<mkdir dir="${javadoc.dir}"/>
+		<javadoc author="true" version="true" destdir="${javadoc.dir}"
+			splitindex="true" windowtitle="Tapestry API ${framework.version}">
+			<doctitle>Tapestry ${framework.version} API</doctitle>
+			<package name="org.apache.tapestry.*"/>
+
+			<link href="http://java.sun.com/j2se/1.3/docs/api/"
+				offline="true" packageListLoc="package-lists/jdk"/>
+
+			<link href="http://java.sun.com/j2ee/sdk_1.2.1/techdocs/api/"
+				offline="true" packageListLoc="package-lists/j2ee"/>
+
+			<link href="http://jakarta.apache.org/log4j/docs/api/"
+				offline="true" packageListLoc="package-lists/log4j"/>
+
+			<link href="http://www.junit.org/junit/javadoc/3.7/" offline="true"
+				packageListLoc="package-lists/junit"/>
+
+			<link href="http://jakarta.apache.org/oro/api/" offline="true"
+				packageListLoc="package-lists/jakarta-oro"/>
+				
+			<group title="Tapestry Framework"
+				packages="org.apache.tapestry:org.apache.tapestry.*"/>
+			<group title="Tapestry Contributions Framework"
+				packages="org.apache.tapestry.contrib.*"/>
+
+			<sourcepath>
+				<pathelement location="framework/src"/>
+				<pathelement location="contrib/src"/>
+			</sourcepath>
+			
+			<classpath>
+				<path refid="vlib.classpath"/>
+				<path refid="ext.dist.classpath"/>
+				<fileset dir="${root.lib.dir}">
+					<include name="${j2ee.dir}/*.jar"/>
+				</fileset>
+			</classpath>
+		</javadoc>
+	</target>
+	
+	<target name="run-workbench" depends="check-for-jetty-dir,build-workbench"
+		description="Runs the Tapestry Workbench using Jetty.">
+		<delete dir="${private.dir}" quiet="true"/>
+		<mkdir dir="${private.dir}"/>
+		<echo>Running Tapestry Workbench on port 8080 ...</echo>
+		<java classname="org.mortbay.jetty.Server" fork="true" maxmemory="128M">
+			<classpath>
+				<path refid="jetty.classpath"/>
+			</classpath>
+			<arg value="config/jetty-workbench.xml"/>
+			<!-- Enable debugging when running the tutorial -->
+			<jvmarg line="-showversion -Xdebug -Xnoagent"/>
+			<jvmarg
+				line="-Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=20150"
+				/>
+			<!-- Jetty can get easily confused (under NT) unless this is turned off. -->
+			<sysproperty key="org.mortbay.util.FileResource.checkAliases"
+				value="false"/>
+			<sysproperty key="org.apache.tapestry.asset.dir" value="${private.dir}"
+				/>
+			<sysproperty key="org.apache.tapestry.asset.URL" value="/private"/>
+		</java>
+	</target>
+	
+	<!-- ===================================================================================
+
+	 JBoss 3.0.6 auto configuration
+	
+	 Configures a JBoss 3.0.6 with a new configuration, tapestry.  Part of the configuration
+	 comes with the Tapestry distribution; part is copied from the JBoss default server
+	 configuration.
+	 
+	 This only works with JBoss 3.0.6; other releases differ enough that this
+	 simple script is broken.
+	
+     ====================================================================================  -->
+	<property name="tapestry.dir" value="${jboss.dir}/server/tapestry"/>
+	<property name="tapestry.conf.dir" value="${tapestry.dir}/conf"/>
+	<property name="tapestry.lib.dir" value="${tapestry.dir}/lib"/>
+	<property name="tapestry.db.dir" value="${tapestry.dir}/db"/>
+	<property name="tapestry.deploy.dir" value="${tapestry.dir}/deploy"/>
+	<property name="tapestry.private.dir"
+		value="${tapestry.dir}/tmp/${private.dir}"/>
+	<property name="jboss.server.default.dir"
+		value="${jboss.dir}/server/default"/>
+	<target name="configure" depends="check-for-jboss-dir,download-ext-examples"
+		description="Configure the JBoss 3.0.6 server and setup the Tapestry database."
+		>
+		<delete dir="${tapestry.lib.dir}" quiet="true"/>
+		<mkdir dir="${tapestry.lib.dir}"/>
+		<copy todir="${tapestry.lib.dir}" flatten="true">
+			<fileset dir="${root.lib.dir}">
+				<include name="*-${framework.version}.jar"/>
+				<include name="${ext.dir}/*.jar"/>
+			</fileset>
+			<fileset dir="${ext.dist.dir}">
+				<include name="mckoidb*.jar"/>
+			</fileset>			
+			<fileset dir="${jboss.server.default.dir}/lib">
+				<!-- Could do a careful analysis of just what we need and copy only that,
+				 but this is good for now.  -->
+				<include name="*.jar"/>
+			</fileset>
+		</copy>
+		<!-- Delete, recreate and copy -->
+		<delete dir="${tapestry.conf.dir}" quiet="true"/>
+		<mkdir dir="${tapestry.conf.dir}"/>
+		<copy todir="${tapestry.conf.dir}" filtering="true">
+			<fileset dir="config/jboss/conf"/>
+			<filterset>
+				<filter token="jboss.dir" value="${jboss.dir}"/>
+				<filter token="user.dir" value="${user.dir}"/>
+			</filterset>
+		</copy>
+		<mkdir dir="${tapestry.deploy.dir}"/>
+		<copy todir="${tapestry.deploy.dir}">
+			<fileset dir="${jboss.server.default.dir}/deploy">
+				<!-- Skip one file that is replaced -->
+				<exclude name="jbossweb.sar/META-INF/jboss-service.xml"/>
+				<include name="*"/>
+				<include name="**/*"/>
+			</fileset>
+		</copy>
+		<!-- Technically, this isn't necessary any longer (the filtering part),
+		 but it does no harm, and may be needed again in the future.  -->
+		<copy todir="${tapestry.deploy.dir}" filtering="true">
+			<fileset dir="config/jboss/deploy"/>
+			<filterset>
+				<filter token="user.dir" value="${user.dir}"/>
+				<filter token="jboss.dir" value="${jboss.dir}"/>
+			</filterset>
+		</copy>
+		<!-- Set a flag if the vlib already exists, then extract it if necessary. -->
+		<mkdir dir="${tapestry.db.dir}"/>
+		<available file="${tapestry.db.dir}/tapestry.conf"
+			property="tapestry.db.exists"/>
+		<antcall target="unpack-tapestry-database"/>
+	</target>
+	
+	<target name="unpack-tapestry-database"
+		description="Unpacks the Tapestry demos database."
+		unless="tapestry.db.exists">
+		<unzip src="config/jboss/tapestry-db.zip" dest="${tapestry.db.dir}"/>
+	</target>
+	
+	<target name="deploy-jboss-demos" depends="check-for-jboss-dir,build-workbench,build-vlib"
+		description="Deploys the demos and Tapestry frameworks into JBoss.">
+		<copy todir="${tapestry.deploy.dir}">
+			<fileset dir="${examples.dir}">
+				<include name="${vlib.ear}"/>
+				<include name="${workbench.war}"/>
+			</fileset>		
+		</copy>
+	</target>
+	
+	<target name="run-jboss" depends="deploy-jboss-demos"
+		description="Launch the JBoss application server.">
+		<delete dir="${tapestry.private.dir}" quiet="true"/>
+		<mkdir dir="${tapestry.private.dir}"/>
+		<java fork="true" dir="${jboss.dir}/bin" classname="org.jboss.Main">
+			<!-- Launch using the tapestry configuration, not the default. -->
+			<arg line="--configuration=tapestry"/>
+			<classpath>
+				<pathelement location="${jboss.dir}/bin/run.jar"/>
+				<!-- Include this so that the JMX control panel (based on JSPs) can work. -->
+				<pathelement location="${java.home}/../lib/tools.jar"/>
+			</classpath>
+			<!-- Enable debugging -->
+			<jvmarg line="-showversion -Xdebug -Xnoagent"/>
+			<jvmarg
+				line="-Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=20500"
+				/>
+			<!-- These allow private assets to be exported as static
+	  		 files.  This coordinates with portions of
+	  		 config/deploy/jbossweb.sar/META-INF/jboss-service.xml -->
+			<sysproperty key="org.apache.tapestry.asset.dir"
+				value="${tapestry.private.dir}"/>
+			<sysproperty key="org.apache.tapestry.asset.URL" value="/private"/>
+			<!-- The following is probably only necessary under Windows.  Jetty gets
+	  	     tripped up by the fact that pathnames are case-insensitive.  -->
+			<sysproperty key="org.mortbay.util.FileResource.checkAliases"
+				value="false"/>
+		</java>
+	</target>
+		
+	<target name="deploy-tomcat"
+		depends="check-for-tomcat-dir,build-workbench"
+		description="Deploys the Workbench application into Tomcat.">
+					
+		<copy file="${examples.dir}/${workbench.war}" todir="${tomcat.dir}/webapps"/>
+
+	</target>
+	
+	<target name="check-for-jboss-dir">
+		<available property="exists.jboss.dir" type="dir" file="${jboss.dir}"/>
+		<fail unless="jboss.dir"
+			message="Property jboss.dir not specified in config/build.properties."
+			/>
+		<fail unless="exists.jboss.dir"
+			message="Directory ${jboss.dir} (jboss.dir from config/build.properties) does not exist."
+			/>
+	</target>
+	
+	<target name="check-for-tomcat-dir">
+		<available property="exists.tomcat.dir" type="dir" file="${tomcat.dir}"
+			/>
+		<fail unless="tomcat.dir"
+			message="Property tomcat.dir not specified in config/build.properties."
+			/>
+		<fail unless="exists.tomcat.dir"
+			message="Directory ${tomcat.dir} (tomcat.dir from config/build.properties) does not exist."
+			/>
+	</target>
+	
+	<target name="check-for-clover-dir">
+		<available property="exists.clover.dir" type="dir" file="${clover.dir}"
+			/>
+		<fail unless="clover.dir"
+			message="Property clover.dir not specified in config/build.properties."
+			/>
+		<fail unless="exists.clover.dir"
+			message="Directory ${clover.dir} (clover.dir from config/build.properties) does not exist."
+			/>
+	</target>
+	
+	<target name="check-for-jython-dir">
+		<available property="exists.jython.dir" type="dir" file="${jython.dir}"
+			/>
+		<fail unless="jython.dir"
+			message="Property jython.dir not specified in config/build.properties."
+			/>
+		<fail unless="exists.jython.dir"
+			message="Directory ${jython.dir} (jython.dir from config/build.properties) does not exist."
+			/>
+	</target>
+	
+	<target name="check-for-jetty-dir">
+		<available property="exists.jetty.dir" type="dir" file="${jetty.dir}" />
+		<fail unless="jetty.dir"
+			message="Property jetty.dir not specified in config/build.properties."
+			/>
+		<fail unless="exists.jetty.dir"
+			message="Directory ${jetty.dir} (jetty.dir from config/build.properties) does not exist."
+			/>
+	</target>
+	
+	<target name="check-for-forrest-dir" depends="check-defined-forrest-dir,check-downloaded-forrest">
+	</target>
+	
+	<target name="site" description="Generates static HTML documentation" depends="check-for-forrest-dir">
+		<ant antfile="${installed.forrest.dir}/forrest.antproxy.xml" target="site">
+			<property name="forrest.home" value="${installed.forrest.dir}"/>
+		</ant>
+	</target>
+
+	<target name="validate" depends="check-for-forrest-dir" description="Validates XML documentation files">
+		<ant antfile="${installed.forrest.home}/forrest.antproxy.xml" target="validate"/>
+	</target>
+
+	<target name="check-defined-forrest-dir" if="forrest.dir">
+		<available property="exists.forrest.dir" type="dir" file="${forrest.dir}"/>
+		<fail unless="exists.forrest.dir"
+	        message="Directory ${forrest.dir} (forrest.dir from config/build.properties) does not exist."/>
+		<property name="installed.forrest.dir" value="${forrest.dir}"/>
+	</target>		
+	
+	<target name="check-downloaded-forrest" unless="forrest.home" depends="proxyflags" 
+		description="Download forrest package">
+		<echo message="Property forrest.dir not specified in config/build.properties"/>
+		<echo message="Downloading Forrest"/>
+		<antcall target="downloadzip">
+			<param name="sourcefile" value="${forrestdl.loc}"/>
+			<param name="dlfile" value="${forrestdl.ant.xml}"/>
+			<param name="destdir" value="${ext.download.dir}"/>
+		</antcall>
+		<property name="installed.forrest.dir" value="${forrestdl.home}"/>
+	</target>
+
+	<target name="download-ext-install" 
+		depends="download-ext-framework, download-ext-examples" 
+		description="Download binary packages for the install target"/>
+
+	<target name="download-ext-framework" depends="proxyflags" 
+		description="Download binary packages for compiling the framework and examples" >
+		<mkdir dir="${ext.download.dir}" />
+    	
+		<antcall target="installgz">
+			<param name="sourcefile" value="${jdom.loc}"/>
+			<param name="dlfile" value="${jdom.jar}"/>
+			<param name="destfile" value="${jdom.ext.jar}"/>
+			<param name="destdir" value="${ext.download.dir}"/>
+		</antcall>
+		
+		<antcall target="installzip">
+		  <param name="sourcefile" value="${javassist.loc}"/>
+		  <param name="dlfile" value="${javassist.jar}"/>
+		  <param name="destfile" value="${javassist.ext.jar}"/>
+		  <param name="destdir" value="${javassist.dest}"/>
+		</antcall>
+		
+		<antcall target="installjar">
+		  <param name="sourcefile" value="${ognl.loc}"/>
+		  <param name="destfile" value="${ognl.dest}"/>
+		</antcall>
+
+	</target>
+
+	<target name="download-ext-examples" depends="proxyflags" 
+		description="Download binary packages for compiling the examples" >
+		<mkdir dir="${ext.download.dir}" />
+    
+		<antcall target="installzip">
+			<param name="sourcefile" value="${mckoi.loc}"/>
+			<param name="dlfile" value="${mckoi.jar}"/>
+			<param name="destfile" value="${mckoi.ext.jar}"/>
+			<param name="destdir" value="${ext.download.dir}"/>
+		</antcall>
+	</target>
+
+	<target name="download-ext-junit" depends="proxyflags" 
+		description="Download binary packages for compiling the unit tests" >
+		<mkdir dir="${ext.download.dir}" />
+    
+		<antcall target="installzip">
+			<param name="sourcefile" value="${junit.loc}"/>
+			<param name="dlfile" value="${junit.jar}"/>
+			<param name="destfile" value="${junit.ext.jar}"/>
+			<param name="destdir" value="${ext.download.dir}"/>
+		</antcall>
+
+		<antcall target="installgz">
+			<param name="sourcefile" value="${jdom.loc}"/>
+			<param name="dlfile" value="${jdom.jar}"/>
+			<param name="destfile" value="${jdom.ext.jar}"/>
+			<param name="destdir" value="${ext.download.dir}"/>
+		</antcall>
+	</target>
+
+	<target name="download-ext-doc" depends="proxyflags" 
+		description="Download binary packages for compiling the documentation" >
+		<mkdir dir="${ext.download.dir}" />
+    
+		<antcall target="downloadfile">
+			<param name="sourcefile" value="${docbookxml.loc}"/>
+			<param name="destfile" value="${docbookxml.file}"/>
+			<param name="destdir" value="${ext.dist.dir}"/>
+		</antcall>
+
+		<antcall target="downloadfile">
+			<param name="sourcefile" value="${docbookxsl.loc}"/>
+			<param name="destfile" value="${docbookxsl.file}"/>
+			<param name="destdir" value="${ext.dist.dir}"/>
+		</antcall>
+	</target>
+
+    <target name="download-alert" unless="download-alert-shown">
+    <echo>
+*********************************************************************************
+* Due to the restrictions of the Apache Software License 2.0, it is necessary   *
+* to download some additional libraries that use non-ASL licenses. You should   *
+* be aware that redistribution of these files are regulated by their individual *
+* licenses. If you experience problems with the download, consult the file      * 
+* ext-dist/README.html for details on how to configure the build to work        *
+* around a firewall.                                                            *
+*********************************************************************************
+    </echo>
+    
+    <!-- This doesn't work so well ... the property must be getting lost after
+         each antcall completes. -->
+         
+    <property name="download-alert-shown" value="you-betcha"/>
+    
+    </target>
+
+    <target name="installjar" unless="exist" depends="setproxy,testexistdest,download-alert">
+      <get src="${sourcefile}" dest="${destfile}"/>
+    </target>
+
+	<target name="installgz" unless="exist" depends="setproxy,testexistdest">
+		<antcall target="downloadgz"/>
+		<copy file="${dlfile}" tofile="${destfile}"/>
+	</target>
+  
+	<target name="downloadgz" unless="exist" depends="setproxy,testexist,download-alert">
+		<mkdir dir="${ext.download.dir}"/>
+		<!-- Download and extract the package -->
+		<get src="${sourcefile}" dest="${ext.download.dir}/file.tar.gz" />
+		<gunzip src="${ext.download.dir}/file.tar.gz" dest="${ext.download.dir}/file.tar"/>
+		<untar src="${ext.download.dir}/file.tar" dest="${ext.download.dir}"/>
+		<delete file="${ext.download.dir}/file.tar"/>
+		<delete file="${ext.download.dir}/file.tar.gz"/>
+	</target>
+
+	<target name="installzip" unless="exist" depends="setproxy,testexistdest">
+		<antcall target="downloadzip"/>
+		<copy file="${dlfile}" tofile="${destfile}"/>
+	</target>
+  
+	<target name="downloadzip" unless="exist" depends="setproxy,testexist,download-alert">
+		<!-- Download and extract the package -->
+		<mkdir dir="${ext.download.dir}"/>
+		<get src="${sourcefile}" dest="${ext.download.dir}/file.zip" />
+		<mkdir dir="${destdir}" />
+		<unzip src="${ext.download.dir}/file.zip" dest="${destdir}"/>
+		<delete file="${ext.download.dir}/file.zip"/>
+	</target>
+
+	<target name="downloadfile" unless="exist" depends="setproxy,testexistdest">
+		<!-- Download extract the file -->
+		<mkdir dir="${destdir}" />
+		<get src="${sourcefile}" dest="${destfile}" />
+	</target>
+
+	<target name="proxyflags">
+		<!-- check proxy parameters. -->
+		<condition property="useproxy">
+			<equals arg1="${proxy.use}" arg2="on" />
+		</condition>
+	</target>
+
+	<target name="setproxy"  if="useproxy">
+		<taskdef name="setproxy"
+			classname="org.apache.tools.ant.taskdefs.optional.net.SetProxy" />
+		<setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}"/> 
+		<echo message="Using ${proxy.host}:${proxy.port} to download ${sourcefile}"/>
+	</target>
+
+	<target name="testexistdest">
+		<echo message="Testing for ${destfile}"/>
+		<available file="${destfile}" property="exist"/>
+	</target>
+
+	<target name="testexist">
+		<echo message="Testing for ${dlfile}"/>
+		<available file="${dlfile}" property="exist"/>
+	</target>
+
+</project>
diff --git a/3.0.4/config/.cvsignore b/3.0.4/config/.cvsignore
new file mode 100644
index 0000000..9a96d4a
--- /dev/null
+++ b/3.0.4/config/.cvsignore
@@ -0,0 +1,2 @@
+build.properties
+build.properties
diff --git a/3.0.4/config/Version.properties b/3.0.4/config/Version.properties
new file mode 100644
index 0000000..2cd3a42
--- /dev/null
+++ b/3.0.4/config/Version.properties
@@ -0,0 +1,5 @@
+# $Id$
+#
+# Stores the version number of the framework.
+
+framework.version=3.0.4
diff --git a/3.0.4/config/build.properties.sample b/3.0.4/config/build.properties.sample
new file mode 100644
index 0000000..df89514
--- /dev/null
+++ b/3.0.4/config/build.properties.sample
@@ -0,0 +1,32 @@
+# $Id$
+# This file is used to configure the Tapestry build.
+# Copy it as "build.properties" and fill in the necessary data.
+
+# The absolute path to the directory where external distributions 
+# used in the building process will be downloaded and installed
+base.path=/usr/share/java
+
+# The absolute path to the directory containing the JBoss installation.
+# Required to execute the configure and run-jboss targets.
+jboss.dir=
+
+# The absolute path to the directory containing the Tomcat installation.
+# Required to execute the deploy-tomcat target.
+# 
+tomcat.dir=
+
+# The absolute path to the directory containing the Jetty installation.
+# Required to execute the run-workbench target.
+jetty.dir=
+
+# The absolute path to the directory containing the Jython installation.
+# Required to execute the junit target.
+jython.dir=
+
+# Home for xml-forrest, used to build documentation.
+# Available from :pserver:anoncvs@cvs.apache.org:/home/cvspublic as module xml-forrest
+# Build forrest, then set to the shbat directory, i.e.
+# C:/workspace/xml-forrest/build/dist/shbat
+
+forrest.home=
+
diff --git a/3.0.4/config/common.properties b/3.0.4/config/common.properties
new file mode 100644
index 0000000..94d02b0
--- /dev/null
+++ b/3.0.4/config/common.properties
@@ -0,0 +1,94 @@
+# $Id$
+#
+# Specifies some general properties used throughout.
+# Each build.xml must specify root.dir (as a relative path).
+
+lib.dir=lib
+
+root.lib.dir=${root.dir}/${lib.dir}
+
+ext.dist.dir=${root.dir}/ext-dist
+
+root.config.dir=${root.dir}/config
+
+framework.jar=tapestry-${framework.version}.jar
+contrib.jar=tapestry-contrib-${framework.version}.jar
+
+examples.dir=${root.lib.dir}/examples
+
+vlib.war=vlib.war
+vlib.ear=vlib.ear
+vlibbeans.jar=vlibbeans.jar
+workbench.war=workbench.war
+wap.war=wap.war
+
+ext.download.dir=${ext.dist.dir}/downloads
+
+# Names of directories under lib
+
+ext.dir=ext
+j2ee.dir=j2ee
+runtime.dir=runtime
+
+jboss.lib.dir=${jboss.dir}/lib
+jboss.client.dir=${jboss.dir}/client
+jboss.server.all.lib.dir=${jboss.dir}/server/all/lib
+
+# Directory containing source code and package resources
+src.dir=src
+
+# Directory containing compiled Java code
+classes.dir=classes
+
+# Used as part of copyrights
+
+copyright.years=2000-2004
+
+# ----- JUnit Unit Test Suite, version 3.8 or later -----
+junit.home=${ext.download.dir}/junit3.8.1
+junit.lib=${junit.home}
+junit.jar=${junit.lib}/junit.jar
+junit.ext.jar=${ext.dist.dir}/junit.jar
+junit.loc=http://telia.dl.sourceforge.net/sourceforge/junit/junit3.8.1.zip
+
+# ----- JDOM Library, version 1.0 -----
+jdom.home=${ext.download.dir}/jdom-1.0
+jdom.lib=${jdom.home}
+jdom.jar=${jdom.lib}/build/jdom.jar
+jdom.ext.jar=${ext.dist.dir}/jdom-1.0.jar
+jdom.loc=http://www.jdom.org/dist/binary/jdom-1.0.tar.gz
+
+# ----- McKoi Pure Java Database, version 1.0.2 -----
+mckoi.home=${ext.download.dir}/mckoi1.0.2
+mckoi.lib=${mckoi.home}
+mckoi.jar=${mckoi.lib}/mckoidb.jar
+mckoi.ext.jar=${ext.dist.dir}/mckoidb.jar
+mckoi.loc=http://www.mckoi.com/database/ver/mckoi1.0.2.zip
+
+# ----- DocBook XML, version 4.1.2 -----
+docbookxml.file=${ext.dist.dir}/docbkx412.zip
+docbookxml.loc=http://www.docbook.org/xml/4.1.2/docbkx412.zip
+
+# ----- DocBook XSL, version 1.64.1 -----
+docbookxsl.file=${ext.dist.dir}/docbook-xsl-1.64.1.zip
+docbookxsl.loc=http://telia.dl.sourceforge.net/sourceforge/docbook/docbook-xsl-1.64.1.zip
+
+# ----- Apache Forrest, version 0.5.1 -----
+forrestdl.home=${ext.download.dir}/apache-forrest-0.5.1-bin
+forrestdl.ant.xml=${forrestdl.home}/forrest.antproxy.xml
+forrestdl.loc=http://archive.apache.org/dist/forrest/pre-0.6/apache-forrest-0.5.1-bin.zip
+
+# ---- OGNL ----
+ognl.version=2.6.7
+ognl.loc=http://ognl.org/${ognl.version}/ognl-${ognl.version}.jar
+ognl.dest=${root.lib.dir}/${ext.dir}/ognl-${ognl.version}.jar
+
+# ---- Javassist ----
+
+javassist.version=2.5.1
+javassist.loc=http://umn.dl.sourceforge.net/sourceforge/jboss/javassist-${javassist.version}.zip
+javassist.dest=${ext.download.dir}/javassist-${javassist.version}
+javassist.ext.jar=${root.lib.dir}/${ext.dir}/javassist-${javassist.version}.jar
+javassist.jar=${javassist.dest}/javassist.jar
+
+
diff --git a/3.0.4/config/jboss/conf/auth.conf b/3.0.4/config/jboss/conf/auth.conf
new file mode 100644
index 0000000..2fe9341
--- /dev/null
+++ b/3.0.4/config/jboss/conf/auth.conf
@@ -0,0 +1,12 @@
+// This file is now obsolete but is read for backward compatability
+// Use the login-config.xml file instead
+// $Id$
+
+simple {
+    // Very simple login module: 
+    // any user name is accepted.
+    // password should either coincide with user name or be null, 
+    // all users have role "guest", 
+    // users with non-null password also have role "user"
+    org.jboss.security.auth.spi.SimpleServerLoginModule required;
+};
diff --git a/3.0.4/config/jboss/conf/jboss-minimal.xml b/3.0.4/config/jboss/conf/jboss-minimal.xml
new file mode 100644
index 0000000..22dec8e
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jboss-minimal.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE server>
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  A minimal JBoss Server Configuration                                 -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<server>
+
+  <!-- Load all jars from the JBOSS_DIST/server/<config>/lib directory. This
+    can be restricted to specific jars by specifying them in the archives
+    attribute.
+   -->
+  <classpath codebase="lib" archives="*"/>
+
+  <!-- ==================================================================== -->
+  <!-- Log4j Initialization                                                 -->
+  <!-- ==================================================================== -->
+  <mbean code="org.jboss.logging.Log4jService"
+    name="jboss.system:type=Log4jService,service=Logging">
+    <attribute name="ConfigurationURL">resource:log4j.xml</attribute>
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- JNDI                                                                 -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.naming.NamingService"
+	 name="jboss:service=Naming">
+    <!-- The listening port for the bootstrap JNP service. Set this to -1
+      to run the NamingService without the JNP invoker listening port.
+    -->
+    <attribute name="Port">1099</attribute>
+  </mbean>
+  <mbean code="org.jboss.naming.JNDIView" 
+	 name="jboss:service=JNDIView"/>
+
+  <!-- ==================================================================== -->
+  <!-- Deployment Scanning                                                  -->
+  <!-- ==================================================================== -->
+
+  <!-- An mbean for hot deployment/undeployment of archives.
+  -->
+  <mbean code="org.jboss.deployment.scanner.URLDeploymentScanner"
+	 name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+    <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+
+    <!-- The URLComparator can be used to specify a deployment ordering
+         for deployments found in a scanned directory.  The class specified
+         must be an implementation of java.util.Comparator, it must be able
+         to compare two URL objects, and it must have a no-arg constructor.
+         Two deployment comparators are shipped with JBoss:
+           - org.jboss.deployment.DeploymentSorter 
+             Sorts by file extension, as follows:
+               "sar", "service.xml", "rar", "jar", "war", "wsr", "ear", "zip", 
+               "*"
+           - org.jboss.deployment.scanner.PrefixDeploymentSorter
+             If the name portion of the url begins with 1 or more digits, those 
+             digits are converted to an int (ignoring leading zeroes), and 
+             files are deployed in that order.  Files that do not start with 
+             any digits will be deployed last, and they will be sorted by
+             extension as above with DeploymentSorter.
+    -->
+    <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+    <!-- The Filter specifies a java.io.FileFilter for scanned
+         directories.  Any file not accepted by this filter will not be
+         deployed.  The org.jboss.deployment.scanner.DeploymentFilter 
+         rejects the following patterns:
+             "#*", "%*", ",*", ".*", "_$*", "*#", "*$", "*%", "*.BAK", 
+             "*.old", "*.orig", "*.rej", "*.bak", "*,v", "*~", ".make.state", 
+             ".nse_depinfo", "CVS", "CVS.admin", "RCS", "RCSLOG", "SCCS", 
+             "TAGS", "core", "tags"
+    -->
+    <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+
+    <attribute name="ScanPeriod">5000</attribute>
+
+    <!-- URLs are comma seperated and unprefixed arguments are considered
+       file URLs and resolve relative to server home(JBOSS_DIST/server/default)
+       unless the given path is absolute. Any referenced directories cannot
+       be unpackaged archives, use the parent directory of the unpacked
+       archive.
+     -->
+    <attribute name="URLs">
+       ./deploy
+    </attribute>
+  </mbean>
+
+</server>
diff --git a/3.0.4/config/jboss/conf/jboss-service.xml b/3.0.4/config/jboss/conf/jboss-service.xml
new file mode 100644
index 0000000..e52d927
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jboss-service.xml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE server>
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  JBoss Server Configuration                                           -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<server>
+
+  <!-- Load all jars from the JBOSS_DIST/server/<config>/lib directory. This
+    can be restricted to specific jars by specifying them in the archives
+    attribute.
+   -->
+  <classpath codebase="lib" archives="*"/>
+
+  <!-- ==================================================================== -->
+  <!-- PropertyEditors and System Properties                                -->
+  <!-- ==================================================================== -->
+  <mbean code="org.jboss.varia.property.PropertyEditorManagerService"
+    name="jboss:type=Service,name=BootstrapEditors">
+    <!-- Preload all custom editors for VMs that don't use the thread
+         context class loader when searching for PropertyEditors
+    -->
+    <attribute name="BootstrapEditors">
+       java.math.BigDecimal=org.jboss.util.propertyeditor.BigDecimalEditor
+       java.lang.Boolean=org.jboss.util.propertyeditor.BooleanEditor
+       java.lang.Class=org.jboss.util.propertyeditor.ClassEditor
+       java.util.Date=org.jboss.util.propertyeditor.DateEditor
+       java.io.File=org.jboss.util.propertyeditor.FileEditor
+       java.net.InetAddress=org.jboss.util.propertyeditor.InetAddressEditor
+       java.lang.Integer=org.jboss.util.propertyeditor.IntegerEditor
+       javax.management.ObjectName=org.jboss.util.propertyeditor.ObjectNameEditor
+       java.util.Properties=org.jboss.util.propertyeditor.PropertiesEditor
+       [Ljava.lang.String;=org.jboss.util.propertyeditor.StringArrayEditor
+       java.net.URL=org.jboss.util.propertyeditor.URLEditor
+    </attribute>
+  </mbean>
+  <mbean code="org.jboss.varia.property.SystemPropertiesService"
+    name="jboss:type=Service,name=SystemProperties">
+    <!-- The invokerServletPath property gives the public URL to the
+      org.jboss.invocation.http.servlet.InvokerServlet used by the
+      HTTP proxy for RMI/HTTP. This is only needed if the http-invoker.sar
+      is deployed.
+    -->
+    <attribute name="Properties">
+      invokerServletPath=http://localhost:8080/invoker/JMXInvokerServlet
+    </attribute>
+    <!-- Load properties from each of the given comma seperated URLs
+    <attribute name="URLList">
+      http://somehost/some-location.properties,
+      ./conf/somelocal.properties
+    </attribute>
+    -->
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- Log4j Initialization                                                 -->
+  <!-- ==================================================================== -->
+  <mbean code="org.jboss.logging.Log4jService"
+    name="jboss.system:type=Log4jService,service=Logging">
+    <attribute name="ConfigurationURL">resource:log4j.xml</attribute>
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- Class Loading                                                        -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.web.WebService"
+	 name="jboss:service=Webserver">
+    <attribute name="Port">8083</attribute>
+    <!-- Should resources and non-EJB classes be downloadable -->
+    <attribute name="DownloadServerClasses">true</attribute>
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- JSR-77 Single JBoss Server Management Domain                         -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.management.j2ee.SingleJBossServerManagement"
+	 name="jboss.management.single:j2eeType=J2EEDomain,name=Manager" >
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- JNDI                                                                 -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.naming.NamingService"
+	 name="jboss:service=Naming">
+    <!-- The listening port for the bootstrap JNP service. Set this to -1
+      to run the NamingService without the JNP invoker listening port.
+    -->
+    <attribute name="Port">1099</attribute>
+  </mbean>
+  <mbean code="org.jboss.naming.JNDIView" 
+	 name="jboss:service=JNDIView"/>
+
+  <!-- ==================================================================== -->
+  <!-- Security                                                             -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.security.plugins.SecurityConfig"
+	 name="jboss.security:name=SecurityConfig">
+    <attribute name="LoginConfig">jboss.security:service=XMLLoginConfig</attribute>
+  </mbean>
+  <mbean code="org.jboss.security.auth.login.XMLLoginConfig"
+	 name="jboss.security:service=XMLLoginConfig">
+    <attribute name="ConfigResource">login-config.xml</attribute>
+  </mbean>
+
+  <!-- JAAS security manager and realm mapping -->
+  <mbean code="org.jboss.security.plugins.JaasSecurityManagerService"
+	 name="jboss.security:service=JaasSecurityManager">
+    <attribute name="SecurityManagerClassName">
+      org.jboss.security.plugins.JaasSecurityManager
+    </attribute>
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- Transactions                                                         -->
+  <!-- ==================================================================== -->
+
+  <mbean code="org.jboss.tm.XidFactory" 
+	 name="jboss:service=XidFactory">
+  </mbean>
+ 
+  <mbean code="org.jboss.tm.TransactionManagerService" 
+	 name="jboss:service=TransactionManager">
+    <attribute name="TransactionTimeout">300</attribute>
+    <depends optional-attribute-name="XidFactory">jboss:service=XidFactory</depends>
+  </mbean>
+
+  <!-- 
+     | Uncomment to use Tyrex (tyrex.exolab.org) transaction manager plugin
+     | instead of the org.jboss.tm.TransactionManagerService and comment out
+     | the TransactionManagerService above.
+     | Make sure you have Xerces in lib/. At the moment JBoss does not
+     | ship Xerces as part of distribution. Version 1.x seems to work fine,
+     | though 2.x should as well, use whichever you like.
+     |
+  <mbean code="org.jboss.tm.plugins.tyrex.TransactionManagerService"
+         name="jboss:service=TransactionManager">
+        <attribute name="ConfigFileName">../conf/default/domain.xml</attribute>
+  </mbean>
+  -->
+
+  <mbean code="org.jboss.tm.usertx.server.ClientUserTransactionService"
+	 name="jboss:service=ClientUserTransaction">
+  </mbean>
+
+  <!-- The CachedConnectionManager is used partly to relay started UserTransactions to 
+    open connections so they may be enrolled in the new tx-->
+  <mbean code="org.jboss.resource.connectionmanager.CachedConnectionManager" name="jboss.jca:service=CachedConnectionManager">
+  </mbean>
+
+
+  <!-- ==================================================================== -->
+  <!-- The deployers...                                                     -->
+  <!-- ==================================================================== -->
+
+  <!-- Main Deployer and SARDeployer are provided by main -->
+
+  <!-- EJB deployer, remove to disable EJB behavior-->
+  <mbean code="org.jboss.ejb.EJBDeployer" name="jboss.ejb:service=EJBDeployer">
+    <attribute name="VerifyDeployments">true</attribute>
+    <attribute name="ValidateDTDs">false</attribute>
+    <attribute name="MetricsEnabled">false</attribute>
+    <attribute name="VerifierVerbose">true</attribute>
+    <!-- Add a dependency on the JMS provider(jms-service.xml) for MDBs. If
+      you are not using MDBs and JMS remove these.
+    -->
+    <depends>jboss.mq:service=JMSProviderLoader,name=JBossMQProvider</depends>
+    <depends>jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool</depends>
+  </mbean>
+
+  <!-- EAR deployer -->
+  <mbean code="org.jboss.deployment.EARDeployer" name="jboss.j2ee:service=EARDeployer">
+  </mbean>
+  
+  <!-- WAR Deployer is provided by tomcat or jetty -->
+  <!-- RAR Deployer is provided by the rar.sar package -->
+
+
+  <!-- ==================================================================== -->
+  <!-- JBoss Server Management                                              -->
+  <!-- ==================================================================== -->
+
+  <!-- AS Temporary not available
+  <mbean code="org.jboss.management.ServerDataCollector"
+         name="jboss.management:service=Collector">
+    <attribute name="RefreshSleep">5000</attribute>
+  </mbean>
+  -->
+
+  <!-- ==================================================================== -->
+  <!-- Monitoring and Management                                            -->
+  <!-- ==================================================================== -->
+
+  <!-- Uncomment to enable JMX monitoring of the bean cache
+  <mbean code="org.jboss.monitor.BeanCacheMonitor" 
+         name="jboss.monitor:name=BeanCacheMonitor"/>
+  -->
+
+  <!-- Uncomment to enable JMX monitoring of the entity bean locking
+  <mbean code="org.jboss.monitor.EntityLockMonitor" 
+         name="jboss.monitor:name=EntityLockMonitor"/>
+  -->
+
+  
+
+  <!-- ==================================================================== -->
+  <!-- Invokers to the JMX node                                             -->
+  <!-- ==================================================================== -->
+
+  <!-- RMI/JRMP invoker -->
+  <mbean code="org.jboss.invocation.jrmp.server.JRMPInvoker" 
+         name="jboss:service=invoker,type=jrmp">
+    <attribute name="RMIObjectPort">4444</attribute>
+    <!--
+    <attribute name="RMIClientSocketFactory">custom</attribute>
+    <attribute name="RMIServerSocketFactory">custom</attribute>
+    <attribute name="RMIServerSocketAddr">custom</attribute>
+    -->
+  </mbean>
+  
+  <mbean code="org.jboss.invocation.pooled.server.PooledInvoker" 
+         name="jboss:service=invoker,type=pooled">
+  </mbean>
+
+  <mbean code="org.jboss.invocation.local.LocalInvoker" 
+         name="jboss:service=invoker,type=local">
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- Deployment Scanning                                                  -->
+  <!-- ==================================================================== -->
+
+  <!-- Uncomment to enable caching of deployment units
+  <mbean code="org.jboss.deployment.cache.FileDeploymentStore"
+	 name="jboss.deployment:type=DeploymentStore,flavor=File">
+    <attribute name="DirectoryName">data/deployment-cache</attribute>
+  </mbean>
+
+  <mbean code="org.jboss.deployment.cache.DeploymentCache"
+	 name="jboss.deployment:type=DeploymentCache">
+    <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+    <depends optional-attribute-name="Store">jboss.deployment:type=DeploymentStore,flavor=File</depends>
+  </mbean>
+  -->
+
+  <!-- An mbean for hot deployment/undeployment of archives.
+  -->
+  <mbean code="org.jboss.deployment.scanner.URLDeploymentScanner"
+	 name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+    <!-- Uncomment (and comment/remove version below) to enable usage of the
+      DeploymentCache
+    <depends optional-attribute-name="Deployer">jboss.deployment:type=DeploymentCache</depends>
+    -->
+    <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+
+    <!-- The URLComparator can be used to specify a deployment ordering
+         for deployments found in a scanned directory.  The class specified
+         must be an implementation of java.util.Comparator, it must be able
+         to compare two URL objects, and it must have a no-arg constructor.
+         Two deployment comparators are shipped with JBoss:
+           - org.jboss.deployment.DeploymentSorter 
+             Sorts by file extension, as follows:
+               "sar", "service.xml", "rar", "jar", "war", "wsr", "ear", "zip", 
+               "*"
+           - org.jboss.deployment.scanner.PrefixDeploymentSorter
+             If the name portion of the url begins with 1 or more digits, those 
+             digits are converted to an int (ignoring leading zeroes), and 
+             files are deployed in that order.  Files that do not start with 
+             any digits will be deployed first, and they will be sorted by
+             extension as above with DeploymentSorter.
+    -->
+    <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+    <!--
+    <attribute name="URLComparator">org.jboss.deployment.scanner.PrefixDeploymentSorter</attribute>
+    -->
+
+    <!-- The Filter specifies a java.io.FileFilter for scanned
+         directories.  Any file not accepted by this filter will not be
+         deployed.  The org.jboss.deployment.scanner.DeploymentFilter 
+         rejects the following patterns:
+             "#*", "%*", ",*", ".*", "_$*", "*#", "*$", "*%", "*.BAK", 
+             "*.old", "*.orig", "*.rej", "*.bak", "*,v", "*~", ".make.state", 
+             ".nse_depinfo", "CVS", "CVS.admin", "RCS", "RCSLOG", "SCCS", 
+             "TAGS", "core", "tags"
+    -->
+    <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+
+    <attribute name="ScanPeriod">5000</attribute>
+
+    <!-- URLs are comma seperated and unprefixed arguments are considered
+       file URLs and resolve relative to server home(JBOSS_DIST/server/default)
+       unless the given path is absolute. Any referenced directories cannot
+       be unpackaged archives, use the parent directory of the unpacked
+       archive.
+     -->
+    <attribute name="URLs">
+       ./deploy
+    </attribute>
+  </mbean>
+
+  <!--  An alternate hot deployer mbean. Use URLDirectoryScanner if you need to
+    specify which urls are directories to scan, and which are urls to be
+    deployed directly. URLDeploymentScanner assumes that all directories are to
+    be scanned, which can cause problems if directory referred to in the
+    deploy attribute is an exploded archive.
+  <mbean code="org.jboss.deployment.scanner.URLDirectoryScanner"
+       name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+    <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+    <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+    <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+    <attribute name="ScanPeriod">5000</attribute>
+    /* Each entry specifies either a dir (directory to be scanned),
+      or url (url to be deployed). Like the URLs for the DeploymentScanner
+      above, a file: protocol will be assumed if not specified otherwise.
+    */
+    <attribute name="URLs">
+        <urls>
+            <dir name="./deploy" />
+            <url name="./deploy/examples/myapp.ear" />
+            <dir name="./deploy/examples" />
+            <url name="http://www.test.com/samples/myapp.ear" />
+        </urls>
+    </attribute>
+  </mbean>
+  -->
+
+</server>
diff --git a/3.0.4/config/jboss/conf/jbossmq-state.xml b/3.0.4/config/jboss/conf/jbossmq-state.xml
new file mode 100644
index 0000000..113ec64
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jbossmq-state.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StateManager>
+	<Users>
+		<User>
+			<Name>john</Name>
+			<Password>needle</Password>
+			<Id>DurableSubscriberExample</Id>
+		</User>
+		<User>
+			<Name>guest</Name>
+			<Password>guest</Password>
+		</User>
+		<User>
+			<Name>nobody</Name>
+			<Password>nobody</Password>
+		</User>
+		<User>
+			<Name>dynsub</Name>
+			<Password>dynsub</Password>
+		</User>
+	</Users>
+	<Roles>
+		<Role name="guest">
+			<UserName>guest</UserName>
+			<UserName>john</UserName>
+		</Role>
+		<Role name="subscriber">
+			<UserName>john</UserName>
+		</Role>
+		<Role name="publisher">
+			<UserName>john</UserName>
+			<UserName>dynsub</UserName>
+		</Role>
+		<Role name="durpublisher">
+			<UserName>john</UserName>
+			<UserName>dynsub</UserName>
+		</Role>
+		<Role name="noacc">
+			<UserName>nobody</UserName>
+		</Role>
+	</Roles>
+	<DurableSubscriptions>
+	</DurableSubscriptions>
+</StateManager>
diff --git a/3.0.4/config/jboss/conf/jndi.properties b/3.0.4/config/jboss/conf/jndi.properties
new file mode 100644
index 0000000..c59f571
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jndi.properties
@@ -0,0 +1,5 @@
+java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
+java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
+# Do NOT uncomment this line as it causes in VM calls to go over
+# RMI!
+#java.naming.provider.url=localhost
diff --git a/3.0.4/config/jboss/conf/log4j.xml b/3.0.4/config/jboss/conf/log4j.xml
new file mode 100644
index 0000000..000fa62
--- /dev/null
+++ b/3.0.4/config/jboss/conf/log4j.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  Log4j Configuration                                                  -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<!--
+   | For more configuration infromation and examples see the Jakarta Log4j
+   | owebsite: http://jakarta.apache.org/log4j
+ -->
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+
+  <!-- ================================= -->
+  <!-- Preserve messages in a local file -->
+  <!-- ================================= -->
+
+  <!-- A time/date based rolling appender -->
+  <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
+    <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
+    <param name="Append" value="false"/>
+    <param name="Threshold" value="INFO"/>
+
+    <!-- Rollover at midnight each day -->
+    <param name="DatePattern" value="'.'yyyy-MM-dd"/>
+
+    <!-- Rollover at the top of each hour
+    <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
+    -->
+
+    <layout class="org.apache.log4j.PatternLayout">
+      <!-- The default pattern: Date Priority [Category] Message\n -->
+      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+
+      <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
+      <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+       -->
+    </layout>	    
+  </appender>
+
+  <!-- A size based file rolling appender
+  <appender name="FILE" class="org.jboss.logging.appender.RollingFileAppender">
+    <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
+    <param name="Append" value="false"/>
+    <param name="MaxFileSize" value="500KB"/>
+    <param name="MaxBackupIndex" value="1"/>
+
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+    </layout>	    
+  </appender>
+  -->
+
+  <!-- ============================== -->
+  <!-- Append messages to the console -->
+  <!-- ============================== -->
+
+  <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+    <param name="Threshold" value="INFO"/>
+    <param name="Target" value="System.out"/>
+
+    <layout class="org.apache.log4j.PatternLayout">
+      <!-- The default pattern: Date Priority [Category] Message\n -->
+      <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
+    </layout>
+  </appender>
+
+
+  <!-- ====================== -->
+  <!-- More Appender examples -->
+  <!-- ====================== -->
+
+  <!-- Buffer events and log them asynchronously
+  <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+    <appender-ref ref="FILE"/>
+    <appender-ref ref="CONSOLE"/>
+    <appender-ref ref="SMTP"/>
+  </appender>
+  -->
+
+  <!-- EMail events to an administrator
+  <appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
+    <param name="Threshold" value="ERROR"/>
+    <param name="To" value="admin@myhost.domain.com"/>
+    <param name="From" value="nobody@myhost.domain.com"/>
+    <param name="Subject" value="JBoss Sever Errors"/>
+    <param name="SMTPHost" value="localhost"/>
+    <param name="BufferSize" value="10"/>
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/>
+    </layout>
+  </appender>
+  -->
+
+  <!-- Syslog events
+  <appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">
+    <param name="Facility" value="LOCAL7"/>
+    <param name="FacilityPrinting" value="true"/>
+    <param name="SyslogHost" value="localhost"/>
+  </appender>
+  -->
+
+  <!-- Log events to JMS (requires a topic to be created)
+  <appender name="JMS" class="org.apache.log4j.net.JMSAppender">
+    <param name="Threshold" value="ERROR"/>
+    <param name="TopicConnectionFactoryBindingName" value="java:/ConnectionFactory"/>
+    <param name="TopicBindingName" value="topic/MyErrorsTopic"/>
+  </appender>
+  -->
+
+  <!-- ================ -->
+  <!-- Limit categories -->
+  <!-- ================ -->
+
+  <!-- Limit JBoss categories to INFO
+  <category name="org.jboss">
+    <priority value="INFO"/>
+  </category>
+  -->
+
+  <!-- Increase the priority threshold for the DefaultDS category
+  <category name="DefaultDS">
+    <priority value="FATAL"/>
+  </category>
+  -->
+
+  <!-- Decrease the priority threshold for the org.jboss.varia category
+  <category name="org.jboss.varia">
+    <priority value="DEBUG"/>
+  </category>
+  -->
+
+  <category name="org.apache.tapestry">
+  	<priority value="ERROR"/>
+  </category>
+
+  
+  <!--
+     | An example of enabling the custom TRACE level priority that is used
+     | by the JBoss internals to diagnose low level details. This example
+     | turns on TRACE level msgs for the org.jboss.ejb.plugins package and its
+     | subpackages. This will produce A LOT of logging output.
+       If you use replace the log4j 1.2 jar with a 1.1.3 jar you will need to
+       change this from XLevel to XPriority.
+  <category name="org.jboss.system">
+    <priority value="TRACE" class="org.jboss.logging.XLevel"/>
+  </category>
+  <category name="org.jboss.ejb.plugins">
+    <priority value="TRACE" class="org.jboss.logging.XLevel"/>
+  </category>
+  -->
+
+  <!-- ======================= -->
+  <!-- Setup the Root category -->
+  <!-- ======================= -->
+
+  <root>
+    <appender-ref ref="CONSOLE"/>
+    <appender-ref ref="FILE"/>
+  </root>
+  
+  <!-- Clustering logging -->
+  <!-- Uncomment the following to redirect the org.javagroups and
+     org.jboss.ha categories to a cluster.log file.
+
+  <appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender">
+    <param name="File" value="${jboss.server.home.dir}/log/cluster.log"/>
+    <param name="Append" value="false"/>
+    <param name="MaxFileSize" value="500KB"/>
+    <param name="MaxBackupIndex" value="1"/>
+
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+    </layout>	    
+  </appender>
+  <category name="org.javagroups">
+    <priority value="DEBUG" />
+    <appender-ref ref="CLUSTER"/>
+  </category>
+  <category name="org.jboss.ha">
+    <priority value="DEBUG" />
+    <appender-ref ref="CLUSTER"/>
+  </category>
+  -->
+
+</log4j:configuration>
diff --git a/3.0.4/config/jboss/conf/login-config.xml b/3.0.4/config/jboss/conf/login-config.xml
new file mode 100644
index 0000000..7760d26
--- /dev/null
+++ b/3.0.4/config/jboss/conf/login-config.xml
@@ -0,0 +1,122 @@
+<?xml version='1.0'?>
+<!DOCTYPE policy PUBLIC
+      "-//JBoss//DTD JBOSS Security Config 3.0//EN"
+      "http://www.jboss.org/j2ee/dtd/security_config.dtd">
+
+<!-- The XML based JAAS login configuration read by the
+org.jboss.security.auth.login.XMLLoginConfig mbean. Add
+an application-policy element for each security domain.
+
+The outline of the application-policy is:
+<application-policy name="security-domain-name">
+  <authentication>
+    <login-module code="login.module1.class.name" flag="control_flag">
+      <module-option name = "option1-name">option1-value</module-option>
+      <module-option name = "option2-name">option2-value</module-option>
+      ...
+    </login-module>
+
+    <login-module code="login.module2.class.name" flag="control_flag">
+      ...
+    </login-module>
+    ...
+  </authentication>
+</application-policy>
+
+$Revision$
+-->
+
+<policy>
+    <!-- Used by clients within the application server VM such as
+    mbeans and servlets that access EJBs.
+    -->
+    <application-policy name = "client-login">
+       <authentication>
+          <login-module code = "org.jboss.security.ClientLoginModule"
+             flag = "required">
+          </login-module>
+       </authentication>
+    </application-policy>
+
+    <!-- Security domain for JBossMQ -->
+    <application-policy name = "jbossmq">
+       <authentication>
+          <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule"
+             flag = "required">
+             <module-option name = "unauthenticatedIdentity">guest</module-option>
+	     <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option>
+          </login-module>
+       </authentication>
+    </application-policy>
+
+    <!-- Security domains for testing new jca framework -->
+    <application-policy name = "HsqlDbRealm">
+       <authentication>
+          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+             flag = "required">
+             <module-option name = "principal">sa</module-option>
+             <module-option name = "userName">sa</module-option>
+             <module-option name = "password"></module-option>
+             <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=hsqldbDS</module-option>
+          </login-module>
+       </authentication>
+    </application-policy>
+
+    <application-policy name = "FirebirdDBRealm">
+       <authentication>
+          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+             flag = "required">
+             <module-option name = "principal">sysdba</module-option>
+             <module-option name = "userName">sysdba</module-option>
+             <module-option name = "password">masterkey</module-option>
+             <module-option name = "managedConnectionFactoryName">jboss.jca:service=XaTxCM,name=FirebirdDS</module-option>
+          </login-module>
+       </authentication>
+    </application-policy>
+
+    <application-policy name = "JmsXARealm">
+       <authentication>
+          <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+             flag = "required">
+             <module-option name = "principal">guest</module-option>
+             <module-option name = "userName">guest</module-option>
+             <module-option name = "password">guest</module-option>
+             <module-option name = "managedConnectionFactoryName">jboss.jca:service=XaTxCM,name=jmsra</module-option>
+          </login-module>
+       </authentication>
+    </application-policy>
+
+    <!-- A template configuration for the jmx-console web application. This
+      defaults to the UsersRolesLoginModule the same as other and should be
+      changed to a stronger authentication mechanism as required.
+    -->
+    <application-policy name = "jmx-console">
+       <authentication>
+          <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
+             flag = "required" />
+       </authentication>
+    </application-policy>
+
+    <!-- The default login configuration used by any security domain that
+    does not have a application-policy entry with a matching name
+    -->
+    <application-policy name = "other">
+       <!-- A simple server login module, which can be used when the number 
+       of users is relatively small. It uses two properties files:
+       users.properties, which holds users (key) and their password (value).
+       roles.properties, which holds users (key) and a comma-separated list of
+       their roles (value).
+       The unauthenticatedIdentity property defines the name of the principal
+       that will be used when a null username and password are presented as is
+       the case for an unuathenticated web client or MDB. If you want to
+       allow such users to be authenticated add the property, e.g.,
+       unauthenticatedIdentity="nobody"
+       -->
+       <authentication>
+          <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule"
+             flag = "required" />
+       </authentication>
+    </application-policy>
+
+</policy>
+
diff --git a/3.0.4/config/jboss/conf/server.policy b/3.0.4/config/jboss/conf/server.policy
new file mode 100644
index 0000000..da69056
--- /dev/null
+++ b/3.0.4/config/jboss/conf/server.policy
@@ -0,0 +1,12 @@
+/// ====================================================================== ///
+//                                                                          //
+//  JBoss Security Policy                                                   //
+//                                                                          //
+/// ====================================================================== ///
+
+// $Id$
+
+grant {
+   // Allow everything for now
+   permission java.security.AllPermission;
+};
diff --git a/3.0.4/config/jboss/conf/standardjaws.xml b/3.0.4/config/jboss/conf/standardjaws.xml
new file mode 100644
index 0000000..f9deeb4
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjaws.xml
@@ -0,0 +1,1267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE jbosscmp-jdbc PUBLIC
+    "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN"
+    "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  Standard Jaws Configuration                                          -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<jaws>
+   <datasource>java:/DefaultDS</datasource>
+   <type-mapping>Hypersonic SQL</type-mapping>
+   <debug>false</debug>
+
+   <default-entity>
+      <create-table>true</create-table>
+      <remove-table>false</remove-table>
+      <tuned-updates>true</tuned-updates>
+      <read-only>false</read-only>
+      <time-out>300</time-out>
+      <row-locking>false</row-locking>
+      <read-ahead>false</read-ahead>
+   </default-entity>
+
+   <type-mappings>
+      <type-mapping-definition>
+	 <name>InterBase</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>NUMERIC(18,0)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE PRECISION</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(64)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>VARCHAR(2000)</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>DB2</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <!--  DB2 does not appear to support columns of type "byte"
+	 Regrettably, this means they'll be serialized.
+      <mapping>
+      <java-type>java.lang.Byte</java-type>
+      <jdbc-type>CHAR</jdbc-type>
+      <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+      </mapping>
+	 -->
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>BIGINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>REAL</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(254)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>BLOB(2000)</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>Oracle8</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>NUMBER(1)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>NUMERIC</jdbc-type>
+	    <sql-type>NUMBER(3)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>NUMERIC</jdbc-type>
+	    <sql-type>NUMBER(5)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>NUMBER(10)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>NUMBER(19)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>NUMBER(38,7)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.math.BigDecimal</java-type>
+	    <jdbc-type>DECIMAL</jdbc-type>
+	    <sql-type>NUMBER(38,15)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>NUMBER(38,15)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR2(255)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>BLOB</jdbc-type>
+	    <sql-type>BLOB</sql-type>
+	    <!-- Change this from BLOB to RAW(255) if you know your
+	    serialized object will be <= 255 bytes -->
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>Oracle7</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>NUMBER(1)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>NUMERIC</jdbc-type>
+	    <sql-type>NUMBER(3)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>NUMERIC</jdbc-type>
+	    <sql-type>NUMBER(5)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>NUMBER(10)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>NUMBER(19)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>NUMBER(38,7)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>NUMBER(38,15)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR2(255)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>LONG RAW</sql-type>
+	    <!-- Change this from LONG RAW to RAW(255) if you know your
+	    serialized object will be <= 255 bytes -->
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>Sybase</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BIT</sql-type>
+	 </mapping>
+	 <!-- Current Sybase JDBC drivers (jConnect 5.2) don't support
+	 byte or short.  Unfortunately they'll be serialized.
+      <mapping>
+      <java-type>java.lang.Byte</java-type>
+      <jdbc-type>TINYINT</jdbc-type>
+      <sql-type>TINYINT</sql-type>
+      </mapping>
+      <mapping>
+      <java-type>java.lang.Short</java-type>
+      <jdbc-type>SMALLINT</jdbc-type>
+      <sql-type>SMALLINT</sql-type>
+      </mapping>
+	 -->
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>NUMERIC</jdbc-type>
+	    <sql-type>NUMERIC(38,0)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>REAL</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE PRECISION</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(255)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>SMALLDATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>IMAGE</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>PostgreSQL</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>BOOLEAN</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>INT2</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>INT2</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INT4</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>INT8</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT(7)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>FLOAT8</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR(1)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>TEXT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>OID</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>PostgreSQL 7.2</name>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>BOOLEAN</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>INT2</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>INT2</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INT4</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>INT8</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT(7)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>FLOAT8</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR(1)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>TEXT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>OID</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+      
+      <type-mapping-definition>
+	 <name>Hypersonic SQL</name>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BIT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>OBJECT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>REAL</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>BIGINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>PointBase</name>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BINARY</jdbc-type>
+	    <sql-type>BOOLEAN</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>BLOB</jdbc-type>
+	    <sql-type>BLOB</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>SOLID</name>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>TINYINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>BLOB</jdbc-type>
+	    <sql-type>BLOB</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BIT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>BIGINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>mySQL</name>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>TINYINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>BLOB</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>TINYINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>BIGINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(255) BINARY</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>BIGINT</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>MS SQLSERVER</name>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>DECIMAL</jdbc-type>
+	    <sql-type>DECIMAL(20)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.math.BigDecimal</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>IMAGE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>TINYINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATETIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BIT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition> 
+	 <name>MS SQLSERVER2000</name> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Integer</java-type> 
+	    <jdbc-type>INTEGER</jdbc-type> 
+	    <sql-type>INTEGER</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Character</java-type> 
+	    <jdbc-type>CHAR</jdbc-type> 
+	    <sql-type>CHAR</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Short</java-type> 
+	    <jdbc-type>SMALLINT</jdbc-type> 
+	    <sql-type>SMALLINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Long</java-type> 
+	    <jdbc-type>BIGINT</jdbc-type> 
+	    <sql-type>BIGINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.math.BigDecimal</java-type> 
+	    <jdbc-type>VARCHAR</jdbc-type> 
+	    <sql-type>VARCHAR(256)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.String</java-type> 
+	    <jdbc-type>VARCHAR</jdbc-type> 
+	    <sql-type>VARCHAR(256)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Object</java-type> 
+	    <jdbc-type>JAVA_OBJECT</jdbc-type> 
+	    <sql-type>IMAGE</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Byte</java-type> 
+	    <jdbc-type>TINYINT</jdbc-type> 
+	    <sql-type>TINYINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Timestamp</java-type> 
+	    <jdbc-type>TIMESTAMP</jdbc-type> 
+	    <sql-type>TIMESTAMP</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Date</java-type> 
+	    <jdbc-type>DATE</jdbc-type> 
+	    <sql-type>DATETIME</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Time</java-type> 
+	    <jdbc-type>TIME</jdbc-type> 
+	    <sql-type>DATETIME</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.util.Date</java-type> 
+	    <jdbc-type>DATE</jdbc-type> 
+	    <sql-type>DATETIME</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Boolean</java-type> 
+	    <jdbc-type>BIT</jdbc-type> 
+	    <sql-type>BIT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Float</java-type> 
+	    <jdbc-type>REAL</jdbc-type> 
+	    <sql-type>REAL</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Double</java-type> 
+	    <jdbc-type>DOUBLE</jdbc-type> 
+	    <sql-type>FLOAT</sql-type> 
+	 </mapping> 
+      </type-mapping-definition>
+      
+      <type-mapping-definition>
+	 <name>DB2/400</name>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR(1)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <!-- Apparent DB2/400 doesn't handle Byte type either
+      <mapping>
+      <java-type>java.lang.Byte</java-type>
+      <jdbc-type>CHAR</jdbc-type>
+      <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+      </mapping>
+	 -->
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR(5)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>VARCHAR(4096) FOR BIT DATA</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>SapDB</name>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>VARCHAR</jdbc-type>
+	    <sql-type>VARCHAR(256)</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>LONG BYTE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>CHAR BYTE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.util.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BOOLEAN</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>FLOAT</jdbc-type>
+	    <sql-type>FLOAT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE PRECISION</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>DECIMAL</jdbc-type>
+	    <sql-type>DECIMAL(20)</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      <type-mapping-definition>
+	 <name>Cloudscape</name>
+	 <mapping>
+	    <java-type>java.math.BigDecimal</java-type>
+	    <jdbc-type>LONGVARCHAR</jdbc-type>
+	    <sql-type>LONG VARCHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Boolean</java-type>
+	    <jdbc-type>BIT</jdbc-type>
+	    <sql-type>BOOLEAN</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Byte</java-type>
+	    <jdbc-type>TINYINT</jdbc-type>
+	    <sql-type>TINYINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Short</java-type>
+	    <jdbc-type>SMALLINT</jdbc-type>
+	    <sql-type>SMALLINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Integer</java-type>
+	    <jdbc-type>INTEGER</jdbc-type>
+	    <sql-type>INTEGER</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Long</java-type>
+	    <jdbc-type>BIGINT</jdbc-type>
+	    <sql-type>LONGINT</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Float</java-type>
+	    <jdbc-type>REAL</jdbc-type>
+	    <sql-type>REAL</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Double</java-type>
+	    <jdbc-type>DOUBLE</jdbc-type>
+	    <sql-type>DOUBLE PRECISION</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Character</java-type>
+	    <jdbc-type>CHAR</jdbc-type>
+	    <sql-type>CHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.String</java-type>
+	    <jdbc-type>LONGVARCHAR</jdbc-type>
+	    <sql-type>LONG VARCHAR</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Date</java-type>
+	    <jdbc-type>DATE</jdbc-type>
+	    <sql-type>DATE</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Time</java-type>
+	    <jdbc-type>TIME</jdbc-type>
+	    <sql-type>TIME</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.sql.Timestamp</java-type>
+	    <jdbc-type>TIMESTAMP</jdbc-type>
+	    <sql-type>TIMESTAMP</sql-type>
+	 </mapping>
+	 <mapping>
+	    <java-type>java.lang.Object</java-type>
+	    <jdbc-type>JAVA_OBJECT</jdbc-type>
+	    <sql-type>LONG VARBINARY</sql-type>
+	 </mapping>
+      </type-mapping-definition>
+
+      
+      <type-mapping-definition> 
+	 <name>InformixDB</name> 
+	 <mapping> 
+	    <java-type>java.lang.Character</java-type> 
+	    <jdbc-type>CHAR</jdbc-type> 
+	    <sql-type>CHAR(1)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.String</java-type> 
+	    <jdbc-type>VARCHAR</jdbc-type> 
+	    <sql-type>VARCHAR(255,0)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.math.BigDecimal</java-type> 
+	    <jdbc-type>NUMERIC</jdbc-type> 
+	    <sql-type>DECIMAL</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Boolean</java-type> 
+	    <jdbc-type>BIT</jdbc-type> 
+	    <sql-type>SMALLINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Integer</java-type> 
+	    <jdbc-type>INTEGER</jdbc-type> 
+	    <sql-type>INTEGER</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Long</java-type> 
+	    <jdbc-type>BIGINT</jdbc-type> 
+	    <sql-type>NUMERIC(18,0)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Float</java-type> 
+	    <jdbc-type>REAL</jdbc-type> 
+	    <sql-type>FLOAT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Double</java-type> 
+	    <jdbc-type>DOUBLE</jdbc-type> 
+	    <sql-type>DOUBLE PRECISION</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Byte</java-type> 
+	    <jdbc-type>TINYINT</jdbc-type> 
+	    <sql-type>SMALLINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Short</java-type> 
+	    <jdbc-type>SMALLINT</jdbc-type> 
+	    <sql-type>SMALLINT</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.util.Date</java-type> 
+	    <jdbc-type>DATE</jdbc-type> 
+	    <sql-type>DATE</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Date</java-type> 
+	    <jdbc-type>DATE</jdbc-type> 
+	    <sql-type>DATE</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Time</java-type> 
+	    <jdbc-type>TIME</jdbc-type> 
+	    <sql-type>TIME</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.sql.Timestamp</java-type> 
+	    <jdbc-type>TIMESTAMP</jdbc-type> 
+	    <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type> 
+	 </mapping> 
+	 
+	 <mapping> 
+	    <java-type>java.lang.Object</java-type> 
+	    <jdbc-type>JAVA_OBJECT</jdbc-type> 
+	    <sql-type>BYTE</sql-type> 
+	 </mapping> 
+      </type-mapping-definition> 
+
+   </type-mappings>
+</jaws>
diff --git a/3.0.4/config/jboss/conf/standardjboss.xml b/3.0.4/config/jboss/conf/standardjboss.xml
new file mode 100644
index 0000000..fdd3fc1
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjboss.xml
@@ -0,0 +1,992 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  Standard JBoss Configuration                                         -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+<jboss>
+	<enforce-ejb-restrictions>false</enforce-ejb-restrictions>
+	<container-configurations>
+		<container-configuration>
+			<container-name>Standard CMP 2.x EntityBean</container-name>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>    
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+				<interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Instance Per Transaction CMP 2.x EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>    
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Standard CMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>    
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>A</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Instance Per Transaction CMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>    
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>A</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Clustered CMP 2.x EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Clustered CMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Standard Stateless SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+         </container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+			<instance-cache/>
+			<persistence-manager/>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Clustered Stateless SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+         </container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+			<instance-cache/>
+			<persistence-manager/>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Standard Stateful SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+            <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.StatefulSessionInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+			</client-interceptors>
+			<instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<remover-period>1800</remover-period>
+					<max-bean-life>1800</max-bean-life>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Clustered Stateful SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+            <interceptor>org.jboss.ejb.plugins.StatefulHASessionSynchronisationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.StatefulSessionInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+			</client-interceptors>
+			<instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.StatefulHASessionPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<remover-period>1800</remover-period>
+					<max-bean-life>1800</max-bean-life>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Standard BMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+	                        <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>A</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Instance Per Transaction BMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Clustered BMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+                                <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+                                <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+				<list-entity>
+					<interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</list-entity>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>Standard Message Driven Bean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.ejb.plugins.jms.JMSContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.RunAsSecurityInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.MessageDrivenTxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>    <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+        </container-interceptors>
+			<client-interceptors>
+				<home>
+					<interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</home>
+				<bean>
+					<interceptor>new org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+					<interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+					<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+				</bean>
+			</client-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.MessageDrivenInstancePool</instance-pool>
+			<instance-cache/>
+			<persistence-manager/>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<container-invoker-conf>
+				<JMSProviderAdapterJNDI>DefaultJMSProvider</JMSProviderAdapterJNDI>
+				<ServerSessionPoolFactoryJNDI>StdJMSPool</ServerSessionPoolFactoryJNDI>
+				<MaximumSize>15</MaximumSize>
+				<MaxMessages>1</MaxMessages>
+				<MDBConfig>
+					<ReconnectIntervalSec>10</ReconnectIntervalSec>
+					<DLQConfig>
+						<DestinationQueue>queue/DLQ</DestinationQueue>
+						<MaxTimesRedelivered>10</MaxTimesRedelivered>
+						<TimeToLive>0</TimeToLive>
+					</DLQConfig>
+				</MDBConfig>
+			</container-invoker-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>IIOP CMP 2.x EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+			</container-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>B</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>IIOP CMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>A</commit-option>
+		</container-configuration>
+		<container-configuration>
+			<container-name>IIOP Stateless SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<!-- CMT -->
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+			</container-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+			<instance-cache/>
+			<persistence-manager/>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>IIOP Stateful SessionBean</container-name>
+			<call-logging>false</call-logging>
+			<container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<!-- CMT -->
+
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<!-- BMT -->
+
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+				<interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+				<interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+			</container-interceptors>
+			<instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<remover-period>1800</remover-period>
+					<max-bean-life>1800</max-bean-life>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+		</container-configuration>
+		<container-configuration>
+			<container-name>IIOP BMP EntityBean</container-name>
+			<call-logging>false</call-logging>
+			<sync-on-commit-only>false</sync-on-commit-only>
+			<container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+			<container-interceptors>
+				<interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+				<interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+				<interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+			</container-interceptors>
+			<instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+			<instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+			<persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+			<transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+			<web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+			<locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+			<container-cache-conf>
+				<cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+				<cache-policy-conf>
+					<min-capacity>50</min-capacity>
+					<max-capacity>1000000</max-capacity>
+					<overager-period>300</overager-period>
+					<max-bean-age>600</max-bean-age>
+					<resizer-period>400</resizer-period>
+					<max-cache-miss-period>60</max-cache-miss-period>
+					<min-cache-miss-period>1</min-cache-miss-period>
+					<cache-load-factor>0.75</cache-load-factor>
+				</cache-policy-conf>
+			</container-cache-conf>
+			<container-pool-conf>
+				<MaximumSize>100</MaximumSize>
+			</container-pool-conf>
+			<commit-option>A</commit-option>
+		</container-configuration>
+	</container-configurations>
+</jboss>
diff --git a/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml b/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml
new file mode 100644
index 0000000..8bc80b7
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml
@@ -0,0 +1,2005 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE jbosscmp-jdbc>
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  Standard JBossCMP-JDBC Configuration                                 -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<jbosscmp-jdbc>
+   
+   <defaults>
+      <datasource>java:/DefaultDS</datasource>
+      <datasource-mapping>Hypersonic SQL</datasource-mapping>
+      
+      <create-table>true</create-table>
+      <remove-table>false</remove-table>
+      <read-only>false</read-only>
+      <time-out>300</time-out>
+      <pk-constraint>true</pk-constraint>
+      <fk-constraint>false</fk-constraint>
+      <row-locking>false</row-locking>
+      <preferred-relation-mapping>foreign-key</preferred-relation-mapping>
+      <read-ahead>
+      <strategy>on-load</strategy>
+      <page-size>1000</page-size>
+      <eager-load-group>*</eager-load-group>
+      </read-ahead>
+      <list-cache-max>1000</list-cache-max>
+   </defaults>
+
+   <type-mappings>
+     <type-mapping>
+      <name>McKoi</name>
+      <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+      <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+      <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+      <alias-header-prefix>t</alias-header-prefix>
+      <alias-header-suffix>_</alias-header-suffix>
+      <alias-max-length>32</alias-max-length>
+      <subquery-supported>true</subquery-supported>
+      <true-mapping>TRUE</true-mapping>
+      <false-mapping>FALSE</false-mapping>
+
+      <mapping>
+         <java-type>java.lang.Boolean</java-type>
+         <jdbc-type>BIT</jdbc-type>
+         <sql-type>BOOLEAN</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Byte</java-type>
+         <jdbc-type>TINYINT</jdbc-type>
+         <sql-type>SMALLINT</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Short</java-type>
+         <jdbc-type>SMALLINT</jdbc-type>
+         <sql-type>SMALLINT</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Integer</java-type>
+         <jdbc-type>INTEGER</jdbc-type>
+         <sql-type>INTEGER</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Long</java-type>
+         <jdbc-type>BIGINT</jdbc-type>
+         <sql-type>BIGINT</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Float</java-type>
+         <jdbc-type>REAL</jdbc-type>
+         <sql-type>FLOAT</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Double</java-type>
+         <jdbc-type>DOUBLE</jdbc-type>
+         <sql-type>DOUBLE</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Character</java-type>
+         <jdbc-type>CHAR</jdbc-type>
+         <sql-type>CHAR</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.String</java-type>
+         <jdbc-type>VARCHAR</jdbc-type>
+         <sql-type>VARCHAR(64)</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.sql.Date</java-type>
+         <jdbc-type>DATE</jdbc-type>
+         <sql-type>DATE</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.sql.Time</java-type>
+         <jdbc-type>TIME</jdbc-type>
+         <sql-type>TIME</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.sql.Timestamp</java-type>
+         <jdbc-type>TIMESTAMP</jdbc-type>
+         <sql-type>TIMESTAMP</sql-type>
+      </mapping>
+      <mapping>
+         <java-type>java.lang.Object</java-type>
+         <jdbc-type>JAVA_OBJECT</jdbc-type>
+         <sql-type>JAVA_OBJECT</sql-type>
+      </mapping>
+   </type-mapping>
+   
+      <type-mapping>
+         <name>InterBase</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>NUMERIC(18,0)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE PRECISION</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(64)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>VARCHAR(2000)</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>DB2</name>
+         <row-locking-template/>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+    <!--  DB2 does not appear to support columns of type "byte"
+    Regrettably, this means they'll be serialized.
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+         </mapping>
+    -->
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>BIGINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>REAL</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(254)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>BLOB(2000)</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Oracle9i</name>
+         <!--
+         | Make sure that you have the Oracle 9i version of classes12.jar
+         | or you will suffer 
+         -->
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>30</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substr(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>instr(?2, ?1, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>NUMBER(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>NUMBER(3)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMBER(5)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>NUMBER(10)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>NUMBER(19)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>NUMBER(38,7)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>DECIMAL</jdbc-type>
+            <sql-type>NUMBER(38,15)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>NUMBER(38,15)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR2(255)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP(3)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP(9)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>BLOB</jdbc-type>
+            <sql-type>BLOB</sql-type>
+            <!--
+            | Change this from BLOB to RAW(n) if you know your
+            | serialized object will be <= n bytes and n <= 2000
+            -->
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Oracle8</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>30</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substr(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>instr(?2, ?1, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>NUMBER(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMBER(3)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMBER(5)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>NUMBER(10)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>NUMBER(19)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>NUMBER(38,7)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>DECIMAL</jdbc-type>
+            <sql-type>NUMBER(38,15)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>NUMBER(38,15)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR2(255)</sql-type>
+         </mapping>
+         <mapping>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>BLOB</jdbc-type>
+            <sql-type>BLOB</sql-type>
+            <!--
+            | Change this from BLOB to RAW(n) if you know your
+            | serialized object will be <= n bytes and n <= 2000
+            -->
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Oracle7</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>30</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substr(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>instr(?2, ?1, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>NUMBER(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMBER(3)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMBER(5)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>NUMBER(10)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>NUMBER(19)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>NUMBER(38,7)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>NUMBER(38,15)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR2(255)</sql-type>
+         </mapping>
+         <mapping>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>LONGVARBINARY</jdbc-type>
+            <sql-type>LONG RAW</sql-type>
+            <!--
+            | Change this from LONG RAW to RAW(n) if you know your
+            | serialized object will be <= n bytes and n <= 2000
+            | Oracle only permits one LONG type per table
+            -->
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Sybase</name>
+         <row-locking-template/>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BIT</sql-type>
+         </mapping>
+    <!-- Current Sybase JDBC drivers (jConnect 5.2) don't support
+    byte or short.  Unfortunately they'll be serialized.
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+    -->
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMERIC(38,0)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>REAL</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE PRECISION</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(255)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>SMALLDATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>IMAGE</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>PostgreSQL</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>TRUE</true-mapping>
+         <false-mapping>FALSE</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>(CASE position(?1 in substring(?2 from ?3)) WHEN 0 THEN 0 ELSE position(?1 in substring(?2 from ?3)) + ?3 - 1 END)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(CAST(?1 AS double precision))</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+    
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>BOOLEAN</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>INT2</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>INT2</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INT4</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>INT8</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT(7)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>FLOAT8</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>TEXT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMERIC</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>VARBINARY</jdbc-type>
+            <sql-type>BYTEA</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>PostgreSQL 7.2</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>TRUE</true-mapping>
+         <false-mapping>FALSE</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>(CASE position(?1 in substring(?2 from ?3)) WHEN 0 THEN 0 ELSE position(?1 in substring(?2 from ?3)) + ?3 - 1 END)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(CAST(?1 AS double precision))</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+    
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>BOOLEAN</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>INT2</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>INT2</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INT4</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>INT8</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT(7)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>FLOAT8</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>TEXT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>NUMERIC</jdbc-type>
+            <sql-type>NUMERIC</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>VARBINARY</jdbc-type>
+            <sql-type>BYTEA</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Hypersonic SQL</name>
+         <row-locking-template/>    
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template/>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>(1=1)</true-mapping>
+         <false-mapping>(1=0)</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 || ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>SUBSTRING(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lcase(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>LENGTH(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>LOCATE(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>ABS(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>SQRT(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>ucase(?1)</function-sql>
+         </function-mapping>    
+
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BIT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <!-- hsqldb only supports directly serializable objects for sql type OBJECT -->
+            <jdbc-type>VARBINARY</jdbc-type>
+            <sql-type>VARBINARY</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>REAL</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>BIGINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>DECIMAL</jdbc-type>
+            <sql-type>DECIMAL</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>PointBase</name>
+         <row-locking-template/>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BINARY</jdbc-type>
+            <sql-type>BOOLEAN</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>BLOB</jdbc-type>
+            <sql-type>BLOB</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>SOLID</name>
+         <row-locking-template/>
+         <pk-constraint-template>PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>BLOB</jdbc-type>
+            <sql-type>BLOB</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BIT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>BIGINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>mySQL</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD INDEX ind_?3 (?3), ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>false</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>concat(?1, ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>length(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>locate(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>BLOB</jdbc-type>
+            <sql-type>LONGBLOB</sql-type>
+            <!--
+            | Change this from LONGBLOB to BLOB if you know your
+            | serialized object will be <= 2^16 bytes
+            -->
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+            <!--
+            | This type is problematical because mysql does not have any 
+            | date/time types that store milliseconds. You should avoid it.
+            -->
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>BIGINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(250) BINARY</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>MS SQLSERVER</name>
+         <row-locking-template>SELECT ?1 FROM ?2 with (rowlock) WHERE ?3</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 + ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substring(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>len(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>charindex(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+    
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>DECIMAL</jdbc-type>
+            <sql-type>DECIMAL(20)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>IMAGE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>DATETIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BIT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping> 
+         <name>MS SQLSERVER2000</name> 
+         <row-locking-template>SELECT ?1 FROM ?2 with (rowlock) WHERE ?3</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <function-mapping>
+            <function-name>concat</function-name>
+            <function-sql>(?1 + ?2)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>substring</function-name>
+            <function-sql>substring(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>lcase</function-name>
+            <function-sql>lower(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>length</function-name>
+            <function-sql>len(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>locate</function-name>
+            <function-sql>charindex(?1, ?2, ?3)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>abs</function-name>
+            <function-sql>abs(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>sqrt</function-name>
+            <function-sql>sqrt(?1)</function-sql>
+         </function-mapping>    
+         <function-mapping>
+            <function-name>ucase</function-name>
+            <function-sql>upper(?1)</function-sql>
+         </function-mapping>    
+    
+         <mapping> 
+            <java-type>java.lang.Integer</java-type> 
+            <jdbc-type>INTEGER</jdbc-type> 
+            <sql-type>INTEGER</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Character</java-type> 
+            <jdbc-type>CHAR</jdbc-type> 
+            <sql-type>CHAR</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Short</java-type> 
+            <jdbc-type>SMALLINT</jdbc-type> 
+            <sql-type>SMALLINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Long</java-type> 
+            <jdbc-type>BIGINT</jdbc-type> 
+            <sql-type>BIGINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.math.BigDecimal</java-type> 
+            <jdbc-type>VARCHAR</jdbc-type> 
+            <sql-type>VARCHAR(256)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.String</java-type> 
+            <jdbc-type>VARCHAR</jdbc-type> 
+            <sql-type>VARCHAR(256)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Object</java-type> 
+            <jdbc-type>JAVA_OBJECT</jdbc-type> 
+            <sql-type>IMAGE</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Byte</java-type> 
+            <jdbc-type>TINYINT</jdbc-type> 
+            <sql-type>TINYINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <!--
+            | Note that you lose granularity here
+            | Use a numeric type and store milliseconds if you really need it
+            -->
+            <java-type>java.sql.Timestamp</java-type> 
+            <jdbc-type>TIMESTAMP</jdbc-type> 
+            <sql-type>DATETIME</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.sql.Date</java-type> 
+            <jdbc-type>DATE</jdbc-type> 
+            <sql-type>DATETIME</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.sql.Time</java-type> 
+            <jdbc-type>TIME</jdbc-type> 
+            <sql-type>DATETIME</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.util.Date</java-type> 
+            <jdbc-type>TIMESTAMP</jdbc-type> 
+            <sql-type>DATETIME</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Boolean</java-type> 
+            <jdbc-type>BIT</jdbc-type> 
+            <sql-type>BIT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Float</java-type> 
+            <jdbc-type>REAL</jdbc-type> 
+            <sql-type>REAL</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Double</java-type> 
+            <jdbc-type>DOUBLE</jdbc-type> 
+            <sql-type>FLOAT</sql-type> 
+         </mapping> 
+      </type-mapping>
+      
+      <type-mapping>
+         <name>DB2/400</name>
+         <row-locking-template/>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(1)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+    <!-- Apparent DB2/400 doesn't handle Byte type either
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+         </mapping>
+    -->
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR(5)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>VARCHAR(4096) FOR BIT DATA</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>SapDB</name>
+         <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>VARCHAR</jdbc-type>
+            <sql-type>VARCHAR(256)</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>LONG BYTE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>CHAR BYTE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.util.Date</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BOOLEAN</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>FLOAT</jdbc-type>
+            <sql-type>FLOAT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE PRECISION</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>DECIMAL</jdbc-type>
+            <sql-type>DECIMAL(20)</sql-type>
+         </mapping>
+      </type-mapping>
+
+      <type-mapping>
+         <name>Cloudscape</name>
+         <row-locking-template/>
+         <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping>
+            <java-type>java.math.BigDecimal</java-type>
+            <jdbc-type>LONGVARCHAR</jdbc-type>
+            <sql-type>LONG VARCHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Boolean</java-type>
+            <jdbc-type>BIT</jdbc-type>
+            <sql-type>BOOLEAN</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Byte</java-type>
+            <jdbc-type>TINYINT</jdbc-type>
+            <sql-type>TINYINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Short</java-type>
+            <jdbc-type>SMALLINT</jdbc-type>
+            <sql-type>SMALLINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Integer</java-type>
+            <jdbc-type>INTEGER</jdbc-type>
+            <sql-type>INTEGER</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Long</java-type>
+            <jdbc-type>BIGINT</jdbc-type>
+            <sql-type>LONGINT</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Float</java-type>
+            <jdbc-type>REAL</jdbc-type>
+            <sql-type>REAL</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Double</java-type>
+            <jdbc-type>DOUBLE</jdbc-type>
+            <sql-type>DOUBLE PRECISION</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Character</java-type>
+            <jdbc-type>CHAR</jdbc-type>
+            <sql-type>CHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.String</java-type>
+            <jdbc-type>LONGVARCHAR</jdbc-type>
+            <sql-type>LONG VARCHAR</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Date</java-type>
+            <jdbc-type>DATE</jdbc-type>
+            <sql-type>DATE</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Time</java-type>
+            <jdbc-type>TIME</jdbc-type>
+            <sql-type>TIME</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.sql.Timestamp</java-type>
+            <jdbc-type>TIMESTAMP</jdbc-type>
+            <sql-type>TIMESTAMP</sql-type>
+         </mapping>
+         <mapping>
+            <java-type>java.lang.Object</java-type>
+            <jdbc-type>JAVA_OBJECT</jdbc-type>
+            <sql-type>LONG VARBINARY</sql-type>
+         </mapping>
+      </type-mapping>
+
+      
+      <type-mapping> 
+         <name>InformixDB</name> 
+         <row-locking-template>select ?1 from ?2 where ?3 for update</row-locking-template>
+         <pk-constraint-template>PRIMARY KEY (?2) CONSTRAINT ?1</pk-constraint-template>
+         <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT FOREIGN KEY (?3) REFERENCES ?4 (?5) CONSTRAINT ?2</fk-constraint-template>
+         <alias-header-prefix>t</alias-header-prefix>
+         <alias-header-suffix>_</alias-header-suffix>
+         <alias-max-length>32</alias-max-length>
+         <subquery-supported>true</subquery-supported>
+         <true-mapping>1</true-mapping>
+         <false-mapping>0</false-mapping>
+
+         <mapping> 
+            <java-type>java.lang.Character</java-type> 
+            <jdbc-type>CHAR</jdbc-type> 
+            <sql-type>CHAR(1)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.String</java-type> 
+            <jdbc-type>VARCHAR</jdbc-type> 
+            <sql-type>VARCHAR(255,0)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.math.BigDecimal</java-type> 
+            <jdbc-type>NUMERIC</jdbc-type> 
+            <sql-type>DECIMAL</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Boolean</java-type> 
+            <jdbc-type>BIT</jdbc-type> 
+            <sql-type>SMALLINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Integer</java-type> 
+            <jdbc-type>INTEGER</jdbc-type> 
+            <sql-type>INTEGER</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Long</java-type> 
+            <jdbc-type>BIGINT</jdbc-type> 
+            <sql-type>NUMERIC(18,0)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Float</java-type> 
+            <jdbc-type>REAL</jdbc-type> 
+            <sql-type>FLOAT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Double</java-type> 
+            <jdbc-type>DOUBLE</jdbc-type> 
+            <sql-type>DOUBLE PRECISION</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Byte</java-type> 
+            <jdbc-type>TINYINT</jdbc-type> 
+            <sql-type>SMALLINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Short</java-type> 
+            <jdbc-type>SMALLINT</jdbc-type> 
+            <sql-type>SMALLINT</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.util.Date</java-type> 
+            <jdbc-type>TIMESTAMP</jdbc-type> 
+            <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.sql.Date</java-type> 
+            <jdbc-type>DATE</jdbc-type> 
+            <sql-type>DATE</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.sql.Time</java-type> 
+            <jdbc-type>TIME</jdbc-type> 
+            <sql-type>TIME</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.sql.Timestamp</java-type> 
+            <jdbc-type>TIMESTAMP</jdbc-type> 
+            <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type> 
+         </mapping> 
+    
+         <mapping> 
+            <java-type>java.lang.Object</java-type> 
+            <jdbc-type>JAVA_OBJECT</jdbc-type> 
+            <sql-type>BYTE</sql-type> 
+         </mapping> 
+      </type-mapping> 
+
+   </type-mappings>
+</jbosscmp-jdbc>
diff --git a/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml b/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml
new file mode 100644
index 0000000..61ad66c
--- /dev/null
+++ b/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<server>
+
+  <!-- ==================================================================== -->
+  <!-- Web Container                                                        -->
+  <!-- ==================================================================== -->
+
+  <!--
+     | Be sure to check that the configuration values are valid for your
+     | environment.
+   -->
+
+  <mbean code="org.jboss.jetty.JettyService" name="jboss.web:service=WebServer">
+
+    <!-- ================================================================= -->
+    <!-- Your webdefault.xml file - The default settings for every webapp  -->
+    <!-- deployed by Jetty. Make systemwide changes here to your webapps   -->
+    <!-- configurations.                                                   -->
+    <!-- ================================================================= -->
+
+    <attribute name="WebDefaultResource">webdefault.xml</attribute>
+
+    <!-- ================================================================== -->
+    <!-- If true, .war files are unpacked to a temporary directory. This    -->
+    <!-- is useful with JSPs.                                               -->
+    <!-- ================================================================== -->
+
+    <attribute name="UnpackWars">true</attribute>
+
+    <!-- ================================================================== -->
+    <!-- If true, Jetty first delegates loading a class to the webapp's     -->
+    <!-- parent class loader (a la Java 2). If false, Jetty follows the     -->
+    <!--  Servlet 2.3 specification, and tries the webapp's own loader      -->
+    <!-- first (for "non-system" classes)                                   -->
+    <!-- ================================================================== -->
+
+    <attribute name="Java2ClassLoadingCompliance">true</attribute>
+
+    <!-- ================================================================= -->
+    <!-- If you require JAAS authentication, configure the name of the     -->
+    <!-- attribute in which you expect to find the JAAS active subject:    -->
+    <!--                                                                   -->
+    <!-- Commenting out this configuration will disable JAAS support       -->
+    <!-- ================================================================= -->
+
+    <attribute name="SubjectAttributeName">j_subject</attribute>
+
+    <!-- ================================================================= -->
+    <!-- Configuring Jetty. The XML fragment contained in the              -->
+    <!-- name="ConfigurationElement" attribute is a Jetty-style            -->
+    <!-- configuration specification.  It is used to configure Jetty with  -->
+    <!-- a listener on port 8080, and a HTTP request log location.         -->
+    <!-- The placement here of other Jetty XML configuration statements    -->
+    <!-- for deploying webapps etc is not encouraged: if you REALLY NEED   -->
+    <!-- something extra, place it in WEB-INF/jetty-web.xml files          -->
+    <!-- ================================================================= -->
+
+    <attribute name="ConfigurationElement">
+      <Configure class="org.mortbay.jetty.Server">
+
+       <!-- =============================================================== -->
+       <!-- Configure the Request Listeners                                 -->
+       <!-- =============================================================== -->
+
+
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- Add and configure a HTTP listener to port 80                    -->
+       <!-- The default port can be changed using: java -Djetty.port=80     -->
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <Call name="addListener">
+         <Arg>
+          <New class="org.mortbay.http.SocketListener">
+            <Set name="Port"><SystemProperty name="jetty.port" default="80"/></Set>
+            <Set name="MinThreads">5</Set>
+            <Set name="MaxThreads">100</Set>
+            <Set name="MaxIdleTimeMs">30000</Set>
+            <Set name="LowResourcePersistTimeMs">5000</Set>
+          </New>
+         </Arg>
+       </Call>
+
+
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- Add a HTTPS SSL listener on port 8843                           -->
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- UNCOMMENT TO ACTIVATE
+       <Call name="addListener">
+         <Arg>
+           <New class="org.mortbay.http.SunJsseListener">
+            <Set name="Port">8443</Set>
+            <Set name="MinThreads">5</Set>
+            <Set name="MaxThreads">100</Set>
+            <Set name="MaxIdleTimeMs">30000</Set>
+            <Set name="LowResourcePersistTimeMs">2000</Set>
+            <Set name="Keystore"><SystemProperty name="jetty.home" default="."/>/etc/demokeystore</Set>
+            <Set name="Password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
+            <Set name="KeyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
+           </New>
+         </Arg>
+       </Call>
+       -->
+
+
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- Add a AJP13 listener on port 8009                               -->
+       <!-- This protocol can be used with mod_jk in apache, IIS etc.       -->
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <Call name="addListener">
+         <Arg>
+           <New class="org.mortbay.http.ajp.AJP13Listener">
+            <Set name="Port">8009</Set>
+            <Set name="MinThreads">5</Set>
+            <Set name="MaxThreads">255</Set>
+            <Set name="MaxIdleTimeMs">30000</Set>
+            <Set name="confidentialPort">443</Set>
+           </New>
+         </Arg>
+       </Call>
+
+		 <!-- Private assets are exposed by copying them to the
+		      specifyed directory and building a URI to the
+		      specified virtual folder. -->
+		      
+   <Call name="addContext">
+    <Arg>/private/*</Arg>
+    <Set name="ResourceBase">../server/tapestry/tmp/private</Set>
+    
+    <Call name="addHandler">
+      <Arg><New class="org.mortbay.http.handler.ResourceHandler"/></Arg>
+    </Call>
+    
+    <Call name="addHandler">
+    	<Arg><New class="org.mortbay.http.handler.NotFoundHandler"/></Arg>
+    </Call>
+  </Call>
+
+
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- Add and configure a NIO HTTP listener to port 8888              -->
+       <!-- This listener should be used to replace the standard HTTP       -->
+       <!-- listener when deployed on LARGE systems using jdk 1.4           -->
+       <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+       <!-- UNCOMMENT TO ACTIVATE
+       <Call name="addListener">
+         <Arg>
+           <New class="org.mortbay.http.SocketChannelListener">
+            <Set name="Port"><SystemProperty name="jetty.port" default="8888"/></Set>
+            <Set name="MinThreads">5</Set>
+            <Set name="MaxThreads">500</Set>
+            <Set name="MaxIdleTimeMs">30000</Set>
+           </New>
+         </Arg>
+       </Call>
+       -->
+       <!-- =============================================================== -->
+       <!-- Configure the Request Log                                       -->
+       <!-- =============================================================== -->
+       <Set name="RequestLog">
+         <New class="org.mortbay.http.NCSARequestLog">
+           <Arg><SystemProperty name="jboss.server.home.dir"/><SystemProperty name="jetty.log" default="/log"/>/yyyy_mm_dd.request.log
+           </Arg>
+           <Set name="retainDays">90</Set>
+           <Set name="append">true</Set>
+           <Set name="extended">true</Set>
+           <Set name="LogTimeZone">GMT</Set>
+         </New>
+       </Set>
+
+       <!-- ======================================================= -->
+       <!-- New Distributed Session Manager                         -->
+       <!-- ======================================================= -->
+
+       <!--
+       These can be set on a per webapp basis in WEB-INF/jetty-web.xml
+       -->
+
+      <Set name="DistributableSessionManagerPrototype">
+       <New class="org.mortbay.j2ee.session.Manager">
+        <Set name="scavengerPeriod">600</Set>
+        <!-- NYI
+        <Set name="workerName">node1</Set>
+        -->
+        <Set name="interceptorStack">
+         <Array type="org.mortbay.j2ee.session.StateInterceptor">
+<!--
+          <Item><New class="org.mortbay.j2ee.session.DebugInterceptor"/></Item>
+-->
+          <Item><New class="org.mortbay.j2ee.session.ValidatingInterceptor"/></Item>
+          <Item><New class="org.mortbay.j2ee.session.TypeCheckingInterceptor"/></Item>
+          <Item><New class="org.mortbay.j2ee.session.BindingInterceptor"/></Item>
+          <Item><New class="org.mortbay.j2ee.session.PublishingInterceptor"/></Item>
+          <Item><New class="org.mortbay.j2ee.session.SubscribingInterceptor"/></Item>
+          <Item><New class="org.mortbay.j2ee.session.SynchronizingInterceptor"/></Item>
+         </Array>
+        </Set>
+        <!-- Put this back in for distributable support under 'all' configuration
+        <Set name="store">
+         <New class="org.mortbay.j2ee.session.JGStore">
+          <Set name="actualMaxInactiveInterval">604800</Set>
+          <Set name="scavengerPeriod">3600</Set>
+          <Set name="scavengerExtraTime">900</Set>
+          <Set name="protocolStack">UDP(mcast_addr=228.8.8.8;mcast_port=45566;ip_ttl=32;ucast_recv_buf_size=16000;ucast_send_buf_size=16000;mcast_send_buf_size=32000;mcast_recv_buf_size=64000;loopback=true):PING(timeout=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.STABLE(desired_avg_gossip=20000):pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):UNICAST(timeout=2000):FRAG(frag_size=8192;down_thread=false;up_thread=false):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true):pbcast.STATE_TRANSFER</Set>
+          <Set name="subClusterName">DefaultSubCluster</Set>
+          <Set name="retrievalTimeOut">20000</Set>
+          <Set name="distributionTimeOut">5000</Set>
+          <Set name="distributionMode">GET_ALL</Set>
+         </New>
+        </Set>
+        -->
+       </New>
+      </Set>
+
+      <!-- For testing the Distributable SessionManager with e.g. Watchdog -->
+      <!--
+      <Set name="forceDistributable">true</Set>
+      -->
+
+      </Configure>
+     </attribute>
+
+  </mbean>
+
+  <!-- ==================================================================== -->
+  <!-- ==================================================================== -->
+
+</server>
diff --git a/3.0.4/config/jboss/deploy/mckoi-service.xml b/3.0.4/config/jboss/deploy/mckoi-service.xml
new file mode 100644
index 0000000..52797b2
--- /dev/null
+++ b/3.0.4/config/jboss/deploy/mckoi-service.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!--                                                                       -->
+<!--  McKoi Database 1.00 configuration                                    -->
+<!--                                                                       -->
+<!-- ===================================================================== -->
+
+<!-- This is basically a cut-and-paste of the Solid example service, modified
+     for McKoi DB.  This required McKoi release 1.00, which includes
+     the MBean implementation that allow it to operate within JBoss
+     (previously, a seperate MBean JAR file was needed). -->
+      
+
+<server>
+
+	<!-- The current working directory is the JBoss/bin directory, so this
+		 relative path works. -->
+		 
+	<mbean code="net.sf.tapestry.contrib.mckoi.McKoiDB" name="jboss:service=McKoiDB">
+  		<attribute name="ConfigPath">../server/tapestry/db/tapestry.conf</attribute>
+	</mbean>
+	  		
+
+  <mbean
+  	code="org.jboss.resource.connectionmanager.LocalTxConnectionManager" 
+  	name="jboss.jca:service=LocalTxCM,name=McKoiDB">
+
+    <depends>jboss:service=McKoiDB</depends>
+      
+    <depends optional-attribute-name="ManagedConnectionFactoryName">
+      
+      <!--embedded mbean-->
+      <mbean
+      	code="org.jboss.resource.connectionmanager.RARDeployment" 
+      	name="jboss.jca:service=LocalTxDS,name=McKoiDB">
+
+        <attribute name="JndiName">McKoiDB</attribute>
+        
+        <!--NOTE: Solid wants the username/password in the URL, it will 
+            ignore the specific arguments.-->
+        <attribute name="ManagedConnectionFactoryProperties">
+          <properties>
+            <config-property name="ConnectionURL" type="java.lang.String">jdbc:mckoi://localhost/</config-property>
+            <config-property name="DriverClass" type="java.lang.String">com.mckoi.JDBCDriver</config-property>
+            <config-property name="UserName" type="java.lang.String">admin</config-property>
+            <config-property name="Password" type="java.lang.String">secret</config-property>
+          </properties>
+
+            <!--These properties are ignored by the Solid driver.
+            <config-property name="UserName" type="java.lang.String"></config-property>
+            <config-property name="Password" type="java.lang.String"></config-property>
+             -->
+        </attribute>
+        <!--hack-->
+        <depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
+      </mbean>
+    </depends>
+
+    <depends optional-attribute-name="ManagedConnectionPool">
+      <!--embedded mbean-->
+      <mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
+      	name="jboss.jca:service=LocalTxPool,name=McKoiDB">
+
+        <attribute name="MinSize">0</attribute>
+        <attribute name="MaxSize">50</attribute>
+        <attribute name="BlockingTimeoutMillis">5000</attribute>
+        <attribute name="IdleTimeoutMinutes">15</attribute>
+        <!--criteria indicates if Subject (from security domain) or app supplied
+            parameters (such as from getConnection(user, pw)) are used to distinguish
+            connections in the pool. Choices are 
+            ByContainerAndApplication (use both), 
+            ByContainer (use Subject),
+            ByApplication (use app supplied params only),
+            ByNothing (all connections are equivalent, usually if adapter supports
+              reauthentication)-->
+        <!-- Since at present only a single user specified in the URL is supported, 
+          ByNothing is mosst appropriate.  If a URL construction scheme is implemented, 
+          this could be one of the other values -->
+        <attribute name="Criteria">ByNothing</attribute>
+      </mbean>
+
+    </depends>
+    <depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>
+   <!-- Since the username/password needs to be in the url, there is no way at 
+     present for a generic wrapper to supply user/pw to the driver.  A custom 
+     wrapper could be used to consruct the url dynamically from a base and the 
+     user/pw.  In case someone does that, I'm leaving the container-managed-security 
+     attribute in.  -->
+    <!-- <attribute name="SecurityDomainJndiName">SolidDbRealm</attribute>-->
+    
+    <depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>
+    
+
+    <attribute name="TransactionManager">java:/TransactionManager</attribute>
+    <!--make the rar deploy! hack till better deployment-->
+    <depends>jboss.jca:service=RARDeployer</depends>
+  </mbean>
+
+</server>
+
+
diff --git a/3.0.4/config/jboss/tapestry-db.zip b/3.0.4/config/jboss/tapestry-db.zip
new file mode 100644
index 0000000..d2a4f2a
--- /dev/null
+++ b/3.0.4/config/jboss/tapestry-db.zip
Binary files differ
diff --git a/3.0.4/config/jetty-workbench.xml b/3.0.4/config/jetty-workbench.xml
new file mode 100644
index 0000000..7b75ceb
--- /dev/null
+++ b/3.0.4/config/jetty-workbench.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- $Id$ -->
+<!DOCTYPE Configure PUBLIC
+	"-//Mort Bay Consulting//DTD Configure 1.2//EN"
+	"http://jetty.mortbay.org/configure_1_2.dtd">
+<!--
+  This configuration file is used to allow the Tutorial to be run directly from
+  the main distribution directory (i.e., without having to build the frameworks).
+  -->
+<Configure class="org.mortbay.jetty.Server">
+  <Call name="addListener">
+    <Arg>
+      <New class="org.mortbay.http.SocketListener">
+        <Set name="Port">8080</Set>
+        <Set name="MinThreads">1</Set>
+        <Set name="MaxThreads">10</Set>
+        <Set name="MaxIdleTimeMs">50000</Set>
+      </New>
+    </Arg>
+  </Call>
+  
+  <Call name="addWebApplication">
+    <Arg>/workbench</Arg>
+    <Arg>lib/examples/workbench.war</Arg>
+    <Set name="DefaultsDescriptor">config/webdefault.xml</Set>
+  </Call>
+  
+   <Call name="addContext">
+    <Arg>/private/*</Arg>
+    <Set name="ResourceBase">private</Set>
+    
+    <Call name="addHandler">
+      <Arg><New class="org.mortbay.http.handler.ResourceHandler"/></Arg>
+    </Call>
+    
+    <Call name="addHandler">
+    	<Arg><New class="org.mortbay.http.handler.NotFoundHandler"/></Arg>
+    </Call>
+  </Call>
+  
+  <Call name="addContext">
+    <Arg>/</Arg>   
+    <Set name="realmName">Jetty Demo Realm</Set>
+   
+    <Call name="addServlet">
+      <Arg>Admin</Arg>
+      <Arg>/</Arg>
+      <Arg>org.mortbay.servlet.AdminServlet</Arg>
+    </Call>
+    
+    <Call name="setAttribute">
+      <Arg>org.mortbay.http.HttpServer</Arg>
+      <Arg><Call name="getHttpServer"/></Arg>
+    </Call>
+  </Call> 
+   
+</Configure>
diff --git a/3.0.4/config/log4j.properties b/3.0.4/config/log4j.properties
new file mode 100644
index 0000000..ee019a8
--- /dev/null
+++ b/3.0.4/config/log4j.properties
@@ -0,0 +1,12 @@
+# $Id$
+# Set root category priority to INFO and its only appender to A1.
+log4j.rootCategory=WARN, A1
+
+# A1 is set to be a ConsoleAppender. 
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%r %c{1} [%p] %m%n
+
+log4j.category.org.apache.commons.digester.Digester=FATAL
\ No newline at end of file
diff --git a/3.0.4/config/webdefault.xml b/3.0.4/config/webdefault.xml
new file mode 100644
index 0000000..2f1fe3c
--- /dev/null
+++ b/3.0.4/config/webdefault.xml
@@ -0,0 +1,116 @@
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">   
+<!-- $Id$ -->
+
+<web-app>
+  <description>
+    Default web.xml file.  
+    This file is applied to a Web application before it's own WEB_INF/web.xml file
+  </description>
+ 
+
+  <!-- ==================================================================== -->
+  <!-- JSP Servlet                                                          -->
+  <!-- This is the jasper JSP servlet from the jakarta project              -->
+  <!-- The following initParameters are supported:                          -->
+  <!--                                                                      -->
+  <!--   classpath           What class path should I use while compiling   -->
+  <!--                       generated servlets?  [Created dynamically      -->
+  <!--                       based on the current web application]          -->
+  <!--                                                                      -->
+  <!--   classdebuginfo      Should the class file be compiled with         -->
+  <!--                       debugging information?  [false]                -->
+  <!--                                                                      -->
+  <!--   ieClassId           The class-id value to be sent to Internet      -->
+  <!--                       Explorer when using <jsp:plugin> tags.         -->
+  <!--                       [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93]   -->
+  <!--                                                                      -->
+  <!--   jspCompilerPlugin   The fully qualified class name of the JSP      -->
+  <!--                       compiler plug-in to be used.  See below for    -->
+  <!--                       more information.                              -->
+  <!--                       [Use internal JDK compiler]                    -->
+  <!--                                                                      -->
+  <!--   keepgenerated       Should we keep the generated Java source code  -->
+  <!--                       for each page instead of deleting it? [true]   -->
+  <!--                                                                      -->
+  <!--   largefile           Should we store the static content of JSP      -->
+  <!--                       pages in external data files, to reduce the    -->
+  <!--                       size of the generated servlets?  [false]       -->
+  <!--                                                                      -->
+  <!--   logVerbosityLevel   The level of detailed messages to be produced  -->
+  <!--                       by this servlet.  Increasing levels cause the  -->
+  <!--                       generation of more messages.  Valid values are -->
+  <!--                       FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
+  <!--                       [WARNING]                                      -->
+  <!--                                                                      -->
+  <!--   mappedfile          Should we generate static content with one     -->
+  <!--                       print statement per input line, to ease        -->
+  <!--                       debugging?  [false]                            -->
+  <!--                                                                      -->
+  <!--   scratchdir          What scratch directory should we use when      -->
+  <!--                       compiling JSP pages?  [default work directory  -->
+  <!--                       for the current web application]               -->
+  <!--                                                                      -->
+  <!-- If you wish to use Jikes to compile JSP pages:                       -->
+  <!-- * Set the "classpath" initialization parameter appropriately         -->
+  <!--   for this web application.                                          -->
+  <!-- * Set the "jspCompilerPlugin" initialization parameter to            -->
+  <!--   "org.apache.jasper.compiler.JikesJavaCompiler".                    -->
+  <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+  
+  <servlet>
+    <servlet-name>jsp</servlet-name>
+    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+    <load-on-startup>0</load-on-startup>
+  </servlet>
+
+  <servlet>
+    <servlet-name>Default</servlet-name>
+    <servlet-class>org.mortbay.jetty.servlet.Default</servlet-class>
+    <init-param>
+      <param-name>acceptRanges</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>dirAllowed</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <init-param>
+      <param-name>putAllowed</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>delAllowed</param-name>
+      <param-value>false</param-value>
+    </init-param>
+    <init-param>
+      <param-name>redirectWelcome</param-name>
+      <param-value>true</param-value>
+    </init-param>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  
+
+  <!-- ==================================================================== -->
+  <servlet-mapping>
+    <servlet-name>Default</servlet-name>
+    <url-pattern>/</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
+    <servlet-name>jsp</servlet-name>
+    <url-pattern>*.jsp</url-pattern>
+  </servlet-mapping>
+
+  <!-- ==================================================================== -->
+  <session-config>
+    <session-timeout>60</session-timeout>
+  </session-config>
+
+  <!-- ==================================================================== -->
+  <welcome-file-list>
+    <welcome-file>index.html</welcome-file>
+    <welcome-file>index.htm</welcome-file>
+  </welcome-file-list>
+
+</web-app>
+
diff --git a/3.0.4/contrib/.cvsignore b/3.0.4/contrib/.cvsignore
new file mode 100644
index 0000000..602053d
--- /dev/null
+++ b/3.0.4/contrib/.cvsignore
@@ -0,0 +1,3 @@
+classes

+*.log

+target

diff --git a/3.0.4/contrib/build.xml b/3.0.4/contrib/build.xml
new file mode 100644
index 0000000..35337d7
--- /dev/null
+++ b/3.0.4/contrib/build.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+<project name="Tapestry Contrib Framework" default="install">
+	<property name="root.dir" value=".."/>
+	<property file="${root.dir}/config/Version.properties"/>
+	<property file="${root.dir}/config/build.properties"/>
+	<property file="${root.dir}/config/common.properties"/>
+	<path id="jetty.classpath">
+		<fileset dir="${jetty.dir}">
+			<include name="**/javax.*.jar"/>
+		</fileset>
+	</path>
+	<path id="project.classpath">
+		<fileset dir="${root.lib.dir}">
+			<include name="${framework.jar}"/>
+			<include name="${ext.dir}/*.jar"/>
+			<include name="${j2ee.dir}/*.jar"/>
+		</fileset>
+	</path>
+	<target name="init">
+		<mkdir dir="${classes.dir}"/>
+	</target>
+	<target name="clean">
+		<delete dir="${classes.dir}"/>
+	</target>
+
+	<target name="compile" depends="init"
+		description="Compile all classes in the framework.">
+		<javac srcdir="${src.dir}" destdir="${classes.dir}" debug="on"
+			target="1.1" source="1.3">
+			<classpath refid="project.classpath"/>
+		</javac>
+	</target>
+
+	<target name="install" depends="compile"
+		description="Compile all classes and build the installed JAR including all package resources."
+		>
+		<jar jarfile="${root.lib.dir}/${contrib.jar}">
+			<fileset dir="${classes.dir}"/>
+			<fileset dir="${src.dir}">
+				<exclude name="**/*.java"/>
+				<exclude name="**/package.html"/>
+			</fileset>
+		</jar>
+	</target>
+</project>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library b/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library
new file mode 100644
index 0000000..fb5b813
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE library-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<library-specification>
+
+  <component-type type="InspectorButton" specification-path="inspector/InspectorButton.jwc"/>
+  <page name="Inspector" specification-path="inspector/Inspector.page"/>
+
+  <library id="inspector" specification-path="inspector/Inspector.library"/>
+
+  <component-type type="Choose" specification-path="components/Choose.jwc"/>
+  <component-type type="When" specification-path="components/When.jwc"/>
+  <component-type type="Otherwise" specification-path="components/Otherwise.jwc"/>
+
+  <component-type type="Palette" specification-path="palette/Palette.jwc"/>
+  <component-type type="MultiplePropertySelection" specification-path="form/MultiplePropertySelection.jwc"/>
+  <component-type type="DateField" specification-path="valid/DateField.jwc"/>
+  <component-type type="MaskEdit" specification-path="form/MaskEdit.jwc"/>
+  <component-type type="NumericField" specification-path="valid/NumericField.jwc"/>
+  <component-type type="ValidatingTextField" specification-path="valid/ValidatingTextField.jwc"/>
+  <component-type type="FormConditional" specification-path="form/FormConditional.jwc"/>
+
+  <component-type type="InheritInformalAny" specification-path="informal/InheritInformalAny.jwc"/>
+
+  <component-type type="Table" specification-path="table/components/Table.jwc"/>
+  <component-type type="TableColumns" specification-path="table/components/TableColumns.jwc"/>
+  <component-type type="TablePages" specification-path="table/components/TablePages.jwc"/>
+  <component-type type="TableRows" specification-path="table/components/TableRows.jwc"/>
+  <component-type type="TableValues" specification-path="table/components/TableValues.jwc"/>
+  <component-type type="TableView" specification-path="table/components/TableView.jwc"/>
+  <component-type type="FormTable" specification-path="table/components/FormTable.jwc"/>
+  <component-type type="TableFormRows" specification-path="table/components/TableFormRows.jwc"/>
+  <component-type type="TableFormPages" specification-path="table/components/TableFormPages.jwc"/>
+
+  <page name="SimpleTableColumnPage" specification-path="table/components/inserted/SimpleTableColumnPage.page"/>
+  <component-type type="SimpleTableColumnComponent" specification-path="table/components/inserted/SimpleTableColumnComponent.jwc"/>
+  <component-type type="SimpleTableColumnFormComponent" specification-path="table/components/inserted/SimpleTableColumnFormComponent.jwc"/>
+
+  <component-type type="PopupLink" specification-path="popup/PopupLink.jwc"/>
+
+    <component-type type="Tree"
+        specification-path="/org/apache/tapestry/contrib/tree/components/Tree.jwc"/>
+    <component-type type="TreeDataView"
+        specification-path="/org/apache/tapestry/contrib/tree/components/TreeDataView.jwc"/>
+    <component-type type="TreeNodeView"
+        specification-path="/org/apache/tapestry/contrib/tree/components/TreeNodeView.jwc"/>
+    <component-type type="TreeView"
+        specification-path="/org/apache/tapestry/contrib/tree/components/TreeView.jwc"/>
+    <component-type type="TreeTableDataView"
+        specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableDataView.jwc"/>
+    <component-type type="TreeTable"
+        specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTable.jwc"/>
+    <component-type type="TreeTableNodeViewDelegator"
+        specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableNodeViewDelegator.jwc"/>
+    <page name="TreeNodeViewPage" specification-path="/org/apache/tapestry/contrib/tree/components/TreeNodeViewPage.page"/>
+
+    <page name="TreeTableNodeViewPage" specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableNodeViewPage.page"/>
+</library-specification>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java
new file mode 100644
index 0000000..20c41f4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java
@@ -0,0 +1,62 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.components;
+
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.components.Conditional;
+
+/**
+ *  This component is a container for {@link When} or Otherwise components;
+ *  it provides the context for mutually exclusive conditional evaluation.
+ *
+ *  [<a href="../../../../../../ComponentReference/contrib.Choose.html">Component Reference</a>]
+ *
+ *  @author David Solis
+ *  @version $Id$
+ * 
+ **/
+public abstract class Choose extends Conditional {
+
+
+	public void addBody(IRender element)
+	{
+		super.addBody(element);
+		if (element instanceof When)
+			((When) element).setChoose(this);	
+	}
+	
+	protected void cleanupAfterRender(IRequestCycle cycle)
+	{
+		setConditionMet(false);
+		super.cleanupAfterRender(cycle);
+	}
+	
+	protected boolean evaluateCondition()
+	{
+		return getCondition();
+	}
+
+	public boolean getInvert()
+	{
+		// This component doesn't require invert parameter.
+		return false;
+	}
+
+	public abstract boolean getCondition();
+	
+	public abstract boolean isConditionMet();
+	public abstract void setConditionMet(boolean value);
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc
new file mode 100644
index 0000000..e3a522c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+  
+<component-specification class="org.apache.tapestry.contrib.components.Choose">
+
+  <description>
+  Provides the context for mutually exclusive conditional evaluation.
+  </description>
+
+  <parameter name="condition" type="boolean" direction="in" default-value="true">
+    <description>
+    The condition to evaluate.
+    </description>
+  </parameter>
+
+  <parameter name="element" type="java.lang.String" direction="in">
+  	<description>
+  	The element to emulate.
+  	</description>
+  </parameter>
+
+  <reserved-parameter name="invert"/>
+  
+  <property-specification name="conditionMet" type="boolean" initial-value="false"/>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc
new file mode 100644
index 0000000..3beb4f9
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+  
+<component-specification class="org.apache.tapestry.contrib.components.When">
+  <description>
+  Otherwise is just a When component that always tries to render its body and/or emulate an element 
+  and its attributes (if element is specified) .
+  </description>
+  
+  <parameter name="element" type="java.lang.String" direction="in">
+  	<description>
+  	The element to emulate.
+  	</description>
+  </parameter>
+
+  <reserved-parameter name="condition"/>
+
+  <reserved-parameter name="invert"/>
+
+  <property-specification name="condition" type="boolean" initial-value="true"/>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java
new file mode 100644
index 0000000..9bcc3fa
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java
@@ -0,0 +1,91 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.components;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.components.Conditional;
+
+/**
+ *  Represents an alternative whithin a {@link Choose} component. 
+ *  The default alternative is described by the Otherwise component.
+ *
+ *  [<a href="../../../../../../ComponentReference/contrib.When.html">Component Reference</a>]
+ *
+ *  @author David Solis
+ *  @version $Id$
+ * 
+ **/
+public abstract class When extends Conditional
+{
+    /** Parent of this component. */
+
+    private Choose _choose;
+
+    /**
+     *  Renders its wrapped components only if the condition is true and its parent {@link Choose}
+     *  allows it. In addition, if element is specified, can emulate that HTML element.
+     *
+     **/
+
+    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        Choose choose = getChoose();
+
+        if (choose == null)
+            throw new ApplicationRuntimeException(
+                Tapestry.getMessage("When.must-be-contained-by-choose"),
+                this,
+                null,
+                null);
+
+        if (!choose.isConditionMet() && getCondition())
+        {
+            choose.setConditionMet(true);
+            super.renderComponent(writer, cycle);
+        }
+    }
+
+    protected boolean evaluateCondition()
+    {
+        return true;
+    }
+
+    public boolean getInvert()
+    {
+        // This component doesn't require invert parameter.
+        return false;
+    }
+
+    /**
+     *  @return Choose
+     */
+    public Choose getChoose()
+    {
+        return _choose;
+    }
+
+    /**
+     *  Sets the choose.
+     *  @param value The choose to set
+     */
+    public void setChoose(Choose value)
+    {
+        _choose = value;
+    }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc
new file mode 100644
index 0000000..be9b7a8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+  
+<component-specification class="org.apache.tapestry.contrib.components.When">
+  <description>
+  If this is the first When component to evaluate to true within Choose then emulates an element 
+  and its attributes (if element is specified) and/or includes a block of content.
+  </description>
+  
+  <parameter name="condition" type="boolean" direction="in">
+    <description>
+    The condition to evaluate.
+    </description>
+  </parameter>
+  
+  <parameter name="element" type="java.lang.String" direction="in">
+  	<description>
+  	The element to emulate.
+  	</description>
+  </parameter>
+
+  <reserved-parameter name="invert"/>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html
new file mode 100644
index 0000000..14e9648
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html
@@ -0,0 +1,14 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Contribution of foundational components.
+
+@author David Solis <a href="mailto:dsolis@apache.org">dsolis@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java
new file mode 100644
index 0000000..1e8bb86
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java
@@ -0,0 +1,54 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.CreateException;
+
+/**
+ *  Extended version of {@link CreateException} that includes a root cause.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class XCreateException extends CreateException
+{
+    private Throwable rootCause;
+
+    public XCreateException(String message)
+    {
+        super(message);
+    }
+
+    public XCreateException(String message, Throwable rootCause)
+    {
+        super(message);
+
+        this.rootCause = rootCause;
+    }
+
+    public XCreateException(Throwable rootCause)
+    {
+        super(rootCause.getMessage());
+
+        this.rootCause = rootCause;
+    }
+
+    public Throwable getRootCause()
+    {
+        return rootCause;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java
new file mode 100644
index 0000000..bd92f4c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java
@@ -0,0 +1,57 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.EJBException;
+
+/**
+ *  Extended version of {@link EJBException} that includes a root cause.
+ *  {@link EJBException} doesn't have quite the right constructor for this ...
+ *  it has an equivalent to the rootCause property, (causedByException), but
+ *  doesn't have a constructor that allows us to set a custom message.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class XEJBException extends EJBException
+{
+    private Throwable rootCause;
+
+    public XEJBException(String message)
+    {
+        super(message);
+    }
+
+    public XEJBException(String message, Throwable rootCause)
+    {
+        super(message);
+
+        this.rootCause = rootCause;
+    }
+
+    public XEJBException(Throwable rootCause)
+    {
+        super(rootCause.getMessage());
+
+        this.rootCause = rootCause;
+    }
+
+    public Throwable getRootCause()
+    {
+        return rootCause;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java
new file mode 100644
index 0000000..a340ee8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java
@@ -0,0 +1,54 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.FinderException;
+
+/**
+ *  Extended version of {@link FinderException} that includes a root cause.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class XFinderException extends FinderException
+{
+    private Throwable rootCause;
+
+    public XFinderException(String message)
+    {
+        super(message);
+    }
+
+    public XFinderException(String message, Throwable rootCause)
+    {
+        super(message);
+
+        this.rootCause = rootCause;
+    }
+
+    public XFinderException(Throwable rootCause)
+    {
+        super(rootCause.getMessage());
+
+        this.rootCause = rootCause;
+    }
+
+    public Throwable getRootCause()
+    {
+        return rootCause;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java
new file mode 100644
index 0000000..92b0132
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java
@@ -0,0 +1,54 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.RemoveException;
+
+/**
+ *  Extended version of {@link RemoveException} that includes a root cause.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class XRemoveException extends RemoveException
+{
+    private Throwable rootCause;
+
+    public XRemoveException(String message)
+    {
+        super(message);
+    }
+
+    public XRemoveException(String message, Throwable rootCause)
+    {
+        super(message);
+
+        this.rootCause = rootCause;
+    }
+
+    public XRemoveException(Throwable rootCause)
+    {
+        super(rootCause.getMessage());
+
+        this.rootCause = rootCause;
+    }
+
+    public Throwable getRootCause()
+    {
+        return rootCause;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html
new file mode 100644
index 0000000..1e0fbfb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Subclasses of the EJB exceptions that take an optional, additional, root cause Throwable
+to identify the underlying reason for the exception.  This is less necessary in JDK 1.4, which
+support root cause for all exceptions.
+
+@author Howard Lewis Ship <a href="mailto:hlship@apache.org">hlship@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java
new file mode 100644
index 0000000..3661094
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java
@@ -0,0 +1,103 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ *  Implementation of {@link IMultiplePropertySelectionRenderer} that
+ *  produces a table of checkbox (&lt;input type=checkbox&gt;) elements.
+ *
+ *  @version $Id$
+ *  @author Sanjay Munjal
+ *
+ **/
+
+public class CheckBoxMultiplePropertySelectionRenderer
+    implements IMultiplePropertySelectionRenderer
+{
+
+    /**
+     *  Writes the &lt;table&gt; element.
+     *
+     **/
+
+    public void beginRender(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle)
+    {
+        writer.begin("table");
+        writer.attribute("border", 0);
+        writer.attribute("cellpadding", 0);
+        writer.attribute("cellspacing", 2);
+    }
+
+    /**
+     *  Closes the &lt;table&gt; element.
+     *
+     **/
+
+    public void endRender(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle)
+    {
+        writer.end(); // <table>
+    }
+
+    /**
+     *  Writes a row of the table.  The table contains two cells; the first is the checkbox,
+     *  the second is the label for the checkbox.
+     *
+     **/
+
+    public void renderOption(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle,
+        IPropertySelectionModel model,
+        Object option,
+        int index,
+        boolean selected)
+    {
+        writer.begin("tr");
+        writer.begin("td");
+
+        writer.beginEmpty("input");
+        writer.attribute("type", "checkbox");
+        writer.attribute("name", component.getName());
+        writer.attribute("value", model.getValue(index));
+
+        if (component.isDisabled())
+            writer.attribute("disabled", "disabled");
+
+        if (selected)
+            writer.attribute("checked", "checked");
+
+        writer.end(); // <td>
+
+        writer.println();
+
+        writer.begin("td");
+        writer.print(model.getLabel(index));
+        writer.end(); // <td>
+        writer.end(); // <tr>
+
+        writer.println();
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java
new file mode 100644
index 0000000..c76fad0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java
@@ -0,0 +1,168 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import java.io.IOException;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.IActionListener;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.form.AbstractFormComponent;
+import org.apache.tapestry.request.RequestContext;
+import org.apache.tapestry.util.io.DataSqueezer;
+
+/**
+ *  A conditional element on a page which will render its wrapped elements
+ *  zero or one times.
+ * 
+ * This component is a variant of {@link org.apache.tapestry.components.Conditional}, 
+ * but is designed for operation in a form. The component parameters are stored in 
+ * hidden fields during rendering and are taken from those fields during the rewind, 
+ * thus no StaleLink exceptions occur. 
+ *
+ *  [<a href="../../../../../ComponentReference/contrib.FormConditional.html">Component Reference</a>]
+ *
+ *  @author Mindbridge
+ *  @version $Id$
+ *  @since 3.0
+ * 
+ **/
+
+public abstract class FormConditional extends AbstractFormComponent
+{
+
+    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        IForm form = getForm(cycle);
+
+        boolean cycleRewinding = cycle.isRewinding();
+
+        // If the cycle is rewinding, but not this particular form,
+        // then do nothing (don't even render the body).
+
+        if (cycleRewinding && !form.isRewinding())
+            return;
+
+        String name = form.getElementId(this);
+
+        boolean condition = getCondition(cycle, form, name);
+
+        // call listener
+        IActionListener listener = getListener();
+        if (listener != null)
+            listener.actionTriggered(this, cycle);
+
+        // render the component body only if the condition is true
+        if (condition) {
+            String element = getElement();
+            
+            boolean render = !cycleRewinding && Tapestry.isNonBlank(element);
+            
+            if (render)
+            {
+                writer.begin(element);
+                renderInformalParameters(writer, cycle);
+            }
+
+            renderBody(writer, cycle);
+            
+            if (render)
+                writer.end(element);
+        }
+    }
+
+    private boolean getCondition(IRequestCycle cycle, IForm form, String name)
+    {
+        boolean condition;
+        
+        if (!cycle.isRewinding())
+        {
+            condition = getCondition();
+            writeValue(form, name, condition);
+        }
+        else
+        {
+            RequestContext context = cycle.getRequestContext();
+            String submittedConditions[] = context.getParameters(name);
+            condition = convertValue(submittedConditions[0]);
+        }
+
+        IBinding conditionValueBinding = getConditionValueBinding();
+        if  (conditionValueBinding != null) 
+            conditionValueBinding.setBoolean(condition);
+        
+        return condition;
+    }
+
+    private void writeValue(IForm form, String name, boolean value)
+    {
+        String externalValue;
+
+        Object booleanValue = new Boolean(value);
+        try
+        {
+            externalValue = getDataSqueezer().squeeze(booleanValue);
+        }
+        catch (IOException ex)
+        {
+            throw new ApplicationRuntimeException(
+                Tapestry.format("FormConditional.unable-to-convert-value", booleanValue),
+                this,
+                null,
+                ex);
+        }
+
+        form.addHiddenValue(name, externalValue);
+    }
+
+    private boolean convertValue(String value)
+    {
+        try
+        {
+            Object booleanValue = getDataSqueezer().unsqueeze(value);
+            return Tapestry.evaluateBoolean(booleanValue);
+        }
+        catch (IOException ex)
+        {
+            throw new ApplicationRuntimeException(
+                Tapestry.format("FormConditional.unable-to-convert-string", value),
+                this,
+                null,
+                ex);
+        }
+    }
+
+    private DataSqueezer getDataSqueezer()
+    {
+        return getPage().getEngine().getDataSqueezer();
+    }
+
+    public boolean isDisabled()
+    {
+        return false;
+    }
+
+    public abstract boolean getCondition();
+    public abstract String getElement();
+
+    public abstract IBinding getConditionValueBinding();
+
+    public abstract IActionListener getListener();
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc
new file mode 100644
index 0000000..c2ba3d3
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+  
+<component-specification class="org.apache.tapestry.contrib.form.FormConditional">
+  <description>
+  Conditionally emulates an element and its attributes (if element is specified) and/or includes a block of content if a condition is met.
+  </description>
+  
+  <parameter name="condition" type="boolean" direction="in" required="yes">
+    <description>
+    The condition to evaluate.
+    </description>
+  </parameter>
+  
+  <parameter name="element" type="java.lang.String" direction="in" required="no">
+  	<description>
+  	The element to emulate.
+  	</description>
+  </parameter>
+
+  <parameter name="listener" type="org.apache.tapestry.IActionListener" direction="in"/>
+
+  <parameter name="conditionValue" type="boolean">
+    <description>
+    The value of the condition. During render this is obtained from
+    the condition parameter. During rewind it is the submitted condition.
+    </description>
+  </parameter>
+
+  <reserved-parameter name="invert"/>
+  
+  <property-specification name="name" type="java.lang.String"/>
+  <property-specification name="form" type="org.apache.tapestry.IForm"/>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java
new file mode 100644
index 0000000..a70af59
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java
@@ -0,0 +1,65 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ *  Defines an object that works with a {@link MultiplePropertySelection} component
+ *  to render the individual elements obtained from the {@link IPropertySelectionModel model}.
+ *
+ *  @version $Id$
+ *  @author Sanjay Munjal
+ *
+ **/
+
+public interface IMultiplePropertySelectionRenderer
+{
+    /**
+     *  Begins the rendering of the {@link MultiplePropertySelection}.
+     *
+     **/
+
+    public void beginRender(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle);
+
+    /**
+     *  Invoked for each element obtained from the {@link IPropertySelectionModel model}.
+     *
+     **/
+
+    public void renderOption(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle,
+        IPropertySelectionModel model,
+        Object option,
+        int index,
+        boolean selected);
+
+    /**
+     *  Ends the rendering of the {@link MultiplePropertySelection}.
+     *
+     **/
+
+    public void endRender(
+        MultiplePropertySelection component,
+        IMarkupWriter writer,
+        IRequestCycle cycle);
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html
new file mode 100644
index 0000000..3e4b0a5
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html
@@ -0,0 +1,5 @@
+<input jwcid="maskEdit" type="text"/>
+<input jwcid="maskValue" type="hidden"/>
+<span jwcid="maskEditScript"/>
+
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java
new file mode 100644
index 0000000..7d596b4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java
@@ -0,0 +1,113 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IBinding;
+
+/**
+ * Provides a mask edit HTML &lt;input type="text"&gt; form element.
+ * <p>
+ * Mask edit field validates the text the user enters against a 
+ * mask that encodes the valid forms the text can take. The mask can 
+ * also format text that is displayed to the user.
+ * <p>
+ * <table border="1" cellpadding="2">
+ *  <tr>
+ *   <th>Mask character</th><th>Meaning in mask</th>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;l</td><td>&nbsp;Mixed case letter character [a..z, A..Z]</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;L</td><td>&nbsp;Upper case letter character [A..Z]</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;a</td><td>&nbsp;Mixed case alpha numeric character [a..z, A..Z, 0..1]</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;A</td><td>&nbsp;Upper case alpha numeric character [A..Z, 0..9]</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;#</td><td>&nbsp;Numeric character [0..9]</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;_</td><td>&nbsp;Reserved character for display, do not use.</td>
+ *  </tr>
+ *  <tr>
+ *   <td>&nbsp;others</td><td>&nbsp;Non editable character for display.</td>
+ *  </tr>
+ * </table> 
+ * <p>
+ * This component requires JavaScript to be enabled in the client browser.
+ * <p>
+ * [<a href="../../../../../ComponentReference/MaskEdit.html">Component Reference</a>]
+ *
+ * @author Malcolm Edgar
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class MaskEdit extends BaseComponent
+{
+    private String _mask;
+    private IBinding _valueBinding;
+    private boolean _disabled;
+
+    public String getMask()
+    {
+        return _mask;
+    }
+
+    public void setMask(String mask)
+    {
+        _mask = mask;
+    }
+    
+    public String getValue()
+    {
+        if (_valueBinding != null) {
+            return _valueBinding.getString();
+        } else {
+            return null;
+        }
+    }
+
+    public void setValue(String value)
+    {
+        _valueBinding.setString(value);
+    }
+
+    public IBinding getValueBinding()
+    {
+        return _valueBinding;
+    }
+
+    public void setValueBinding(IBinding valueBinding)
+    {
+        _valueBinding = valueBinding;
+    }
+
+    public boolean isDisabled()
+    {
+        return _disabled;
+    }
+
+    public void setDisabled(boolean disabled)
+    {
+        _disabled = disabled;
+    }        
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js
new file mode 100644
index 0000000..9db04c8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js
@@ -0,0 +1,420 @@
+/**

+ *  JavaScript Mask Edit control

+ *  Paul Geerts

+ *  Oct 2002

+ * 

+ *  Note:  This probably only works for English

+ *  Other languages have been deprecated and will be removed in the 

+ *  next version of Speech (TM)

+ **/

+

+var dontDoIt;  // hack for Moz because it won't cancel events properly

+var isTab;     // another Moz hack

+

+

+// Init the mask edit field by creating a lookalike DIV

+// and hiding the real one

+function initMask(field, maskField) {

+

+	if (field.disabled == true) {

+	   return;

+	}

+

+    var mask = maskField.value;

+    var val = field.value;

+    

+    if (!val) {  // if there's no val, init it with empty mask

+        val = displayMask(mask);

+        field.value = displayMask(mask);

+    }

+    // create a div and add a bunch of spans

+    // and edits to it.

+    div = document.createElement("div");

+   	div.style.backgroundColor = "white";

+    for (var i = 0 ; i < mask.length ; i++) {

+        var ds = document.createElement("SPAN");

+        var v = val.substr(i,1);

+        var m = mask.substr(i,1);

+        if (v==" ") {

+            v="&nbsp;";

+        }

+        ds.innerHTML = v;

+        ds.index = i;

+        ds.mask = m;

+        ds.div = div;

+        // if we can edit this char

+        // make a little tiny edit field

+        if (isEditChar(m)) {

+            var es = document.createElement("INPUT");

+            es.style.width = "1px";

+            es.style.border="0px";

+            es.index = i;

+            es.field = field;

+            es.mask = m;

+            es.display = ds;

+            ds.editField = es;

+            es.div = div;

+            div.appendChild(es);  // set up some events

+            if (navigator.appName == "Microsoft Internet Explorer") {

+                addEvent("keypress", es, changeBitIE);

+            } else {

+                addEvent("keypress", es, changeBitNS);

+            }

+            addEvent("keydown", es, specialKey); // keydown handles stuff like home, end etc

+            addEvent("click", ds, click);

+        } 

+

+        div.appendChild(ds);

+

+    }

+    

+    // the final edit field on the end

+    var es =document.createElement("INPUT");

+    es.style.width = "1px";

+    es.style.border="0px";

+    es.div = div;

+    div.appendChild(es);

+    if (navigator.appName == "Microsoft Internet Explorer") {

+        addEvent("keypress", es, changeBitIE);

+    } else {

+        addEvent("keypress", es, changeBitNS);

+    }

+    addEvent("keydown", es, specialKey);

+

+    div.noWrap = true; // force single line display

+

+    formatDiv(div, field); // format the DIV to look like an edit box

+    field.style.display = 'none'; 

+    field.parentNode.insertBefore(div, field);

+    addEvent("click", div, divClick);

+}

+

+function formatDiv(div, field) {

+    // make it look like an IE edit

+    if (navigator.appName == "Microsoft Internet Explorer") {

+        div.style.fontFamily="courier"; 

+        div.style.fontSize="10pt";      

+        div.style.width = field.offsetWidth;

+        div.style.height = field.offsetHeight;

+        if (navigator.appVersion.match(/6.0/)) { // IE 6 is different

+            div.style.border = "1px solid #7F9DB9";

+        } else {

+            div.style.borderLeft = "2px solid #606060";

+            div.style.borderTop = "2px solid #606060";

+            div.style.borderRight = "1px solid #aaaaaa";

+            div.style.borderBottom = "1px solid #aaaaaa";

+        }

+

+    } else {

+        // Mozilla edit look-a-like

+        div.style.fontFamily="courier";

+        div.style.fontSize="10pt";

+        div.style.border="2px inset #cccccc";

+        if (field.size) {

+            div.style.widh = 13 * field.size;

+        } else {

+            div.style.width = "130px";

+        }

+    }

+}

+

+

+function isEditChar(c) {  // is this char a meaningful mask char

+    switch (c) {

+    case "_":

+    case "#":

+    case "a":

+    case "A":

+    case "l":

+    case "L":

+        return true;

+    default:

+        return false;

+    }

+    return false;

+}

+

+function displayMaskChar(c) {  // display mask chars as _ 

+    if (isEditChar(c)) {       // otherwise just show normal char

+        return "_";

+    } else {

+        return c;

+    }

+}

+

+function displayMask(mask) {  // display entire mask using about subroutine

+    var d = "";

+    for (var i = 0 ; i < mask.length ; i++) {

+        d+=displayMaskChar(mask.substr(i,1));

+    }

+    return d;

+}

+

+function divClick(e) {     // when the main DIV is clicked, focus the end of the edit

+    var d = getEventObject(e);

+    if (d && d.lastChild) {

+        try {

+           d.lastChild.focus();

+        } catch (e) {

+           // nuffin

+        }

+    }

+}

+

+function specialKey(e) { // deal with special keys like backspace, delete etc

+    var s = getEventObject(e);

+    var code = e.keyCode;

+    dontDoIt = true;  // Moz needs these, as I can't seem to cancel events properly

+    isTab = false;    // Moz can't handle tabs well either

+    switch (code) {

+    case 8:   // backspace

+        var b = getPrevEdit(s);

+        if (b) {

+            b.display.innerHTML = displayMaskChar(b.mask);

+            var i = b.index;

+            b.field.value = b.field.value.substr(0, i) + 

+                displayMaskChar(b.mask) + b.field.value.substr(i+1, b.field.value.length - i);

+            b.focus();

+        }

+        cancelEvent(e);

+        return false;

+    case 46:  // delete

+        if (s.display) {

+            s.display.innerHTML = displayMaskChar(s.mask);

+            var i = s.index;

+            s.field.value = s.field.value.substr(0, i) + displayMaskChar(s.mask) + 

+                s.field.value.substr(i+1, s.field.value.length - i);

+        }

+        cancelEvent(e);

+        return false;

+        break;

+    case 37: // left

+        var p = getPrevEdit(s);

+        if (p) {

+            p.focus();

+        }

+        cancelEvent(e);

+        return false;

+    case 39: // right

+        var n = getNextEdit(s);

+        if (n) {

+            n.focus();

+        }

+        cancelEvent(e);

+        return false;

+    case 36: // home

+        s.div.firstChild.focus();

+        cancelEvent(e);

+        return false;

+    case 35: // end

+        s.div.lastChild.focus();

+        cancelEvent(e);

+        return false;

+    case 9: // tab

+        if (navigator.appName == "Microsoft Internet Explorer") {

+            if (!e.shiftKey) {

+                s.div.lastChild.focus();

+            } else {

+                s.div.firstChild.focus();

+            }

+            return;

+        } else {  // is mozilla/netscape

+            isTab = true;  // best i can do really

+        }

+        break;

+    }

+       

+    dontDoIt = false;

+}

+

+function moveForward(s) { // focus next edit

+    var b = getNextEdit(s);

+    if (b) {

+        b.focus();

+    }

+}

+

+function moveBackward(s) { // focus previous edit

+    var b = getPrevEdit(s);

+    if (b) {

+        b.focus();

+    }

+}

+

+function isInsertOK(code, s) {  // check if you're good to insert a char

+    var mchar = s.mask;

+    switch (mchar) {

+    case "_":

+        return true;

+        break;

+    case "#":

+        return checkDigit(code);

+        break;

+    case "a":

+        return checkAlphaNumeric(code);

+        break;

+    case "A":

+        return checkUpCaseAlphaNumeric(code);

+        break;

+    case "l":

+        return checkAlpha(code);

+        break;

+    case "L":

+        return checkUpCaseAlpha(code);

+        break;

+    }

+    return false;

+}

+

+// functions to check the key code, good ol ASCII

+// fairly straightforward

+

+function checkDigit(code) {

+    if ((code>=48) && (code<=57)) {

+        return code;

+    } else {

+        return null;

+    }

+}

+

+function checkAlpha(code) {

+    if (((code>=65) && (code<=90)) || ((code>=97) && (code<=122))) {

+        return code;

+    } else {

+        return null;

+    }

+}

+

+function checkUpCaseAlpha(code) {

+    if ((code>=65) && (code<=90)) {

+        return code;

+    } else if ((code>=97) && (code<=122)) {

+        return code - 32;

+    } else {

+        return null;

+    }

+}

+

+function checkAlphaNumeric(code) {

+    if (((code>=65) && (code<=90)) || ((code>=97) && (code<=122)) || ((code>=48) && (code<=57))) {

+        return code;

+    } else {

+        return null;

+    }

+}

+

+function checkUpCaseAlphaNumeric(code) {

+    if ((code>=65) && (code<=90)) {

+        return code;

+    } else if ((code>=97) && (code<=122)) {

+        return code - 32;

+    } else if ((code>=48) && (code<=57)) {

+        return code;

+    } else {

+        return null;

+    }

+}

+

+

+function changeBitNS(e) {  // handle key events in NS

+    var es = getEventObject(e);

+    if (!isTab) {

+        if (es.display) {

+            if (!dontDoIt) {

+                var code = e.charCode;

+                if (code = isInsertOK(code, es)) {

+                    var  c = String.fromCharCode(code);

+                    es.display.innerHTML = c

+                        var i = es.index;

+                    es.field.value = es.field.value.substr(0, i) + c + es.field.value.substr(i+1, es.field.value.length - i);

+                    moveForward(es);

+                }

+            }

+            es.value = "";

+            cancelEvent(e);

+        }        

+        return false;

+    }  

+}

+

+function changeBitIE(e) { // handle key events in IE

+    var es = getEventObject(e);

+    if (es.display) {

+        var code = e.keyCode;

+        if (code = isInsertOK(code, es)) {

+            var  c = String.fromCharCode(code);

+            es.display.innerHTML = c;

+            var i = es.index;

+            es.field.value = es.field.value.substr(0, i) + c + es.field.value.substr(i+1, es.field.value.length - i);

+            moveForward(es);

+            es.value = "";

+        }

+    }

+    cancelEvent(e);

+    return false;

+}

+

+function click(e) {  // clicking on a display span focuses the edit

+    var s = getEventObject(e);

+    s.editField.focus();

+    cancelEvent(e);

+    return false;

+}

+

+function getPrevEdit(s) {    // get previous input field 

+    var b = s.previousSibling;

+    while (b && (b.tagName!="INPUT")) {

+        b = b.previousSibling;

+    }

+    return b;

+}

+

+function getNextEdit(s) { // get previous next field 

+    var b = s.nextSibling;

+    while (b && (b.tagName!="INPUT")) {

+        b = b.nextSibling;

+    }

+    return b;

+}

+

+function cancelEvent(e) {   // kill event propagation

+    e.cancelBubble = true;

+    e.cancel = true;

+    if (navigator.appName != "Microsoft Internet Explorer") {

+        e.stopPropagation();  // doesn't seem to work for key events

+        e.preventDefault();

+    }

+}

+

+

+function getEventObject(e) {  // utility function to retrieve object from event

+    if (navigator.appName == "Microsoft Internet Explorer") {

+        return e.srcElement;

+    } else {  // is mozilla/netscape

+        // need to crawl up the tree to get the first "real" element

+        // i.e. a tag, not raw text

+        var o = e.target;

+        while (!o.tagName) {

+            o = o.parentNode;

+        }

+        return o;

+    }

+}

+

+function addEvent(name, obj, funct) { // utility function to add event handlers

+

+    if (navigator.appName == "Microsoft Internet Explorer") {

+        obj.attachEvent("on"+name, funct);

+    } else {  // is mozilla/netscape

+        obj.addEventListener(name, funct, false);

+    }

+}

+

+function deleteEvent(name, obj, funct) { // utility function to delete event handlers

+

+    if (navigator.appName == "Microsoft Internet Explorer") {

+        obj.detachEvent("on"+name, funct);

+    } else {  // is mozilla/netscape

+        obj.removeEventListener(name, funct, false);

+    }

+}

diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc
new file mode 100644
index 0000000..a796fcb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.form.MaskEdit" allow-informal-parameters="no">
+
+  <parameter name="mask" direction="in" type="java.lang.String" required="yes"/>
+  <parameter name="value" direction="custom" type="java.lang.String" required="yes"/>
+  <parameter name="disabled" direction="in" type="boolean" required="no"/>
+  
+  <component id="maskEdit" type="TextField">
+    <binding name="value" expression="value"/>
+    <binding name="maxlength" expression="mask.length()"/>
+    <binding name="size" expression="mask.length()"/>        
+    <binding name="disabled" expression="disabled"/>
+  </component>
+
+  <component id="maskValue" type="Hidden">
+    <binding name="value" expression="mask"/>
+    <binding name="encode" expression="false"/>
+  </component>
+
+  <component id="maskEditScript" type="Script">
+    <binding name="maskEdit" expression="components.maskEdit"/>
+    <binding name="maskValue" expression="components.maskValue"/>
+    <binding name="script" expression='"MaskEdit.script"'/>
+  </component>
+        
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script
new file mode 100644
index 0000000..e6c7756
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id$ -->
+<!DOCTYPE script PUBLIC
+	"-//Howard Lewis Ship//Tapestry Script 1.2//EN"
+	"http://tapestry.sf.net/dtd/Script_1_2.dtd">
+  
+<script>
+
+<include-script resource-path="/org/apache/tapestry/contrib/form/MaskEdit.js"/>
+
+<input-symbol key="maskEdit" class="org.apache.tapestry.form.TextField" required="yes"/>
+<input-symbol key="maskValue" class="org.apache.tapestry.form.Hidden" required="yes"/>
+
+<let key="formName">
+  ${maskEdit.form.name}
+</let>
+
+<let key="functionName">
+  ${maskEdit.name}_init
+</let>
+
+
+<body>
+function ${functionName}() {
+  initMask(document.${formName}.${maskEdit.name},
+           document.${formName}.${maskValue.name});
+}
+</body>
+
+<initialization>
+  ${functionName}();
+</initialization>
+
+</script>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java
new file mode 100644
index 0000000..3a412d3
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java
@@ -0,0 +1,216 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import java.util.List;
+
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.form.AbstractFormComponent;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ *  A component which uses &lt;input type=checkbox&gt; to
+ *  set a property of some object.  Typically, the values for the object
+ *  are defined using an {@link org.apache.commons.lang.enum.Enum}.  A MultiplePropertySelection is dependent on
+ *  an {link IPropertySelectionModel} to provide the list of possible values.
+ *
+ *  <p>Often, this is used to select one or more {@link org.apache.commons.lang.enum.Enum} to assign to a property; the
+ * {@link org.apache.tapestry.form.EnumPropertySelectionModel} class simplifies this.
+ * 
+ *  <p>The {@link org.apache.tapestry.contrib.palette.Palette} component
+ *  is more powerful, but requires client-side JavaScript and 
+ *  is not fully cross-browser compatible.
+ *
+ *  <p>
+ *
+ * <table border=1>
+ * <tr>
+ *    <td>Parameter</td>
+ *    <td>Type</td>
+ *	  <td>Direction</td>
+ *    <td>Required</td>
+ *    <td>Default</td>
+ *    <td>Description</td>
+ * </tr>
+ *
+ * <tr>
+ *		<td>selectedList</td>
+ *		<td>java.util.List</td>
+ *		<td>in-out</td>
+ *		<td>yes</td>
+ *		<td>&nbsp;</td>
+ *		<td>The property to set.  During rendering, this property is read, and sets
+ * the default value of the options in the select.
+ * When the form is submitted, list is cleared, then has each
+ * selected option added to it. </td> </tr>
+ *
+ * <tr>
+ *		<td>renderer</td>
+ *		<td>{@link IMultiplePropertySelectionRenderer}</td>
+ *		<td>in</td>
+ *		<td>no</td>
+ *		<td>shared instance of {@link CheckBoxMultiplePropertySelectionRenderer}</td>
+ *		<td>Defines the object used to render this component.  The default
+ *  renders a table of checkboxes.</td></tr>
+ *
+ *  <tr>
+ *		<td>model</td>
+ *		<td>{@link IPropertySelectionModel}</td>
+ *		<td>in</td>
+ *		<td>yes</td>
+ *		<td>&nbsp;</td>
+ *		<td>The model provides a list of possible labels, and matches those labels
+ *  against possible values that can be assigned back to the property.</td> </tr>
+ *
+ *  <tr>
+ * 		<td>disabled</td>
+ *		<td>boolean</td>
+ *		<td>in</td>
+ *		<td>no</td>
+ *		<td>false</td>
+ *		<td>Controls whether the &lt;select&gt; is active or not. A disabled PropertySelection
+ * does not update its value parameter.
+ *
+ *			<p>Corresponds to the <code>disabled</code> HTML attribute.</td>
+ *	</tr>
+ *
+ *	</table>
+ *
+ * <p>Informal parameters are not allowed.
+ *
+ *
+ *  @version $Id$
+ *  @author Sanjay Munjal
+ *
+ **/
+
+public abstract class MultiplePropertySelection extends AbstractFormComponent
+{
+
+    /**
+     *  A shared instance of {@link CheckBoxMultiplePropertySelectionRenderer}.
+     *
+     **/
+
+    public static final IMultiplePropertySelectionRenderer DEFAULT_CHECKBOX_RENDERER =
+        new CheckBoxMultiplePropertySelectionRenderer();
+
+    public abstract IBinding getSelectedListBinding();
+
+    protected void finishLoad()
+    {
+        setRenderer(DEFAULT_CHECKBOX_RENDERER);
+    }
+
+    /**
+     *  Returns true if the component is disabled (this is relevant to the
+     *  renderer).
+     *
+     **/
+
+    public abstract boolean isDisabled();
+
+    /**
+     *  Renders the component, much of which is the responsiblity
+     *  of the {@link IMultiplePropertySelectionRenderer renderer}.  The possible options,
+     *  their labels, and the values to be encoded in the form are provided
+     *  by the {@link IPropertySelectionModel model}.
+     *
+     **/
+
+    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        IForm form = getForm(cycle);
+
+        boolean rewinding = form.isRewinding();
+
+        String name = form.getElementId(this);
+
+        List selectedList = (List) getSelectedListBinding().getObject("selectedList", List.class);
+
+        if (selectedList == null)
+            throw Tapestry.createRequiredParameterException(this, "selectedList");
+
+        IPropertySelectionModel model = getModel();
+
+        if (model == null)
+            throw Tapestry.createRequiredParameterException(this, "model");
+
+        // Handle the form processing first.
+        if (rewinding)
+        {
+            // If disabled, ignore anything that comes up from the client.
+
+            if (isDisabled())
+                return;
+
+            // get all the values
+            String[] optionValues = cycle.getRequestContext().getParameters(name);
+
+            // Clear the list
+
+            selectedList.clear();
+
+            // Nothing was selected
+            if (optionValues != null)
+            {
+
+                // Go through the array and translate and put back in the list
+                for (int i = 0; i < optionValues.length; i++)
+                {
+                    // Translate the new value
+                    Object selectedValue = model.translateValue(optionValues[i]);
+
+                    // Add this element in the list back
+                    selectedList.add(selectedValue);
+                }
+            }
+
+            return;
+        }
+
+        IMultiplePropertySelectionRenderer renderer = getRenderer();
+
+        // Start rendering
+        renderer.beginRender(this, writer, cycle);
+
+        int count = model.getOptionCount();
+
+        for (int i = 0; i < count; i++)
+        {
+            Object option = model.getOption(i);
+
+            // Try to find the option in the list and if yes, then it is checked.
+            boolean optionSelected = selectedList.contains(option);
+
+            renderer.renderOption(this, writer, cycle, model, option, i, optionSelected);
+        }
+
+        // A PropertySelection doesn't allow a body, so no need to worry about
+        // wrapped components.
+        renderer.endRender(this, writer, cycle);
+    }
+
+    public abstract IPropertySelectionModel getModel();
+
+    public abstract IMultiplePropertySelectionRenderer getRenderer();
+
+    public abstract void setRenderer(IMultiplePropertySelectionRenderer renderer);
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc
new file mode 100644
index 0000000..ae91cb2
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.form.MultiplePropertySelection" 
+	allow-body="no" allow-informal-parameters="no">
+	
+  <parameter name="model" 
+  	type="org.apache.tapestry.form.IPropertySelectionModel" required="yes" direction="in"/>
+  	
+  <parameter name="selectedList" type="java.util.List" required="yes"/>
+  
+  <parameter name="disabled" type="boolean" direction="in"/>
+  
+  <parameter name="renderer" 
+  	type="org.apache.tapestry.contrib.form.IMultiplePropertySelectionRenderer"
+  	direction="in"/>
+  	
+  <property-specification name="name" type="java.lang.String"/>
+  <property-specification name="form" type="org.apache.tapestry.IForm"/>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java
new file mode 100644
index 0000000..f50d4b9
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java
@@ -0,0 +1,117 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.informal;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.tapestry.AbstractComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.spec.IComponentSpecification;
+
+/**
+ * 
+ *  A version of the Any component that inherits the informal attributes of its parent.
+ *  This component has been deprecated in favour of the 'inherit-informal-parameters' 
+ *  tag that indicates that a particular component must inherit the informal parameters
+ *  of its parent. This tag is available in the page or component specification file.
+ * 
+ *  @deprecated
+ *  @version $Id$
+ *  @author mindbridge
+ *  @since 2.2
+ * 
+ **/
+
+public class InheritInformalAny extends AbstractComponent
+{
+    // Bindings
+    private IBinding m_objElementBinding;
+
+    public IBinding getElementBinding()
+    {
+        return m_objElementBinding;
+    }
+
+    public void setElementBinding(IBinding objElementBinding)
+    {
+        m_objElementBinding = objElementBinding;
+    }
+
+    protected void generateParentAttributes(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        String attribute;
+
+        IComponent objParent = getContainer();
+        if (objParent == null)
+            return;
+
+        IComponentSpecification specification = objParent.getSpecification();
+        Map bindings = objParent.getBindings();
+        if (bindings == null)
+            return;
+
+        Iterator i = bindings.entrySet().iterator();
+
+        while (i.hasNext())
+        {
+            Map.Entry entry = (Map.Entry) i.next();
+            String name = (String) entry.getKey();
+
+            // Skip over formal parameters stored in the bindings
+            // Map.  We're just interested in informal parameters.
+
+            if (specification.getParameter(name) != null)
+                continue;
+
+            IBinding binding = (IBinding) entry.getValue();
+
+            Object value = binding.getObject();
+            if (value == null)
+                continue;
+
+            if (value instanceof IAsset)
+            {
+                IAsset asset = (IAsset) value;
+
+                // Get the URL of the asset and insert that.
+                attribute = asset.buildURL(cycle);
+            }
+            else
+                attribute = value.toString();
+
+            writer.attribute(name, attribute);
+        }
+
+    }
+
+    public void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        String strElement = m_objElementBinding.getObject().toString();
+
+        writer.begin(strElement);
+        generateParentAttributes(writer, cycle);
+        renderInformalParameters(writer, cycle);
+
+        renderBody(writer, cycle);
+
+        writer.end();
+    }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc
new file mode 100644
index 0000000..e9d9eb1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!--  $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.informal.InheritInformalAny" allow-body="yes" allow-informal-parameters="yes">
+    <parameter name="element" type="java.lang.String" required="yes" direction="custom"/>
+</component-specification>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif
new file mode 100644
index 0000000..42ff5ec
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif
new file mode 100644
index 0000000..5f2860d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif
new file mode 100644
index 0000000..0105a1b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif
new file mode 100644
index 0000000..8590996
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif
new file mode 100644
index 0000000..78ee58c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css
new file mode 100644
index 0000000..c8852b0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css
@@ -0,0 +1,201 @@
+H1  {

+	font-size: 12pt;

+	font-weight: bold;

+

+}

+

+H2  {}

+

+H3  {}

+

+A  {

+	color:#ffffff;

+}

+

+A:Visited  {}

+

+A:Active  {}

+

+A:Hover  {}

+

+SPAN.error

+{

+		color: Red;

+		font-weight: bold;

+	background-color : "#330066"		

+}

+

+BODY  {

+	font-family: "Trebuchet MS", sans-serif;

+	 background-color: #839cd1;

+}

+

+

+TABLE.inspector-data TR.odd TD  {

+	text-align : left;

+	color : Black;

+	background-color : Silver;

+}

+

+

+TABLE.inspector-data TR.even TH

+{

+	text-align : right;

+	font-weight: bold;

+}

+

+TABLE.inspector-data TR.odd TH

+{

+	text-align: right;

+	color : Black;

+	background-color : Silver;

+	font-weight: bold;

+}

+

+TABLE.inspector-data TR.even TD  {

+	text-align : left;

+}

+

+TABLE.inspector-data,

+TABLE.selector

+{

+	font-size: 9pt;

+}

+

+TABLE.selector TD.page-link

+{

+	font-style: italic;

+}

+

+TABLE.selector TD

+{

+	verticle-align: center;

+}

+

+TABLE.inspector-data TR.heading TH,

+TABLE.template TH

+{

+	text-align: center;

+	color : White;

+	background-color : "#330066";

+	font-weight: bold;

+}

+

+TABLE.template TD

+{

+	background-color: Silver;

+	font-size: small;

+}

+

+SPAN.message

+{

+	color : Silver

+	font-size: large;

+}

+

+SPAN.jwc-tag

+{

+	font-weight: bold;

+}

+

+SPAN.jwc-id, SPAN.localized-string

+{

+	font-style: italic;

+}

+

+

+

+TABLE.request-context-border  {

+	border-width : 1;

+	border-color : Black;

+	font-size: 9pt;

+}

+

+SPAN.request-context-object  {

+	font-weight : bold;

+	text-align : left;

+	font-size: 12pt;

+}

+

+TR.request-context-section TH  {

+	text-align : center;

+	color : White;

+	background-color : Blue;

+}

+

+TR.request-context-header TH  {

+	text-align : center;

+	color : White;

+	background-color : Blue;

+}

+

+TABLE.request-context-object TR.odd TD  {

+	text-align : left;

+	color : Black;

+	background-color : Silver;

+}

+

+TABLE.request-context-object TR.odd TH  {

+	color : Black;

+	background-color : Silver;

+	text-align : right;

+}

+

+TABLE.request-context-object TR.even TD  {

+	text-align : left;

+}

+

+TABLE.request-context-object TR.even TH  {

+	text-align : right;

+}

+

+TABLE.request-context-object  {

+	width : 100%;

+	font-size: 9pt;

+}

+

+TABLE.request-context-object TR  {

+	vertical-align : text-top;

+}

+

+TABLE.exception-display TR.even  {

+	top : auto;

+}

+

+TABLE.exception-displaY TD

+{

+	width: 100%;

+}

+

+TABLE.exception-display TR.even TH  {

+	text-align : right;

+	font-weight : bold;

+}

+

+TABLE.exception-display TR.odd TD  {

+	text-align : left;

+	background-color : Silver;

+}

+

+TABLE.exception-display TR.odd TH  {

+	text-align : right;

+	font-weight : bold;

+	background-color : Silver;	

+}

+

+TABLE.exception-display TR.even TD  {

+	text-align : left;

+}

+

+TABLE.exception-display TR.stack-trace  {

+	font-size : small;

+	font-family : sans-serif;

+	text-align : left;

+}

+

+UL 

+{

+	margin-top: 0px;

+	margin-bottom: 0px;

+	margin-left: 20px;

+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html
new file mode 100644
index 0000000..42d16d6
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html
@@ -0,0 +1,31 @@
+<!-- $Id$ -->
+<span jwcid="@Shell" title="ognl:inspectorTitle" stylesheet="ognl:assets.stylesheet">
+<body jwcid="@Body">
+
+<span jwcid="@inspector:Selector">
+
+<span jwcid="@inspector:ViewTabs">
+
+<span jwcid="@RenderBlock" block="ognl:blockForView"/>
+
+</span>
+</span>
+
+<span jwcid="specificationBlock@Block">
+<span jwcid="@inspector:ShowSpecification"/>
+</span>
+
+<span jwcid="templateBlock@Block">
+<span jwcid="@inspector:ShowTemplate"/>
+</span>
+
+<span jwcid="propertiesBlock@Block">
+<span jwcid="@inspector:ShowProperties"/>
+</span>
+
+<span jwcid="engineBlock@Block">
+<span jwcid="@inspector:ShowEngine"/>
+</span>
+
+</body>
+</span>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java
new file mode 100644
index 0000000..631e893
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java
@@ -0,0 +1,145 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.components.Block;
+import org.apache.tapestry.html.BasePage;
+
+/**
+ *  The Tapestry Inspector page.
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ **/
+
+public abstract class Inspector extends BasePage
+{
+    private Map _blocks = new HashMap();
+
+    protected void finishLoad()
+    {
+        _blocks.put(View.TEMPLATE, getComponent("templateBlock"));
+        _blocks.put(View.SPECIFICATION, getComponent("specificationBlock"));
+        _blocks.put(View.ENGINE, getComponent("engineBlock"));
+        _blocks.put(View.PROPERTIES, getComponent("propertiesBlock"));
+    }
+
+    public abstract View getView();
+
+    public abstract void setView(View value);
+
+    public abstract String getInspectedPageName();
+    
+    public abstract void setInspectedPageName(String value);
+
+    public abstract String getInspectedIdPath();
+
+    public abstract void setInspectedIdPath(String value);
+
+    /** 
+     *  Invoked to change the component being inspected within the current
+     *  page.
+     *
+     *  @since 1.0.6
+     **/
+
+    public void selectComponent(String idPath)
+    {
+        setInspectedIdPath(idPath);
+    }
+
+    /**
+     *  Method invoked by the {@link InspectorButton} component, 
+     *  to begin inspecting a page.
+     *
+     **/
+
+    public void inspect(String pageName, IRequestCycle cycle)
+    {
+        setInspectedPageName(pageName);
+        selectComponent((String) null);
+
+        cycle.activate(this);
+    }
+
+    /**
+     *  Listener for the component selection, which allows a particular component.  
+     *  
+     *  <p>The context is a single string,
+     *  the id path of the component to be selected (or null to inspect
+     *  the page itself).  This invokes
+     *  {@link #selectComponent(String)}.
+     *
+     **/
+
+    public void selectComponent(IRequestCycle cycle)
+    {
+        Object[] parameters = cycle.getServiceParameters();
+
+        String newIdPath;
+
+        // The up button may generate a null context.
+
+        if (parameters == null)
+            newIdPath = null;
+        else
+            newIdPath = (String) parameters[0];
+
+        selectComponent(newIdPath);
+    }
+
+    /**
+     *  Returns the {@link IPage} currently inspected by the Inspector, as determined
+     *  from the inspectedPageName property.
+     *
+     **/
+
+    public IPage getInspectedPage()
+    {
+        return getRequestCycle().getPage(getInspectedPageName());
+    }
+
+    /**
+     *  Returns the {@link IComponent} current inspected; this is determined
+     *  from the inspectedPageName and inspectedIdPath properties.
+     *
+     **/
+
+    public IComponent getInspectedComponent()
+    {
+        return getInspectedPage().getNestedComponent(getInspectedIdPath());
+    }
+
+    public String getInspectorTitle()
+    {
+        return "Tapestry Inspector: " + getEngine().getSpecification().getName();
+    }
+
+    /**
+     *  Returns the {@link Block} for the currently selected view.
+     *
+     **/
+
+    public Block getBlockForView()
+    {
+        return (Block) _blocks.get(getView());
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library
new file mode 100644
index 0000000..17e172a
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- Inspector.library,v 1.1 2002/08/24 16:07:50 hship Exp -->
+<!DOCTYPE library-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<library-specification/>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page
new file mode 100644
index 0000000..03b88a4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE page-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<page-specification class="org.apache.tapestry.contrib.inspector.Inspector">
+
+  <property-specification name="view" type="org.apache.tapestry.contrib.inspector.View"
+  		persistent="yes"
+  		initial-value="@org.apache.tapestry.contrib.inspector.View@SPECIFICATION"/>
+  <property-specification name="inspectedPageName" type="java.lang.String" persistent="yes"/>
+  <property-specification name="inspectedIdPath" type="java.lang.String" persistent="yes"/>
+  
+  <private-asset name="stylesheet" resource-path="Inspector.css"/>
+
+</page-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html
new file mode 100644
index 0000000..aa38e55
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html
@@ -0,0 +1,10 @@
+<!-- $Id$ -->
+
+<span jwcid="$content$">
+
+<div id="tapestryInspector" style="position:absolute; border-color:black; border-width:2px; border-style:solid; padding:3px; background-color:#839cd1;">
+<a jwcid="link"><img jwcid="rollover"/></a>
+</div>
+
+</span>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java
new file mode 100644
index 0000000..9fd512d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java
@@ -0,0 +1,133 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IDirect;
+import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.IResourceLocation;
+import org.apache.tapestry.IScript;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.engine.IScriptSource;
+import org.apache.tapestry.html.Body;
+
+/**
+ *  Component that can be placed into application pages that will launch
+ *  the inspector in a new window.
+ * 
+ *  [<a href="../../../../../../ComponentReference/InspectorButton.html">Component Reference</a>]
+ *
+ *  <p>Because the InspectorButton component is implemented using a {@link org.apache.tapestry.html.Rollover},
+ *  the containing page must use a {@link Body} component instead of
+ *  a &lt;body&gt; tag.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class InspectorButton extends BaseComponent implements IDirect
+{
+    private boolean _disabled = false;
+
+    /**
+     *  Gets the listener for the link component.
+     *
+     *  @since 1.0.5
+     **/
+
+    public void trigger(IRequestCycle cycle)
+    {
+        String name = getNamespace().constructQualifiedName("Inspector");
+
+        Inspector inspector = (Inspector) cycle.getPage(name);
+
+        inspector.inspect(getPage().getPageName(), cycle);
+    }
+
+    /**
+     *  Renders the script, then invokes the normal implementation.
+     *
+     *  @since 1.0.5
+     **/
+
+    protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        if (_disabled || cycle.isRewinding())
+            return;
+
+        IEngine engine = getPage().getEngine();
+        IScriptSource source = engine.getScriptSource();
+
+        IResourceLocation scriptLocation =
+            getSpecification().getSpecificationLocation().getRelativeLocation(
+                "InspectorButton.script");
+
+        IScript script = source.getScript(scriptLocation);
+
+        Map symbols = new HashMap();
+
+        IEngineService service = engine.getService(Tapestry.DIRECT_SERVICE);
+        ILink link = service.getLink(cycle, this, null);
+
+        symbols.put("URL", link.getURL());
+
+        Body body = Body.get(cycle);
+
+        if (body == null)
+            throw new ApplicationRuntimeException(
+                Tapestry.getMessage("InspectorButton.must-be-contained-by-body"),
+                this,
+                null,
+                null);
+
+        script.execute(cycle, body, symbols);
+
+        // Now, go render the rest from the template.
+
+        super.renderComponent(writer, cycle);
+    }
+
+    public boolean isDisabled()
+    {
+        return _disabled;
+    }
+
+    public void setDisabled(boolean disabled)
+    {
+        _disabled = disabled;
+    }
+
+    /**
+     *  Always returns false.
+     * 
+     *  @since 2.3
+     * 
+     **/
+
+    public boolean isStateful()
+    {
+        return false;
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc
new file mode 100644
index 0000000..cccf00d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.InspectorButton" 
+	allow-body="no" 
+	allow-informal-parameters="no">
+
+    <description>
+<![CDATA[
+Includes the Inspector button on the page (which dynamically positions itself in the
+lower right corner).  Clicking the button raises the Tapestry Inspector in a pop-up
+window.
+]]>
+    </description>
+
+  <parameter name="disabled" type="boolean" direction="in"/>
+
+    <component id="link" type="GenericLink">
+        <static-binding name="href">javascript:ti_raiseInspector();</static-binding>
+    </component>
+
+    <component id="rollover" type="Rollover">
+    	<binding name="image" expression="assets.logo"/>
+    	<binding name="focus" expression="assets.inspector"/>
+    </component>
+
+    <private-asset name="logo" resource-path="tapestry-logo.gif"/>
+    <private-asset name="inspector" resource-path="inspector-rollover.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script
new file mode 100644
index 0000000..a0e1f31
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id$ -->
+<!DOCTYPE script PUBLIC 
+	"-//Howard Lewis Ship//Tapestry Script 1.2//EN"
+	"http://tapestry.sf.net/dtd/Script_1_2.dtd">
+<!--
+
+Adds scripting support for the ShowInspector component.
+
+Prefixes all variables and functions with "ti_" (for Tapestry Inspector).
+
+Expects that the Inspector is inside a <div> named "tapestryInspector".
+
+Input symbols:
+ URL - The complete URL needed for to raise the Inspector
+ 
+-->
+<script>
+
+<include-script resource-path="/org/apache/tapestry/html/PracticalBrowserSniffer.js"/>
+
+<input-symbol key="URL" class="java.lang.String" required="yes"/>
+
+<body>
+var ti = new Object();
+
+ti.oldX = 0;
+ti.oldY = 0;
+
+function ti_positionInspector()
+{
+  var object;
+  var width;
+  var height;
+
+  if (navigator.family == "nn4")
+  {
+    object = document.tapestryInspector;
+    width = innerWidth + pageXOffset;  <!-- Doesn't properly account for scrollbars! -->
+    height = innerHeight + pageYOffset;
+  }
+  else
+  {
+    object = document.getElementById("tapestryInspector");
+    
+	if (navigator.OS == "mac")
+	{
+	  width = document.body.offsetWidth;
+	  height = document.body.offsetWidth;
+	}
+	else if (navigator.family == "gecko")
+	{
+      width = innerWidth + pageXOffset; 
+      height = innerHeight + pageYOffset;
+	}
+	else
+	{
+	  // IE 5, 6? on PC
+	  width = document.body.clientWidth  + document.body.scrollLeft;
+	  height = document.body.clientHeight + document.body.scrollTop;
+	}
+  }
+   	
+  // The width/height of the animation, plus
+  // a couple of pixels of border.
+  
+  var indent = 65;
+  
+  var x = width - indent;
+  var y = height - indent;
+
+  if (navigator.family == "nn4")
+  {
+    if (x != ti.oldX || y != ti.oldY)
+    {
+      object.moveTo(x, y);
+      object.visibility = "visible";
+    }
+  }
+  else
+  {
+    if (x != ti.oldX)
+    {
+       object.style.left = x + "px";
+       ti.oldX = x;
+    }
+    if (y != ti.oldY)
+    {
+    	object.style.top = y + "px";
+    	ti.oldY = y;
+    }
+
+ 	object.style.visibility = "visible";  
+  }
+
+
+    
+  // Reposition it every quarter second.
+  
+  window.setTimeout("ti_positionInspector()", 250);
+}
+
+function ti_raiseInspector()
+{
+  var newWindow = window.open(
+  	"${URL}",
+  	"TapestryInspector",
+  	"titlebar,resizable,scrollbars,width=700,height=600");
+  	
+  newWindow.focus();
+}
+</body>
+
+<initialization>
+ti_positionInspector();
+</initialization>
+
+</script>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif
new file mode 100644
index 0000000..e2fe821
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif
new file mode 100644
index 0000000..8aa25cb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif
new file mode 100644
index 0000000..5fa7f5b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif
new file mode 100644
index 0000000..12b13a1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif
new file mode 100644
index 0000000..917436a
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif
new file mode 100644
index 0000000..371cba0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif
new file mode 100644
index 0000000..eb87bf4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif
new file mode 100644
index 0000000..0cfdd51
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif
new file mode 100644
index 0000000..8fed715
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif
new file mode 100644
index 0000000..dda92b0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html
new file mode 100644
index 0000000..15ecbf7
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html
@@ -0,0 +1,23 @@
+<!-- $Id$ -->
+
+<table class="selector">
+	<tr valign=center>
+		<td>
+			<form jwcid="form">
+				<select jwcid="selectPage"/>
+			</form>
+		</td>
+		<td class="page-link">
+			<a jwcid="page">page</a>
+		</td>
+<span jwcid="e">
+		<td>&gt;&gt;</td>
+		<td>
+		<a jwcid="component"><span jwcid="insertId"/></a>
+		</td>
+</span>
+	</tr>
+</table>
+
+<span jwcid="renderBody"/>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java
new file mode 100644
index 0000000..158025d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java
@@ -0,0 +1,150 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.INamespace;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.engine.ISpecificationSource;
+import org.apache.tapestry.form.IPropertySelectionModel;
+import org.apache.tapestry.form.StringPropertySelectionModel;
+
+/**
+ *  Component of the {@link Inspector} page used to select the page and "crumb trail"
+ *  of the inspected component.
+ *
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class Selector extends BaseComponent
+{
+    /**
+     *  When the form is submitted,
+     *  the inspectedPageName of the {@link Inspector} page will be updated,
+     *  but we need to reset the inspectedIdPath as well.
+     *
+     **/
+
+    public void formSubmit(IRequestCycle cycle)
+    {
+        Inspector inspector = (Inspector) getPage();
+
+        inspector.selectComponent((String) null);
+    }
+
+    /**
+     *  Returns an {IPropertySelectionModel} used to select the name of the page
+     *  to inspect.  The page names are sorted.
+     *
+     **/
+
+    public IPropertySelectionModel getPageModel()
+    {
+        return new StringPropertySelectionModel(getPageNames());
+    }
+
+    /**
+     *  The crumb trail is all the components from the inspected component up to
+     *  (but not including) the page.
+     *
+     **/
+
+    public List getCrumbTrail()
+    {
+        List result = null;
+
+        Inspector inspector = (Inspector) getPage();
+        IComponent component = inspector.getInspectedComponent();
+        IComponent container = null;
+
+        while (true)
+        {
+            container = component.getContainer();
+            if (container == null)
+                break;
+
+            if (result == null)
+                result = new ArrayList();
+
+            result.add(component);
+
+            component = container;
+        }
+
+        if (result == null)
+            return null;
+
+        // Reverse the list, such that the inspected component is last, and the
+        // top-most container is first.
+
+        Collections.reverse(result);
+
+        return result;
+    }
+
+    private String[] getPageNames()
+    {
+        Set names = new HashSet();
+
+        ISpecificationSource source = getPage().getEngine().getSpecificationSource();
+
+        addPageNames(names, source.getFrameworkNamespace());
+        addPageNames(names, source.getApplicationNamespace());
+
+        List l = new ArrayList(names);
+        Collections.sort(l);
+
+        return (String[]) l.toArray(new String[l.size()]);
+    }
+
+    private void addPageNames(Set names, INamespace namespace)
+    {
+        String idPrefix = namespace.getExtendedId();
+
+        List pageNames = namespace.getPageNames();
+        int count = pageNames.size();
+
+        for (int i = 0; i < count; i++)
+        {
+            String name = (String) pageNames.get(i);
+
+            if (idPrefix == null)
+                names.add(name);
+            else
+                names.add(idPrefix + ":" + name);
+        }
+
+        List ids = namespace.getChildIds();
+        count = ids.size();
+
+        for (int i = 0; i < count; i++)
+        {
+            String id = (String) ids.get(i);
+
+            addPageNames(names, namespace.getChildNamespace(id));
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc
new file mode 100644
index 0000000..dee4b40
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.inspector.Selector">
+
+  <component id="form" type="Form">
+    <binding name="listener" expression="listeners.formSubmit"/>
+  </component>
+
+  <component id="selectPage" type="PropertySelection">
+    <binding name="value" expression="page.inspectedPageName"/>
+    <binding name="model" expression="pageModel"/>
+    <binding name="submitOnChange" expression="true"/>
+  </component>
+
+  <component id="page" type="DirectLink">
+    <binding name="listener" expression="page.listeners.selectComponent"/>
+  </component>
+
+  <component id="e" type="Foreach">
+    <binding name="source" expression="crumbTrail"/>
+  </component>
+
+  <component id="component" type="DirectLink">
+    <binding name="parameters" expression="components.e.value.idPath"/>
+    <binding name="listener" expression="page.listeners.selectComponent"/>
+  </component>
+
+  <component id="insertId" type="Insert">
+    <binding name="value" expression="components.e.value.id"/>
+  </component>
+
+  <component id="renderBody" type="RenderBody"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html
new file mode 100644
index 0000000..917e59c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html
@@ -0,0 +1,5 @@
+<!-- $Id$ -->
+
+<span jwcid="$content$">
+<span jwcid="ifDescription"><img jwcid="descriptionImage"/></span>
+</span>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc
new file mode 100644
index 0000000..28466ca
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.BaseComponent" 
+	allow-body="no" 
+	allow-informal-parameters="no">
+	
+	<parameter name="description" required="yes"/>
+	
+	<component id="ifDescription" type="Conditional">
+	  <inherited-binding name="condition" parameter-name="description"/>
+	</component>
+	
+	<component id="descriptionImage" type="Image">
+	  <binding name="image" expression="assets.info"/>
+	  <inherited-binding name="alt" parameter-name="description"/>
+	</component>
+	
+	<private-asset name="info" resource-path="info.gif"/>
+	
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html
new file mode 100644
index 0000000..797c8ff
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html
@@ -0,0 +1,90 @@
+<!-- $Id$ -->
+
+<table class="inspector-data">
+
+	<tr class="heading">
+		<th colspan=2>Engine/Application Properties</th>
+	</tr>
+	
+	<tr class="heading">
+		<th>Name</th> <th>Property</th>
+	</tr>
+	
+	<tr class="even">
+		<th>Tapestry Framework Version</th>
+		<td><span jwcid="insertFrameworkVersion"/></td>
+	</tr>
+	
+	<tr class="odd">
+		<th>Application Name</th>
+		<td><span jwcid="insertApplicationName"/></td>
+	</tr>
+
+	<tr class="even">
+		<th>Context Path</th>
+		<td><span jwcid="insertContextPath"/></td>
+	</tr>
+
+	<tr class="odd">
+		<th>Servlet Path</th>
+		<td><span jwcid="insertServletPath"/></td>
+	</tr>
+
+	<tr class="even">
+		<th>Engine Class</th>
+		<td><span jwcid="insertEngineClass"/></td>
+	</tr>
+	
+	<tr class="odd">
+		<th>Locale</th>
+		<td><span jwcid="insertLocale"/></td>
+	</tr>
+
+	<tr class="even">
+		<th>Visit</th>
+		<td>
+<span jwcid="ifNoVisit">
+<em>none</em>
+</span>
+
+<span jwcid="ifVisit">
+<span jwcid="insertVisit"/>
+</span>
+		</td>
+	</tr>
+
+</table>
+
+<h1>Operations</h1>
+
+<table class="inspector-data">
+
+	<tr class="even">
+		<td><a jwcid="restart" target="_new"><img jwcid="restartButton"/></a>
+		</td>
+		<td>Restart the application (in a new window).
+		</td>
+	</tr>
+
+	<tr class="even">
+		<td><a jwcid="reset"><img jwcid="resetButton"/></a>
+		</td>
+		<td>
+		Reset the application, discarding all cached specifications, assets
+		and templates.
+		</td>
+	</tr>
+</table>
+
+<h1>Serialized Engine</h1>
+
+<p>The serialized state of the application engine (the size of this is relevant
+for application servers which support clustering).
+
+<p><span jwcid="insertByteCount"/> bytes:
+<pre><span jwcid="insertSerializedEngine"/></pre>
+
+<h1>Request Context</h1>
+
+<span jwcid="insertRequest"/>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java
new file mode 100644
index 0000000..0b9dc71
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java
@@ -0,0 +1,186 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.io.ByteArrayOutputStream;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.event.PageDetachListener;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.util.io.BinaryDumpOutputStream;
+
+/**
+ *  Component of the {@link Inspector} page used to display
+ *  the properties of the {@link org.apache.tapestry.IEngine} as well as a serialized view of it.
+ *  Also, the {@link org.apache.tapestry.request.RequestContext} is dumped out.
+ *
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowEngine extends BaseComponent implements PageDetachListener
+{
+    private byte[] serializedEngine;
+
+    public void pageDetached(PageEvent event)
+    {
+        serializedEngine = null;
+    }
+
+    /**
+     *  Workaround for OGNL limitation --- OGNL can't dereference
+     *  past class instances.
+     * 
+     *  @since 2.2
+     * 
+     **/
+
+    public String getEngineClassName()
+    {
+        return getPage().getEngine().getClass().getName();
+    }
+
+    private byte[] getSerializedEngine()
+    {
+        if (serializedEngine == null)
+            buildSerializedEngine();
+
+        return serializedEngine;
+    }
+
+    private void buildSerializedEngine()
+    {
+        ByteArrayOutputStream bos = null;
+        ObjectOutputStream oos = null;
+
+        try
+        {
+            bos = new ByteArrayOutputStream();
+            oos = new ObjectOutputStream(bos);
+
+            // Write the application object to the stream.
+
+            oos.writeObject(getPage().getEngine());
+
+            // Extract the application as an array of bytes.
+
+            serializedEngine = bos.toByteArray();
+        }
+        catch (IOException ex)
+        {
+            throw new ApplicationRuntimeException(
+                Tapestry.getMessage("ShowEngine.could-not-serialize"),
+                ex);
+        }
+        finally
+        {
+            close(oos);
+            close(bos);
+        }
+
+        // It would be nice to deserialize the application object now, but in
+        // practice, that fails due to class loader problems.
+    }
+
+    private void close(OutputStream stream)
+    {
+        if (stream == null)
+            return;
+
+        try
+        {
+            stream.close();
+        }
+        catch (IOException ex)
+        {
+            // Ignore.
+        }
+    }
+
+    public int getEngineByteCount()
+    {
+        return getSerializedEngine().length;
+    }
+
+    public IRender getEngineDumpDelegate()
+    {
+        return new IRender()
+        {
+            public void render(IMarkupWriter writer, IRequestCycle cycle)
+            {
+                dumpSerializedEngine(writer);
+            }
+        };
+    }
+
+    private void dumpSerializedEngine(IMarkupWriter responseWriter)
+    {
+        CharArrayWriter writer = null;
+        BinaryDumpOutputStream bos = null;
+
+        try
+        {
+            // Because IReponseWriter doesn't implement the
+            // java.io.Writer interface, we have to buffer this
+            // stuff then pack it in all at once.  Kind of a waste!
+
+            writer = new CharArrayWriter();
+
+            bos = new BinaryDumpOutputStream(writer);
+            bos.setBytesPerLine(32);
+
+            bos.write(getSerializedEngine());
+            bos.close();
+
+            responseWriter.print(writer.toString());
+        }
+        catch (IOException ex)
+        {
+            // Ignore.
+        }
+        finally
+        {
+            if (bos != null)
+            {
+                try
+                {
+                    bos.close();
+                }
+                catch (IOException ex)
+                {
+                    // Ignore.
+                }
+            }
+
+            if (writer != null)
+            {
+                writer.reset();
+                writer.close();
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc
new file mode 100644
index 0000000..b181816
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowEngine" allow-body="no" allow-informal-parameters="no">
+
+  <component id="insertFrameworkVersion" type="Insert">
+  	<binding name="value" expression="@org.apache.tapestry.Tapestry@VERSION"/>
+  </component>
+  
+  <component id="insertApplicationName" type="Insert">
+    <binding name="value" expression="page.engine.specification.name"/>
+  </component>
+  
+  <component id="insertContextPath" type="Insert">
+    <binding name="value" expression="page.engine.contextPath"/>
+  </component>
+  
+  <component id="insertServletPath" type="Insert">
+    <binding name="value" expression="page.engine.servletPath"/>
+  </component>
+  
+  <component id="insertEngineClass" type="Insert">
+    <binding name="value" expression="engineClassName"/>
+  </component>
+  
+  <component id="insertLocale" type="Insert">
+    <binding name="value" expression="page.engine.locale.displayName"/>
+  </component>
+  
+  <component id="ifNoVisit" type="Conditional">
+    <binding name="condition" expression="! page.engine.hasVisit"/>
+  </component>
+  
+  <component id="insertVisit" type="Insert">
+    <binding name="value" expression="page.engine.visit"/>
+  </component>
+  
+  <component id="ifVisit" type="Conditional">
+    <binding name="condition" expression="page.engine.hasVisit"/>
+  </component>
+  
+  <component id="restart" type="ServiceLink">
+    <binding name="service" expression="@org.apache.tapestry.Tapestry@RESTART_SERVICE"/>
+  </component>
+  
+  <component id="restartButton" type="Rollover">
+    <binding name="image" expression="assets.restart"/>
+    <binding name="focus" expression="assets.restartFocus"/>
+  </component>
+  
+  <component id="reset" type="ServiceLink">
+    <binding name="service" expression="@org.apache.tapestry.Tapestry@RESET_SERVICE"/>
+    <binding name="disabled" expression="! page.engine.resetServiceEnabled"/>
+  </component>
+  
+  <component id="resetButton" type="Rollover">
+    <binding name="image" expression="assets.reset"/>
+    <binding name="focus" expression="assets.resetFocus"/>
+    <binding name="disabled" expression="assets.resetDisabled"/>
+  </component>
+  
+  <component id="insertByteCount" type="Insert">
+    <binding name="value" expression="engineByteCount"/>
+  </component>
+  
+  <component id="insertSerializedEngine" type="Delegator">
+    <binding name="delegate" expression="engineDumpDelegate"/>
+  </component>
+  
+  <component id="insertRequest" type="Delegator">
+    <binding name="delegate" expression="page.requestCycle.requestContext"/>
+  </component>
+  
+  <private-asset name="reset" resource-path="Reset_Np1.gif"/>
+  <private-asset name="resetFocus" resource-path="Reset_NRp2.gif"/>
+  <private-asset name="resetDisabled" resource-path="Reset_Np1_disabled.gif"/>
+  <private-asset name="restart" resource-path="Restart_Np1.gif"/>
+  <private-asset name="restartFocus" resource-path="Restart_NRp2.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html
new file mode 100644
index 0000000..1aa67d8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html
@@ -0,0 +1,35 @@
+<!-- $Id$ -->
+
+<span jwcid="ifNoProperties">
+<span class="message">Page contains no persistent properties.</span>
+</span>
+
+<span jwcid="ifHasProperties">
+<table class="inspector-data">
+	<tr class="heading">
+		<th>Component</th> <th>Property Name</th> <th>Value Class</th> <th>Value</th>
+	</tr>
+
+	<tr jwcid="e">
+		<td>
+			<a jwcid="selectComponent"><span jwcid="insertPath"/></a>
+		</td>
+		<td>
+			<span jwcid="insertPersistPropertyName"/>
+		</td>
+		<td>
+			<span jwcid="insertPersistValueClass"/>
+		</td>
+		<td>
+			<span jwcid="insertPersistValue"/>
+		</td>
+	</tr>
+
+</table>
+
+
+</span>
+
+
+
+	
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java
new file mode 100644
index 0000000..6b96c2c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java
@@ -0,0 +1,142 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.engine.IPageRecorder;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.event.PageRenderListener;
+import org.apache.tapestry.record.IPageChange;
+
+/**
+ *  Component of the {@link Inspector} page used to display
+ *  the persisent properties of the page.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowProperties extends BaseComponent implements PageRenderListener
+{
+    private List _properties;
+    private IPageChange _change;
+    private IPage _inspectedPage;
+
+    /**
+     *  Does nothing.
+     *
+     *  @since 1.0.5
+     *
+     **/
+
+    public void pageBeginRender(PageEvent event)
+    {
+    }
+
+    /**
+     *  @since 1.0.5
+     *
+     **/
+
+    public void pageEndRender(PageEvent event)
+    {
+        _properties = null;
+        _change = null;
+        _inspectedPage = null;
+    }
+
+    private void buildProperties()
+    {
+        Inspector inspector = (Inspector) getPage();
+
+        _inspectedPage = inspector.getInspectedPage();
+
+        IEngine engine = getPage().getEngine();
+        IPageRecorder recorder =
+            engine.getPageRecorder(_inspectedPage.getPageName(), inspector.getRequestCycle());
+
+        // No page recorder?  No properties.
+
+        if (recorder == null)
+        {
+            _properties = Collections.EMPTY_LIST;
+            return;
+        }
+
+        if (recorder.getHasChanges())
+            _properties = new ArrayList(recorder.getChanges());
+    }
+
+    /**
+     *  Returns a {@link List} of {@link IPageChange} objects.
+     *
+     *  <p>Sort order is not defined.
+     *
+     **/
+
+    public List getProperties()
+    {
+        if (_properties == null)
+            buildProperties();
+
+        return _properties;
+    }
+
+    public void setChange(IPageChange value)
+    {
+        _change = value;
+    }
+
+    public IPageChange getChange()
+    {
+        return _change;
+    }
+
+    /**
+     *  Returns the name of the value's class, if the value is non-null.
+     *
+     **/
+
+    public String getValueClassName()
+    {
+        Object value;
+
+        value = _change.getNewValue();
+
+        if (value == null)
+            return "<null>";
+
+        return convertClassToName(value.getClass());
+    }
+
+    private String convertClassToName(Class cl)
+    {
+        // TODO: This only handles one-dimensional arrays
+        // property.
+
+        if (cl.isArray())
+            return "array of " + cl.getComponentType().getName();
+
+        return cl.getName();
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc
new file mode 100644
index 0000000..4bde6af
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowProperties">
+
+  <bean name="persistPropertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  <bean name="propertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  
+  <component id="ifNoProperties" type="Conditional">
+    <binding name="condition" expression="!properties"/>
+  </component>
+  
+  <component id="ifHasProperties" type="Conditional">
+    <binding name="condition" expression="properties"/>
+  </component>
+  
+  <component id="e" type="Foreach">
+    <binding name="source" expression="properties"/>
+    <binding name="value" expression="change"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.persistPropertyClass.next"/>
+  </component>
+  
+  <component id="selectComponent" type="DirectLink">
+    <binding name="listener" expression="page.listeners.selectComponent"/>
+    <binding name="parameters" expression="change.componentPath"/>
+    <binding name="disabled" expression="change.componentPath == null"/>
+  </component>
+  
+  <component id="insertPath" type="Insert">
+    <binding name="value" expression="change.componentPath"/>
+  </component>
+  
+  <component id="insertPersistPropertyName" type="Insert">
+    <binding name="value" expression="change.propertyName"/>
+  </component>
+  
+  <component id="insertPersistValueClass" type="Insert">
+    <binding name="value" expression="valueClassName"/>
+  </component>
+  
+  <component id="insertPersistValue" type="Insert">
+    <binding name="value" expression="change.newValue"/>
+  </component>
+  
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html
new file mode 100644
index 0000000..74bdccf
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html
@@ -0,0 +1,161 @@
+<!-- $Id$ -->
+
+<table>
+<tr valign=top>
+<td>
+
+<table class="inspector-data" width="100%">
+	<tr class="even">
+		<th>Specification Resource Location</th>
+		<td><span jwcid="@Insert" value="ognl:inspectedSpecification.specificationLocation"/>
+		<span jwcid="@ShowDescription" description="ognl:inspectedSpecification.description"/>
+		</td>
+	</tr>
+	
+	<tr class="odd">
+		<th>Java class</th>
+		<td><span jwcid="@Insert" value="ognl:inspectedComponent.getClass().getName()"/></td>
+	</tr>
+
+<span jwcid="@Conditional" condition="ognl:! inspectedSpecification.pageSpecification">
+
+	<tr class="even">
+		<th>Allow informal parameters</th>
+		<td><span jwcid="@Insert" value="ognl:inspectedSpecification.allowInformalParameters"/></td>
+	</tr>
+
+	<tr class="odd">
+		<th>Allow body</th>
+		<td><span jwcid="@Insert" value="ognl:inspectedSpecification.allowBody"/></td>
+	</tr>
+	
+</span>
+	
+</table>
+
+<span jwcid="@Conditional" condition="ognl:formalParameterNames">
+
+<table class="inspector-data" width="100%">
+	<tr class="heading">
+		<th colspan=4>Formal Parameters</th>
+	</tr>
+	<tr class="heading">
+		<th>Name</th> <th>Required</th> <th>Java type</th> <th>Binding</th>
+	</tr>
+
+	<tr jwcid="e_formal">
+		<td><span jwcid="@Insert" value="ognl:parameterName"/>
+		<span jwcid="@ShowDescription" description="ognl:parameterSpecification.description"/>
+		</td>
+		<td><span jwcid="@Insert" value="ognl:parameterSpecification.required"/></td>
+		<td><span jwcid="@Insert" value="ognl:parameterSpecification.type"/></td>
+		<td><span jwcid="@Insert" value="ognl:binding"/></td>
+	</tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:informalParameterNames">
+
+<table class="inspector-data" width="100%">
+	<tr class="heading">
+		<th colspan=2>Informal Parameters</th>
+	</tr>
+	<tr class="heading">
+		<th>Name</th> <th>Binding</th>
+	</tr>
+
+	<tr jwcid="e_informal">
+		<td><span jwcid="@Insert" value="ognl:parameterName"/></td>
+		<td><span jwcid="@Insert" value="ognl:binding"/></td>
+	</tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:assetNames">
+
+<table class="inspector-data"  width="100%">
+	<tr class="heading">
+		<th colspan=2>Assets</th>
+	</tr>
+	<tr class="heading">
+		<th>Name</th> <th>Asset</th>
+	</tr>
+
+	<tr jwcid="e_asset">
+		<td><span jwcid="@Insert" value="ognl:assetName"/></td>
+		<td><span jwcid="@Insert" value="ognl:asset"/></td>
+	</tr>
+
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:sortedPropertyNames">
+
+<table class="inspector-data" width="100%">
+	<tr class="heading">
+		<th colspan=2>Properties</th>
+	</tr>
+	<tr class="heading">
+		<th>Name</th> <th>Property</th>
+	</tr>
+
+	<tr jwcid="e_property">
+		<th><span jwcid="@Insert" value="ognl:propertyName"/></th>
+		<td><span jwcid="@Insert" value="ognl:propertyValue"/></td>
+	</tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:beanNames">
+
+<table class="inspector-data" width="100%">
+	<tr class="heading">
+		<th colspan=3>Helper Beans</th>
+	</tr>
+	
+	<tr class="heading">
+		<th>Name</th> <th>Class</th> <th>Lifecycle</th>
+	</tr>
+	
+	<tr jwcid="e_bean">
+		<td><span jwcid="@Insert" value="ognl:beanName"/></td>
+		<td><span jwcid="@Insert" value="ognl:beanSpecification.className"/></td>
+		<td><span jwcid="@Insert" value="ognl:beanSpecification.lifecycle.name"/></td>
+	</tr>
+	
+</table>
+</span>
+
+</td>
+
+<td>
+<span jwcid="@Conditional" condition="ognl:sortedComponents">
+
+<table border="0" class="inspector-data">
+
+	<tr class="heading">
+		<th colspan=2>Embedded Components</th>
+	</tr>
+	<tr class="heading">
+		<th>Id</th> <th>Type</th>
+	</tr>
+
+	<tr jwcid="e_components">
+		<td>
+			<a jwcid="selectComponent"><span jwcid="@Insert" value="ognl:component.id"/></a>
+		</td>
+		<td>
+			<span jwcid="@Insert" value="ognl:componentType"/>
+		</td>
+	</tr>
+
+</table>
+</span>
+
+</td>
+</tr>
+</table>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java
new file mode 100644
index 0000000..098a6fa
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java
@@ -0,0 +1,366 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.event.PageRenderListener;
+import org.apache.tapestry.spec.IBeanSpecification;
+import org.apache.tapestry.spec.IComponentSpecification;
+import org.apache.tapestry.spec.IContainedComponent;
+import org.apache.tapestry.spec.IParameterSpecification;
+
+/**
+ *  Component of the {@link Inspector} page used to display
+ *  the specification, parameters and bindings and assets of the inspected component.
+ *
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowSpecification extends BaseComponent implements PageRenderListener
+{
+    private IComponent _inspectedComponent;
+    private IComponentSpecification _inspectedSpecification;
+    private String _parameterName;
+    private String _assetName;
+    private List _sortedComponents;
+    private IComponent _component;
+    private List _assetNames;
+    private List _formalParameterNames;
+    private List _informalParameterNames;
+    private List _sortedPropertyNames;
+    private String _propertyName;
+    private List _beanNames;
+    private String _beanName;
+    private IBeanSpecification _beanSpecification;
+
+    private static class ComponentComparitor implements Comparator
+    {
+        public int compare(Object left, Object right)
+        {
+            IComponent leftComponent;
+            String leftId;
+            IComponent rightComponent;
+            String rightId;
+
+            if (left == right)
+                return 0;
+
+            leftComponent = (IComponent) left;
+            rightComponent = (IComponent) right;
+
+            leftId = leftComponent.getId();
+            rightId = rightComponent.getId();
+
+            return leftId.compareTo(rightId);
+        }
+    }
+
+    /**
+     *  Clears all cached information about the component and such after
+     *  each render (including the rewind phase render used to process
+     *  the tab view).
+     *
+     *  @since 1.0.5
+     *
+     **/
+
+    public void pageEndRender(PageEvent event)
+    {
+        _inspectedComponent = null;
+        _inspectedSpecification = null;
+        _parameterName = null;
+        _assetName = null;
+        _sortedComponents = null;
+        _component = null;
+        _assetNames = null;
+        _formalParameterNames = null;
+        _informalParameterNames = null;
+        _sortedPropertyNames = null;
+        _propertyName = null;
+        _beanNames = null;
+        _beanName = null;
+        _beanSpecification = null;
+    }
+
+    /**
+     *  Gets the inspected component and specification from the {@link Inspector} page.
+     *
+     *  @since 1.0.5
+     **/
+
+    public void pageBeginRender(PageEvent event)
+    {
+        Inspector inspector = (Inspector) getPage();
+
+        _inspectedComponent = inspector.getInspectedComponent();
+        _inspectedSpecification = _inspectedComponent.getSpecification();
+    }
+
+    public IComponent getInspectedComponent()
+    {
+        return _inspectedComponent;
+    }
+
+    public IComponentSpecification getInspectedSpecification()
+    {
+        return _inspectedSpecification;
+    }
+
+    /**
+     *  Returns a sorted list of formal parameter names.
+     *
+     **/
+
+    public List getFormalParameterNames()
+    {
+        if (_formalParameterNames == null)
+            _formalParameterNames = sort(_inspectedSpecification.getParameterNames());
+
+        return _formalParameterNames;
+    }
+
+    /**
+     *  Returns a sorted list of informal parameter names.  This is
+     *  the list of all bindings, with the list of parameter names removed,
+     *  sorted.
+     *
+     **/
+
+    public List getInformalParameterNames()
+    {
+        if (_informalParameterNames != null)
+            return _informalParameterNames;
+
+        Collection names = _inspectedComponent.getBindingNames();
+        if (names != null && names.size() > 0)
+        {
+            _informalParameterNames = new ArrayList(names);
+
+            // Remove the names of any formal parameters.  This leaves
+            // just the names of informal parameters (informal parameters
+            // are any parameters/bindings that don't match a formal parameter
+            // name).
+
+            names = _inspectedSpecification.getParameterNames();
+            if (names != null)
+                _informalParameterNames.removeAll(names);
+
+            Collections.sort(_informalParameterNames);
+        }
+
+        return _informalParameterNames;
+    }
+
+    public String getParameterName()
+    {
+        return _parameterName;
+    }
+
+    public void setParameterName(String value)
+    {
+        _parameterName = value;
+    }
+
+    /**
+     *  Returns the {@link org.apache.tapestry.spec.ParameterSpecification} corresponding to
+     *  the value of the parameterName property.
+     *
+     **/
+
+    public IParameterSpecification getParameterSpecification()
+    {
+        return _inspectedSpecification.getParameter(_parameterName);
+    }
+
+    /**
+     *  Returns the {@link IBinding} corresponding to the value of
+     *  the parameterName property.
+     *
+     **/
+
+    public IBinding getBinding()
+    {
+        return _inspectedComponent.getBinding(_parameterName);
+    }
+
+    public void setAssetName(String value)
+    {
+        _assetName = value;
+    }
+
+    public String getAssetName()
+    {
+        return _assetName;
+    }
+
+    /**
+     *  Returns the {@link IAsset} corresponding to the value
+     *  of the assetName property.
+     *
+     **/
+
+    public IAsset getAsset()
+    {
+        return (IAsset) _inspectedComponent.getAssets().get(_assetName);
+    }
+
+    /**
+     *  Returns a sorted list of asset names, or null if the
+     *  component contains no assets.
+     *
+     **/
+
+    public List getAssetNames()
+    {
+        if (_assetNames == null)
+            _assetNames = sort(_inspectedComponent.getAssets().keySet());
+
+        return _assetNames;
+    }
+
+    public List getSortedComponents()
+    {
+        if (_sortedComponents != null)
+            return _sortedComponents;
+
+        Inspector inspector = (Inspector) getPage();
+        IComponent inspectedComponent = inspector.getInspectedComponent();
+
+        // Get a Map of the components and simply return null if there
+        // are none.
+
+        Map components = inspectedComponent.getComponents();
+
+        _sortedComponents = new ArrayList(components.values());
+
+        Collections.sort(_sortedComponents, new ComponentComparitor());
+
+        return _sortedComponents;
+    }
+
+    public void setComponent(IComponent value)
+    {
+        _component = value;
+    }
+
+    public IComponent getComponent()
+    {
+        return _component;
+    }
+
+    /**
+     *  Returns the type of the component, as specified in the container's
+     *  specification (i.e., the component alias if known).
+     *
+     **/
+
+    public String getComponentType()
+    {
+        IComponent container = _component.getContainer();
+
+        IComponentSpecification containerSpecification = container.getSpecification();
+
+        String id = _component.getId();
+        IContainedComponent contained = containerSpecification.getComponent(id);
+
+        // Temporary:  An implicit component will not be in the containing
+        // component's specification as a ContainedComponent.
+
+        if (contained == null)
+            return null;
+
+        return contained.getType();
+    }
+
+    /**
+     *  Returns a list of the properties for the component
+     *  (from its specification), or null if the component
+     *  has no properties.
+     *
+     **/
+
+    public List getSortedPropertyNames()
+    {
+        if (_sortedPropertyNames == null)
+            _sortedPropertyNames = sort(_inspectedSpecification.getPropertyNames());
+
+        return _sortedPropertyNames;
+    }
+
+    public void setPropertyName(String value)
+    {
+        _propertyName = value;
+    }
+
+    public String getPropertyName()
+    {
+        return _propertyName;
+    }
+
+    public String getPropertyValue()
+    {
+        return _inspectedSpecification.getProperty(_propertyName);
+    }
+
+    public List getBeanNames()
+    {
+        if (_beanNames == null)
+            _beanNames = sort(_inspectedSpecification.getBeanNames());
+
+        return _beanNames;
+    }
+
+    public void setBeanName(String value)
+    {
+        _beanName = value;
+        _beanSpecification = _inspectedSpecification.getBeanSpecification(_beanName);
+    }
+
+    public String getBeanName()
+    {
+        return _beanName;
+    }
+
+    public IBeanSpecification getBeanSpecification()
+    {
+        return _beanSpecification;
+    }
+
+    private List sort(Collection c)
+    {
+        if (c == null || c.size() == 0)
+            return null;
+
+        List result = new ArrayList(c);
+
+        Collections.sort(result);
+
+        return result;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc
new file mode 100644
index 0000000..fa9c420
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd" > 
+  
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowSpecification">
+
+  <bean name="formalClass" class="org.apache.tapestry.bean.EvenOdd"/>           
+  <bean name="informalClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  <bean name="assetClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  <bean name="propertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  <bean name="componentClass" class="org.apache.tapestry.bean.EvenOdd"/>
+  <bean name="beanClass" class="org.apache.tapestry.bean.EvenOdd"/>
+        
+  <component id="e_formal" type="Foreach">
+    <binding name="source" expression="formalParameterNames"/>
+    <binding name="value" expression="parameterName"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.formalClass.next"/>
+  </component>
+     
+  
+  <component id="e_informal" type="Foreach"> 
+    <binding name="source" expression="informalParameterNames"/>
+    <binding name="value" expression="parameterName"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.informalClass.next"/>
+  </component>
+
+  <component id="e_asset" type="Foreach">
+    <binding name="source" expression="assetNames"/>
+    <binding name="value" expression="assetName"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.assetClass.next"/>
+  </component>
+  
+  <component id="e_components" type="Foreach">
+    <binding name="source" expression="sortedComponents"/>
+    <binding name="value" expression="component"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.componentClass.next"/>
+  </component>
+
+  <component id="selectComponent" type="DirectLink">
+    <binding name="listener" expression="page.listeners.selectComponent"/>
+    <binding name="parameters" expression="component.idPath"/>
+  </component>
+
+  <component id="e_property" type="Foreach">
+    <binding name="source" expression="sortedPropertyNames"/>
+    <binding name="value" expression="propertyName"/>
+    <static-binding name="element">tr</static-binding>
+    <binding name="class" expression="beans.propertyClass.next"/>
+  </component>
+      
+  <component id="e_bean" type="Foreach">
+  	<binding name="source" expression="beanNames"/>
+  	<binding name="value" expression="beanName"/>
+  	<static-binding name="element">tr</static-binding>
+  	<binding name="class" expression="beans.beanClass.next"/>
+  </component>
+  	
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html
new file mode 100644
index 0000000..2673368
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html
@@ -0,0 +1,15 @@
+<!-- $Id$ -->
+
+<span jwcid="ifNoTemplate">
+<span class="message">Component does not have a template.
+</span>
+</span>
+
+<span jwcid="ifTemplate">
+<table class="template">
+	<tr>
+		<td><span jwcid="insertTemplate"/></td>
+	</tr>
+</table>
+
+</span>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java
new file mode 100644
index 0000000..65a8c13
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java
@@ -0,0 +1,333 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IDirect;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.engine.ITemplateSource;
+import org.apache.tapestry.parse.CloseToken;
+import org.apache.tapestry.parse.ComponentTemplate;
+import org.apache.tapestry.parse.LocalizationToken;
+import org.apache.tapestry.parse.OpenToken;
+import org.apache.tapestry.parse.TemplateAttribute;
+import org.apache.tapestry.parse.TemplateToken;
+import org.apache.tapestry.parse.TextToken;
+import org.apache.tapestry.parse.TokenType;
+
+/**
+ *  Component of the {@link Inspector} page used to display
+ *  the ids and types of all embedded components.
+ *
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowTemplate extends BaseComponent implements IDirect
+{
+
+    public boolean getHasTemplate()
+    {
+        Inspector inspector;
+
+        inspector = (Inspector) getPage();
+
+        // Components that inherit from BaseComponent have templates,
+        // others do not.
+
+        return inspector.getInspectedComponent() instanceof BaseComponent;
+    }
+
+    public IRender getTemplateDelegate()
+    {
+        return new IRender()
+        {
+            public void render(IMarkupWriter writer, IRequestCycle cycle)
+            {
+                writeTemplate(writer, cycle);
+            }
+        };
+    }
+
+    /**
+     *  Writes the HTML template for the component.  When &lt;jwc&gt; tags are
+     *  written, the id is made a link (that selects the named component).  We
+     *  use some magic to accomplish this, creating links as if we were a
+     *  {@link DirectLink} component, and attributing those links
+     *  to the captive {@link DirectLink} component embedded here.
+     *
+     **/
+
+    private void writeTemplate(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        IComponent inspectedComponent = getInspectedComponent();
+        ComponentTemplate template = null;
+        ITemplateSource source = getPage().getEngine().getTemplateSource();
+
+        try
+        {
+            template = source.getTemplate(cycle, inspectedComponent);
+        }
+        catch (Exception ex)
+        {
+            return;
+        }
+
+        writer.begin("pre");
+
+        int count = template.getTokenCount();
+
+        for (int i = 0; i < count; i++)
+        {
+            TemplateToken token = template.getToken(i);
+            TokenType type = token.getType();
+
+            if (type == TokenType.TEXT)
+            {
+                write(writer, (TextToken) token);
+                continue;
+            }
+
+            if (type == TokenType.CLOSE)
+            {
+                write(writer, (CloseToken) token);
+
+                continue;
+            }
+
+            if (token.getType() == TokenType.LOCALIZATION)
+            {
+
+                write(writer, (LocalizationToken) token);
+                continue;
+            }
+
+            if (token.getType() == TokenType.OPEN)
+            {
+                boolean nextIsClose =
+                    (i + 1 < count) && (template.getToken(i + 1).getType() == TokenType.CLOSE);
+
+                write(writer, nextIsClose, (OpenToken) token);
+
+                if (nextIsClose)
+                    i++;
+
+                continue;
+            }
+
+            // That's all the types known at this time.
+        }
+
+        writer.end(); // <pre>        
+    }
+
+    /** @since 3.0 **/
+
+    private IComponent getInspectedComponent()
+    {
+        Inspector page = (Inspector) getPage();
+
+        return page.getInspectedComponent();
+    }
+
+    /** @since 3.0 **/
+
+    private void write(IMarkupWriter writer, TextToken token)
+    {
+        int start = token.getStartIndex();
+        int end = token.getEndIndex();
+
+        // Print the section of the template ... print() will
+        // escape and invalid characters as HTML entities.  Also,
+        // we show the full stretch of text, not the trimmed version.
+
+        writer.print(token.getTemplateData(), start, end - start + 1);
+    }
+
+    /** @since 3.0 **/
+
+    private void write(IMarkupWriter writer, CloseToken token)
+    {
+        writer.begin("span");
+        writer.attribute("class", "jwc-tag");
+
+        writer.print("</");
+        writer.print(token.getTag());
+        writer.print(">");
+
+        writer.end(); // <span>
+    }
+
+    /** @since 3.0 **/
+
+    private void write(IMarkupWriter writer, LocalizationToken token)
+    {
+        IComponent component = getInspectedComponent();
+
+        writer.begin("span");
+        writer.attribute("class", "jwc-tag");
+
+        writer.print("<span key=\"");
+        writer.print(token.getKey());
+        writer.print('"');
+
+        Map attributes = token.getAttributes();
+        if (attributes != null && !attributes.isEmpty())
+        {
+            Iterator it = attributes.entrySet().iterator();
+            while (it.hasNext())
+            {
+                Map.Entry entry = (Map.Entry) it.next();
+                String attributeName = (String) entry.getKey();
+                String attributeValue = (String) entry.getValue();
+
+                writer.print(' ');
+                writer.print(attributeName);
+                writer.print("=\"");
+                writer.print(attributeValue);
+                writer.print('"');
+
+            }
+        }
+
+        writer.print('>');
+        writer.begin("span");
+        writer.attribute("class", "localized-string");
+
+        writer.print(component.getMessages().getMessage(token.getKey()));
+        writer.end(); // <span>
+
+        writer.print("</span>");
+
+        writer.end(); // <span>
+    }
+
+    /** @since 3.0 **/
+
+    private void write(IMarkupWriter writer, boolean nextIsClose, OpenToken token)
+    {
+        IComponent component = getInspectedComponent();
+        IEngineService service = getPage().getEngine().getService(Tapestry.DIRECT_SERVICE);
+        String[] context = new String[1];
+
+        // Each id references a component embedded in the inspected component.
+        // Get that component.
+
+        String id = token.getId();
+        IComponent embedded = component.getComponent(id);
+        context[0] = embedded.getIdPath();
+
+        // Build a URL to select that component, as if by the captive
+        // component itself (it's a Direct).
+
+        ILink link = service.getLink(getPage().getRequestCycle(), this, context);
+
+        writer.begin("span");
+        writer.attribute("class", "jwc-tag");
+
+        writer.print("<");
+        writer.print(token.getTag());
+
+        writer.print(" jwcid=\"");
+
+        writer.begin("span");
+        writer.attribute("class", "jwc-id");
+
+        writer.begin("a");
+        writer.attribute("href", link.getURL());
+        writer.print(id);
+
+        writer.end(); // <a>
+        writer.end(); // <span>
+        writer.print('"');
+
+        Map attributes = token.getAttributesMap();
+
+        if (attributes != null)
+        {
+            Iterator ii = attributes.entrySet().iterator();
+
+            while (ii.hasNext())
+            {
+                Map.Entry e = (Map.Entry) ii.next();
+                
+                TemplateAttribute attribute = (TemplateAttribute)e.getValue();               
+                
+                writer.print(' ');
+                writer.print(e.getKey().toString());
+                writer.print("=\"");
+                
+                // TODO: Fix this to output something appropriate for each type
+                // of attribute (literal, expression, string).
+                
+                writer.print(attribute.getValue());
+                writer.print('"');
+            }
+        }
+
+        // Collapse an open & close down to a single tag.
+
+        if (nextIsClose)
+            writer.print('/');
+
+        writer.print('>');
+        writer.end(); // <span>
+    }
+
+    /**
+     *  Invoked when a component id is clicked.
+     *
+     **/
+
+    public void trigger(IRequestCycle cycle)
+    {
+        Inspector inspector = (Inspector) getPage();
+
+        Object[] parameters = cycle.getServiceParameters();
+
+        inspector.selectComponent((String) parameters[0]);
+
+        IComponent newComponent = inspector.getInspectedComponent();
+
+        // If the component is not a BaseComponent then it won't have
+        // a template, so switch to the specification view.
+
+        if (!(newComponent instanceof BaseComponent))
+            inspector.setView(View.SPECIFICATION);
+    }
+
+    /**
+     *  Always returns true.
+     * 
+     *  @since 2.3
+     * 
+     **/
+
+    public boolean isStateful()
+    {
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc
new file mode 100644
index 0000000..266a467
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowTemplate">
+  <component id="ifNoTemplate" type="Conditional">
+    <binding name="condition" expression="! hasTemplate"/>
+  </component>
+  
+  <component id="ifTemplate" type="Conditional">
+    <binding name="condition" expression="hasTemplate"/>
+  </component>
+  
+  <component id="insertTemplate" type="Delegator">
+    <binding name="delegate" expression="templateDelegate"/>
+  </component>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif
new file mode 100644
index 0000000..7b695d0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif
new file mode 100644
index 0000000..33062cb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif
new file mode 100644
index 0000000..896f81b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif
new file mode 100644
index 0000000..6700d10
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif
new file mode 100644
index 0000000..5f8b7db
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif
new file mode 100644
index 0000000..16e1792
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif
new file mode 100644
index 0000000..2bc30ee
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif
new file mode 100644
index 0000000..e250138
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif
new file mode 100644
index 0000000..b7e2175
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif
new file mode 100644
index 0000000..a83fb37
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java
new file mode 100644
index 0000000..6aac890
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java
@@ -0,0 +1,68 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import org.apache.commons.lang.enum.Enum;
+
+/**
+ *  Identifies different views for the inspector.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class View extends Enum
+{
+    /**
+     *  View that displays the basic specification information, plus
+     *  formal and informal parameters (and related bindings), and 
+     *  assets.
+     *
+     **/
+
+    public static final View SPECIFICATION = new View("SPECIFICATION");
+
+    /**
+     *  View that displays the HTML template for the component, if one
+     *  exists.
+     *
+     **/
+
+    public static final View TEMPLATE = new View("TEMPLATE");
+
+    /**
+     *  View that shows the persistent properties of the page containing
+     *  the inspected component.
+     *
+     **/
+
+    public static final View PROPERTIES = new View("PROPERTIES");
+
+    /**
+     *  View that shows information about the 
+     *  {@link org.apache.tapestry.IEngine}.
+     *
+     **/
+
+    public static final View ENGINE = new View("ENGINE");
+
+
+    private View(String name)
+    {
+        super(name);
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html
new file mode 100644
index 0000000..6d3a970
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html
@@ -0,0 +1,20 @@
+<!-- $Id$ -->
+
+<table border=0 cellpadding=0 cellspacing=2>
+	<tr>
+		<td>
+<span jwcid="@Foreach" source="ognl:views" value="ognl:view">
+			<a jwcid="select@ActionLink" listener="ognl:listeners.selectTab"><img 
+				jwcid="@Rollover" image="ognl:viewImage" focus="ognl:focusImage"
+				width="120" height="19"/></a>
+</span>
+		</td>
+	</tr>
+	<tr>
+		<td><img jwcid="@Image" image="ognl:bannerImage"/></td>
+	</tr>
+	<tr>
+		<td><span jwcid="@RenderBody"/></td>
+	</tr>
+</table>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java
new file mode 100644
index 0000000..3251d35
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java
@@ -0,0 +1,92 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IRequestCycle;
+
+/**
+ *  Component of the {@link Inspector} page used to select the view.
+ *
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public abstract class ViewTabs extends BaseComponent
+{
+    private static View[] _views =
+        {
+            View.SPECIFICATION,
+            View.TEMPLATE,
+            View.PROPERTIES,
+            View.ENGINE };
+
+     public View[] getViews()
+    {
+        return _views;
+    }
+
+    public abstract void setView(View value);
+
+    public abstract View getView();
+
+    private IAsset getImageForView(boolean focus)
+    {
+        Inspector inspector = (Inspector) getPage();
+		View view = getView();
+		
+        boolean selected = (view == inspector.getView());
+
+        StringBuffer buffer = new StringBuffer(view.getName());
+
+        if (selected)
+            buffer.append("_selected");
+
+        if (focus)
+            buffer.append("_focus");
+
+        String key = buffer.toString();
+
+        return (IAsset) getAssets().get(key);
+    }
+
+    public IAsset getViewImage()
+    {
+        return getImageForView(false);
+    }
+
+    public IAsset getFocusImage()
+    {
+        return getImageForView(true);
+    }
+
+    public IAsset getBannerImage()
+    {
+         Inspector inspector = (Inspector) getPage();
+        View selectedView = inspector.getView();
+        String key = selectedView.getName() + "_banner";
+
+        return (IAsset) getAssets().get(key);
+    }
+
+    public void selectTab(IRequestCycle cycle)
+    {
+        Inspector inspector = (Inspector) getPage();
+        inspector.setView(getView());
+    }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc
new file mode 100644
index 0000000..1e03bad
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   Copyright 2004 The Apache Software Foundation
+  
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+  
+       http://www.apache.org/licenses/LICENSE-2.0
+  
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC 
+  "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
+  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+	
+<component-specification class="org.apache.tapestry.contrib.inspector.ViewTabs">
+  
+  <property-specification name="view" type="org.apache.tapestry.contrib.inspector.View"/>
+  
+  <private-asset name="SPECIFICATION" resource-path="Specification_Np1.gif"/>
+  <private-asset name="SPECIFICATION_selected" resource-path="Specification_Hp3.gif"/>
+  <private-asset name="SPECIFICATION_focus" resource-path="Specification_NRp2.gif"/>
+  <private-asset name="SPECIFICATION_selected_focus" resource-path="Specification_HRp4.gif"/>
+  <private-asset name="SPECIFICATION_banner" resource-path="Specification_NBanner.gif"/>
+  <private-asset name="TEMPLATE" resource-path="Template_Np1.gif"/>
+  <private-asset name="TEMPLATE_selected" resource-path="Template_Hp3.gif"/>
+  <private-asset name="TEMPLATE_focus" resource-path="Template_NRp2.gif"/>
+  <private-asset name="TEMPLATE_selected_focus" resource-path="Template_HRp4.gif"/>
+  <private-asset name="TEMPLATE_banner" resource-path="Template_NBanner.gif"/>
+  <private-asset name="PROPERTIES" resource-path="Properties_Np1.gif"/>
+  <private-asset name="PROPERTIES_selected" resource-path="Properties_Hp3.gif"/>
+  <private-asset name="PROPERTIES_focus" resource-path="Properties_NRp2.gif"/>
+  <private-asset name="PROPERTIES_selected_focus" resource-path="Properties_HRp4.gif"/>
+  <private-asset name="PROPERTIES_banner" resource-path="Properties_NBanner.gif"/>
+  <private-asset name="ENGINE" resource-path="Engine_Np1.gif"/>
+  <private-asset name="ENGINE_selected" resource-path="Engine_Hp3.gif"/>
+  <private-asset name="ENGINE_focus" resource-path="Engine_NRp2.gif"/>
+  <private-asset name="ENGINE_selected_focus" resource-path="Engine_HRp4.gif"/>
+  <private-asset name="ENGINE_banner" resource-path="Engine_NBanner.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif
new file mode 100644
index 0000000..be3d1d1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif
new file mode 100644
index 0000000..df0d3ef
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html
new file mode 100644
index 0000000..7610fdb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Implementation of the Tapestry <em>Inspector</em>, a specialized page
+used to dynamically introspect the construction of an application while
+it runs.  The {@link org.apache.tapestry.contrib.inspector.InspectorButton} component
+creates an icon on the page that raises the Inspector in a seperate window.
+
+@author Howard Lewis Ship <a href="mailto:hlship@apache.org">hlship@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif
new file mode 100644
index 0000000..82ad636
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java
new file mode 100644
index 0000000..80fc31d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java
@@ -0,0 +1,57 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  Wrapper around a boolean parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ *
+ **/
+
+public class BooleanParameter implements IParameter
+{
+    private boolean _value;
+
+    public static final BooleanParameter TRUE = new BooleanParameter(true);
+
+    public static final BooleanParameter FALSE = new BooleanParameter(false);
+
+    private BooleanParameter(boolean value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setBoolean(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Boolean<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java
new file mode 100644
index 0000000..e9f6d65
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java
@@ -0,0 +1,52 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  A wrapper around a double parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class DoubleParameter implements IParameter
+{
+    private double _value;
+
+    public DoubleParameter(double value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setDouble(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Double<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java
new file mode 100644
index 0000000..b2eb348
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java
@@ -0,0 +1,52 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  A wrapper around a float parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class FloatParameter implements IParameter
+{
+    private float _value;
+
+    public FloatParameter(float value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setFloat(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Float<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java
new file mode 100644
index 0000000..2032a00
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java
@@ -0,0 +1,41 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  Represents a parameter within a dynamically generated SQL statement.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ *  @see org.apache.tapestry.contrib.jdbc.ParameterizedStatement
+ * 
+ **/
+
+public interface IParameter
+{
+    /**
+     *  Invokes the appropriate setXXX() method on the 
+     *  {@link java.sql.PreparedStatement}.
+     * 
+     **/
+    
+    public void set(PreparedStatement statement, int index)
+    throws SQLException;
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java
new file mode 100644
index 0000000..c9f2544
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java
@@ -0,0 +1,70 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ *  A wrapper around {@link java.sql.Statement} or 
+ *  {@link java.sql.PreparedStatement} which hides the differences
+ *  between the two.  
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *  @see org.apache.tapestry.contrib.jdbc.StatementAssembly#createStatement(Connection)
+ * 
+ **/
+
+public interface IStatement
+{
+    /**
+     * Returns the SQL associated with this statement.
+     *
+     **/
+
+    public String getSQL();
+
+    /**
+     *  Returns the underlying {@link java.sql.Statement} 
+     *  (or {@link java.sql.PreparedStatement}).
+     *
+     **/
+
+    public Statement getStatement();
+
+    /**
+     *  Closes the underlying statement, and nulls the reference to it.
+     *
+     **/
+
+    public void close() throws SQLException;
+
+    /**
+     *  Executes the statement as a query, returning a {@link ResultSet}.
+     *
+     **/
+
+    public ResultSet executeQuery() throws SQLException;
+
+    /**
+     *  Executes the statement as an update, returning the number of rows
+     *  affected.
+     *
+     **/
+
+    public int executeUpdate() throws SQLException;
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java
new file mode 100644
index 0000000..9148201
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java
@@ -0,0 +1,52 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  A wrapper around an integer parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class IntegerParameter implements IParameter
+{
+    private int _value;
+
+    public IntegerParameter(int value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setInt(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Integer<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java
new file mode 100644
index 0000000..847e8a0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java
@@ -0,0 +1,52 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  Wrapper around long parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class LongParameter implements IParameter
+{
+    private long _value;
+
+    public LongParameter(long value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setLong(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Long<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java
new file mode 100644
index 0000000..25be80f
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java
@@ -0,0 +1,52 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  An arbitrary object parameter.
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class ObjectParameter implements IParameter
+{
+    private Object _value;
+
+    public ObjectParameter(Object value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setObject(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Object<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java
new file mode 100644
index 0000000..3d37cca
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java
@@ -0,0 +1,152 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *  A wrapper around {@link PreparedStatement}.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ * 
+ **/
+
+public class ParameterizedStatement implements IStatement
+{
+    private static final Log LOG = LogFactory.getLog(ParameterizedStatement.class);
+
+    private String _SQL;
+    private PreparedStatement _statement;
+    private IParameter[] _parameters;
+
+    /**
+     *  Create a new instance; the parameters list is copied.
+     * 
+     *  @param SQL the SQL to execute (see {@link Connection#prepareStatement(java.lang.String)})
+     *  @param connection the JDBC connection to use
+     *  @param parameters list of {@link IParameter}
+     * 
+     **/
+    
+    public ParameterizedStatement(String SQL, Connection connection, List parameters) throws SQLException
+    {
+        _SQL = SQL;
+
+        _statement = connection.prepareStatement(SQL);
+
+        _parameters = (IParameter[]) parameters.toArray(new IParameter[parameters.size()]);
+
+        for (int i = 0; i < _parameters.length; i++)
+        {
+            // JDBC numbers things from 1, not 0.
+
+            _parameters[i].set(_statement, i + 1);
+        }
+    }
+
+    /**
+     * Returns the SQL associated with this statement.
+     *
+     **/
+
+    public String getSQL()
+    {
+        return _SQL;
+    }
+
+    /**
+     *  Returns the underlying or {@link PreparedStatement}.
+     *
+     **/
+
+    public Statement getStatement()
+    {
+        return _statement;
+    }
+
+    /**
+     *  Closes the underlying statement, and nulls the reference to it.
+     *
+     **/
+
+    public void close() throws SQLException
+    {
+        _statement.close();
+
+        _statement = null;
+        _SQL = null;
+    }
+
+    /**
+     *  Executes the statement as a query, returning a {@link ResultSet}.
+     *
+     **/
+
+    public ResultSet executeQuery() throws SQLException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Executing query: " + this);
+
+        return _statement.executeQuery();
+    }
+
+    /**
+     *  Executes the statement as an update, returning the number of rows
+     *  affected.
+     *
+     **/
+
+    public int executeUpdate() throws SQLException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Executing update: " + this);
+
+        return _statement.executeUpdate();
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("ParameterizedStatement@");
+        buffer.append(Integer.toHexString(hashCode()));
+        buffer.append("[SQL=\n<");
+        buffer.append(_SQL);
+        buffer.append("\n>");
+
+        for (int i = 0; i < _parameters.length; i++)
+        {
+            IParameter parameter = _parameters[i];
+
+            buffer.append(" ?");
+            buffer.append(i + 1);
+            buffer.append('=');
+
+            buffer.append(parameter);
+        }
+
+        buffer.append(']');
+
+        return buffer.toString();
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java
new file mode 100644
index 0000000..31cfea7
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java
@@ -0,0 +1,53 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ *  A wrapper around a short parameter.  
+ *
+ *
+ *  @author Howard Lewis Ship
+ *  @version $Id$
+ *  @since 2.3
+ * 
+ **/
+
+public class ShortParameter implements IParameter
+{
+    private short _value;
+
+    public ShortParameter(short value)
+    {
+        _value = value;
+    }
+
+    public void set(PreparedStatement statement, int index) throws SQLException
+    {
+        statement.setShort(index, _value);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer = new StringBuffer("Short<");
+        buffer.append(_value);
+        buffer.append('>');
+
+        return buffer.toString();
+    }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java
new file mode 100644
index 0000000..16df20f
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java
@@ -0,0 +1,127 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *  A wrapper around {@link Statement}.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class SimpleStatement implements IStatement
+{
+    private static final Log LOG = LogFactory.getLog(SimpleStatement.class);
+
+    private String _sql;
+    private Statement _statement;
+
+    public SimpleStatement(String SQL, Connection connection) throws SQLException
+    {
+        _sql = SQL;
+        _statement = connection.createStatement();
+    }
+
+    public SimpleStatement(String SQL, Connection connection, int resultSetType, int resultSetConcurrency)
+        throws SQLException
+    {
+        _sql = SQL;
+        _statement = connection.createStatement(resultSetType, resultSetConcurrency);
+    }
+
+    /**
+     * Returns the SQL associated with this statement.
+     *
+     **/
+
+    public String getSQL()
+    {
+        return _sql;
+    }
+
+    /**
+     *  Returns the underlying {@link Statement}.
+     *
+     **/
+
+    public Statement getStatement()
+    {
+        return _statement;
+    }
+
+    /**
+     *  Closes the underlying statement, and nulls the reference to it.
+     *
+     **/
+
+    public void close() throws SQLException
+    {
+        _statement.close();
+
+        _statement = null;
+        _sql = null;
+    }
+
+    /**
+     *  Executes the statement as a query, returning a {@link ResultSet}.
+     *
+     **/
+
+    public ResultSet executeQuery() throws SQLException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Executing query: " + this);
+
+        return _statement.executeQuery(_sql);
+    }
+
+    /**
+     *  Executes the statement as an update, returning the number of rows
+     *  affected.
+     *
+     **/
+
+    public int executeUpdate() throws SQLException
+    {
+        if (LOG.isDebugEnabled())
+            LOG.debug("Executing update: " + this);
+
+        return _statement.executeUpdate(_sql);
+    }
+
+    public String toString()
+    {
+        StringBuffer buffer;
+
+        buffer = new StringBuffer("SimpleStatement@");
+        buffer.append(Integer.toHexString(hashCode()));
+
+        buffer.append("[SQL=<\n");
+        buffer.append(_sql);
+        buffer.append("\n>]");
+
+        return buffer.toString();
+    }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java
new file mode 100644
index 0000000..112e740
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java
@@ -0,0 +1,480 @@
+//  Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ *  Class for creating and executing JDBC statements.  Allows statements to be assembled
+ *  incrementally (like a {@link StringBuffer}), but also tracks parameters, shielding
+ *  the developer from the differences between constructing and 
+ *  using a JDBC 
+ *  {@link java.sql.Statement} and 
+ *  a JDBC {@link java.sql.PreparedStatement}.  This class is somewhat skewed towards
+ *  Oracle, which works more efficiently with prepared staments than
+ *  simple SQL.
+ * 
+ *  <p>In addition, implements {@link #toString()} in a useful way (you can see the
+ *  SQL and parameters), which is invaluable when debugging.
+ * 
+ *  <p>{@link #addParameter(int)} (and all overloaded versions of it for scalar types)
+ *  adds a "?" to the statement and records the parameter value.
+ * 
+ *  <p>{@link #addParameter(Integer)} (and all overloaded version of it for wrapper
+ *  types) does the same ... unless the value is null, in which case "NULL" is
+ *  inserted into the statement.
+ * 
+ *  <p>{@link #addParameterList(int[], String)} (and all overloaded versions of it)
+ *  simply invokes the appropriate {@link #addParameter(int)}, adding the
+ *  separator in between parameters.
+ *
+ *  @version $Id$
+ *  @author Howard Lewis Ship
+ *
+ **/
+
+public class StatementAssembly
+{
+    private StringBuffer _buffer = new StringBuffer();
+
+    private static final String NULL = "NULL";
+
+    public static final String SEP = ", ";
+
+    /**
+     *  List of {@link IParameter}
+     * 
+     **/
+
+    private List _parameters;
+
+    private int _lineLength;
+    private int _maxLineLength = 80;
+    private int _indent = 5;
+