You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by be...@apache.org on 2026/10/24 10:06:54 UTC

(tapestry-5-site) branch main updated: Static files frm SVN (dtd, schema, etc.)

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

benweidig pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tapestry-5-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 6003125  Static files frm SVN (dtd, schema, etc.)
6003125 is described below

commit 600312500651b4e82331df14e30d433d05ed9ded
Author: Ben Weidig <be...@netzgut.net>
AuthorDate: Sat Oct 24 12:06:44 2026 +0200

    Static files frm SVN (dtd, schema, etc.)
---
 static/archetype-catalog.xml     |  74 ++++++
 static/doap.rdf                  |  59 +++++
 static/dtd/Script_1_0.dtd        |  63 +++++
 static/dtd/Script_1_1.dtd        | 136 ++++++++++
 static/dtd/Script_1_2.dtd        | 167 ++++++++++++
 static/dtd/Script_3_0.dtd        | 196 ++++++++++++++
 static/dtd/Script_4_0.dtd        | 196 ++++++++++++++
 static/dtd/Tapestry_1_2.dtd      | 430 ++++++++++++++++++++++++++++++
 static/dtd/Tapestry_1_3.dtd      | 548 +++++++++++++++++++++++++++++++++++++++
 static/dtd/Tapestry_3_0.dtd      | 546 ++++++++++++++++++++++++++++++++++++++
 static/dtd/Tapestry_4_0.dtd      | 472 +++++++++++++++++++++++++++++++++
 static/dtd/Tapestry_4_1.dtd      | 475 +++++++++++++++++++++++++++++++++
 static/schema/tapestry_5_0_0.xsd |  15 ++
 static/schema/tapestry_5_1_0.xsd | 117 +++++++++
 static/schema/tapestry_5_3.xsd   |  99 +++++++
 static/schema/tapestry_5_4.xsd   | 100 +++++++
 16 files changed, 3693 insertions(+)

diff --git a/static/archetype-catalog.xml b/static/archetype-catalog.xml
new file mode 100644
index 0000000..6fb71a7
--- /dev/null
+++ b/static/archetype-catalog.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<archetype-catalog> 
+	<archetypes>
+
+		<!-- Manually editted 02 Feb 2025 -->
+
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.9.1</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.8.7</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.7.3</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.6.4</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.5.0</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.4.5</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.3.7</version> 
+			<description>Tapestry 5 Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.2.6</version> 
+			<description>Tapestry Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.1.0.5</version> 
+			<description>Tapestry Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>quickstart</artifactId> 
+			<version>5.0.19</version> 
+			<description>Tapestry Quickstart Project</description> 
+		</archetype>
+		<archetype> 
+			<groupId>org.apache.tapestry</groupId> 
+			<artifactId>tapestry-archetype</artifactId> 
+			<version>4.1.6</version> 
+			<description>Tapestry 4.1.6 Archetype</description> 
+		</archetype>
+	</archetypes> 
+</archetype-catalog> 
diff --git a/static/doap.rdf b/static/doap.rdf
new file mode 100644
index 0000000..63dce21
--- /dev/null
+++ b/static/doap.rdf
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
+<rdf:RDF xml:lang="en"
+         xmlns="http://usefulinc.com/ns/doap#" 
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
+         xmlns:asfext="http://projects.apache.org/ns/asfext#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/">
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+  <Project rdf:about="http://tapestry.apache.org">
+    <created>2013-02-11</created>
+    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20" />
+    <name>Apache Tapestry</name>
+    <homepage rdf:resource="http://tapestry.apache.org" />
+    <asfext:pmc rdf:resource="http://tapestry.apache.org" />
+    <shortdesc>Component oriented framework for creating dynamic, robust, highly scalable web applications in Java.</shortdesc>
+    <description>Tapestry is a component-oriented Java web application framework.
+    Its design emphasizes ease of use and developer productivity. Component
+    classes are simple POJOs, with Tapestry using byte code manipulation to
+    enhance classes at runtime. Configuration is via annotations and naming
+    conventions rather than XML. Web page and component templates use regular
+    (X)HTML that can be edited by any web designer. Live Class Reloading enables
+    you to edit Java code and immediately see results by reloading the page in
+    the web browser, resulting in a very fast "code it - see it - fix it" loop.
+</description>
+    <bug-database rdf:resource="https://issues.apache.org/jira/browse/TAP5" />
+    <mailing-list rdf:resource="http://tapestry.apache.org/community.html#Community-GettingInvolved" />
+    <download-page rdf:resource="http://tapestry.apache.org/download.html" />
+    <programming-language>Java</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/web-framework" />
+    <release>
+      <Version>
+        <name>Apache Tapestry</name>
+        <created>2025-04-07</created>
+        <revision>5.9.1</revision>
+      </Version>
+    </release>
+    <repository>
+      <SVNRepository>
+        <location rdf:resource="https://gitbox.apache.org/repos/asf/tapestry-5.git"/>
+        <browse rdf:resource="https://gitbox.apache.org/repos/asf?p=tapestry-5.git"/>
+      </SVNRepository>
+    </repository>
+  </Project>
+</rdf:RDF>
diff --git a/static/dtd/Script_1_0.dtd b/static/dtd/Script_1_0.dtd
new file mode 100644
index 0000000..a98b7ff
--- /dev/null
+++ b/static/dtd/Script_1_0.dtd
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--DTD for the files used with the ScriptGenerator class and Script component.  This is recognized with the public identifier:
+
+	-//Primix Solutions//Tapestry Script 1.0//EN
+
+-->
+
+<!--
+
+Element: script
+
+Root element.
+
+-->
+
+<!ELEMENT script (let*, body?, initialization?)>
+
+<!--
+
+Element: let
+Contained by: script
+
+Used to create a new symbol.
+
+-->
+
+<!ELEMENT let (#PCDATA | insert)*>
+<!ATTLIST let
+	key CDATA #REQUIRED
+>
+
+<!--
+
+Element: body
+Contained by: script
+
+Allows a mix of text and insert elements.  This text is added to
+the large scripting block just before the <body> tag.
+-->
+
+<!ELEMENT body (#PCDATA | insert)*>
+
+<!--
+Element: initialization
+Contained by: script
+
+Text in this block is added to the event handler for the <body>
+tag's onLoad event.
+-->
+
+<!ELEMENT initialization (#PCDATA | insert)*>
+
+<!--
+Element: insert
+Contained by: body, initialization
+
+Allows an arbitrary symbol to be inserted.
+-->
+
+<!ELEMENT insert (#PCDATA)>
+<!ATTLIST insert
+	key CDATA #REQUIRED
+>
diff --git a/static/dtd/Script_1_1.dtd b/static/dtd/Script_1_1.dtd
new file mode 100644
index 0000000..70eea4a
--- /dev/null
+++ b/static/dtd/Script_1_1.dtd
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+DTD for the files used with the ScriptGenerator class and Script component.  
+This is recognized with the public identifier:
+
+	-//Howard Ship//Tapestry Script 1.1//EN
+
+The canonical location for the DTD is:
+
+	http://tapestry.sf.net/dtd/Tapestry_1_1.dtd
+
+The root element is always script.
+	
+-->
+<!-- =======================================================
+
+Entity: full-content
+
+Identifies the contents of most of the other elements.
+
+-->
+<!ENTITY % full-content "(#PCDATA | foreach | insert | if | if-not)*">
+<!-- =======================================================
+
+Element: body
+Contained by: script
+
+Allows a mix of text and insert elements.  This text is added to
+the large scripting block just before the <body> tag.
+-->
+<!ELEMENT body %full-content;>
+<!-- =======================================================
+
+Element: foreach
+Appears in: %full-content;
+
+Iterates over a list of items; this is modeled after the
+Foreach component.  No iteration occurs if the value
+from the property path is null.
+
+Attributes:
+  key: Defines the symbol into which each succesive value is stored.
+  property-path: The source of values.
+-->
+<!ELEMENT foreach %full-content;>
+<!ATTLIST foreach
+  key CDATA #REQUIRED
+  property-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: include-script
+Contained by: script
+
+Inserts a reference to an external, static, JavaScript file.
+
+Attributes:
+  resource-path: The path to the script within the classpath.
+-->
+<!ELEMENT include-script EMPTY>
+<!ATTLIST include-script
+  resource-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: if
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the property-path evaulates to true.
+
+-->
+<!ELEMENT if %full-content;>
+<!ATTLIST if
+  property-path CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: if-not
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the property-path evaulates to false.
+
+-->
+<!ELEMENT if-not %full-content;>
+<!ATTLIST if-not
+  property-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: initialization
+Contained by: script
+
+Text in this block is added to the event handler for the <body>
+tag's onLoad event.
+-->
+<!ELEMENT initialization %full-content;>
+<!-- =======================================================
+Element: insert
+Contained by: body, initialization
+
+Allows an arbitrary symbol to be inserted.
+
+Attributes:
+  property-path: The path to the value to insert.
+-->
+<!ELEMENT insert EMPTY>
+<!ATTLIST insert
+  property-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: let
+Contained by: script
+
+Used to create a new symbol.
+
+-->
+<!ELEMENT let %full-content;>
+<!ATTLIST let
+  key CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: script
+
+Root element.
+
+Allows zero or more let elements (to establish new symbols),
+followed by a body and/or initialization element.
+
+-->
+<!ELEMENT script (include-script*, let*, body?, initialization?)>
diff --git a/static/dtd/Script_1_2.dtd b/static/dtd/Script_1_2.dtd
new file mode 100644
index 0000000..ab1e035
--- /dev/null
+++ b/static/dtd/Script_1_2.dtd
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+DTD for the files used with the ScriptParser class and Script component.  
+This is recognized with the public identifier:
+
+	-//Howard Lewis Ship//Tapestry Script 1.2//EN
+
+The canonical location for the DTD is:
+
+	http://tapestry.sf.net/dtd/Script_1_2.dtd
+
+The root element is always script.
+	
+-->
+<!-- =======================================================
+
+Entity: full-content
+
+Identifies the contents of most of the other elements.
+
+-->
+<!ENTITY % full-content "(#PCDATA | foreach | if | if-not)*">
+<!-- =======================================================
+
+Element: body
+Contained by: script
+
+Allows a mix of text and insert elements.  This text is added to
+the large scripting block just before the <body> tag.
+-->
+<!ELEMENT body %full-content;>
+<!-- =======================================================
+
+Element: foreach
+Appears in: %full-content;
+
+Iterates over a list of items; this is modeled after the
+Foreach component.  No iteration occurs if the value
+from the property path is null.
+
+Attributes:
+  key: Defines the symbol into which each succesive value is stored.
+  expression: The source of values, as an OGNL expression rooted in the symbols Map.
+-->
+<!ELEMENT foreach %full-content;>
+<!ATTLIST foreach
+  key CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: include-script
+Contained by: script
+
+Inserts a reference to an external, static, JavaScript file.
+
+Attributes:
+  resource-path: The path to the script within the classpath.
+-->
+<!ELEMENT include-script EMPTY>
+<!ATTLIST include-script
+  resource-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: if
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the expression evaulates to true.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if %full-content;>
+<!ATTLIST if
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: if-not
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the property-path evaulates to false.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if-not %full-content;>
+<!ATTLIST if-not
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: initialization
+Contained by: script
+
+Text in this block is added to the event handler for the <body>
+tag's onLoad event.
+-->
+<!ELEMENT initialization %full-content;>
+
+
+
+<!-- =======================================================
+Element: input-symbol
+Contained by: script
+
+Defines an input symbol used by the script.
+Attributes:
+  key: The name of the symbol.
+  class:  If specified, the exected class or interface for the symbol.
+  required: If yes, then the symbol must be non-null.
+-->
+
+<!ELEMENT input-symbol EMPTY>
+<!ATTLIST input-symbol
+  key CDATA #REQUIRED
+  class CDATA #IMPLIED
+  required (yes|no) "no"
+>
+
+<!-- =======================================================
+
+Element: let
+Contained by: script
+
+Used to create a new symbol.
+
+-->
+<!ELEMENT let %full-content;>
+<!ATTLIST let
+  key CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: script
+
+Root element.
+
+Allows zero or more let elements (to establish new symbols),
+followed by a body and/or initialization element.
+
+-->
+<!ELEMENT script (include-script*, input-symbol*, 
+	(let | set)*, body?, initialization?)>
+
+
+<!-- =======================================================
+
+Element: set
+Contained by: script
+
+Creates a new symbol as the result of evaluating an OGNL expression.
+
+-->
+<!ELEMENT set EMPTY>
+<!ATTLIST set
+  key CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
\ No newline at end of file
diff --git a/static/dtd/Script_3_0.dtd b/static/dtd/Script_3_0.dtd
new file mode 100644
index 0000000..b7d8e0d
--- /dev/null
+++ b/static/dtd/Script_3_0.dtd
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+DTD for the files used with the ScriptParser class and Script component.  
+This is recognized with the public identifier:
+
+	-//Apache Software Foundation//Tapestry Script Specification 3.0//EN
+
+The canonical location for the DTD is:
+
+	http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd
+
+The root element is always script.
+	
+This DTD is backwards compatible with the 1.2 DTD, with the following exceptions:
+- Addition of <unique> element
+- Addition of unique attribute to <let> element
+- Addition of index attribute to <foreach> element
+-->
+<!-- =======================================================
+
+Entity: full-content
+
+Identifies the contents of most of the other elements.
+
+-->
+<!ENTITY % full-content "(#PCDATA | foreach | if | if-not | unique)*">
+<!-- =======================================================
+
+Element: body
+Contained by: script
+
+Allows a mix of text and control elements.  This text is added to
+the large scripting block just inside the <body> tag.
+-->
+<!ELEMENT body %full-content;>
+<!-- =======================================================
+
+Element: foreach
+Appears in: %full-content;
+
+Iterates over a list of items; this is modeled after the
+For component.  No iteration occurs if the value
+from the expression is null.
+
+Attributes:
+  key: Defines the symbol into which each succesive value is stored.
+  index: Defines the symbol into which the index of the value of the current iteration is stored.
+  expression: The source of values, as an OGNL expression rooted in the symbols Map.
+-->
+<!ELEMENT foreach %full-content;>
+<!ATTLIST foreach
+  key CDATA #IMPLIED
+  index CDATA #IMPLIED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: include-script
+Contained by: script
+
+Inserts a reference to an external, static, JavaScript file.
+
+Attributes:
+  resource-path: The path to the script within the classpath.
+-->
+<!ELEMENT include-script EMPTY>
+<!ATTLIST include-script
+  resource-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: if
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the expression evaulates to true.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if %full-content;>
+<!ATTLIST if
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: if-not
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the property-path evaulates to false.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if-not %full-content;>
+<!ATTLIST if-not
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: initialization
+Contained by: script
+
+Text in this block is added to the event handler for the <body>
+tag's onLoad event.
+-->
+<!ELEMENT initialization %full-content;>
+
+
+
+<!-- =======================================================
+Element: input-symbol
+Contained by: script
+
+Defines an input symbol used by the script.
+Attributes:
+  key: The name of the symbol.
+  class:  If specified, the exected class or interface for the symbol.
+  required: If yes, then the symbol must be non-null.
+-->
+
+<!ELEMENT input-symbol EMPTY>
+<!ATTLIST input-symbol
+  key CDATA #REQUIRED
+  class CDATA #IMPLIED
+  required (yes|no) "no"
+>
+
+<!-- =======================================================
+
+Element: let
+Contained by: script
+
+Used to create a new symbol. The content of the tag
+is used to create a string that is the name.  If the
+unique flag is enabled, the name is ensured to be unique
+(a suffix may be appended to ensure it is unique
+among all names so generated).
+
+Attributes:
+  key: The name of the symbol to create.
+  unique: If yes, the name is ensured to be unique.
+  The default is no.
+
+-->
+<!ELEMENT let %full-content;>
+<!ATTLIST let
+  key CDATA #REQUIRED
+  unique (yes|no) "no"
+>
+<!-- =======================================================
+
+Element: script
+
+Root element.
+
+Allows zero or more let elements (to establish new symbols),
+followed by a body and/or initialization element.
+
+-->
+<!ELEMENT script (include-script*, input-symbol*, 
+	(let | set)*, body?, initialization?)>
+
+
+<!-- =======================================================
+
+Element: set
+Contained by: script
+
+Creates a new symbol as the result of evaluating an OGNL expression.
+
+-->
+<!ELEMENT set EMPTY>
+<!ATTLIST set
+  key CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: unique
+Appears in: %full-content;
+
+Defines a block that only is rendered once per page.
+This is appropriate to certain kinds of initialization code
+that should not be duplicated, even if the script is
+executed multiple times.
+
+-->
+<!ELEMENT unique %full-content;>
diff --git a/static/dtd/Script_4_0.dtd b/static/dtd/Script_4_0.dtd
new file mode 100644
index 0000000..e8e600b
--- /dev/null
+++ b/static/dtd/Script_4_0.dtd
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+DTD for the files used with the ScriptParser class and Script component.  
+This is recognized with the public identifier:
+
+	-//Apache Software Foundation//Tapestry Script Specification 4.0//EN
+
+The canonical location for the DTD is:
+
+	http://tapestry.apache.org/dtd/Script_4_0.dtd
+
+The root element is always script.
+	
+This DTD is backwards compatible with the 1.2 DTD, with the following exceptions:
+- Addition of <unique> element
+- Addition of unique attribute to <let> element
+- Addition of index attribute to <foreach> element
+-->
+<!-- =======================================================
+
+Entity: full-content
+
+Identifies the contents of most of the other elements.
+
+-->
+<!ENTITY % full-content "(#PCDATA | foreach | if | if-not | unique)*">
+<!-- =======================================================
+
+Element: body
+Contained by: script
+
+Allows a mix of text and control elements.  This text is added to
+the large scripting block just inside the <body> tag.
+-->
+<!ELEMENT body %full-content;>
+<!-- =======================================================
+
+Element: foreach
+Appears in: %full-content;
+
+Iterates over a list of items; this is modeled after the
+For component.  No iteration occurs if the value
+from the expression is null.
+
+Attributes:
+  key: Defines the symbol into which each succesive value is stored.
+  index: Defines the symbol into which the index of the value of the current iteration is stored.
+  expression: The source of values, as an OGNL expression rooted in the symbols Map.
+-->
+<!ELEMENT foreach %full-content;>
+<!ATTLIST foreach
+  key CDATA #IMPLIED
+  index CDATA #IMPLIED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: include-script
+Contained by: script
+
+Inserts a reference to an external, static, JavaScript file.
+
+Attributes:
+  resource-path: The path to the script within the classpath.
+-->
+<!ELEMENT include-script EMPTY>
+<!ATTLIST include-script
+  resource-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: if
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the expression evaulates to true.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if %full-content;>
+<!ATTLIST if
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+
+Element: if-not
+Appears in: %full-content;
+
+Creates a conditional portion of the script; The body of the element 
+is only included if the property-path evaulates to false.
+
+Attributes:
+  expression: The trigger expression, as an OGNL expression rooted in 
+    the symbols Map.
+
+-->
+<!ELEMENT if-not %full-content;>
+<!ATTLIST if-not
+  expression CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: initialization
+Contained by: script
+
+Text in this block is added to the event handler for the <body>
+tag's onLoad event.
+-->
+<!ELEMENT initialization %full-content;>
+
+
+
+<!-- =======================================================
+Element: input-symbol
+Contained by: script
+
+Defines an input symbol used by the script.
+Attributes:
+  key: The name of the symbol.
+  class:  If specified, the exected class or interface for the symbol.
+  required: If yes, then the symbol must be non-null.
+-->
+
+<!ELEMENT input-symbol EMPTY>
+<!ATTLIST input-symbol
+  key CDATA #REQUIRED
+  class CDATA #IMPLIED
+  required (yes|no) "no"
+>
+
+<!-- =======================================================
+
+Element: let
+Contained by: script
+
+Used to create a new symbol. The content of the tag
+is used to create a string that is the name.  If the
+unique flag is enabled, the name is ensured to be unique
+(a suffix may be appended to ensure it is unique
+among all names so generated).
+
+Attributes:
+  key: The name of the symbol to create.
+  unique: If yes, the name is ensured to be unique.
+  The default is no.
+
+-->
+<!ELEMENT let %full-content;>
+<!ATTLIST let
+  key CDATA #REQUIRED
+  unique (yes|no) "no"
+>
+<!-- =======================================================
+
+Element: script
+
+Root element.
+
+Allows zero or more let elements (to establish new symbols),
+followed by a body and/or initialization element.
+
+-->
+<!ELEMENT script (include-script*, input-symbol*, 
+	(let | set)*, body?, initialization?)>
+
+
+<!-- =======================================================
+
+Element: set
+Contained by: script
+
+Creates a new symbol as the result of evaluating an OGNL expression.
+
+-->
+<!ELEMENT set EMPTY>
+<!ATTLIST set
+  key CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+
+Element: unique
+Appears in: %full-content;
+
+Defines a block that only is rendered once per page.
+This is appropriate to certain kinds of initialization code
+that should not be duplicated, even if the script is
+executed multiple times.
+
+-->
+<!ELEMENT unique %full-content;>
diff --git a/static/dtd/Tapestry_1_2.dtd b/static/dtd/Tapestry_1_2.dtd
new file mode 100644
index 0000000..60bb1e1
--- /dev/null
+++ b/static/dtd/Tapestry_1_2.dtd
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id: Tapestry_1_2.dtd 243999 2004-10-29 17:14:26Z hlship $ -->
+<!--
+
+The DTD for Tapestry application and component specifications.
+Associated with the public identifier:
+
+	-//Howard Lewis Ship//Tapestry Specification 1.2//EN
+	
+The canonical location for the DTD is:
+
+	http://tapestry.sf.net/dtd/Tapestry_1_2.dtd
+
+For application specifications, the root element is application.
+
+For component specifications the root element is specification.
+
+This DTD is backwards compatible with the 1.1 DTD, with the following exceptions:
+- Addition of the parameter-name attribute to the parameter element
+- Addition of direction attribute to the parameter element
+- Addition of string-binding element
+
+-->
+<!-- =======================================================
+Entity: attribute-flag
+
+For entity attribute that take a boolean value, defines 'yes' and 'no.
+-->
+<!ENTITY % attribute-flag "(yes|no)">
+<!-- =======================================================
+Element: application
+Root element
+
+Defines a Tapestry application.
+
+Attributes:
+  name: A textual name used to uniquely identify the application.
+  engine-class:  The Java class to instantiate as the application engine.
+-->
+<!ELEMENT application (description*, property*, (page|component-alias|service)*)>
+<!ATTLIST application
+  name CDATA #REQUIRED
+  engine-class CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: bean
+Appears in: specification
+
+Defines a JavaBean that will be used in some way by the component.  Beans
+are accessible via the components' beans property (which contains a property
+for each bean).  Beans are created as needed, and are discarded based on
+the lifecycle attribute.  Beans are typically used to extend the
+implementation of a component via aggregation.
+
+Attributes:
+  name: the name of the bean
+  class: the Java class to instantiate
+  lifecycle: when the reference to the bean should be discard
+  	"none" no lifecycle, the bean is created and returned, but not stored
+  	"request" the bean is retained until the end of the request cycle
+  	"page" the bean is retained for the lifespan of the page
+  	
+Nothing prevents a bean for storing state; however, such state will
+not be associated with any particular session (unlike persistant page
+properties).  Further, because of page pooling, subsequent requests
+from the same client may be serviced by different instances of a page and
+(therefore) different bean instances.
+
+Beans that have the "request" lifecycle may be stored into a pool
+for later re-use (in the same or different page).
+
+The bean may have its properties set.  Properties are set on both
+newly instantiated beans, and beans that are retrieved from a pool.
+
+-->
+<!ELEMENT bean (description*, set-property*)>
+<!ATTLIST bean
+  name CDATA #REQUIRED
+  class CDATA #REQUIRED
+  lifecycle (none|request|page) "request"
+>
+<!-- =======================================================
+Element: binding
+Appears in: component
+
+Binds a parameter of the component to a property of its container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  property-path: The property path, relative to the container, to obtain
+    the parameter value from.
+-->
+<!ELEMENT binding EMPTY>
+<!ATTLIST binding
+  name CDATA #REQUIRED
+  property-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: component
+Contained by: specification
+
+Defines a component contained by the component being specified.
+
+Attribute:
+  id: A unique identifier for the component within the container.
+  type: The type of component, either a well known logical name, or the complete path
+    to the component's specification.
+  copy-of: The id of a previously defined component; this component will be a copy
+    of the other component.
+
+The Tapestry page loader ensures that either type or copy-of is specified, but not both.
+-->
+<!ELEMENT component ((binding | field-binding | inherited-binding | static-binding | string-binding)*)>
+<!ATTLIST component
+  id ID #REQUIRED
+  type CDATA #IMPLIED
+  copy-of IDREF #IMPLIED
+>
+<!-- =======================================================
+Element: component-alias
+Contained by: application
+
+Establishes a short logic name for a particular component that is used
+within the application.
+
+Attributes:
+  type: The logical name for the component.
+  specification-path:  The complete path to the component's specification.
+-->
+<!ELEMENT component-alias EMPTY>
+<!ATTLIST component-alias
+  type CDATA #REQUIRED
+  specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: context-asset
+Contained by: specification
+
+An asset located in the same web application context as the running
+application.
+
+Attributes:
+  name: The name of the asset.
+  path: The path, relative to the web application context, of the resource.
+-->
+<!ELEMENT context-asset EMPTY>
+<!ATTLIST context-asset
+  name CDATA #REQUIRED
+  path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: description
+Appears in: application bean parameter specification
+
+Several elements may contain descriptions; these descriptions are
+optional.  The eventual goal is to provide help in some form of IDE.
+Currently, descriptions are optional and ignored.
+
+Attributes:
+  xml:lang the language that the description is expressed in.
+-->
+<!ELEMENT description (#PCDATA)>
+<!ATTLIST description
+  xml:lang NMTOKEN "en"
+>
+<!-- =======================================================
+Element: external-asset
+Contained by: specification
+
+Defines an asset at some external source.
+
+Attributes:
+  name: The name of the asset.
+  URL: The URL used to reference the asset.
+-->
+<!ELEMENT external-asset EMPTY>
+<!ATTLIST external-asset
+  name CDATA #REQUIRED
+  URL CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: field-binding
+Appears in: component
+
+Binds a parameter of the component to a public static field of
+some Java object.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  field-name:  The name of the field, of the form [package.]class.field.
+    The package may be ommitted if it is "java.lang".
+-->
+<!ELEMENT field-binding EMPTY>
+<!ATTLIST field-binding
+  name CDATA #REQUIRED
+  field-name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: field-value
+Appears in: set-property
+
+Allows a helper bean property to be set to the value of
+a static field.
+
+Attributes:
+  field-name: The name of the field, as with field-binding.
+  
+-->
+<!ELEMENT field-value EMPTY>
+<!ATTLIST field-value
+  field-name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: inherited-binding
+Appears in: component
+
+Binds a parameter of the component to a parameter of the container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  parameter-name: The name of the container parameter to bind the
+    component parameter to.
+-->
+<!ELEMENT inherited-binding EMPTY>
+<!ATTLIST inherited-binding
+  name CDATA #REQUIRED
+  parameter-name CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: page
+Contained by: application
+
+Defines a single page within the application.  Each application will contain
+at least one of these, to define the Home page.
+
+Attributes:
+  name: A unique name for the application.
+  specification-path:  The resource classpath of the component specification
+    for the page.
+-->
+<!ELEMENT page EMPTY>
+<!ATTLIST page
+  name CDATA #REQUIRED
+  specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: parameter
+Contained by: specification
+
+Defines a formal parameter for the component.
+
+Attributes:
+  name: A unqiue name for the parameter.
+  java-type: The name of a Java class or primitive type expected by the parameter.
+    This is for documentation purposes only, it is not enforced.
+  required: If yes, then the parameter must be bound.  If no (the default),
+    then the parameter is optional.
+  property-name: The name to use, instead of the parameter name, for the
+    JavaBean property connected to this parameter.
+  direction: The normal flow of data through the component.
+-->
+<!ELEMENT parameter (description*)>
+<!ATTLIST parameter
+  name CDATA #REQUIRED
+  java-type CDATA #IMPLIED
+  required %attribute-flag; "no"
+  property-name CDATA #IMPLIED
+  direction (in|custom) "custom"
+>
+<!-- =======================================================
+Element: private-asset
+Contained by: specification
+
+An asset available within the Java classpath (i.e., bundled inside a JAR or WAR).
+
+Attributes:
+  name: The name of the asset.
+  resource-path: The complete pathname of the resource.
+-->
+<!ELEMENT private-asset EMPTY>
+<!ATTLIST private-asset
+  name CDATA #REQUIRED
+  resource-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: property
+Contained by: application, specification
+
+Defines a key/value pair associated with the application or component specification.  Properties
+are used to capture information that doesn't fit into the DTD.  The value for the property is
+the PCDATA wrapped by the property tag (which is trimmed of leading and trailing whitespace).
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: property-value
+Appears in: set-parameter
+
+Used to initialize a bean with a property of its containing
+component.
+-->
+
+<!ELEMENT property-value EMPTY>
+<!ATTLIST property-value
+  property-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: reserved-parameter
+Appears in: specification
+
+Identifies a name which may not be used as an informal parameter.
+Informal parameters are typically HTML attribute names; this
+list identifies HTML attributes that are written exclusively
+by the component and may not be affected by informal parameters.
+-->
+
+<!ELEMENT reserved-parameter EMPTY>
+<!ATTLIST reserved-parameter
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: service
+Appears in: application
+
+Defines an engine service.  You may override the default
+set of engine services or provide completely new services.
+
+Attributes:
+  name: The name of the service.
+  class: The Java class to instantiate for the service.
+
+-->
+
+<!ELEMENT service EMPTY>
+<!ATTLIST service
+  name CDATA #REQUIRED
+  class CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: set-property
+Appears in: bean
+
+Used to initialize a property of a helper bean.
+-->
+
+<!ELEMENT set-property (static-value | property-value | field-value)>
+<!ATTLIST set-property
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: specification
+Root element
+
+A component specification.  It's attributes define the Java class to
+instantiate, whether the component may wrap other elements, and whether
+informal (undeclared) parameters are allowed.
+
+Attributes:
+  class: The Java class to instantiate for the component.
+  allow-body:  If yes (the default), the component may wrap other elements (have a body).
+  allow-informal-parameters:  If yes (the default), informal parameters (parameters that are not
+    explictily defined) are allowed.
+-->
+<!ELEMENT specification (description*, parameter*, reserved-parameter*, property*, bean*,
+	component*, (external-asset | context-asset | private-asset)*)>
+<!ATTLIST specification
+  class CDATA #REQUIRED
+  allow-body %attribute-flag; "yes"
+  allow-informal-parameters %attribute-flag; "yes"
+>
+<!-- =======================================================
+Element: static-binding
+Appears in: component
+
+Binds a parameter of the component to a static value defined directly
+within this specification. The value is the PCDATA wrapped by the element
+(with leading and trailing whitespace removed).
+
+Attributes:
+  name: The name of the component parameter to bind.
+
+-->
+<!ELEMENT static-binding (#PCDATA)>
+<!ATTLIST static-binding
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: static-value
+Appears in: set-parameter
+
+A static value, that will be converted to some known type.
+
+The possible types are limited to a few simple scalar types,
+and String.  Additional types will likely be added in the future.
+
+-->
+
+<!ELEMENT static-value (#PCDATA)>
+<!ATTLIST static-value
+  type (boolean|int|double|String) "String"
+>
+
+<!-- =======================================================
+Element: string-binding
+Appears in: component
+
+Binds a parameter of the component to a localized string of
+its container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  key: The key used to access a localized string.
+  
+-->
+
+<!ELEMENT string-binding EMPTY>
+<!ATTLIST string-binding
+  name CDATA #REQUIRED
+  key CDATA #REQUIRED
+>
\ No newline at end of file
diff --git a/static/dtd/Tapestry_1_3.dtd b/static/dtd/Tapestry_1_3.dtd
new file mode 100644
index 0000000..e01c5ab
--- /dev/null
+++ b/static/dtd/Tapestry_1_3.dtd
@@ -0,0 +1,548 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+The DTD for Tapestry application, page and component specifications.
+Associated with the public identifier:
+
+	-//Howard Lewis Ship//Tapestry Specification 1.3//EN
+	
+The canonical location for the DTD is:
+
+	http://tapestry.sf.net/dtd/Tapestry_1_3.dtd
+
+For application specifications, the root element is application.
+
+For component specifications, the root element is component-specification.
+
+For page specifications, the root element is page-specification.
+
+For library specifiations, the root element is library-specification.
+
+This DTD is backwards compatible with the 1.2 DTD, with the following exceptions:
+- specification (in 1.1) has been split into page-specification and component-specification
+- added string-value element
+- added library-specification root element
+- added library element
+- added extension element
+- added static value type 'long'
+- allow <property> within <bean>, <component>, <extension>, <private-asset>, <context-asset> and <external-asset>
+- add "render" to bean lifecycle value
+- rename <binding>'s property-path attribute to expression
+- simplify set-property to use OGNL expressions
+- add "form" as parameter direction
+-->
+
+<!-- =======================================================
+Entity: attribute-flag
+
+For entity attributesthat take a boolean value, defines 'yes' and 'no'.
+The default varies, so isn't included here.
+-->
+<!ENTITY % attribute-flag "(yes|no)">
+
+
+<!-- =======================================================
+Entity: static-value-type
+
+For entity attributes that take a string but convert it to a real
+type.  Defaults to String.
+
+-->
+<!ENTITY % static-value-type "(boolean|int|long|double|String) 'String'">
+
+<!ENTITY % library-content "(description*, property*, (page|component-alias|service|library|extension)*)">
+
+<!-- =======================================================
+Element: application
+Root element
+
+Defines a Tapestry application.
+
+Attributes:
+  name: A textual name used to uniquely identify the application.
+  engine-class:  The Java class to instantiate as the application engine.
+-->
+<!ELEMENT application %library-content;>
+<!ATTLIST application
+  name CDATA #REQUIRED
+  engine-class CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: bean
+Appears in: component-specification, page-specification
+
+Defines a JavaBean that will be used in some way by the component.  Beans
+are accessible via the components' beans property (which contains a property
+for each bean).  Beans are created as needed, and are discarded based on
+the lifecycle attribute.  Beans are typically used to extend the
+implementation of a component via aggregation.
+
+Attributes:
+  name: the name of the bean
+  class: the Java class to instantiate
+  lifecycle: when the reference to the bean should be discard
+  	"none" no lifecycle, the bean is created and returned, but not stored
+  	"request" the bean is retained until the end of the request cycle
+  	"page" the bean is retained for the lifespan of the page
+  	"render" the bean is retained until the end of the current page render
+  	
+Nothing prevents a bean for storing state; however, such state will
+not be associated with any particular session (unlike persistant page
+properties).  Further, because of page pooling, subsequent requests
+from the same client may be serviced by different instances of a page and
+(therefore) different bean instances.
+
+Beans that have the "request" lifecycle may be stored into a pool
+for later re-use (in the same or different page).
+
+The bean may have its properties set.  Properties are set on both
+newly instantiated beans, and beans that are retrieved from a pool.
+
+-->
+<!ELEMENT bean (description*, property*, (set-property | set-string-property)*)>
+<!ATTLIST bean
+  name CDATA #REQUIRED
+  class CDATA #REQUIRED
+  lifecycle (none|request|page|render) "request"
+>
+
+<!-- =======================================================
+Element: binding
+Appears in: component
+
+Binds a parameter of the component to a property of its container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  expression: The OGNL expression.
+-->
+<!ELEMENT binding EMPTY>
+<!ATTLIST binding
+  name CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: configure
+Appears in: extension
+
+Configures one JavaBean property of an extension.
+
+Attributes:
+  property-name:  The name of the property to configure.
+  type: Conversion of property value.
+  
+ 
+-->
+
+<!ELEMENT configure (#PCDATA)>
+<!ATTLIST configure 
+  property-name CDATA #REQUIRED
+  type %static-value-type;
+>
+  
+<!-- =======================================================
+Element: component
+Contained by: component-specification, page-specification
+
+Defines a component contained by the component being specified.
+
+Attribute:
+  id: A unique identifier for the component within the container.
+  type: The type of component, either a well known logical name, or the complete path
+    to the component's specification.
+  copy-of: The id of a previously defined component; this component will be a copy
+    of the other component.
+
+The Tapestry page loader ensures that either type or copy-of is specified, but not both.
+-->
+<!ELEMENT component (property*, (binding | field-binding | inherited-binding | static-binding | string-binding)*)>
+<!ATTLIST component
+  id ID #REQUIRED
+  type CDATA #IMPLIED
+  copy-of IDREF #IMPLIED
+>
+
+<!-- =======================================================
+Element: component-alias
+Contained by: application
+
+Establishes a short logic name for a particular component that is used
+within the application.
+
+Attributes:
+  type: The logical name for the component.
+  specification-path:  The complete path to the component's specification.
+-->
+<!ELEMENT component-alias EMPTY>
+<!ATTLIST component-alias
+  type CDATA #REQUIRED
+  specification-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: component-specification
+Root element
+
+A component specification.  It's attributes define the Java class to
+instantiate, whether the component may wrap other elements, and whether
+informal (undeclared) parameters are allowed.  Very similar to a page-specification,
+except that component-specification allows for parameters (formal and informal).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+  allow-body:  If yes (the default), the component may wrap other elements (have a body).
+  allow-informal-parameters:  If yes (the default), informal parameters (parameters that are not
+    explictily defined) are allowed.
+-->
+<!ELEMENT component-specification 
+	(description*, parameter*, reserved-parameter*, property*,
+	(bean |	component | external-asset | context-asset | private-asset)*)>
+<!ATTLIST component-specification
+  class CDATA #REQUIRED
+  allow-body %attribute-flag; "yes"
+  allow-informal-parameters %attribute-flag; "yes"
+>
+
+<!-- =======================================================
+Element: context-asset
+Contained by: component-specification, page-specification
+
+An asset located in the same web application context as the running
+application.
+
+Attributes:
+  name: The name of the asset.
+  path: The path, relative to the web application context, of the resource.
+-->
+<!ELEMENT context-asset (property*)>
+<!ATTLIST context-asset
+  name CDATA #REQUIRED
+  path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: description
+Appears in: many
+
+Several elements may contain descriptions; these descriptions are
+optional.  The eventual goal is to provide help in some form of IDE.
+Currently, descriptions are optional and ignored.
+
+Attributes:
+  xml:lang the language that the description is expressed in.
+-->
+<!ELEMENT description (#PCDATA)>
+<!ATTLIST description
+  xml:lang NMTOKEN "en"
+>
+
+<!-- =======================================================
+Element: extension
+Contained by: application, library-specification
+
+Defines an extension, an object that is instantiated and configured
+(like a helper bean) and is then accessible, by name, from the
+containing library (or application).
+
+Attributes:
+  name: Name of the extension.
+  class: Java class to instantiate.
+  immediate: If true, the extension is instantiated early instead of as-needed.
+  
+-->
+<!ELEMENT extension (property*, configure*)>
+<!ATTLIST extension
+  name CDATA #REQUIRED
+  class CDATA #REQUIRED
+  immediate %attribute-flag; "no"
+>
+
+<!-- =======================================================
+Element: external-asset
+Contained by: component-specification, page-specification
+
+Defines an asset at some external source.
+
+Attributes:
+  name: The name of the asset.
+  URL: The URL used to reference the asset.
+-->
+<!ELEMENT external-asset (property*)>
+<!ATTLIST external-asset
+  name CDATA #REQUIRED
+  URL CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: field-binding
+Appears in: component
+
+Binds a parameter of the component to a public static field of
+some Java object.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  field-name:  The name of the field, of the form [package.]class.field.
+    The package may be ommitted if it is "java.lang".
+-->
+<!ELEMENT field-binding EMPTY>
+<!ATTLIST field-binding
+  name CDATA #REQUIRED
+  field-name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: inherited-binding
+Appears in: component
+
+Binds a parameter of the component to a parameter of the container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  parameter-name: The name of the container parameter to bind the
+    component parameter to.
+-->
+<!ELEMENT inherited-binding EMPTY>
+<!ATTLIST inherited-binding
+  name CDATA #REQUIRED
+  parameter-name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: library
+Appears in: application-specification, library-specification
+
+Defines a library used in the construction of the container
+(either another library, or the application itself).
+
+Attributes:
+  id: An identifier used to reference pages and components
+    provided by the library.
+  specification-path: The path to the resource that provides
+    the library specification.
+-->
+<!ELEMENT library EMPTY>
+<!ATTLIST library
+  id CDATA #REQUIRED
+  specification-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: library-specification
+Root element
+
+Defines a library that may be used in the construction 
+of an application (or another library).  An application can
+be thought of as a specialized kind of library.
+
+-->
+<!ELEMENT library-specification %library-content;>
+
+<!-- =======================================================
+Element: page
+Contained by: application, library-specification
+
+Defines a single page within the application.  Each application will contain
+at least one of these, to define the Home page.
+
+Attributes:
+  name: A unique name for the application.
+  specification-path:  The resource classpath of the component specification
+    for the page.
+-->
+<!ELEMENT page EMPTY>
+<!ATTLIST page
+  name CDATA #REQUIRED
+  specification-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: page-specification
+Root element
+
+A page specification.  It's attributes define the Java class to
+instantiate.  Pages are like components, except they always allow
+a body, and never allow parameters (formal or otherwise).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+-->
+<!ELEMENT page-specification (description*, property*,
+    (bean | component | external-asset | context-asset | private-asset)*)>
+<!ATTLIST page-specification
+  class CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: parameter
+Contained by: component-specification
+
+Defines a formal parameter for the component.
+
+Attributes:
+  name: A unqiue name for the parameter.
+  java-type: The name of a Java class or primitive type expected by the parameter.
+    This is for documentation purposes only, it is not enforced.
+  required: If yes, then the parameter must be bound.  If no (the default),
+    then the parameter is optional.
+  property-name: The name to use, instead of the parameter name, for the
+    JavaBean property connected to this parameter.
+  direction: The normal flow of data through the component.
+-->
+
+<!ELEMENT parameter (description*)>
+<!ATTLIST parameter
+  name CDATA #REQUIRED
+  java-type CDATA #IMPLIED
+  required %attribute-flag; "no"
+  property-name CDATA #IMPLIED
+  direction (in|form|custom) "custom"
+>
+
+<!-- =======================================================
+Element: private-asset
+Contained by: component-specification, page-specification
+
+An asset available within the Java classpath (i.e., bundled inside a JAR or WAR).
+
+Attributes:
+  name: The name of the asset.
+  resource-path: The complete pathname of the resource.
+-->
+<!ELEMENT private-asset (property*)>
+<!ATTLIST private-asset
+  name CDATA #REQUIRED
+  resource-path CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: property
+Contained by: (many other elements)
+
+Defines a key/value pair associated with the application or component specification.  Properties
+are used to capture information that doesn't fit into the DTD.  The value for the property is
+the PCDATA wrapped by the property tag (which is trimmed of leading and trailing whitespace).
+
+This should not be confused with several other tags which are used to set JavaBeans properties
+of various objects.  The <property> tag exists to allow meta-data to be stored in the specification.
+
+Attributes:
+  name: The name of the property to set.
+  
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: reserved-parameter
+Appears in: component-specification
+
+Identifies a name which may not be used as an informal parameter.
+Informal parameters are typically HTML attribute names; this
+list identifies HTML attributes that are written exclusively
+by the component and may not be affected by informal parameters.
+
+Attributes:
+  name: The parameter name to reserve.
+-->
+
+<!ELEMENT reserved-parameter EMPTY>
+<!ATTLIST reserved-parameter
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: service
+Appears in: application
+
+Defines an engine service.  You may override the default
+set of engine services or provide completely new services.
+
+Attributes:
+  name: The name of the service.
+  class: The Java class to instantiate for the service.
+
+-->
+
+<!ELEMENT service EMPTY>
+<!ATTLIST service
+  name CDATA #REQUIRED
+  class CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: set-property
+Appears in: bean
+
+Used to initialize a property of a helper bean.
+
+Attributes:
+  name: The name of the property to be set.
+  expression: The OGNL expression that provides a value.
+-->
+
+<!ELEMENT set-property EMPTY>
+<!ATTLIST set-property
+  name CDATA #REQUIRED
+  expression CDATA #REQUIRED
+>
+
+
+<!-- =======================================================
+Element: set-string-property
+Appears in: bean
+
+A localized string.
+
+Attributes:
+  key:  Sets a property of a string from a localized string.
+
+-->
+
+<!ELEMENT set-string-property EMPTY>
+<!ATTLIST set-string-property
+  name CDATA #REQUIRED
+  key CDATA #REQUIRED
+>
+
+
+<!-- =======================================================
+Element: static-binding
+Appears in: component
+
+Binds a parameter of the component to a static value defined directly
+within this specification. The value is the PCDATA wrapped by the element
+(with leading and trailing whitespace removed).
+
+Attributes:
+  name: The name of the component parameter to bind.
+
+-->
+<!ELEMENT static-binding (#PCDATA)>
+<!ATTLIST static-binding
+  name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: string-binding
+Appears in: component
+
+Binds a parameter of the component to a localized string of
+its container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  key: The key used to access a localized string.
+  
+-->
+
+<!ELEMENT string-binding EMPTY>
+<!ATTLIST string-binding
+  name CDATA #REQUIRED
+  key CDATA #REQUIRED
+>
+
diff --git a/static/dtd/Tapestry_3_0.dtd b/static/dtd/Tapestry_3_0.dtd
new file mode 100644
index 0000000..2a2bfad
--- /dev/null
+++ b/static/dtd/Tapestry_3_0.dtd
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+The DTD for Tapestry application, library, page and component specifications.
+Associated with the public identifier:
+
+	-//Apache Software Foundation//Tapestry Specification 3.0//EN
+	
+The canonical location for the DTD is:
+
+	http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd
+
+For application specifications, the root element is application.
+
+For component specifications, the root element is component-specification.
+
+For page specifications, the root element is page-specification.
+
+For library specifiations, the root element is library-specification.
+
+This DTD is backwards compatible with the 1.3 DTD, with the following exceptions:
+- <field-binding> has been removed
+- attribute class of <component-specification> and <page-specification is now optional
+- attributes name and engine-class of <application> are now optional
+- added value attribute to <static-binding>
+- added value attribute to <property>
+- renamed <component-alias> to <component-type>
+- rename <set-string-property> to <set-message-property>
+- added <listener-binding> element
+- added <property-specification> element
+- renamed java-type to type inside <parameter>
+- allow values to be specified as attributes or wrapped character data in many elements
+- allow only a single <description> per element
+-->
+<!-- =======================================================
+Entity: attribute-flag
+
+For entity attributes that take a boolean value, defines 'yes' and 'no'.
+The default varies, so isn't included here.
+-->
+<!ENTITY % attribute-flag "(yes|no)">
+<!-- =======================================================
+Entity: static-value-type
+
+For entity attributes that take a string but convert it to a real
+type.  Defaults to String.
+
+-->
+<!ENTITY % static-value-type "(boolean|int|long|double|String) 'String'">
+<!ENTITY % library-content "(description?, property*, (page|component-type|service|library|extension)*)">
+<!-- =======================================================
+Element: application
+Root element
+
+Defines a Tapestry application.
+
+Attributes:
+  name: A textual name used to uniquely identify the application.
+  engine-class:  The Java class to instantiate as the application engine.
+-->
+<!ELEMENT application %library-content;>
+<!ATTLIST application
+	name CDATA #IMPLIED
+	engine-class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: bean
+Appears in: component-specification, page-specification
+
+Defines a JavaBean that will be used in some way by the component.  Beans
+are accessible via the components' beans property (which contains a property
+for each bean).  Beans are created as needed, and are discarded based on
+the lifecycle attribute.  Beans are typically used to extend the
+implementation of a component via aggregation.
+
+Attributes:
+  name: the name of the bean
+  class: the Java class to instantiate
+  lifecycle: when the reference to the bean should be discard
+  	"none" no lifecycle, the bean is created and returned, but not stored
+  	"request" the bean is retained until the end of the request cycle
+  	"page" the bean is retained for the lifespan of the page
+  	"render" the bean is retained until the end of the current page render
+  	
+Nothing prevents a bean for storing state; however, such state will
+not be associated with any particular session (unlike persistant page
+properties).  Further, because of page pooling, subsequent requests
+from the same client may be serviced by different instances of a page and
+(therefore) different bean instances.
+
+Beans that have the "request" lifecycle may be stored into a pool
+for later re-use (in the same or different page).
+
+The bean may have its properties set.  Properties are set on both
+newly instantiated beans, and beans that are retrieved from a pool.
+
+-->
+<!ELEMENT bean (description?, property*, (set-property | set-message-property)*)>
+<!ATTLIST bean
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	lifecycle (none | request | page | render) "request"
+>
+<!-- =======================================================
+Element: binding
+Appears in: component
+
+Binds a parameter of the component to a OGNL expression, relative
+to its container.  The expression may be provided as an attribute, or 
+as the body of the element.  The latter case is useful when the 
+expression is long, or uses problematic characters (such as a 
+mix of single and double quotes).
+
+Attributes:
+  name: The name of the component parameter to bind.
+  expression: The OGNL expression.
+-->
+<!ELEMENT binding (#PCDATA)>
+<!ATTLIST binding
+	name CDATA #REQUIRED
+	expression CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: configure
+Appears in: extension
+
+Configures one JavaBean property of an extension.
+
+Attributes:
+  property-name:  The name of the property to configure.
+  type: Conversion of property value.
+  value: The value to be converted and applied.  If not 
+    specified, the element's character data is
+    used.  
+ 
+-->
+<!ELEMENT configure (#PCDATA)>
+<!ATTLIST configure
+	property-name CDATA #REQUIRED
+	type %static-value-type;
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: component
+Contained by: component-specification, page-specification
+
+Defines a component contained by the component being specified.
+
+Attribute:
+  id: A unique identifier for the component within the container.
+  type: The type of component, either a well known logical name, or the complete path
+    to the component's specification.
+  copy-of: The id of a previously defined component; this component will be a copy
+    of the other component.
+
+The Tapestry page loader ensures that either type or copy-of is specified, but not both.
+-->
+<!ELEMENT component (property*, (binding | inherited-binding | listener-binding | static-binding | message-binding)*)>
+<!ATTLIST component
+	id ID #REQUIRED
+	type CDATA #IMPLIED
+	copy-of IDREF #IMPLIED
+	inherit-informal-parameters %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: component-type
+Contained by: application
+
+Establishes a short logic name for a particular component that is used
+within the application.
+
+Attributes:
+  type: The logical name for the component.
+  specification-path:  The complete path to the component's specification.
+-->
+<!ELEMENT component-type EMPTY>
+<!ATTLIST component-type
+	type CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: component-specification
+Root element
+
+A component specification.  It's attributes define the Java class to
+instantiate, whether the component may wrap other elements, and whether
+informal (undeclared) parameters are allowed.  Very similar to a page-specification,
+except that component-specification allows for parameters (formal and informal).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+  allow-body:  If yes (the default), the component may wrap other elements (have a body).
+  allow-informal-parameters:  If yes (the default), informal parameters (parameters that are not
+    explictily defined) are allowed.
+-->
+<!ELEMENT component-specification (description?, parameter*, reserved-parameter*, property*, (bean | component | external-asset | context-asset | private-asset | property-specification)*)>
+<!ATTLIST component-specification
+	class CDATA #IMPLIED
+	allow-body %attribute-flag; "yes"
+	allow-informal-parameters %attribute-flag; "yes"
+>
+<!-- =======================================================
+Element: context-asset
+Contained by: component-specification, page-specification
+
+An asset located in the same web application context as the running
+application.
+
+Attributes:
+  name: The name of the asset.
+  path: The path, relative to the web application context, of the resource.
+-->
+<!ELEMENT context-asset (property*)>
+<!ATTLIST context-asset
+	name CDATA #REQUIRED
+	path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: description
+Appears in: many
+
+Several elements may contain descriptions; these descriptions are
+optional.  The eventual goal is to provide help in some form of IDE.
+Currently, descriptions are optional and ignored.
+
+-->
+<!ELEMENT description (#PCDATA)>
+<!-- =======================================================
+Element: extension
+Contained by: application, library-specification
+
+Defines an extension, an object that is instantiated and configured
+(like a helper bean) and is then accessible, by name, from the
+containing library (or application).
+
+Attributes:
+  name: Name of the extension.
+  class: Java class to instantiate.
+  immediate: If true, the extension is instantiated early instead of as-needed.
+  
+-->
+<!ELEMENT extension (property*, configure*)>
+<!ATTLIST extension
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	immediate %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: external-asset
+Contained by: component-specification, page-specification
+
+Defines an asset at some external source.
+
+Attributes:
+  name: The name of the asset.
+  URL: The URL used to reference the asset.
+-->
+<!ELEMENT external-asset (property*)>
+<!ATTLIST external-asset
+	name CDATA #REQUIRED
+	URL CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: inherited-binding
+Appears in: component
+
+Binds a parameter of the component to a parameter of the container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  parameter-name: The name of the container parameter to bind the
+    component parameter to.
+-->
+<!ELEMENT inherited-binding EMPTY>
+<!ATTLIST inherited-binding
+	name CDATA #REQUIRED
+	parameter-name CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: library
+Appears in: application-specification, library-specification
+
+Defines a library used in the construction of the container
+(either another library, or the application itself).
+
+Attributes:
+  id: An identifier used to reference pages and components
+    provided by the library.
+  specification-path: The path to the resource that provides
+    the library specification.
+-->
+<!ELEMENT library EMPTY>
+<!ATTLIST library
+	id CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: library-specification
+Root element
+
+Defines a library that may be used in the construction 
+of an application (or another library).  An application can
+be thought of as a specialized kind of library.
+
+-->
+<!ELEMENT library-specification %library-content;>
+<!-- =======================================================
+Element: page
+Contained by: application, library-specification
+
+Defines a single page within the application.  Each application will contain
+at least one of these, to define the Home page.
+
+Attributes:
+  name: A unique name for the application.
+  specification-path:  The resource classpath of the component specification
+    for the page.
+-->
+<!ELEMENT page EMPTY>
+<!ATTLIST page
+	name CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: listener-binding
+Appears in: component
+
+Defines an in-place script using the scripting language
+supported by Bean Scripting Framework (http://jakarta.apache.org/bsf).
+The script itself is the element's character data (often, inside
+a CDATA block).
+
+The default language is jython, though this can be overridden.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  language: The language the script is written in.
+-->
+<!ELEMENT listener-binding (#PCDATA)>
+<!ATTLIST listener-binding
+	name CDATA #REQUIRED
+	language CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: page-specification
+Root element
+
+A page specification.  It's attributes define the Java class to
+instantiate.  Pages are like components, except they always allow
+a body, and never allow parameters (formal or otherwise).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+-->
+<!ELEMENT page-specification (description?, property*, (bean | component | external-asset | context-asset | private-asset | property-specification)*)>
+<!ATTLIST page-specification
+	class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: parameter
+Contained by: component-specification
+
+Defines a formal parameter for the component.
+
+Attributes:
+  name: A unique name for the parameter.
+  type: The name of a Java class or primitive type expected by the parameter.
+  required: If yes, then the parameter must be bound.  If no (the default),
+    then the parameter is optional.
+  property-name: The name to use, instead of the parameter name, for the
+    JavaBean property connected to this parameter.
+  direction: The normal flow of data through the component 
+  			(in, form, custom, auto).
+  default-value: Specifies the default value for the parameter, 
+  				if the parameter is not bound.
+-->
+<!ELEMENT parameter (description?)>
+<!ATTLIST parameter
+	name CDATA #REQUIRED
+	type CDATA #IMPLIED
+	required %attribute-flag; "no"
+	property-name CDATA #IMPLIED
+	default-value CDATA #IMPLIED
+	direction (in | form | custom | auto) "custom"
+>
+<!-- =======================================================
+Element: private-asset
+Contained by: component-specification, page-specification
+
+An asset available within the Java classpath (i.e., bundled inside a JAR or WAR).
+
+Attributes:
+  name: The name of the asset.
+  resource-path: The complete pathname of the resource.
+-->
+<!ELEMENT private-asset (property*)>
+<!ATTLIST private-asset
+	name CDATA #REQUIRED
+	resource-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: property
+Contained by: (many other elements)
+
+Defines a key/value pair associated with the application or component specification.  Properties
+are used to capture information that doesn't fit into the DTD.  The value for the property is
+the PCDATA wrapped by the property tag (which is trimmed of leading and trailing whitespace).
+
+This should not be confused with several other tags which are used to set JavaBeans properties
+of various objects.  The <property> tag exists to allow meta-data to be stored in the specification.
+
+Attributes:
+  name: The name of the property to set.
+  value: If specified, is the value of the property, otherwise, the PCDATA is used.
+  
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: property-specification
+Appears in: page-specification, component-specification
+
+Identifies a transient or persistent property.
+
+Attributes:
+  name: The name of the property.
+  type: The type of the value, either the name of a scalar type,
+    or the fully qualified name of a class.  If omitted,
+    java.lang.Object is used.
+  persistent: If "yes", the value will be made persistant.  Default
+    is "no".
+  initial-value:  If provided, this is an OGNL expression used
+    to initialize the property.  If not specified, the
+    body of the element is used as the initial value.
+    
+-->
+<!ELEMENT property-specification (#PCDATA)>
+<!ATTLIST property-specification
+	name CDATA #REQUIRED
+	type CDATA #IMPLIED
+	persistent %attribute-flag; "no"
+	initial-value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: reserved-parameter
+Appears in: component-specification
+
+Identifies a name which may not be used as an informal parameter.
+Informal parameters are typically HTML attribute names; this
+list identifies HTML attributes that are written exclusively
+by the component and may not be affected by informal parameters.
+
+Attributes:
+  name: The parameter name to reserve.
+-->
+<!ELEMENT reserved-parameter EMPTY>
+<!ATTLIST reserved-parameter
+	name CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: service
+Appears in: application
+
+Defines an engine service.  You may override the default
+set of engine services or provide completely new services.
+
+Attributes:
+  name: The name of the service.
+  class: The Java class to instantiate for the service.
+
+-->
+<!ELEMENT service EMPTY>
+<!ATTLIST service
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: set-property
+Appears in: bean
+
+Used to initialize a property of a helper bean.  An OGNL expression
+is provided as the expression attribute, or as wrapped
+character data.
+
+Attributes:
+  name: The name of the property to be set.
+  expression: The OGNL expression that provides a value.
+-->
+<!ELEMENT set-property (#PCDATA)>
+<!ATTLIST set-property
+	name CDATA #REQUIRED
+	expression CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: set-message-property
+Appears in: bean
+
+A localized string.
+
+Attributes:
+  key:  Sets a property of a string from a localized string.
+
+-->
+<!ELEMENT set-message-property EMPTY>
+<!ATTLIST set-message-property
+	name CDATA #REQUIRED
+	key CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: static-binding
+Appears in: component
+
+Binds a parameter of the component to a static value defined directly
+within this specification. The value either the value ttribute, or
+the PCDATA wrapped by the element (with leading and trailing whitespace removed).
+
+Attributes:
+  name: The name of the component parameter to bind.
+  value: The value of the binding.  If not specied, the PCDATA wrapped
+    by the element is the binding.
+-->
+<!ELEMENT static-binding (#PCDATA)>
+<!ATTLIST static-binding
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: message-binding
+Appears in: component
+
+Binds a parameter of the component to a localized message of
+its container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  key: The key used to access a localized string.
+  
+-->
+<!ELEMENT message-binding EMPTY>
+<!ATTLIST message-binding
+	name CDATA #REQUIRED
+	key CDATA #REQUIRED
+>
diff --git a/static/dtd/Tapestry_4_0.dtd b/static/dtd/Tapestry_4_0.dtd
new file mode 100644
index 0000000..239476d
--- /dev/null
+++ b/static/dtd/Tapestry_4_0.dtd
@@ -0,0 +1,472 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+The DTD for Tapestry application, library, page and component specifications.
+Associated with the public identifier:
+
+	-//Apache Software Foundation//Tapestry Specification 4.0//EN
+	
+The canonical location for the DTD is:
+
+	http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd
+
+For application specifications, the root element is application.
+
+For component specifications, the root element is component-specification.
+
+For page specifications, the root element is page-specification.
+
+For library specifiations, the root element is library-specification.
+
+This DTD represents a significant change from (and simplification of) the 3.0 DTD. 
+Tapestry 4.0 will continue to parse specifications that use the 3.0 DTD for the
+forseable future.
+
+The following changes have occured:
+
+- <service> has been removed; it was used to define engine services, which
+  is now accomplished using the HiveMind tapestry.services.ApplicationServices
+  configuration point.
+- <static-binding> and <message-binding> elements have been removed.
+  There is now just <binding>, whose value attribute contains a prefix to interpret how
+  the remainder of the value is interpreted (no prefix meaning a literal, or static, value).
+- <property> renamed to <meta> and <property-specification> renamed to <property>
+- Removed the type attribute from <property>
+- <property> persistent attribute is now called "persist", and is a string, not a boolean
+- Added <inject>
+- Removed the direction and type attributes from <parameter>
+- Consolidated <context-asset>, <private-asset> and <external-asset> into <asset>
+- Consolidated <set-property> and <set-message-property> into <set>
+- More flexibility on the order of elements
+- Added property attribute to <component>, <bean> and <asset>
+- Removed the type attribute from the <configure> element
+- Added many alternatives to 'yes' and 'no' for boolean attributes.
+- Added aliases and cache attributes to <parameter>
+- Added deprecated to <component-specification>
+- Removed <listener-binding>
+-->
+<!-- =======================================================
+Entity: attribute-flag
+
+For entity attributes that take a boolean value.
+-->
+<!ENTITY % attribute-flag "(yes|no|true|false|on|off|1|0|y|n|t|f|aye|nay)">
+<!ENTITY % library-content "(description?, (meta|page|component-type|library|extension)*)">
+<!-- =======================================================
+Element: application
+Root element
+
+Defines a Tapestry application.
+
+Attributes:
+  name: A textual name used to uniquely identify the application.
+  engine-class:  The Java class to instantiate as the application engine.
+-->
+<!ELEMENT application %library-content;>
+<!ATTLIST application
+	name CDATA #IMPLIED
+	engine-class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: asset
+Contained by: component-specification, page-specification
+
+An asset that may be referenced by the component. Different prefixes
+may be applied to the path indicate where the asset is stored; 
+context: for the web application context folder or classpath:
+for a file stored in the web applications' classpath.
+
+Attributes:
+  name: The name of the asset.
+  path: The path for the resource, which may be relative or absolute.
+  property: The name of a property that will be created to inject the
+    asset into the component.
+-->
+<!ELEMENT asset (meta*)>
+<!ATTLIST asset
+	name CDATA #REQUIRED
+	path CDATA #REQUIRED
+  property CDATA #IMPLIED
+>
+  <!-- =======================================================
+Element: bean
+Appears in: component-specification, page-specification
+
+Defines a JavaBean that will be used in some way by the component.  Beans
+are accessible via the components' beans property (which contains a property
+for each bean).  Beans are created as needed, and are discarded based on
+the lifecycle attribute.  Beans are typically used to extend the
+implementation of a component via aggregation.
+
+Attributes:
+  name: the name of the bean
+  class: the Java class to instantiate
+  lifecycle: when the reference to the bean should be discard
+  	"none" no lifecycle, the bean is created and returned, but not stored
+  	"request" the bean is retained until the end of the request cycle
+  	"page" the bean is retained for the lifespan of the page
+  	"render" (default) the bean is retained until the end of the current page render
+  property: if specified, then a read-ony property is created in the component
+    to access the bean.
+    
+Nothing prevents a bean for storing state; however, such state will
+not be associated with any particular session (unlike persistant page
+properties).  Further, because of page pooling, subsequent requests
+from the same client may be serviced by different instances of a page and
+(therefore) different bean instances.
+
+Beans that have the "request" lifecycle may be stored into a pool
+for later re-use (in the same or different page).
+
+The bean may have its properties set.  Properties are set on both
+newly instantiated beans, and beans that are retrieved from a pool.
+
+-->
+<!ELEMENT bean (description?, (meta|set)*)>
+<!ATTLIST bean
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	lifecycle (none | request | page | render) "request"
+  property CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: binding
+Appears in: component
+
+Binds a parameter of the component to a value. The value may
+be literal, an OGNL expression, or something else, as
+determined by its prefix. The value attribute is optional,
+if not provided, the enclosed character data is the value
+(but it is not allowed to specify both value and character data).
+
+Attributes:
+  name: The name of the component parameter to bind.
+  value The value to bind to the parameter.
+-->
+<!ELEMENT binding (#PCDATA)>
+<!ATTLIST binding
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: inherited-binding
+Appears in: component
+
+Binds a parameter of the component to a parameter of the container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  parameter-name: The name of the container parameter to bind the
+    component parameter to.
+-->
+<!ELEMENT inherited-binding EMPTY>
+<!ATTLIST inherited-binding
+	name CDATA #REQUIRED
+	parameter-name CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: configure
+Appears in: extension
+
+Configures one JavaBean property of an extension.
+
+Attributes:
+  property:  The name of the property to configure.
+  value: The value to be converted and applied.  If not 
+    specified, the element's character data is
+    used.  
+ 
+-->
+<!ELEMENT configure (#PCDATA)>
+<!ATTLIST configure
+	property CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: component
+Contained by: component-specification, page-specification
+
+Defines a component contained by the component being specified.
+
+Attribute:
+  id: A unique identifier for the component within the container.
+  type: The type of component, either a well known logical name, or the complete path
+    to the component's specification.
+  copy-of: The id of a previously defined component; this component will be a copy
+    of the other component.
+  inherit-informal-parameters: If yes, then all informal parameters of the containing
+    component are copied into this component.
+  property: Optional property name; the component instance will be injected into this
+    property.
+
+The Tapestry page loader ensures that either type or copy-of is specified, but not both.
+-->
+<!ELEMENT component (meta | binding | inherited-binding )*>
+<!ATTLIST component
+	id ID #REQUIRED
+	type CDATA #IMPLIED
+	copy-of IDREF #IMPLIED
+	inherit-informal-parameters %attribute-flag; "no"
+  property CDATA  #IMPLIED
+>
+<!-- =======================================================
+Element: component-type
+Contained by: application
+
+Establishes a short logic name for a particular component that is used
+within the application.
+
+Attributes:
+  type: The logical name for the component.
+  specification-path:  The complete path to the component's specification.
+-->
+<!ELEMENT component-type EMPTY>
+<!ATTLIST component-type
+	type CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: component-specification
+Root element
+
+A component specification.  It's attributes define the Java class to
+instantiate, whether the component may wrap other elements, and whether
+informal (undeclared) parameters are allowed.  Very similar to a page-specification,
+except that component-specification allows for parameters (formal and informal).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+  allow-body:  If yes (the default), the component may wrap other elements (have a body).
+  allow-informal-parameters:  If yes (the default), informal parameters (parameters that are not
+    explictily defined) are allowed.
+  deprecated: If yes, then using the component will generate a warning, advising the user
+    to find a different component. The default is no.
+-->
+<!ELEMENT component-specification (description?, (parameter | reserved-parameter | meta | bean | component | asset | property | inject )*)>
+<!ATTLIST component-specification
+	class CDATA #IMPLIED
+	allow-body %attribute-flag; "yes"
+	allow-informal-parameters %attribute-flag; "yes"
+  deprecated %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: description
+Appears in: many
+
+Several elements may contain descriptions; these descriptions are
+optional.  The eventual goal is to provide help in some form of IDE.
+Currently, descriptions are optional and ignored.
+
+-->
+<!ELEMENT description (#PCDATA)>
+<!-- =======================================================
+Element: extension
+Contained by: application, library-specification
+
+Defines an extension, an object that is instantiated and configured
+(like a helper bean) and is then accessible, by name, from the
+containing library (or application).
+
+Attributes:
+  name: Name of the extension.
+  class: Java class to instantiate.
+  immediate: If true, the extension is instantiated early instead of as-needed.
+  
+-->
+<!ELEMENT extension (meta | configure)* >
+<!ATTLIST extension
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	immediate %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: inject
+Contained by: component-specification, page-specification
+
+Defines a new property whose read-only value is an object
+obtained from HiveMind.
+
+Attributes:
+  property The name of the property.
+  type: The type of object to be injected, used to interpret
+    the meaning of the object attribute.
+  object: The locator used to obtain the value.
+-->
+<!ELEMENT inject EMPTY>
+<!ATTLIST inject
+  property CDATA #REQUIRED
+  type CDATA "object"
+  object CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: library
+Appears in: application-specification, library-specification
+
+Defines a library used in the construction of the container
+(either another library, or the application itself).
+
+Attributes:
+  id: An identifier used to reference pages and components
+    provided by the library.
+  specification-path: The path to the resource that provides
+    the library specification.
+-->
+<!ELEMENT library EMPTY>
+<!ATTLIST library
+	id CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: library-specification
+Root element
+
+Defines a library that may be used in the construction 
+of an application (or another library).  An application can
+be thought of as a specialized kind of library.
+
+-->
+<!ELEMENT library-specification %library-content;>
+<!-- =======================================================
+Element: page
+Contained by: application, library-specification
+
+Defines a single page within the application.  Each application will contain
+at least one of these, to define the Home page.
+
+Attributes:
+  name: A unique name for the application.
+  specification-path:  The resource classpath of the component specification
+    for the page.
+-->
+<!ELEMENT page EMPTY>
+<!ATTLIST page
+	name CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: meta
+Contained by: (many other elements)
+
+Defines a key/value pair associated with the application or component specification.  Properties
+are used to capture information that doesn't fit into the DTD.  The value for the property is
+either the value attribute, or the PCDATA wrapped by the property tag 
+(which is trimmed of leading and trailing whitespace).
+
+This should not be confused with several other tags which are used to set JavaBeans properties
+of various objects.  The <property> tag exists to allow meta-data to be stored in the specification.
+
+Attributes:
+  key: The name of the property to set.
+  value: If specified, is the value of the property, otherwise, the PCDATA is used.
+  
+-->
+<!ELEMENT meta (#PCDATA)>
+<!ATTLIST meta
+	key CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: page-specification
+Root element
+
+A page specification.  It's attributes define the Java class to
+instantiate.  Pages are like components, except they always allow
+a body, and never allow parameters (formal or otherwise).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+-->
+<!ELEMENT page-specification (description?,  (meta| bean | component | asset | property | inject )*)>
+<!ATTLIST page-specification
+	class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: parameter
+Contained by: component-specification
+
+Defines a formal parameter for the component.
+
+Attributes:
+  name: A unique name for the parameter.
+  required: If yes, then the parameter must be bound.  If no (the default),
+    then the parameter is optional.
+  property: The name to use, instead of the parameter name, for the
+    JavaBean property connected to this parameter.
+  default-value: Specifies the default value for the parameter, if not bound,
+    as a binding reference.
+  cache: If true (the default), then the parameter property will cache the binding value
+   If false, then each access to the property will re-acquire the the current value
+   for the binding on each access (though invariant bindings may still be cached).
+  aliases: An optional, comma-seperated list of aliases for the parameter. Used to allow
+    compatibility when parameter names are changed.
+  deprecated: If true, then using the parameter will generate a runtime warning.
+-->
+<!ELEMENT parameter (description?)>
+<!ATTLIST parameter
+	name CDATA #REQUIRED
+	required %attribute-flag; "no"
+	property CDATA #IMPLIED
+	default-value CDATA #IMPLIED
+  cache %attribute-flag; "yes"
+  aliases CDATA #IMPLIED
+  deprecated %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: property
+Appears in: page-specification, component-specification
+
+Identifies a transient or persistent property.
+
+Attributes:
+  name: The name of the property.
+  persist: The name of the strategy for persisting the property between requests, 
+   or leave blank for no persistence (that is, a transient property).  
+   "session" is the most common strategy.
+  initial-value:  If provided, this is an OGNL expression used
+    to initialize the property.  If not specified, the
+    body of the element is used as the initial value.
+    
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property
+	name CDATA #REQUIRED
+	persist CDATA #IMPLIED
+	initial-value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: reserved-parameter
+Appears in: component-specification
+
+Identifies a name which may not be used as an informal parameter.
+Informal parameters are typically HTML attribute names; this
+list identifies HTML attributes that are written exclusively
+by the component and may not be affected by informal parameters.
+
+Attributes:
+  name: The parameter name to reserve.
+-->
+<!ELEMENT reserved-parameter EMPTY>
+<!ATTLIST reserved-parameter
+	name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: set
+Appears in: bean
+
+Used to initialize a property of a managed bean.  The value
+is a binding reference, and is provided as the value attribute, 
+or as wrapped character data.
+
+Attributes:
+  name: The name of the property to be set.
+  value: The value (as a binding reference) to set the property
+    to.
+-->
+<!ELEMENT set (#PCDATA)>
+<!ATTLIST set
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+
diff --git a/static/dtd/Tapestry_4_1.dtd b/static/dtd/Tapestry_4_1.dtd
new file mode 100644
index 0000000..42d8e51
--- /dev/null
+++ b/static/dtd/Tapestry_4_1.dtd
@@ -0,0 +1,475 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+The DTD for Tapestry application, library, page and component specifications.
+Associated with the public identifier:
+
+	-//Apache Software Foundation//Tapestry Specification 4.1//EN
+	
+The canonical location for the DTD is:
+
+	http://tapestry.apache.org/dtd/Tapestry_4_1.dtd
+
+For application specifications, the root element is application.
+
+For component specifications, the root element is component-specification.
+
+For page specifications, the root element is page-specification.
+
+For library specifiations, the root element is library-specification.
+
+This DTD represents a significant change from (and simplification of) the 3.0 DTD. 
+Tapestry 4.0 will continue to parse specifications that use the 3.0 DTD for the
+forseable future.
+
+The following changes have occured:
+
+- <service> has been removed; it was used to define engine services, which
+  is now accomplished using the HiveMind tapestry.services.ApplicationServices
+  configuration point.
+- <static-binding>, <inherited-binding> and <message-binding> elements have been removed.
+  There is now just <binding>, whose value attribute contains a prefix to interpret how
+  the remainder of the value is interpreted (no prefix meaning a literal, or static, value).
+- <property> renamed to <meta> and <property-specification> renamed to <property>
+- Removed the type attribute from <property>
+- <property> persistent attribute is now called "persist", and is a string, not a boolean
+- Added <inject>
+- Removed the direction and type attributes from <parameter>
+- Consolidated <context-asset>, <private-asset> and <external-asset> into <asset>
+- Consolidated <set-property> and <set-message-property> into <set>
+- More flexibility on the order of elements
+- Added property attribute to <component>, <bean> and <asset>
+- Removed the type attribute from the <configure> element
+- Added many alternatives to 'yes' and 'no' for boolean attributes.
+- Added aliases and cache attributes to <parameter>
+- Added deprecated to <component-specification>
+- Removed <listener-binding>
+-->
+<!-- =======================================================
+Entity: attribute-flag
+
+For entity attributes that take a boolean value.
+-->
+<!ENTITY % attribute-flag "(yes|no|true|false|on|off|1|0|y|n|t|f|aye|nay)">
+<!ENTITY % library-content "(description?, (meta|page|component-type|library|extension)*)">
+<!-- =======================================================
+Element: application
+Root element
+
+Defines a Tapestry application.
+
+Attributes:
+  name: A textual name used to uniquely identify the application.
+  engine-class:  The Java class to instantiate as the application engine.
+-->
+<!ELEMENT application %library-content;>
+<!ATTLIST application
+	name CDATA #IMPLIED
+	engine-class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: asset
+Contained by: component-specification, page-specification
+
+An asset that may be referenced by the component. Different prefixes
+may be applied to the path indicate where the asset is stored; 
+context: for the web application context folder or classpath:
+for a file stored in the web applications' classpath.
+
+Attributes:
+  name: The name of the asset.
+  path: The path for the resource, which may be relative or absolute.
+  property: The name of a property that will be created to inject the
+    asset into the component.
+-->
+<!ELEMENT asset (meta*)>
+<!ATTLIST asset
+	name CDATA #REQUIRED
+	path CDATA #REQUIRED
+  property CDATA #IMPLIED
+>
+  <!-- =======================================================
+Element: bean
+Appears in: component-specification, page-specification
+
+Defines a JavaBean that will be used in some way by the component.  Beans
+are accessible via the components' beans property (which contains a property
+for each bean).  Beans are created as needed, and are discarded based on
+the lifecycle attribute.  Beans are typically used to extend the
+implementation of a component via aggregation.
+
+Attributes:
+  name: the name of the bean
+  class: the Java class to instantiate
+  lifecycle: when the reference to the bean should be discard
+  	"none" no lifecycle, the bean is created and returned, but not stored
+  	"request" the bean is retained until the end of the request cycle
+  	"page" the bean is retained for the lifespan of the page
+  	"render" (default) the bean is retained until the end of the current page render
+  property: if specified, then a read-ony property is created in the component
+    to access the bean.
+    
+Nothing prevents a bean for storing state; however, such state will
+not be associated with any particular session (unlike persistant page
+properties).  Further, because of page pooling, subsequent requests
+from the same client may be serviced by different instances of a page and
+(therefore) different bean instances.
+
+Beans that have the "request" lifecycle may be stored into a pool
+for later re-use (in the same or different page).
+
+The bean may have its properties set.  Properties are set on both
+newly instantiated beans, and beans that are retrieved from a pool.
+
+-->
+<!ELEMENT bean (description?, (meta|set)*)>
+<!ATTLIST bean
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	lifecycle (none | request | page | render) "request"
+  property CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: binding
+Appears in: component
+
+Binds a parameter of the component to a value. The value may
+be literal, an OGNL expression, or something else, as
+determined by its prefix. The value attribute is optional,
+if not provided, the enclosed character data is the value
+(but it is not allowed to specify both value and character data).
+
+Attributes:
+  name: The name of the component parameter to bind.
+  value The value to bind to the parameter.
+-->
+<!ELEMENT binding (#PCDATA)>
+<!ATTLIST binding
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: inherited-binding
+Appears in: component
+
+Binds a parameter of the component to a parameter of the container.
+
+Attributes:
+  name: The name of the component parameter to bind.
+  parameter-name: The name of the container parameter to bind the
+    component parameter to.
+-->
+<!ELEMENT inherited-binding EMPTY>
+<!ATTLIST inherited-binding
+	name CDATA #REQUIRED
+	parameter-name CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: configure
+Appears in: extension
+
+Configures one JavaBean property of an extension.
+
+Attributes:
+  property:  The name of the property to configure.
+  value: The value to be converted and applied.  If not 
+    specified, the element's character data is
+    used.  
+ 
+-->
+<!ELEMENT configure (#PCDATA)>
+<!ATTLIST configure
+	property CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: component
+Contained by: component-specification, page-specification
+
+Defines a component contained by the component being specified.
+
+Attribute:
+  id: A unique identifier for the component within the container.
+  type: The type of component, either a well known logical name, or the complete path
+    to the component's specification.
+  copy-of: The id of a previously defined component; this component will be a copy
+    of the other component.
+  inherit-informal-parameters: If yes, then all informal parameters of the containing
+    component are copied into this component.
+  property: Optional property name; the component instance will be injected into this
+    property.
+
+The Tapestry page loader ensures that either type or copy-of is specified, but not both.
+-->
+<!ELEMENT component (meta | binding | inherited-binding )*>
+<!ATTLIST component
+	id ID #REQUIRED
+	type CDATA #IMPLIED
+	copy-of IDREF #IMPLIED
+	inherit-informal-parameters %attribute-flag; "no"
+  property CDATA  #IMPLIED
+>
+<!-- =======================================================
+Element: component-type
+Contained by: application
+
+Establishes a short logic name for a particular component that is used
+within the application.
+
+Attributes:
+  type: The logical name for the component.
+  specification-path:  The complete path to the component's specification.
+-->
+<!ELEMENT component-type EMPTY>
+<!ATTLIST component-type
+	type CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: component-specification
+Root element
+
+A component specification.  It's attributes define the Java class to
+instantiate, whether the component may wrap other elements, and whether
+informal (undeclared) parameters are allowed.  Very similar to a page-specification,
+except that component-specification allows for parameters (formal and informal).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+  allow-body:  If yes (the default), the component may wrap other elements (have a body).
+  allow-informal-parameters:  If yes (the default), informal parameters (parameters that are not
+    explictily defined) are allowed.
+  deprecated: If yes, then using the component will generate a warning, advising the user
+    to find a different component. The default is no.
+  inherit-specification: If yes (the default), all elements contained in any superclass components will be
+  	directly inherited in this specification.(this includes parameters/properties/assets/etc..)
+-->
+<!ELEMENT component-specification (description?, (parameter | reserved-parameter | meta | bean | component | asset | property | inject )*)>
+<!ATTLIST component-specification
+	class CDATA #IMPLIED
+	allow-body %attribute-flag; "yes"
+	allow-informal-parameters %attribute-flag; "yes"
+  	deprecated %attribute-flag; "no"
+  	inherit-specification %attribute-flag; "yes"
+>
+<!-- =======================================================
+Element: description
+Appears in: many
+
+Several elements may contain descriptions; these descriptions are
+optional.  The eventual goal is to provide help in some form of IDE.
+Currently, descriptions are optional and ignored.
+
+-->
+<!ELEMENT description (#PCDATA)>
+<!-- =======================================================
+Element: extension
+Contained by: application, library-specification
+
+Defines an extension, an object that is instantiated and configured
+(like a helper bean) and is then accessible, by name, from the
+containing library (or application).
+
+Attributes:
+  name: Name of the extension.
+  class: Java class to instantiate.
+  immediate: If true, the extension is instantiated early instead of as-needed.
+  
+-->
+<!ELEMENT extension (meta | configure)* >
+<!ATTLIST extension
+	name CDATA #REQUIRED
+	class CDATA #REQUIRED
+	immediate %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: inject
+Contained by: component-specification, page-specification
+
+Defines a new property whose read-only value is an object
+obtained from HiveMind.
+
+Attributes:
+  property The name of the property.
+  type: The type of object to be injected, used to interpret
+    the meaning of the object attribute.
+  object: The locator used to obtain the value.
+-->
+<!ELEMENT inject EMPTY>
+<!ATTLIST inject
+  property CDATA #REQUIRED
+  type CDATA "object"
+  object CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: library
+Appears in: application-specification, library-specification
+
+Defines a library used in the construction of the container
+(either another library, or the application itself).
+
+Attributes:
+  id: An identifier used to reference pages and components
+    provided by the library.
+  specification-path: The path to the resource that provides
+    the library specification.
+-->
+<!ELEMENT library EMPTY>
+<!ATTLIST library
+	id CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: library-specification
+Root element
+
+Defines a library that may be used in the construction 
+of an application (or another library).  An application can
+be thought of as a specialized kind of library.
+
+-->
+<!ELEMENT library-specification %library-content;>
+<!-- =======================================================
+Element: page
+Contained by: application, library-specification
+
+Defines a single page within the application.  Each application will contain
+at least one of these, to define the Home page.
+
+Attributes:
+  name: A unique name for the application.
+  specification-path:  The resource classpath of the component specification
+    for the page.
+-->
+<!ELEMENT page EMPTY>
+<!ATTLIST page
+	name CDATA #REQUIRED
+	specification-path CDATA #REQUIRED
+>
+<!-- =======================================================
+Element: meta
+Contained by: (many other elements)
+
+Defines a key/value pair associated with the application or component specification.  Properties
+are used to capture information that doesn't fit into the DTD.  The value for the property is
+either the value attribute, or the PCDATA wrapped by the property tag 
+(which is trimmed of leading and trailing whitespace).
+
+This should not be confused with several other tags which are used to set JavaBeans properties
+of various objects.  The <property> tag exists to allow meta-data to be stored in the specification.
+
+Attributes:
+  key: The name of the property to set.
+  value: If specified, is the value of the property, otherwise, the PCDATA is used.
+  
+-->
+<!ELEMENT meta (#PCDATA)>
+<!ATTLIST meta
+	key CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: page-specification
+Root element
+
+A page specification.  It's attributes define the Java class to
+instantiate.  Pages are like components, except they always allow
+a body, and never allow parameters (formal or otherwise).
+
+Attributes:
+  class: The Java class to instantiate for the component.
+-->
+<!ELEMENT page-specification (description?,  (meta| bean | component | asset | property | inject )*)>
+<!ATTLIST page-specification
+	class CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: parameter
+Contained by: component-specification
+
+Defines a formal parameter for the component.
+
+Attributes:
+  name: A unique name for the parameter.
+  required: If yes, then the parameter must be bound.  If no (the default),
+    then the parameter is optional.
+  property: The name to use, instead of the parameter name, for the
+    JavaBean property connected to this parameter.
+  default-value: Specifies the default value for the parameter, if not bound,
+    as a binding reference.
+  cache: If true (the default), then the parameter property will cache the binding value
+   If false, then each access to the property will re-acquire the the current value
+   for the binding on each access (though invariant bindings may still be cached).
+  aliases: An optional, comma-seperated list of aliases for the parameter. Used to allow
+    compatibility when parameter names are changed.
+  deprecated: If true, then using the parameter will generate a runtime warning.
+-->
+<!ELEMENT parameter (description?)>
+<!ATTLIST parameter
+	name CDATA #REQUIRED
+	required %attribute-flag; "no"
+	property CDATA #IMPLIED
+	default-value CDATA #IMPLIED
+  cache %attribute-flag; "yes"
+  aliases CDATA #IMPLIED
+  deprecated %attribute-flag; "no"
+>
+<!-- =======================================================
+Element: property
+Appears in: page-specification, component-specification
+
+Identifies a transient or persistent property.
+
+Attributes:
+  name: The name of the property.
+  persist: The name of the strategy for persisting the property between requests, 
+   or leave blank for no persistence (that is, a transient property).  
+   "session" is the most common strategy.
+  initial-value:  If provided, this is an OGNL expression used
+    to initialize the property.  If not specified, the
+    body of the element is used as the initial value.
+    
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property
+	name CDATA #REQUIRED
+	persist CDATA #IMPLIED
+	initial-value CDATA #IMPLIED
+>
+<!-- =======================================================
+Element: reserved-parameter
+Appears in: component-specification
+
+Identifies a name which may not be used as an informal parameter.
+Informal parameters are typically HTML attribute names; this
+list identifies HTML attributes that are written exclusively
+by the component and may not be affected by informal parameters.
+
+Attributes:
+  name: The parameter name to reserve.
+-->
+<!ELEMENT reserved-parameter EMPTY>
+<!ATTLIST reserved-parameter
+	name CDATA #REQUIRED
+>
+
+<!-- =======================================================
+Element: set
+Appears in: bean
+
+Used to initialize a property of a managed bean.  The value
+is a binding reference, and is provided as the value attribute, 
+or as wrapped character data.
+
+Attributes:
+  name: The name of the property to be set.
+  value: The value (as a binding reference) to set the property
+    to.
+-->
+<!ELEMENT set (#PCDATA)>
+<!ATTLIST set
+	name CDATA #REQUIRED
+	value CDATA #IMPLIED
+>
+
diff --git a/static/schema/tapestry_5_0_0.xsd b/static/schema/tapestry_5_0_0.xsd
new file mode 100644
index 0000000..05833c4
--- /dev/null
+++ b/static/schema/tapestry_5_0_0.xsd
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"
+    targetNamespace="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+    <!-- comp is a component within the template -->
+    <xs:element name="comp">
+        <xs:complexType mixed="true">
+            <xs:attribute name="id" type="xs:ID"/>
+            <xs:attribute name="type" type="xs:string"/>
+            <xs:anyAttribute/>
+        </xs:complexType>
+    </xs:element>
+    <!-- body identifies where the body of the component belongs within the component's template -->
+    <xs:element name="body"/>
+</xs:schema>
diff --git a/static/schema/tapestry_5_1_0.xsd b/static/schema/tapestry_5_1_0.xsd
new file mode 100644
index 0000000..b9c923c
--- /dev/null
+++ b/static/schema/tapestry_5_1_0.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd"
+           targetNamespace="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
+    <xs:element name="body">
+        <xs:annotation>
+            <xs:documentation>
+                Defines the position within the template that the body of the component (the portion of the container's
+                template
+                enclosed by the component) will be rendered. This is optional, and only applies to components that wish
+                to render
+                their body within their template.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extend">
+        <xs:annotation>
+            <xs:documentation>
+                Root element of a template that extends its parent template, replacing portions of the template.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extension-point">
+        <xs:annotation>
+            <xs:documentation>
+                Defines a portion of a parent component template that may be replaced in a child component.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="replacement">
+        <xs:annotation>
+            <xs:documentation>
+                A replacement, in a child component template, for an extension-point in the parent component template.
+                This element must be an immediate child of the root element, which will be extend.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block, which must match an id of an inheritable extension-point
+                        block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="content">
+        <xs:annotation>
+            <xs:documentation>
+                Marks a portion of the template as the relevant portion; anything outside of the element is discarded.
+                content elements may not be nested inside other content elements.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="remove">
+        <xs:annotation>
+            <xs:documentation>
+                A block of the template to be removed. This can be used as a comment, or to temporarily
+                delete a portion of the template (including markup, expansions and embedded components).
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="container">
+        <xs:annotation>
+            <xs:documentation>
+                May be used as the root element of a template, but is not part of the template itself. Useful when
+                a component exists to emit a series of related elements that are not inside a containing element.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="parameter">
+        <xs:annotation>
+            <xs:documentation>
+                A structured parameter passed to a component as a single object of type Block. The receiving component
+                can get the Block to render. A parameter should always be enclosed by a component element
+                (either an explicit comp element, or an ordinary element instrumented with a Tapestry type or id).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        The name of the parameter to be bound to the Block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="block">
+        <xs:annotation>
+            <xs:documentation>
+                A block is simply a container of other elements. Blocks do not render themselves or their bodies in the
+                normal flow; they
+                only get rendered when specifially directed to.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:ID">
+                <xs:annotation>
+                    <xs:documentation>
+                        An optional identifier that is used to reference the block from inside the Java class.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
diff --git a/static/schema/tapestry_5_3.xsd b/static/schema/tapestry_5_3.xsd
new file mode 100644
index 0000000..99a2509
--- /dev/null
+++ b/static/schema/tapestry_5_3.xsd
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
+           targetNamespace="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
+    <xs:element name="body">
+        <xs:annotation>
+            <xs:documentation>
+                Defines the position within the template that the body of the component (the portion of the container's
+                template
+                enclosed by the component) will be rendered. This is optional, and only applies to components that wish
+                to render
+                their body within their template.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extend">
+        <xs:annotation>
+            <xs:documentation>
+                Root element of a template that extends its parent template, replacing portions of the template.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extension-point">
+        <xs:annotation>
+            <xs:documentation>
+                Defines a portion of a parent component template that may be replaced in a child component.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="replace">
+        <xs:annotation>
+            <xs:documentation>
+                A replacement, in a child component template, for an extension-point in the parent component template.
+                This element must be an immediate child of the root element, which will be extend.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="name" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block, which must match an id of an inheritable extension-point
+                        block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="content">
+        <xs:annotation>
+            <xs:documentation>
+                Marks a portion of the template as the relevant portion; anything outside of the element is discarded.
+                content elements may not be nested inside other content elements.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="remove">
+        <xs:annotation>
+            <xs:documentation>
+                A block of the template to be removed. This can be used as a comment, or to temporarily
+                delete a portion of the template (including markup, expansions and embedded components).
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="container">
+        <xs:annotation>
+            <xs:documentation>
+                May be used as the root element of a template, but is not part of the template itself. Useful when
+                a component exists to emit a series of related elements that are not inside a containing element.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="block">
+        <xs:annotation>
+            <xs:documentation>
+                A block is simply a container of other elements. Blocks do not render themselves or their bodies in the
+                normal flow; they
+                only get rendered when specifially directed to.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:ID">
+                <xs:annotation>
+                    <xs:documentation>
+                        An optional identifier that is used to reference the block from inside the Java class.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
diff --git a/static/schema/tapestry_5_4.xsd b/static/schema/tapestry_5_4.xsd
new file mode 100644
index 0000000..01d0f75
--- /dev/null
+++ b/static/schema/tapestry_5_4.xsd
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+           targetNamespace="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
+    <xs:element name="body">
+        <xs:annotation>
+            <xs:documentation>
+                Defines the position within the template that the body of the component (the portion of the container's
+                template
+                enclosed by the component) will be rendered. This is optional, and only applies to components that wish
+                to render
+                their body within their template.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extend">
+        <xs:annotation>
+            <xs:documentation>
+                Root element of a template that extends its parent template, replacing portions of the template.
+                extend elemenst may containg replace and block elements.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="extension-point">
+        <xs:annotation>
+            <xs:documentation>
+                Defines a portion of a parent component template that may be replaced in a child component.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="replace">
+        <xs:annotation>
+            <xs:documentation>
+                A replacement, in a child component template, for an extension-point in the parent component template.
+                This element must be an immediate child of the root element, which will be extend.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:string" use="required">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unique id for the replaceable block, which must match an id of an inheritable extension-point
+                        block.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="content">
+        <xs:annotation>
+            <xs:documentation>
+                Marks a portion of the template as the relevant portion; anything outside of the element is discarded.
+                content elements may not be nested inside other content elements.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="remove">
+        <xs:annotation>
+            <xs:documentation>
+                A block of the template to be removed. This can be used as a comment, or to temporarily
+                delete a portion of the template (including markup, expansions and embedded components).
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="container">
+        <xs:annotation>
+            <xs:documentation>
+                May be used as the root element of a template, but is not part of the template itself. Useful when
+                a component exists to emit a series of related elements that are not inside a containing element.
+            </xs:documentation>
+        </xs:annotation>
+    </xs:element>
+    <xs:element name="block">
+        <xs:annotation>
+            <xs:documentation>
+                A block is simply a container of other elements. Blocks do not render themselves or their bodies in the
+                normal flow; they
+                only get rendered when specifially directed to.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attribute name="id" type="xs:ID">
+                <xs:annotation>
+                    <xs:documentation>
+                        An optional identifier that is used to reference the block from inside the Java class.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:attribute>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>