diff --git a/TILES_3_0_X/FREEMARKER-LICENSE.txt b/TILES_3_0_X/FREEMARKER-LICENSE.txt
deleted file mode 100644
index ca617cb..0000000
--- a/TILES_3_0_X/FREEMARKER-LICENSE.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-FreeMarker 1.x was released under the LGPL license. Later, by community
-consensus, we have switched over to a BSD-style license. As of FreeMarker
-2.2pre1, the original author, Benjamin Geer, has relinquished the copyright in
-behalf of Visigoth Software Society. The current copyright holder is the
-Visigoth Software Society.
-
-------------------------------------------------------------------------------
-Copyright (c) 2003 The Visigoth Software Society. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1.  Redistributions of source code must retain the above copyright notice,
-    this list of conditions and the following disclaimer.
-
-2.  The end-user documentation included with the redistribution, if any, must
-    include the following acknowlegement:
-      "This product includes software developed by the
-      Visigoth Software Society (http://www.visigoths.org/)."
-    Alternately, this acknowlegement may appear in the software itself, if and
-    wherever such third-party acknowlegements normally appear.
-
-3.  Neither the name "FreeMarker", "Visigoth", nor any of the names of the
-    project contributors may be used to endorse or promote products derived
-    from this software without prior written permission. For written
-    permission, please contact visigoths@visigoths.org.
-
-4.  Products derived from this software may not be called "FreeMarker" or
-    "Visigoth" nor may "FreeMarker" or "Visigoth" appear in their names
-    without prior written permission of the Visigoth Software Society.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-VISIGOTH SOFTWARE SOCIETY OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------------------
-
-This software consists of voluntary contributions made by many individuals on
-behalf of the Visigoth Software Society. For more information on the Visigoth
-Software Society, please see http://www.visigoths.org/
diff --git a/TILES_3_0_X/JAVASSIST-LICENSE.html b/TILES_3_0_X/JAVASSIST-LICENSE.html
deleted file mode 100644
index 65d6611..0000000
--- a/TILES_3_0_X/JAVASSIST-LICENSE.html
+++ /dev/null
@@ -1,372 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>Javassist License</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 5.50.4916.2300" name=GENERATOR></HEAD>
-
-<BODY text=#000000 vLink=#551a8b aLink=#ff0000 link=#0000ee bgColor=#ffffff>
-<CENTER><B><FONT size=+2>MOZILLA PUBLIC LICENSE</FONT></B> <BR><B>Version 
-1.1</B> 
-<P>
-<HR width="20%">
-</CENTER>
-<P><B>1. Definitions.</B> 
-<UL><B>1.0.1. "Commercial Use" </B>means distribution or otherwise making the 
-  Covered Code available to a third party. 
-  <P><B>1.1. ''Contributor''</B> means each entity that creates or contributes 
-  to the creation of Modifications. 
-  <P><B>1.2. ''Contributor Version''</B> means the combination of the Original 
-  Code, prior Modifications used by a Contributor, and the Modifications made by 
-  that particular Contributor. 
-  <P><B>1.3. ''Covered Code''</B> means the Original Code or Modifications or 
-  the combination of the Original Code and Modifications, in each case including 
-  portions thereof<B>.</B> 
-  <P><B>1.4. ''Electronic Distribution Mechanism''</B> means a mechanism 
-  generally accepted in the software development community for the electronic 
-  transfer of data. 
-  <P><B>1.5. ''Executable''</B> means Covered Code in any form other than Source 
-  Code. 
-  <P><B>1.6. ''Initial Developer''</B> means the individual or entity identified 
-  as the Initial Developer in the Source Code notice required by <B>Exhibit 
-  A</B>. 
-  <P><B>1.7. ''Larger Work''</B> means a work which combines Covered Code or 
-  portions thereof with code not governed by the terms of this License. 
-  <P><B>1.8. ''License''</B> means this document. 
-  <P><B>1.8.1. "Licensable"</B> means having the right to grant, to the maximum 
-  extent possible, whether at the time of the initial grant or subsequently 
-  acquired, any and all of the rights conveyed herein. 
-  <P><B>1.9. ''Modifications''</B> means any addition to or deletion from the 
-  substance or structure of either the Original Code or any previous 
-  Modifications. When Covered Code is released as a series of files, a 
-  Modification is: 
-  <UL><B>A.</B> Any addition to or deletion from the contents of a file 
-    containing Original Code or previous Modifications. 
-    <P><B>B.</B> Any new file that contains any part of the Original Code or 
-    previous Modifications. <BR>&nbsp;</P></UL><B>1.10. ''Original Code''</B> 
-  means Source Code of computer software code which is described in the Source 
-  Code notice required by <B>Exhibit A</B> as Original Code, and which, at the 
-  time of its release under this License is not already Covered Code governed by 
-  this License. 
-  <P><B>1.10.1. "Patent Claims"</B> means any patent claim(s), now owned or 
-  hereafter acquired, including without limitation,&nbsp; method, process, and 
-  apparatus claims, in any patent Licensable by grantor. 
-  <P><B>1.11. ''Source Code''</B> means the preferred form of the Covered Code 
-  for making modifications to it, including all modules it contains, plus any 
-  associated interface definition files, scripts used to control compilation and 
-  installation of an Executable, or source code differential comparisons against 
-  either the Original Code or another well known, available Covered Code of the 
-  Contributor's choice. The Source Code can be in a compressed or archival form, 
-  provided the appropriate decompression or de-archiving software is widely 
-  available for no charge. 
-  <P><B>1.12. "You'' (or "Your")&nbsp;</B> means an individual or a legal entity 
-  exercising rights under, and complying with all of the terms of, this License 
-  or a future version of this License issued under Section 6.1. For legal 
-  entities, "You'' includes any entity which controls, is controlled by, or is 
-  under common control with You. For purposes of this definition, "control'' 
-  means (a) the power, direct or indirect, to cause the direction or management 
-  of such entity, whether by contract or otherwise, or (b) ownership of more 
-  than fifty percent (50%) of the outstanding shares or beneficial ownership of 
-  such entity.</P></UL><B>2. Source Code License.</B> 
-<UL><B>2.1. The Initial Developer Grant.</B> <BR>The Initial Developer hereby 
-  grants You a world-wide, royalty-free, non-exclusive license, subject to third 
-  party intellectual property claims: 
-  <UL><B>(a)</B>&nbsp;<B> </B>under intellectual property rights (other than 
-    patent or trademark) Licensable by Initial Developer to use, reproduce, 
-    modify, display, perform, sublicense and distribute the Original Code (or 
-    portions thereof) with or without Modifications, and/or as part of a Larger 
-    Work; and 
-    <P><B>(b)</B> under Patents Claims infringed by the making, using or selling 
-    of Original Code, to make, have made, use, practice, sell, and offer for 
-    sale, and/or otherwise dispose of the Original Code (or portions thereof). 
-    <UL>
-      <UL></UL></UL><B>(c) </B>the licenses granted in this Section 2.1(a) and (b) 
-    are effective on the date Initial Developer first distributes Original Code 
-    under the terms of this License. 
-    <P><B>(d) </B>Notwithstanding Section 2.1(b) above, no patent license is 
-    granted: 1) for code that You delete from the Original Code; 2) separate 
-    from the Original Code;&nbsp; or 3) for infringements caused by: i) the 
-    modification of the Original Code or ii) the combination of the Original 
-    Code with other software or devices. <BR>&nbsp;</P></UL><B>2.2. Contributor 
-  Grant.</B> <BR>Subject to third party intellectual property claims, each 
-  Contributor hereby grants You a world-wide, royalty-free, non-exclusive 
-  license 
-  <UL> <BR><B>(a)</B>&nbsp;<B> </B>under intellectual property rights (other 
-    than patent or trademark) Licensable by Contributor, to use, reproduce, 
-    modify, display, perform, sublicense and distribute the Modifications 
-    created by such Contributor (or portions thereof) either on an unmodified 
-    basis, with other Modifications, as Covered Code and/or as part of a Larger 
-    Work; and 
-    <P><B>(b)</B> under Patent Claims infringed by the making, using, or selling 
-    of&nbsp; Modifications made by that Contributor either alone and/or in<FONT 
-    color=#000000> combination with its Contributor Version (or portions of such 
-    combination), to make, use, sell, offer for sale, have made, and/or 
-    otherwise dispose of: 1) Modifications made by that Contributor (or portions 
-    thereof); and 2) the combination of&nbsp; Modifications made by that 
-    Contributor with its Contributor Version (or portions of such 
-    combination).</FONT> 
-    <P><B>(c) </B>the licenses granted in Sections 2.2(a) and 2.2(b) are 
-    effective on the date Contributor first makes Commercial Use of the Covered 
-    Code. 
-    <P><B>(d)&nbsp;</B>&nbsp;&nbsp; Notwithstanding Section 2.2(b) above, no 
-    patent license is granted: 1) for any code that Contributor has deleted from 
-    the Contributor Version; 2)&nbsp; separate from the Contributor 
-    Version;&nbsp; 3)&nbsp; for infringements caused by: i) third party 
-    modifications of Contributor Version or ii)&nbsp; the combination of 
-    Modifications made by that Contributor with other software&nbsp; (except as 
-    part of the Contributor Version) or other devices; or 4) under Patent Claims 
-    infringed by Covered Code in the absence of Modifications made by that 
-    Contributor.</P></UL></UL>
-<P><BR><B>3. Distribution Obligations.</B> 
-<UL><B>3.1. Application of License.</B> <BR>The Modifications which You create 
-  or to which You contribute are governed by the terms of this License, 
-  including without limitation Section <B>2.2</B>. The Source Code version of 
-  Covered Code may be distributed only under the terms of this License or a 
-  future version of this License released under Section <B>6.1</B>, and You must 
-  include a copy of this License with every copy of the Source Code You 
-  distribute. You may not offer or impose any terms on any Source Code version 
-  that alters or restricts the applicable version of this License or the 
-  recipients' rights hereunder. However, You may include an additional document 
-  offering the additional rights described in Section <B>3.5</B>. 
-  <P><B>3.2. Availability of Source Code.</B> <BR>Any Modification which You 
-  create or to which You contribute must be made available in Source Code form 
-  under the terms of this License either on the same media as an Executable 
-  version or via an accepted Electronic Distribution Mechanism to anyone to whom 
-  you made an Executable version available; and if made available via Electronic 
-  Distribution Mechanism, must remain available for at least twelve (12) months 
-  after the date it initially became available, or at least six (6) months after 
-  a subsequent version of that particular Modification has been made available 
-  to such recipients. You are responsible for ensuring that the Source Code 
-  version remains available even if the Electronic Distribution Mechanism is 
-  maintained by a third party. 
-  <P><B>3.3. Description of Modifications.</B> <BR>You must cause all Covered 
-  Code to which You contribute to contain a file documenting the changes You 
-  made to create that Covered Code and the date of any change. You must include 
-  a prominent statement that the Modification is derived, directly or 
-  indirectly, from Original Code provided by the Initial Developer and including 
-  the name of the Initial Developer in (a) the Source Code, and (b) in any 
-  notice in an Executable version or related documentation in which You describe 
-  the origin or ownership of the Covered Code. 
-  <P><B>3.4. Intellectual Property Matters</B> 
-  <UL><B>(a) Third Party Claims</B>. <BR>If Contributor has knowledge that a 
-    license under a third party's intellectual property rights is required to 
-    exercise the rights granted by such Contributor under Sections 2.1 or 2.2, 
-    Contributor must include a text file with the Source Code distribution 
-    titled "LEGAL'' which describes the claim and the party making the claim in 
-    sufficient detail that a recipient will know whom to contact. If Contributor 
-    obtains such knowledge after the Modification is made available as described 
-    in Section 3.2, Contributor shall promptly modify the LEGAL file in all 
-    copies Contributor makes available thereafter and shall take other steps 
-    (such as notifying appropriate mailing lists or newsgroups) reasonably 
-    calculated to inform those who received the Covered Code that new knowledge 
-    has been obtained. 
-    <P><B>(b) Contributor APIs</B>. <BR>If Contributor's Modifications include 
-    an application programming interface and Contributor has knowledge of patent 
-    licenses which are reasonably necessary to implement that API, Contributor 
-    must also include this information in the LEGAL file. 
-  <BR>&nbsp;</P></UL>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
-  <B>(c)&nbsp;&nbsp;&nbsp; Representations.</B> 
-  <UL>Contributor represents that, except as disclosed pursuant to Section 
-    3.4(a) above, Contributor believes that Contributor's Modifications are 
-    Contributor's original creation(s) and/or Contributor has sufficient rights 
-    to grant the rights conveyed by this License.</UL>
-  <P><BR><B>3.5. Required Notices.</B> <BR>You must duplicate the notice in 
-  <B>Exhibit A</B> in each file of the Source Code.&nbsp; If it is not possible 
-  to put such notice in a particular Source Code file due to its structure, then 
-  You must include such notice in a location (such as a relevant directory) 
-  where a user would be likely to look for such a notice.&nbsp; If You created 
-  one or more Modification(s) You may add your name as a Contributor to the 
-  notice described in <B>Exhibit A</B>.&nbsp; You must also duplicate this 
-  License in any documentation for the Source Code where You describe 
-  recipients' rights or ownership rights relating to Covered Code.&nbsp; You may 
-  choose to offer, and to charge a fee for, warranty, support, indemnity or 
-  liability obligations to one or more recipients of Covered Code. However, You 
-  may do so only on Your own behalf, and not on behalf of the Initial Developer 
-  or any Contributor. You must make it absolutely clear than any such warranty, 
-  support, indemnity or liability obligation is offered by You alone, and You 
-  hereby agree to indemnify the Initial Developer and every Contributor for any 
-  liability incurred by the Initial Developer or such Contributor as a result of 
-  warranty, support, indemnity or liability terms You offer. 
-  <P><B>3.6. Distribution of Executable Versions.</B> <BR>You may distribute 
-  Covered Code in Executable form only if the requirements of Section 
-  <B>3.1-3.5</B> have been met for that Covered Code, and if You include a 
-  notice stating that the Source Code version of the Covered Code is available 
-  under the terms of this License, including a description of how and where You 
-  have fulfilled the obligations of Section <B>3.2</B>. The notice must be 
-  conspicuously included in any notice in an Executable version, related 
-  documentation or collateral in which You describe recipients' rights relating 
-  to the Covered Code. You may distribute the Executable version of Covered Code 
-  or ownership rights under a license of Your choice, which may contain terms 
-  different from this License, provided that You are in compliance with the 
-  terms of this License and that the license for the Executable version does not 
-  attempt to limit or alter the recipient's rights in the Source Code version 
-  from the rights set forth in this License. If You distribute the Executable 
-  version under a different license You must make it absolutely clear that any 
-  terms which differ from this License are offered by You alone, not by the 
-  Initial Developer or any Contributor. You hereby agree to indemnify the 
-  Initial Developer and every Contributor for any liability incurred by the 
-  Initial Developer or such Contributor as a result of any such terms You offer. 
-
-  <P><B>3.7. Larger Works.</B> <BR>You may create a Larger Work by combining 
-  Covered Code with other code not governed by the terms of this License and 
-  distribute the Larger Work as a single product. In such a case, You must make 
-  sure the requirements of this License are fulfilled for the Covered 
-Code.</P></UL><B>4. Inability to Comply Due to Statute or Regulation.</B> 
-<UL>If it is impossible for You to comply with any of the terms of this 
-  License with respect to some or all of the Covered Code due to statute, 
-  judicial order, or regulation then You must: (a) comply with the terms of this 
-  License to the maximum extent possible; and (b) describe the limitations and 
-  the code they affect. Such description must be included in the LEGAL file 
-  described in Section <B>3.4</B> and must be included with all distributions of 
-  the Source Code. Except to the extent prohibited by statute or regulation, 
-  such description must be sufficiently detailed for a recipient of ordinary 
-  skill to be able to understand it.</UL><B>5. Application of this License.</B> 
-<UL>This License applies to code to which the Initial Developer has attached 
-  the notice in <B>Exhibit A</B> and to related Covered Code.</UL><B>6. Versions 
-of the License.</B> 
-<UL><B>6.1. New Versions</B>. <BR>Netscape Communications Corporation 
-  (''Netscape'') may publish revised and/or new versions of the License from 
-  time to time. Each version will be given a distinguishing version number. 
-  <P><B>6.2. Effect of New Versions</B>. <BR>Once Covered Code has been 
-  published under a particular version of the License, You may always continue 
-  to use it under the terms of that version. You may also choose to use such 
-  Covered Code under the terms of any subsequent version of the License 
-  published by Netscape. No one other than Netscape has the right to modify the 
-  terms applicable to Covered Code created under this License. 
-  <P><B>6.3. Derivative Works</B>. <BR>If You create or use a modified version 
-  of this License (which you may only do in order to apply it to code which is 
-  not already Covered Code governed by this License), You must (a) rename Your 
-  license so that the phrases ''Mozilla'', ''MOZILLAPL'', ''MOZPL'', 
-  ''Netscape'', "MPL", ''NPL'' or any confusingly similar phrase do not appear 
-  in your license (except to note that your license differs from this License) 
-  and (b) otherwise make it clear that Your version of the license contains 
-  terms which differ from the Mozilla Public License and Netscape Public 
-  License. (Filling in the name of the Initial Developer, Original Code or 
-  Contributor in the notice described in <B>Exhibit A</B> shall not of 
-  themselves be deemed to be modifications of this License.)</P></UL><B>7. 
-DISCLAIMER OF WARRANTY.</B> 
-<UL>COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, WITHOUT 
-  WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT 
-  LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, 
-  FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE 
-  QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED 
-  CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY 
-  OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR 
-  CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS 
-  LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS 
-  DISCLAIMER.</UL><B>8. TERMINATION.</B> 
-<UL><B>8.1.&nbsp; </B>This License and the rights granted hereunder will 
-  terminate automatically if You fail to comply with terms herein and fail to 
-  cure such breach within 30 days of becoming aware of the breach. All 
-  sublicenses to the Covered Code which are properly granted shall survive any 
-  termination of this License. Provisions which, by their nature, must remain in 
-  effect beyond the termination of this License shall survive. 
-  <P><B>8.2.&nbsp; </B>If You initiate litigation by asserting a patent 
-  infringement claim (excluding declatory judgment actions) against Initial 
-  Developer or a Contributor (the Initial Developer or Contributor against whom 
-  You file such action is referred to as "Participant")&nbsp; alleging that: 
-  <P><B>(a)&nbsp; </B>such Participant's Contributor Version directly or 
-  indirectly infringes any patent, then any and all rights granted by such 
-  Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 
-  60 days notice from Participant terminate prospectively, unless if within 60 
-  days after receipt of notice You either: (i)&nbsp; agree in writing to pay 
-  Participant a mutually agreeable reasonable royalty for Your past and future 
-  use of Modifications made by such Participant, or (ii) withdraw Your 
-  litigation claim with respect to the Contributor Version against such 
-  Participant.&nbsp; If within 60 days of notice, a reasonable royalty and 
-  payment arrangement are not mutually agreed upon in writing by the parties or 
-  the litigation claim is not withdrawn, the rights granted by Participant to 
-  You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of 
-  the 60 day notice period specified above. 
-  <P><B>(b)</B>&nbsp; any software, hardware, or device, other than such 
-  Participant's Contributor Version, directly or indirectly infringes any 
-  patent, then any rights granted to You by such Participant under Sections 
-  2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, 
-  sold, distributed, or had made, Modifications made by that Participant. 
-  <P><B>8.3.&nbsp; </B>If You assert a patent infringement claim against 
-  Participant alleging that such Participant's Contributor Version directly or 
-  indirectly infringes any patent where such claim is resolved (such as by 
-  license or settlement) prior to the initiation of patent infringement 
-  litigation, then the reasonable value of the licenses granted by such 
-  Participant under Sections 2.1 or 2.2 shall be taken into account in 
-  determining the amount or value of any payment or license. 
-  <P><B>8.4.</B>&nbsp; In the event of termination under Sections 8.1 or 8.2 
-  above,&nbsp; all end user license agreements (excluding distributors and 
-  resellers) which have been validly granted by You or any distributor hereunder 
-  prior to termination shall survive termination.</P></UL><B>9. LIMITATION OF 
-LIABILITY.</B> 
-<UL>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING 
-  NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY 
-  OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY 
-  OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, 
-  INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT 
-  LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR 
-  MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH 
-  PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS 
-  LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL 
-  INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW 
-  PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR 
-  LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND 
-  LIMITATION MAY NOT APPLY TO YOU.</UL><B>10. U.S. GOVERNMENT END USERS.</B> 
-<UL>The Covered Code is a ''commercial item,'' as that term is defined in 48 
-  C.F.R. 2.101 (Oct. 1995), consisting of ''commercial computer software'' and 
-  ''commercial computer software documentation,'' as such terms are used in 48 
-  C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 
-  227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users 
-  acquire Covered Code with only those rights set forth herein.</UL><B>11. 
-MISCELLANEOUS.</B> 
-<UL>This License represents the complete agreement concerning subject matter 
-  hereof. If any provision of this License is held to be unenforceable, such 
-  provision shall be reformed only to the extent necessary to make it 
-  enforceable. This License shall be governed by California law provisions 
-  (except to the extent applicable law, if any, provides otherwise), excluding 
-  its conflict-of-law provisions. With respect to disputes in which at least one 
-  party is a citizen of, or an entity chartered or registered to do business in 
-  the United States of America, any litigation relating to this License shall be 
-  subject to the jurisdiction of the Federal Courts of the Northern District of 
-  California, with venue lying in Santa Clara County, California, with the 
-  losing party responsible for costs, including without limitation, court costs 
-  and reasonable attorneys' fees and expenses. The application of the United 
-  Nations Convention on Contracts for the International Sale of Goods is 
-  expressly excluded. Any law or regulation which provides that the language of 
-  a contract shall be construed against the drafter shall not apply to this 
-  License.</UL><B>12. RESPONSIBILITY FOR CLAIMS.</B> 
-<UL>As between Initial Developer and the Contributors, each party is 
-  responsible for claims and damages arising, directly or indirectly, out of its 
-  utilization of rights under this License and You agree to work with Initial 
-  Developer and Contributors to distribute such responsibility on an equitable 
-  basis. Nothing herein is intended or shall be deemed to constitute any 
-  admission of liability.</UL><B>13. MULTIPLE-LICENSED CODE.</B> 
-<UL>Initial Developer may designate portions of the Covered Code as 
-  �Multiple-Licensed?.&nbsp; �Multiple-Licensed? means that the Initial 
-  Developer permits you to utilize portions of the Covered Code under Your 
-  choice of the MPL or the alternative licenses, if any, specified by the 
-  Initial Developer in the file described in Exhibit A.</UL>
-<P><BR><B>EXHIBIT A -Mozilla Public License.</B> 
-<UL>The contents of this file are subject to the Mozilla Public License 
-  Version 1.1 (the "License"); you may not use this file except in compliance 
-  with the License. You may obtain a copy of the License at 
-  <BR>http://www.mozilla.org/MPL/ 
-  <P>Software distributed under the License is distributed on an "AS IS" basis, 
-  WITHOUT WARRANTY OF <BR>ANY KIND, either express or implied. See the License 
-  for the specific language governing rights and <BR>limitations under the 
-  License. 
-  <P>The Original Code is Javassist. 
-  <P>The Initial Developer of the Original Code is Shigeru Chiba. 
-  Portions created by the Initial Developer are<BR>&nbsp;
-  Copyright (C) 1999-2008 Shigeru Chiba. All Rights Reserved. 
-  <P>Contributor(s): ______________________________________. 
-
-  <P>Alternatively, the contents of this file may be used under the terms of
-  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-  in which case the provisions of the LGPL are applicable instead
-  of those above. If you wish to allow use of your version of this file only
-  under the terms of the LGPL, and not to allow others to
-  use your version of this file under the terms of the MPL, indicate your
-  decision by deleting the provisions above and replace them with the notice
-  and other provisions required by the LGPL. If you do not delete
-  the provisions above, a recipient may use your version of this file under
-  the terms of either the MPL or the LGPL.
-
-  <P></P></UL>
-</BODY>
-</HTML>
diff --git a/TILES_3_0_X/LICENSE.txt b/TILES_3_0_X/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/NOTICE.txt b/TILES_3_0_X/NOTICE.txt
deleted file mode 100644
index c622f7a..0000000
--- a/TILES_3_0_X/NOTICE.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2012 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
-   The binary distribution contains software developed by:
-
-   SpringSource: http://www.springsource.com/
-   Visigoth Software Society (Freemarker): http://freemarker.org/
-   OpenSymphony (OGNL): http://www.opensymphony.com/ognl/
-   Codehaus (MVEL): http://mvel.codehaus.org/
-   JBoss (Javassist): http://jboss.org/javassist/
-   Sam Pullara (Mustache Java): https://github.com/spullara/mustache.java/
-
diff --git a/TILES_3_0_X/OGNL-LICENSE.txt b/TILES_3_0_X/OGNL-LICENSE.txt
deleted file mode 100644
index 43bafbb..0000000
--- a/TILES_3_0_X/OGNL-LICENSE.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-/* ====================================================================
- * The OpenSymphony Software License, Version 1.1
- *
- * (this license is derived and fully compatible with the Apache Software
- * License - see http://www.apache.org/LICENSE.txt)
- *
- * Copyright (c) 2001-2004 The OpenSymphony Group. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- *    if any, must include the following acknowledgment:
- *       "This product includes software developed by the
- *        OpenSymphony Group (http://www.opensymphony.com/)."
- *    Alternately, this acknowledgment may appear in the software itself,
- *    if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "OpenSymphony" and "The OpenSymphony Group"
- *    must not be used to endorse or promote products derived from this
- *    software without prior written permission. For written
- *    permission, please contact license@opensymphony.com .
- *
- * 5. Products derived from this software may not be called "OpenSymphony"
- *    or "OGNL", nor may "OpenSymphony" or "OGNL" appear in their
- *    name, without prior written permission of the OpenSymphony Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- */
diff --git a/TILES_3_0_X/SLF4J-LICENSE.txt b/TILES_3_0_X/SLF4J-LICENSE.txt
deleted file mode 100644
index f5ecafa..0000000
--- a/TILES_3_0_X/SLF4J-LICENSE.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright (c) 2004-2008 QOS.ch
-All rights reserved.
-
-Permission is hereby granted, free  of charge, to any person obtaining
-a  copy  of this  software  and  associated  documentation files  (the
-"Software"), to  deal in  the Software without  restriction, including
-without limitation  the rights to  use, copy, modify,  merge, publish,
-distribute,  sublicense, and/or sell  copies of  the Software,  and to
-permit persons to whom the Software  is furnished to do so, subject to
-the following conditions:
-
-The  above  copyright  notice  and  this permission  notice  shall  be
-included in all copies or substantial portions of the Software.
-
-THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
-EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
-MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/TILES_3_0_X/assembly/pom.xml b/TILES_3_0_X/assembly/pom.xml
deleted file mode 100644
index 7253130..0000000
--- a/TILES_3_0_X/assembly/pom.xml
+++ /dev/null
@@ -1,212 +0,0 @@
-<?xml version="1.0"?>
-<!--
-    $Id$
-
-    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.tiles</groupId>
-  <artifactId>tiles-assembly</artifactId>
-  <packaging>pom</packaging>
-  <name>Tiles Assembly</name>
-  <description>Tiles Assembly: assembles artifact to produce distributions.
-  </description>
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <scm>
-    <connection>scm:svn:http://svn.apache.org/repos/asf/tiles/framework/tags/tiles-parent-3.0.1/assembly</connection>
-    <developerConnection>scm:svn:https://svn.apache.org/repos/asf/tiles/framework/tags/tiles-parent-3.0.1/assembly</developerConnection>
-    <url>http://svn.apache.org/viewcvs.cgi/tiles/framework/tags/tiles-parent-3.0.1/assembly</url>
-  </scm>
-
-  <build>
-    <plugins>
-        <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-assembly-plugin</artifactId>
-          <version>2.2-beta-4</version>
-        <configuration>
-          <descriptors>
-            <descriptor>src/main/assembly/bin.xml</descriptor>
-            <descriptor>src/main/assembly/docs.xml</descriptor>
-            <descriptor>src/main/assembly/src.xml</descriptor>
-          </descriptors>
-          <finalName>tiles-${project.version}</finalName>
-          <outputDirectory>target/assembly/out</outputDirectory>
-          <workDirectory>target/assembly/work</workDirectory>
-          <tarLongFileMode>gnu</tarLongFileMode>
-        </configuration>
-      </plugin>
-    </plugins>
-    <extensions>
-      <extension>
-        <groupId>org.apache.maven.wagon</groupId>
-        <artifactId>wagon-ssh</artifactId>
-        <version>1.0</version>
-      </extension>
-    </extensions>
-  </build>
-  <profiles>
-    <profile>
-      <id>apache-release</id>
-      <build>
-        <plugins>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-assembly-plugin</artifactId>
-            <version>2.2-beta-4</version>
-            <executions>
-              <execution>
-                <id>make-assembly</id>
-                <goals>
-                  <goal>attached</goal>
-                </goals>
-                <phase>package</phase>
-              </execution>
-            </executions>
-            <configuration>
-              <descriptors>
-                <descriptor>src/main/assembly/bin.xml</descriptor>
-                <descriptor>src/main/assembly/docs.xml</descriptor>
-                <descriptor>src/main/assembly/src.xml</descriptor>
-              </descriptors>
-              <tarLongFileMode>gnu</tarLongFileMode>
-            </configuration>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-deploy-plugin</artifactId>
-            <configuration>
-              <skip>true</skip>
-            </configuration>
-          </plugin>
-          <plugin>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-antrun-plugin</artifactId>
-            <version>1.3</version>
-            <executions>
-              <execution>
-                <phase>deploy</phase>
-                <goals>
-                  <goal>run</goal>
-                </goals>
-                <configuration>
-                  <tasks>
-                    <mkdir dir="${project.build.directory}/assemblies" />
-                    <echo message="Here I am!" />
-                    <copy todir="${project.build.directory}/assemblies">
-                      <fileset dir="${settings.localRepository}/org/apache/tiles/tiles-assembly/${project.version}">
-                        <include name="tiles-assembly-${project.version}-*.zip*" />
-                        <include name="tiles-assembly-${project.version}-*.tar.gz*" />
-                        <exclude name="tiles-assembly-${project.version}-source-release.*" />
-                      </fileset>
-                      <mapper type="glob" from="tiles-assembly-*" to="tiles-*" />
-                    </copy>
-                  </tasks>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-          <plugin>
-            <groupId>org.codehaus.mojo</groupId>
-            <artifactId>wagon-maven-plugin</artifactId>
-            <version>1.0-beta-4</version>
-            <executions>
-              <execution>
-                <phase>deploy</phase>
-                <goals>
-                  <goal>upload</goal>
-                </goals>
-                <configuration>
-                  <fromDir>${project.build.directory}/assemblies</fromDir>
-                  <includes>**</includes>
-                  <toDir>${project.version}</toDir>
-                  <serverId>tiles.build</serverId>
-                  <url>scp://people.apache.org/www/people.apache.org/builds/tiles</url>
-                </configuration>
-              </execution>
-            </executions>
-          </plugin>
-        </plugins>
-      </build>
-    </profile>
-  </profiles>
-
-  <dependencies>
-
-    <!-- Main Tiles packages -->
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-api</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-servlet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-jsp</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-compat</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-test</artifactId>
-      <version>${project.version}</version>
-      <type>war</type>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-extras</artifactId>
-      <version>${project.version}</version>
-      <type>jar</type>
-    </dependency>
-
-    <!-- Optional dependencies that will be redistributed -->
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <version>1.5.8</version>
-      <scope>runtime</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/assembly/src/main/assembly/bin.xml b/TILES_3_0_X/assembly/src/main/assembly/bin.xml
deleted file mode 100644
index 5fee095..0000000
--- a/TILES_3_0_X/assembly/src/main/assembly/bin.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
- 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.
--->
-<assembly>
-    <id>bin</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <includeSiteDirectory>false</includeSiteDirectory>
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/lib</outputDirectory>
-            <outputFileNameMapping>${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.slf4j:slf4j-api</include>
-                <include>org.slf4j:jcl-over-slf4j</include>
-                <include>commons-beanutils:commons-beanutils</include>
-                <include>commons-digester:commons-digester</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/lib/optional</outputDirectory>
-            <outputFileNameMapping>${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <excludes>
-                <exclude>org.apache.tiles:*</exclude>
-                <exclude>org.slf4j:slf4j-api</exclude>
-                <exclude>org.slf4j:jcl-over-slf4j</exclude>
-                <exclude>commons-beanutils:commons-beanutils</exclude>
-                <exclude>commons-digester:commons-digester</exclude>
-            </excludes>
-        </dependencySet>
-        <dependencySet>
-            <outputDirectory>/</outputDirectory>
-            <outputFileNameMapping>${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
-            <includes>
-                <include>org.apache.tiles:*</include>
-            </includes>
-            <excludes>
-                <exclude>org.apache.tiles:tiles-test</exclude>
-            </excludes>
-        </dependencySet>
-    </dependencySets>
-
-    <fileSets>
-        <fileSet>
-            <directory>..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>*LICENSE.*</include>
-                <include>NOTICE.txt</include>
-            </includes>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/TILES_3_0_X/assembly/src/main/assembly/docs.xml b/TILES_3_0_X/assembly/src/main/assembly/docs.xml
deleted file mode 100644
index 72fae55..0000000
--- a/TILES_3_0_X/assembly/src/main/assembly/docs.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
- 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.
--->
-<assembly>
-    <id>docs</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <includeSiteDirectory>false</includeSiteDirectory>
-    <dependencySets>
-    </dependencySets>
-
-    <fileSets>
-        <fileSet>
-            <directory>..</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>LICENSE.txt</include>
-                <include>NOTICE.txt</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../target/site/apidocs</directory>
-            <outputDirectory>apidocs</outputDirectory>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-core/target/site/dtddoc</directory>
-            <outputDirectory>dtddoc</outputDirectory>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-jsp/target/site/tlddoc</directory>
-            <outputDirectory>tlddoc</outputDirectory>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/TILES_3_0_X/assembly/src/main/assembly/src.xml b/TILES_3_0_X/assembly/src/main/assembly/src.xml
deleted file mode 100644
index 79c9b4c..0000000
--- a/TILES_3_0_X/assembly/src/main/assembly/src.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<!--
- 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.
--->
-<assembly>
-    <id>src</id>
-    <formats>
-        <format>tar.gz</format>
-        <format>zip</format>
-    </formats>
-    <fileSets>
-        <fileSet>
-            <directory>../</directory>
-            <outputDirectory>src/</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../</directory>
-            <outputDirectory>/</outputDirectory>
-            <includes>
-                <include>LICENSE.txt</include>
-                <include>NOTICE.txt</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-core</directory>
-            <outputDirectory>src/tiles-core</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-api</directory>
-            <outputDirectory>src/tiles-api</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-servlet</directory>
-            <outputDirectory>src/tiles-servlet</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-jsp</directory>
-            <outputDirectory>src/tiles-jsp</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-el</directory>
-            <outputDirectory>src/tiles-el</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-mvel</directory>
-            <outputDirectory>src/tiles-mvel</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-ognl</directory>
-            <outputDirectory>src/tiles-ognl</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-template</directory>
-            <outputDirectory>src/tiles-template</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-freemarker</directory>
-            <outputDirectory>src/tiles-freemarker</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-velocity</directory>
-            <outputDirectory>src/tiles-velocity</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-extras</directory>
-            <outputDirectory>src/tiles-extras</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-compat</directory>
-            <outputDirectory>src/tiles-compat</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../tiles-test</directory>
-            <outputDirectory>src/tiles-test</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-        <fileSet>
-            <directory>../assembly</directory>
-            <outputDirectory>src/assembly</outputDirectory>
-            <includes>
-                <include>pom.xml</include>
-                <include>src/</include>
-            </includes>
-        </fileSet>
-    </fileSets>
-</assembly>
diff --git a/TILES_3_0_X/assembly/src/main/resources/LICENSE.txt b/TILES_3_0_X/assembly/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/assembly/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/assembly/src/main/resources/NOTICE.txt b/TILES_3_0_X/assembly/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/assembly/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/assembly/src/site/site.xml b/TILES_3_0_X/assembly/src/site/site.xml
deleted file mode 100644
index f7e677d..0000000
--- a/TILES_3_0_X/assembly/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Assembly">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        ${modules}
-        ${reports}
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/pom.xml b/TILES_3_0_X/pom.xml
deleted file mode 100644
index cf0b018..0000000
--- a/TILES_3_0_X/pom.xml
+++ /dev/null
@@ -1,386 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <parent>
-        <artifactId>tiles-master</artifactId>
-        <groupId>org.apache.tiles</groupId>
-        <version>4</version>
-        <relativePath />
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-    <packaging>pom</packaging>
-    <name>Tiles 3</name>
-    <description>Tiles 3: A framework for page composition.</description>
-    <url>http://tiles.apache.org/framework/</url>
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/tiles/framework/tags/tiles-parent-3.0.1</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/tiles/framework/tags/tiles-parent-3.0.1</developerConnection>
-        <url>http://svn.apache.org/viewvc/tiles/framework/tags/tiles-parent-3.0.1</url>
-    </scm>
-
-    <ciManagement />
-
-    <modules>
-        <module>tiles-api</module>
-        <module>tiles-core</module>
-        <module>tiles-template</module>
-        <module>tiles-servlet</module>
-        <module>tiles-jsp</module>
-        <module>tiles-freemarker</module>
-        <module>tiles-velocity</module>
-        <module>tiles-el</module>
-        <module>tiles-mvel</module>
-        <module>tiles-ognl</module>
-        <module>tiles-compat</module>
-        <module>tiles-extras</module>
-        <module>assembly</module>
-        <module>tiles-test-pom</module>
-    </modules>
-
-    <issueManagement>
-        <system>JIRA</system>
-        <url>https://issues.apache.org/jira/browse/TILES</url>
-    </issueManagement>
-
-    <distributionManagement>
-        <site>
-            <id>apache-site</id>
-            <url>scp://people.apache.org/www/tiles.apache.org/framework</url>
-        </site>
-    </distributionManagement>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.tiles</groupId>
-                <artifactId>tiles-api</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tiles</groupId>
-                <artifactId>tiles-core</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tiles</groupId>
-                <artifactId>tiles-servlet</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.tiles</groupId>
-                <artifactId>tiles-template</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.velocity</groupId>
-                <artifactId>velocity-tools</artifactId>
-                <version>2.0</version>
-                <exclusions>
-                    <exclusion>
-                        <artifactId>struts-taglib</artifactId>
-                        <groupId>org.apache.struts</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>struts-tiles</artifactId>
-                        <groupId>org.apache.struts</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>struts-core</artifactId>
-                        <groupId>org.apache.struts</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>sslext</artifactId>
-                        <groupId>sslext</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>commons-chain</artifactId>
-                        <groupId>commons-chain</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>commons-validator</artifactId>
-                        <groupId>commons-validator</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>commons-digester</artifactId>
-                        <groupId>commons-digester</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>commons-beanutils</artifactId>
-                        <groupId>commons-beanutils</groupId>
-                    </exclusion>
-                    <exclusion>
-                        <artifactId>dom4j</artifactId>
-                        <groupId>dom4j</groupId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-
-            <dependency>
-                <groupId>commons-digester</groupId>
-                <artifactId>commons-digester</artifactId>
-                <version>2.0</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>commons-logging</groupId>
-                        <artifactId>commons-logging</artifactId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.freemarker</groupId>
-                <artifactId>freemarker</artifactId>
-                <version>2.3.15</version>
-            </dependency>
-
-            <dependency>
-                <groupId>ognl</groupId>
-                <artifactId>ognl</artifactId>
-                <version>2.7.3</version>
-            </dependency>
-            <dependency>
-                <groupId>org.mvel</groupId>
-                <artifactId>mvel2</artifactId>
-                <version>2.0.11</version>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet</groupId>
-                <artifactId>servlet-api</artifactId>
-                <version>2.5</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.servlet.jsp</groupId>
-                <artifactId>jsp-api</artifactId>
-                <version>2.1</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>javax.el</groupId>
-                <artifactId>el-api</artifactId>
-                <version>1.0</version>
-                <scope>provided</scope>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.7</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.easymock</groupId>
-                <artifactId>easymock</artifactId>
-                <version>3.0</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.shale</groupId>
-                <artifactId>shale-test</artifactId>
-                <version>1.0.5</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.easymock</groupId>
-                <artifactId>easymockclassextension</artifactId>
-                <version>3.0</version>
-                <scope>test</scope>
-            </dependency>
-            <dependency>
-            	<groupId>org.slf4j</groupId>
-            	<artifactId>slf4j-jdk14</artifactId>
-            	<version>1.5.8</version>
-            	<optional>true</optional>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>jcl-over-slf4j</artifactId>
-                <version>1.5.8</version>
-                <optional>true</optional>
-            </dependency>
-            <dependency>
-            	<groupId>org.apache.tiles</groupId>
-            	<artifactId>tiles-request-api</artifactId>
-            	<version>${tiles.request.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <configuration>
-                        <archive>
-                            <manifestFile>${tiles.manifestfile}</manifestFile>
-                            <manifest>
-                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                            </manifest>
-                        </archive>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <version>2.3.7</version>
-                    <inherited>true</inherited>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <configuration>
-                    <excludeDependencies>true</excludeDependencies>
-                    <manifestLocation>target/osgi</manifestLocation>
-                    <instructions>
-                        <_nouses>true</_nouses>
-                        <Bundle-SymbolicName>${tiles.osgi.symbolicName}</Bundle-SymbolicName>
-                        <Export-Package>${tiles.osgi.export}</Export-Package>
-                        <Private-Package>${tiles.osgi.private}</Private-Package>
-                        <Import-Package>${tiles.osgi.import}</Import-Package>
-                        <DynamicImport-Package>${tiles.osgi.dynamicImport}</DynamicImport-Package>
-                        <Bundle-DocURL>${project.url}</Bundle-DocURL>
-                        <Specification-Title>${project.name}</Specification-Title>
-                        <Specification-Version>${project.version}</Specification-Version>
-                        <Specification-Vendor>${project.organization.name}</Specification-Vendor>
-                        <Implementation-Title>${project.name}</Implementation-Title>
-                        <Implementation-Version>${project.version}</Implementation-Version>
-                        <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
-                        <Implementation-Vendor-Id>org.apache</Implementation-Vendor-Id>
-                    </instructions>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-release-plugin</artifactId>
-                <configuration>
-                    <releaseProfiles>apache-release</releaseProfiles><!-- xxx tiles still uses "release" instead of "apache-release" -->
-                    <goals>deploy site-deploy</goals>
-                </configuration>
-            </plugin>
-        </plugins>
-
-        <defaultGoal>install</defaultGoal>
-    </build>
-
-    <properties>
-        <tiles.osgi.symbolicName>org.apache.${project.artifactId}</tiles.osgi.symbolicName>
-        <tiles.osgi.export>org.apache.tiles.*;version=${project.version}</tiles.osgi.export>
-        <tiles.osgi.import>*</tiles.osgi.import>
-        <tiles.osgi.dynamicImport />
-        <tiles.osgi.private />
-        <tiles.manifestfile>target/osgi/MANIFEST.MF</tiles.manifestfile>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <tiles.request.version>1.0.1</tiles.request.version>
-        <tiles.autotag.version>1.1.0</tiles.autotag.version>
-    </properties>
-
-    <dependencies />
-
-    <profiles>
-        <profile>
-            <id>apache-release</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-install-plugin</artifactId>
-                        <configuration>
-                            <createChecksum>true</createChecksum>
-                        </configuration>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>rat-maven-plugin</artifactId>
-                        <version>1.0-alpha-3</version>
-                        <executions>
-                            <execution>
-                                <phase>verify</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                </goals>
-                                <configuration>
-                                    <addDefaultLicenseMatchers>false</addDefaultLicenseMatchers>
-                                    <licenseMatchers>
-                                        <classNames>
-                                            <className>rat.analysis.license.ApacheSoftwareLicense20</className>
-                                        </classNames>
-                                    </licenseMatchers>
-                                    <includes>
-                                        <include>pom.xml</include>
-                                        <include>src/**</include>
-                                    </includes>
-                                    <excludes>
-                                        <exclude>**/*LICENSE.txt</exclude>
-                                        <exclude>**/*MANIFEST.MF</exclude>
-                                    </excludes>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-        <profile>
-            <id>linkcheck</id>
-            <reporting>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-linkcheck-plugin</artifactId>
-                        <version>1.1</version>
-                        <configuration>
-                            <excludedLinks>
-                                <excludedLink>/*</excludedLink>
-                                <excludedLink>**/index.html</excludedLink>
-                                <excludedLink>**/logo.png</excludedLink>
-                                <excludedLink>**/tiles-jsp/tagreference.html</excludedLink>
-                            </excludedLinks>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </reporting>
-        </profile>
-
-    </profiles>
-
-</project>
diff --git a/TILES_3_0_X/src/site/apt/config-reference.apt b/TILES_3_0_X/src/site/apt/config-reference.apt
deleted file mode 100644
index 71a7b6d..0000000
--- a/TILES_3_0_X/src/site/apt/config-reference.apt
+++ /dev/null
@@ -1,250 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Configuration Reference
-         -----------
-
-Configuring Tiles
-
-  Configuring Tiles means creating the following objects:
-  * an instance of org.apache.tiles.request.ApplicationContext,
-  * an instance of org.apache.tiles.TilesContainer.
-  Usually these are created by an instance of org.apache.tiles.startup.TilesInitializer.
-
-  Several MVC frameworks (struts, spring, shale) provide an easy integration with tiles.
-
-* Starting Tiles in a web application
-
-  Tiles has always been a web application package, usually used in conjunction
-  with Struts. Apache Tiles\u0099 evolved to the point of being technology-independent, but
-  its use in a Servlet-based web application will be the most frequent use case.
-
-  To start Tiles you can extend
-  {{{./apidocs/org/apache/tiles/web/startup/AbstractTilesListener.html}AbstractTilesListener}}
-  and implement the <<<createTilesInitializer>>> method:
-
---------------------------
-protected TilesInitializer createTilesInitializer() {
-    return new MyCustomTilesInitializer();
-}
---------------------------
-
-  You can use {{{./apidocs/org/apache/tiles/startup/AbstractTilesInitializer.html}AbstractTilesInitializer}}
-  as a basis.
-
-  Then you can start Tiles by specifing it in your <<<web.xml>>> file:
-
--------------------------------
-<listener>
-    <listener-class>my.package.MyTilesListener</listener-class>
-</listener>
--------------------------------
-
-* Starting Tiles in a portlet application
-
-  TBD
-
-{Ready-made configuration classes}
-
-  There are some classes that allows to play with Tiles without writing custom code.
-
-* Simple configuration
-
-  {{{./apidocs/org/apache/tiles/web/startup/simple/SimpleTilesListener.html}SimpleTilesListener}}
-  or
-  {{{./apidocs/org/apache/tiles/startup/DefaultTilesInitializer.html}DefaultTilesInitializer}}
-  are the "simple" way to load Tiles. This was the default for Tiles 2.1 and prior versions.
-
-  This configuration has the following characteristics:
-
-  * loads the "/WEB-INF/tiles.xml" file;
-
-  * allows support for JSP, Servlets and Portlets;
-
-  * no expression language is allowed;
-
-  * wildcard expressions can be used to declare definition names.
-
-* Feature-Complete configuration
-
-  It is possible to startup Tiles turning all the new features on by using
-  {{{./apidocs/org/apache/tiles/extras/complete/CompleteAutoloadTilesListener.html}CompleteAutoloadTilesListener}}
-  or
-  {{{./apidocs/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializer.html}CompleteAutoloadTilesInitializer}}
-  available in the <<<tiles-extras>>> module. This initializer turns on:
-
-  * {{{./tutorial/integration/freemarker.html}Freemarker}} and {{{./tutorial/integration/velocity.html}Velocity}} support;
-
-  * using EL, OGNL and MVEL as {{{./tutorial/advanced/el-support.html}evaluation languages}};
-
-  * using Wildcards and Regular expression as {{{./tutorial/advanced/wildcard.html}pattern matching languages}};
-
-  * loading {{{./migration/configuration.html#Reusing_old_Tiles_configuration_files}Tiles 1.x definition files}};
-
-  * loads all the files named "tiles*.xml" under /WEB-INF and under every META-INF in any part of the classpath.
-
-  * using a mutable container to create Definitions at runtime.
-
-* Modular initialization
-
-  It is possible to startup Tiles in a <<modular>> way, that is loading
-  modules of independent Tiles configuration.
-
-  To turn it on, you need to use
-  {{{./apidocs/org/apache/tiles/extras/module/ModularTilesListener.html}ModularTilesListener}}
-  or
-  {{{./apidocs/org/apache/tiles/extras/module/ModularTilesInitializer.html}ModularTilesInitializer}}
-  available in the <<<tiles-extras>>> module.
-
-  Add in your manifest file, under the <<<META-INF/MANIFEST.MF>>>
-  path, the <<<Tiles-Initializer>>> property, whose value is the name of the class of the
-  needed initializer. For example:
-
----------------------------
-Manifest-Version: 1.0
-Tiles-Initializer: org.apache.tiles.extras.module.ModularTilesInitializerTest$TilesInitializer1
----------------------------
-
-  Every initializer that is found will be loaded and "initialized", and destroyed when the
-  main initializer is destroyed.
-
-Configuring Tiles internals
-
-  The container and the application context must be configured to allow custom behaviour
-  and to load definitions from various sources.
-
-* Custom {ApplicationContext}
-
-  Custom ApplicationContext can be provided by implementing
-  {{{/tiles-request/apidocs/org/apache/tiles/request/ApplicationContext.html}ApplicationContext}}.
-  If you are under a servlet environment, you can override
-  {{{/tiles-request/apidocs/org/apache/tiles/request/servlet/ServletApplicationContext.html}ServletApplicationContext}}.
-
-  To use it, you need to override the
-  {{{./apidocs/org/apache/tiles/startup/AbstractTilesInitializer.html#method_summary}createTilesApplicationContext}}
-  method of AbstractTilesInitializer.
-
-  The reason to use a custom Tiles application context could be:
-
-  * supporting a platform not supported yet;
-
-  * providing custom behaviour, such as loading resources in a different manner.
-
-* Custom {TilesContainerFactory}
-
-  Custom Tiles containers can be created by custom Tiles container factories.
-  You have to create a class that extends
-  {{{./apidocs/org/apache/tiles/factory/AbstractTilesContainerFactory.html}AbstractTilesContainerFactory}}.
-  In particular you can use {{{./apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html}BasicTilesContainerFactory}}
-  as a basis for your extended configuration. <<<BasicTilesContainerFactory>>>
-  is the configuration that replicates the default configuration of Tiles,
-  i.e. the one that assumes when no additional parameter is provided.
-  The
-  {{{./apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html}Javadoc documentation of BasicTilesContainerFactory}}
-  documents all the methods that can be overridden to use your own
-  configuration.
-  
-** Changing the path for the Tiles Definitions file
-
-  The <<<BasicTilesContainerFactory>>> loads the "/WEB-INF/tiles.xml" file; the <<<CompleteAutoloadTilesContainerFactory>>>
-  loads all the files named "tiles*.xml" under /WEB-INF and under every META-INF in any part of the classpath.
-  
-  If this behaviour doesn't suits you, you can override the method <<<getSources>>> and retrieve whatever resource you
-  prefer. Just specify the path for the default locale; Tiles will extrapolate and load the localized files as needed.
-
-* Custom components
-
-  These components can be used by overriding the appropriate <<<create>>> method in a custom TilesContainerFactory.
-  
-** Custom {LocaleResolver}
-  
-  The default implementation is {{{./apidocs/org/apache/tiles/locale/impl/DefaultLocaleResolver.html}DefaultLocaleResolver}}.
-
-** Custom {DefinitionDAO}
-
-  The default implementation is {{{./apidocs/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAO.html}ResolvingLocaleUrlDefinitionDAO}}.
-  
-** Custom {AttributeEvaluatorFactory}
-
-  The default implementation is {{{./apidocs/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactory.html}BasicAttributeEvaluatorFactory}}.
-  
-  It can be used with a number of AttributeEvaluators like:
-  
-  * the {{{./apidocs/org/apache/tiles/evaluator/impl/DirectAttributeEvaluator.html}DirectAttributeEvaluator}},
-
-  * the {{{./apidocs/org/apache/tiles/el/ELAttributeEvaluator.html}ELAttributeEvaluator}},
-
-  * the {{{./apidocs/org/apache/tiles/mvel/MVELAttributeEvaluator.html}MVELAttributeEvaluator}},
-
-  * the {{{./apidocs/org/apache/tiles/ognl/OGNLAttributeEvaluator.html}OGNLAttributeEvaluator}}.
-  
-  Please see {{{./xref/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.html}CompleteAutoloadTilesContainerFactory}}
-  for an example of how to configure those.
-
-** Custom {PreparerFactory}
-
-  The default implementation is {{{./apidocs/org/apache/tiles/preparer/factory/BasicPreparerFactory.html}BasicPreparerFactory}}.
-
-  Currently the preparer is associated to a definition using its class name.
-  There will be only <<one>> instance per unique class name. If you want to
-  customize this behaviour, you have to create your own implementation of the
-  <<<PreparerFactory>>> interface.
-
-  For example, the {{{./tutorial/integration/frameworks.html}Struts 1 - Apache Tiles\u0099 integration}}
-  defines a <<<PreparerFactory>>> that can use a URL as a preparer.
-
-** Custom {PatternDefinitionResolver}
-
-  The default implementation is {{{./apidocs/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolver.html}BasicPatternDefinitionResolver}},
-  that implements the <wildcard> syntax.
-  
-  <<<CompleteAutoloadTilesContainerFactory>>> defines a <<<PrefixedPatternDefinitionResolver>>> to enable the use of 
-  both the <wildcard> syntax and the <regexp> syntax, with appropriate prefixes.
-
-* Registering {Renderers}
-
-  Custom {{{/tiles-request/apidocs/org/apache/tiles/request/render/Renderer.html}Renderers}} can be registered by overriding the methods
-  <<<registerAttributeRenderers>>> and <<<createDefaultAttributeRenderer>>>.
-  
-  <<<BasicTilesContainerFactory>>> registers 3 renderers: <<<string>>>, <<<template>>>, and <<<definition>>>, in order to
-  render plain strings, JSPs and tiles definitions.
-  
-  <<<CompleteAutoloadTilesContainerFactory>>> registers 5 renderers: <<<string>>>, <<<template>>>, <<<freemarker>>>, 
-  <<<velocity>>> and <<<definition>>>, in order to render plain strings, JSPs, freemarker and velocity templates 
-  and tiles definitions.
-
-* Changing the {definition files}
-
-  The default implementation <<<BasicTilesContainerFactory>>> loads the file named <<</WEB-INF/tiles.xml>>>.
-
-  <<<CompleteAutoloadTilesContainerFactory>>> loads all files named <<</WEB-INF/tiles*.xml>>> in the web application, or <<</META-INF/tiles*.xml>>> on the classpath.
-
-  Those file names can be changed by overriding the method <<<getSources>>>:
-
------------
-protected List<ApplicationResource> getSources(ApplicationContext applicationContext) {
-    return applicationContext.getResources("/WEB-INF/my-tiles-definitions-file.xml");
-}
------------
-
-  Please note that when using <<<CompleteAutoloadTilesContainerFactory>>>,
-  the <<<ApplicationContext>>> loads the resources via spring, and supports 
-  {{{http://static.springsource.org/spring/docs/2.5.x/reference/resources.html#resources-resource-strings}the spring syntax}} for locating resources.
-
diff --git a/TILES_3_0_X/src/site/apt/dev/release.apt b/TILES_3_0_X/src/site/apt/dev/release.apt
deleted file mode 100644
index d99e3be..0000000
--- a/TILES_3_0_X/src/site/apt/dev/release.apt
+++ /dev/null
@@ -1,334 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Release Process
-         -----------
-
-Tiles Release Process
-
-  Here you will find the steps to create releases for Tiles.
-
-Prerequisites
-
-  To create a release you have to install:
-
-  * {{{http://java.sun.com/javase/6}Java 6.0}}. If you are using a newer
-  version of Java, it is suggested to <<change JAVA_HOME environment variable>>
-  when calling Maven, so it points to an instance of Java 6.0;
-
-  * {{{http://maven.apache.org/}Maven 2.2 or 3}};
-
-  * {{{http://www.gnupg.org/}GnuPG}};
-
-  * {{{http://www.openssh.com/}OpenSSH}};
-
-  * {{{http://www.graphviz.org/}GraphViz}};
-
-One-time operations
-
-  These operations need to be performed only one time.
-
-* Create and publish your GPG key
-
-  To create a GPG key, follow the
-  {{{http://www.apache.org/dev/openpgp.html}guidelines}}.
-  Include it in:
-
--------------------------------------
-https://svn.apache.org/repos/asf/tiles/site/KEYS
--------------------------------------
-
-  Publish your GPG key in a PGP key server, such as
-  {{{http://pgp.mit.edu/} MIT Keyserver}}.
-
-* Create and upload yout SSH key
-
-  * Generate your SSH key (in this case we will use DSA encryption):
-
----------------------------------
-ssh-keygen -t rsa
----------------------------------
-
-  * Copy your public key to the server:
-
---------------------------------------
-scp ~/.ssh/id_rsa.pub user@people.apache.org:.ssh/authorized_keys
---------------------------------------
-
-  * Try to login:
-
----------------------------------
-ssh user@people.apache.org
----------------------------------
-
-  If it does not ask you a password, everything is ok.
-
-* Modify <<<settings.xml>>>
-
-  Your <<<settings.xml>>> must be modified to allow deployment.
-
-  This is the minimal configuration, obviously if you already have a <<<settings.xml>>> file,
-  you must edit it:
-
----------------------------
-<settings xmlns="http://maven.apache.org/POM/4.0.0"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
-    <servers>
-        <server>
-            <id>apache-site</id>
-            <username>YOUR_APACHE_USERNAME</username>
-            <filePermissions>664</filePermissions>
-            <directoryPermissions>775</directoryPermissions>
-        </server>
-        <server>
-            <id>apache.snapshots.https</id>
-            <username>YOUR_APACHE_USERNAME</username>
-            <password>YOUR_APACHE_PASSWORD</password>
-        </server>
-        <server>
-            <id>apache.releases.https</id>
-            <username>YOUR_APACHE_USERNAME</username>
-            <password>YOUR_APACHE_PASSWORD</password>
-        </server>
-    </servers>
-    <profiles>
-        <profile>
-            <id>release</id>
-            <properties>
-                <gpg.passphrase>YOUR_SECRET_PHRASE</gpg.passphrase>
-            </properties>
-            </profile>
-        </profile>
-    </profiles>
-</settings>
----------------------------
-
-Repeatable operations
-
-  These steps must be performed <<for each>> release.
-
-* Prepare the release tag
-
-  To prepare the release Subversion tag, check out the branch/trunk from where
-  you are preparing the release and type:
-
------------------------------------
-mvn release:prepare -Dusername=YOUR_SVN_USER -Dpassword=YOUR_SVN_PASSWORD
------------------------------------
-
-  The plugin interactively will ask you the version to release, the Subversion
-  tag to use and the next snapshot version. It is recommended to use the tag:
-  <<tiles-X.X.X>>.
-  
-  See also {{{http://www.apache.org/dev/publishing-maven-artifacts.html}the recommendations of the ASF}}.
-
-* Perform the Release
-
-  To perform the release, i.e. creating and deploying Maven artifacts, use:
-
------------------------------------
-mvn release:perform
------------------------------------
-  
-  It should compile and test everything, build and upload the artifacts and the website for the project. 
-
-* Close the staging repository
-
-  Login to {{{https://repository.apache.org} Nexus repository}} using your Apache LDAP credentials.
-  Click on "Staging". Then click on "tiles" in the list of repositories.
-  In the panel below you should see an open repository that is linked to your username and ip.
-  Right click on this repository and select "Close".
-  This will close the repository from future deployments and make it available for others to view.
-  If you are staging multiple releases together, skip this step until you have staged everything.
-  Enter the name and version of the artifact being released in the "Description" field and then click "Close".
-  This will make it easier to identify it later.
-
-* Verify the staged artifacts
-
-  If you click on your repository, a tree view will appear below.
-  You can then browse the contents to ensure the artifacts are as you expect them.
-  Pay particular attention to the existence of *.asc (signature) files.
-  If the you don't like the content of the repository, right click your repository and choose "Drop".
-  You can then rollback your release and repeat the process.
-
-  Note the repository URL, you will need this in your vote email.
-
-* Verify the uploaded assemblies
-
-  * go to the destination directory on people.apache.org (cd /www/people.apache.org/builds/tiles/${version}).
-  
-  * check the presence of the 3 distributions (bin, doc and src), and their signature files (*.asc, *.md5, *sha1). 
-
-* Release the JIRA version
-
-  * In JIRA go to the version that you want to release and release it.
-
-  * Create a new version, if it has not been done before.
-
-  * Create the release notes and <<write down the link>> that it uses.
-
-* Send announcement for the test build
-
-  In <<developers mailing list>> send an announcement for the test build:
-
------------------------------------
-Subject: [ANNOUNCE] Tiles ${version} test build available
-
-The test build of Tiles ${version} is available.
-
-
-No determination as to the quality ('alpha,' 'beta,' or 'GA') of Tiles
-${version} has been made, and at this time it is simply a "test build". We
-welcome any comments you may have, and will take all feedback into
-account if a quality vote is called for this build.
-
-Release notes:
-
-* ${jira.release.notes}
-
-Distribution:
-
- * http://people.apache.org/builds/tiles/${version}/
-
-Maven 2 staging repository:
-
- * https://repository.apache.org/content/repositories/tiles-[YOUR REPOSITORY ID]/
-
-A vote regarding the quality of this test build will be initiated
-within the next couple of days.
------------------------------------
-
-* Call for a vote
-
-  A few days after the test build announcement, call for a vote in
-  <<developers mailing list>>.
-
------------------------------------
-Subject: [VOTE] ${version} Release Quality
-
-The Tiles ${version} test build has been available since ${testBuildDate}.
-
-Release notes:
-
-* ${jira.release.notes}
-
-Distribution:
-
- * http://people.apache.org/builds/tiles/${version}/
-
-Maven 2 staging repository:
-
- * https://repository.apache.org/content/repositories/tiles-[YOUR REPOSITORY ID]/
-
-If you have had a chance to review the test build, please respond with
-a vote on its quality:
-
- [ ] Leave at test build
- [ ] Alpha
- [ ] Beta
- [ ] General Availability (GA)
-
-
-Everyone who has tested the build is invited to vote. Votes by PMC
-members are considered binding. A vote passes if there are at least
-three binding +1s and more +1s than -1s.
------------------------------------
-
-* Post-vote operations
-
-  After a vote is finished, and it has been decided that is
-  <<at least of alpha quality>>, there is the need of a post-vote process.
-
-** Promote staged artifacts
-
-  Once the release is deemed fit for public consumption it can be transfered to a production repository where it will be available to all users.
-
-  Login to {{{https://repository.apache.org}Nexus repository}} again.
-  Click on "Staging" and then on the repository with id "tiles-staging".
-  Find your closed staging repository, right click on it and choose "Promote".
-  Select the "Releases" repository and click "Promote".
-
-  Next click on "Repositories", select the "Releases" repository
-  and validate that your artifacts exist as you expect them.
-
-** Move assemblies
-
-  * Move assemblies to the Apache distribution mirrors:
-
--------------------------------------------
-ssh user@people.apache.org
-
-cd /www/people.apache.org/builds/tiles/${version}
-mkdir /www/www.apache.org/dist/tiles/v${version}/
-cp * /www/www.apache.org/dist/tiles/v${version}/
--------------------------------------------
-
-** Update the site
-
-  * Wait 24 hours to let the mirror sync to the release and then update the
-  site. In particular you have to update the index and the download pages:
-
-------------------------------------------------
-https://svn.apache.org/repos/asf/tiles/site/src/site/xdoc/index.xml
-https://svn.apache.org/repos/asf/tiles/site/src/site/apt/download.apt
-------------------------------------------------
-
-  Build and publish the site:
-
---------------------------------------
-mvn site
-mvn site:deploy
---------------------------------------
-
-** Send announcement
-
-  Finally, send an an announcement to the <<users>> and <<developers mailing
-  list>>:
-
---------------------------------------
-Subject: [ANNOUNCE] Tiles ${version} ${quality} released
-
-The Apache Tiles team is pleased to announce the release of Tiles ${version}
-${quality}.
-
-Tiles ${version} is available in a binary and a source distribution.
-
-http://tiles.apache.org/download.html
-
-It is also available in the central Maven repository under Group ID
-"org.apache.tiles".
-
-The 3.0.x series of the Apache Tiles framework has a minimum
-requirement of the following specification versions:
-
-* Java Servlet 2.5 and JavaServer Pages (JSP) 2.1
-* Java Standard Edition (Java SE) 1.6
-
-The release notes are available online at:
-
-* ${jira.release.notes}
-
-Please feel free to test the distribution and post your comments to
-the user list, or, if appropriate, file a ticket with JIRA.
---------------------------------------
-
-  <<You have finished!>>
diff --git a/TILES_3_0_X/src/site/apt/getting_started.apt b/TILES_3_0_X/src/site/apt/getting_started.apt
deleted file mode 100644
index b1fba86..0000000
--- a/TILES_3_0_X/src/site/apt/getting_started.apt
+++ /dev/null
@@ -1,84 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Getting started
-         -----------
-
-Requirements
-
-  To use Tiles in your application you need:
-
-  * a Java Runtime Environment following the <<Java SE 6.0>> specifications;
-  
-  * implementations for slf4j 1.5.8 (or above) and commons-logging 1.1 (or above);
-
-  * Optionally, depending on which options and templating engines you configure:
-
-    * a servlet container that supports <<Servlet 2.5>> (or above) and <<JSP
-  2.1>> (or above).
-  
-    * a portlet container that supports <<Portlet 2.0>> (or above).
-
-    * check {{{./dependency-management.html}Dependency management}} for a comprehensive list. 
-  
-Installation
-
-  Tiles 3.0 includes a large number of optional jar files and transitive dependencies. We 
-  recommend that you use maven or a compatible dependency manager to retrieve only the files 
-  you really need. 
-
-  If however you wish to install Tiles in your application by hand:
-
-  * {{{/download.html}download}} a distribution of Tiles;
-
-  * if you downloaded the binary distribution, unpack it;
-
-  * copy all the jar files into the classpath of your application (for instance
-  in the <<<WEB-INF/lib>>> directory of your web application). In a web environment, 
-  it is <<not recommended>> to put them in a location where they are shared
-  across the container;
-
-Usage
-
-  If you are using Tiles for the first time, read the
-  {{{./tutorial/index.html}Tutorial}}.
-
-  If you are migrating from Struts-Tiles, see the
-  {{{./migration/index.html}Migration guide}}.
-
-  If you're an advanced user, you may find the details you're looking for in 
-  the {{{./index.html}reference documentation}}.
-
-Examples
-
-  To see Tiles in action, there are two examples:
-
-  * The Tiles test web application, included in <<<examples>>> directory of the
-  binary distribution ({{{/download.html}download it}}).
-
-  * The Tiles showcase, that shows Tiles features and integration with other
-  technologies and frameworks (currently only Struts 1).
-
-  Currently it is still under development, and you can access it through its
-  subversion repository:
-
------------------------------
-http://svn.apache.org/repos/asf/tiles/examples/trunk/tiles-showcase/
------------------------------
diff --git a/TILES_3_0_X/src/site/apt/index.apt b/TILES_3_0_X/src/site/apt/index.apt
deleted file mode 100644
index 68323f7..0000000
--- a/TILES_3_0_X/src/site/apt/index.apt
+++ /dev/null
@@ -1,63 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Home
-         -----------
-
-Apache Tiles\u2122
-
-
-    <<{{{http://tiles.apache.org}Apache Tiles}}>> is a template composition
-    framework. Tiles was originally built to simplify the development of web 
-    application user interfaces, but it is no longer restricted to the JavaEE
-    web environment.
-
-    Tiles allows authors to define page fragments which can be assembled
-    into a complete page at runtime.  These fragments, or tiles, can be used
-    as simple includes in order to reduce the duplication of common page
-    elements or embedded within other tiles to develop a series of reusable
-    templates. These templates streamline the development of a consistent
-    look and feel across an entire application.
-
-    {{{/download.html}Download Tiles}}
-
-    {{{./security/index.html}Security bulletins}}
-
-* Documentation
-
-    * {{{./whats-new.html}<<What's new in Tiles 3.0>>}}
-
-    * {{{./tutorial/index.html}Tutorial}}
-
-    * {{{http://cwiki.apache.org/TILES/}Wiki}}
-
-    * Reference
-    
-        ** {{{./getting_started.html}Getting Started}} and installing Tiles
-    
-        ** {{{./config-reference.html}Configuration Reference}}
-
-        ** {{{./apidocs/index.html}Javadocs}}
-
-        ** {{{./tiles-jsp/tlddoc/index.html}Tag library documentation}}
-
-        ** {{{./tiles-core/dtddoc/index.html}Tiles definition file documentation}}
-
-    * {{{./migration/index.html}Migration}} from previous versions
diff --git a/TILES_3_0_X/src/site/apt/migration/apis.apt b/TILES_3_0_X/src/site/apt/migration/apis.apt
deleted file mode 100644
index e6572de..0000000
--- a/TILES_3_0_X/src/site/apt/migration/apis.apt
+++ /dev/null
@@ -1,61 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Java APIs considerations
-         -----------
-
-Introduction
-
-  In this part of the migration guide we address the differences of the APIs
-  in Struts Tiles and Apache Tiles\u0099.
-
-  If you are a Tiles extension developer and you want to convert your existing
-  extension, see {{{./extension.html}Tiles extensions}} migration guide.
-
-Controllers and View Preparers
-
-  In Apache Tiles\u0099, the concept of a Tiles <<<Controller>>>, i.e. an object that it is
-  invoked before rendering a definition, has been replaced with
-  <<<ViewPreparer>>>.
-
-  The classes that implement the <<<Controller>>> interface must now implement
-  the new <<<ViewPreparer>>> interface, or extend the <<<ViewPreparerSupport>>>
-  class.
-
-Tiles <<<ComponentContext>>>
-
-  The <<<ComponentContext>>>, i.e. the Tiles-specific context in which the
-  current attribute values are stored, has been renamed to
-  <<<AttributeContext>>>.
-
-  The method <<<getAttribute>>> returns an <<Attribute>>, and not an
-  <<Attribute Value>>, i.e. a simple object.
-
-   * Previous Migration Pages
-
-     ** {{{./index.html}Introduction }}
-
-     ** {{{./configuration.html}Tiles configuration files}}.
-
-     ** {{{./tags.html}Tiles JSP tags}}
-
-   * Next Migration Pages
-
-     ** {{{./extension.html}Tiles extensions}}.
diff --git a/TILES_3_0_X/src/site/apt/migration/configuration.apt b/TILES_3_0_X/src/site/apt/migration/configuration.apt
deleted file mode 100644
index 4ca41c4..0000000
--- a/TILES_3_0_X/src/site/apt/migration/configuration.apt
+++ /dev/null
@@ -1,160 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Migrating Tiles configuration files
-         -----------
-
-{Reusing old Tiles configuration files}
-
-  With Tiles 2.1 and 2.2 it is possible to use old Struts-Tiles definition files, since
-  1.1 version.
-
-  To use this feature it is needed to:
-
-  * include the <<<tiles-compat-xxx.jar>>> package in the classpath;
-
-  * configure the compatibility definitions reader instance, that is able to
-  read old definition files.
-
-* Configuration
-
-  Override the
-  {{{../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#createDefinitionsReader(java.lang.Object,%20org.apache.tiles.TilesApplicationContext,%20org.apache.tiles.context.TilesRequestContextFactory)}createDefinitionsReader}}
-  method this way:
-
----------------------------------------
-@Override
-protected DefinitionsReader createDefinitionsReader(Object context,
-        TilesApplicationContext applicationContext,
-        TilesRequestContextFactory contextFactory) {
-    return new CompatibilityDigesterDefinitionsReader();
-}
----------------------------------------
-
-  You need to add a renderer for the "page" attribute type, that is in fact the "template" type.
-  So override the
-  {{{../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#registerAttributeRenderers(org.apache.tiles.renderer.impl.BasicRendererFactory,%20java.lang.Object,%20org.apache.tiles.TilesApplicationContext,%20org.apache.tiles.context.TilesRequestContextFactory,%20org.apache.tiles.TilesContainer,%20org.apache.tiles.evaluator.AttributeEvaluator)}registerAttributeRenderers}}
-  method.
-
----------------------------------------
-@Override
-protected void registerAttributeRenderers(
-        BasicRendererFactory rendererFactory, Object context,
-        TilesApplicationContext applicationContext,
-        TilesRequestContextFactory contextFactory, TilesContainer container,
-        AttributeEvaluator evaluator) {
-    super.registerAttributeRenderers(rendererFactory, context,
-            applicationContext, contextFactory, container, evaluator);
-    TemplateAttributeRenderer templateRenderer = new TemplateAttributeRenderer();
-    templateRenderer.setApplicationContext(applicationContext);
-    templateRenderer.setRequestContextFactory(contextFactory);
-    templateRenderer.setEvaluator(evaluator);
-    rendererFactory.registerRenderer("page", templateRenderer);
-}
----------------------------------------
-
-  <<WARNING!!!>> Configuration with initialization parameter has been deprecated! If you
-  still want to use it, please refer to the
-  {{{../../2.1/framework/migration/configuration.html}2.1 version of this page}}.
-
-
-Tiles configuration files translation
-
-  A better, and more powerful, choice is to rewrite the definition files, to use
-  the new features of Tiles 2.1.
-
-  Most of XML elements and attributes can be translated one-to-one or
-  many-to-one without losing functionality from the 1.1-1.3 to the 2.1 DTD
-  version.
-
-* Header
-
-  The new header to be put in your Tiles definitions files is:
-
-------------------------------------------------------------
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-------------------------------------------------------------
-
-* Definitions attributes
-
-*---------------------------------+--------------------------------+
-| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>         |
-*---------------------------------+--------------------------------+
-| <<<\<component-definitions\>>>> | <<<\<tiles-definitions\>>>>    |
-| <<<\<tiles-definitions\>>>>     |                                |
-*---------------------------------+--------------------------------+
-| <<<page>>>                      | <<<template>>>                 |
-| <<<path>>>                      |                                |
-| <<<template>>>                  |                                |
-*---------------------------------+--------------------------------+
-| <<<controllerClass>>>           | <<<preparer>>> [1]             |
-| <<<controllerUrl>>>             |                                |
-*---------------------------------+--------------------------------+
-
-  * \[1\] The default behaviour of <<<preparer>>> is to create and use a
-  single instance of the specified class. Anyway it is still possible to use a
-  URL as a preparer under a Struts 1 environment by using the
-  {{{http://svn.apache.org/repos/asf/struts/struts1/trunk/tiles2/}Struts 1 - Apache Tiles\u0099}}
-  integration module, still under development.
-
-
-* Putting and adding attributes values
-
-  The <<<page>>> attribute type has been removed, use <<<template>>> instead.
-
-  The rest of the conversion is in the table below.
-
-*-----------------------+-----------------------------------------------+
-| <<Struts-Tiles>>      | <<Apache Tiles\u0099>>                        |
-*-----------------------+-----------------------------------------------+
-| <<<\<put\>>>>         | <<<\<put-attribute\>>>>                       |
-*-----------------------+-----------------------------------------------+
-| <<<\<putList\>>>>     | <<<\<put-list-attribute\>>>>                  |
-*-----------------------+-----------------------------------------------+
-| <<<\<add\>>>>         | <<<\<add-attribute\>>>>  [2]                  |
-|                       | <<<\<add-list-attribute\>>>>  [3]             |
-*-----------------------+-----------------------------------------------+
-| <<<content>>>         | <<<value>>>                                   |
-| <<<value>>>           |                                               |
-*-----------------------+-----------------------------------------------+
-| <<<direct="true">>>   | <<<type="string">>>                           |
-*-----------------------+-----------------------------------------------+
-
-  * \[2\] <<<\<add-attribute\>>>> is used when it is needed to add a single
-  attribute to a list attribute.
-
-  * \[3\] <<<\<add-list-attribute\>>>> is used when it is needed to a list
-  attribute as an element of another list attribute.
-
-  []
-
-   * Previous Migration Pages
-
-     ** {{{./index.html}Introduction }}
-
-   * Next Migration Pages
-
-     ** {{{./tags.html}Tiles JSP tags}}
-
-     ** {{{./apis.html}Java APIs considerations}}.
-
-     ** {{{./extension.html}Tiles extensions}}.
diff --git a/TILES_3_0_X/src/site/apt/migration/extension.apt b/TILES_3_0_X/src/site/apt/migration/extension.apt
deleted file mode 100644
index fa6a83e..0000000
--- a/TILES_3_0_X/src/site/apt/migration/extension.apt
+++ /dev/null
@@ -1,88 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles extensions migration
-         -----------
-
-Introduction
-
-  Tiles extensions is the part of Tiles where a major effort in refactoring is
-  needed.
-
-  The internal part of Tiles changed completely, not only in classes names, but
-  also in their behaviour.
-
-Writing definitions factories
-
-  Usually, Struts-Tiles extension writing meant writing a
-  <<<DefinitionsFactory>>> or a <<<FactorySet>>> implementation. Here you will
-  find how to convert your definitions factory to work correctly with Apache Tiles\u0099.
-
-* Requests management
-
-  Apache Tiles\u0099 is now technology-independent, that means that Apache Tiles\u0099 is no longer
-  bound to a Servlet environment. That means for you that all references to
-  <<<HttpServletRequest>>> and <<<HttpServletResponse>>> have been removed,
-  replacing them with <<<TilesRequestContext>>>
-
-* Definitions factory implementation
-
-  The most common way to implement a Definitions Factory is extending the
-  <<<UrlDefinitionsFactory>>> class, that contains code to load definitions,
-  resolve Locale-specific definitions, etc.
-
-  If you implemented <<<FactorySet>>>, here comes the bad news: it has been
-  <<removed>>! Getting a "key" to map different definitions factory was an
-  uncommon implementation detail. But it is easily reproducable, since you can
-  take the <<<TilesRequestContext>>> and calculate your "key". This key can be
-  used to map different <<<Definitions>>> instances, or to be given to an
-  instance of a class extending <<<Definitions>>>. Whatever you choose, it's
-  only a question of taste.
-
-Class and interfaces new names
-
-  The following is a conversion table between Struts-Tiles and Apache Tiles\u0099 class
-  names.
-
-*---------------------------------+---------------------------------+
-| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>          |
-*---------------------------------+---------------------------------+
-| <<<ComponentDefinition>>>       | <<<Definition>>>                |
-*---------------------------------+---------------------------------+
-| <<<XmlDefinitionsSet>>>         | <<<Definitions>>>               |
-*---------------------------------+---------------------------------+
-| <<<XmlAttribute>>>              | <<<Attribute>>>                 |
-*---------------------------------+---------------------------------+
-| <<<ComponentListAttribute>>>    | <<<ListAttribute>>>             |
-*---------------------------------+---------------------------------+
-| <<<I18nFactorySet>>>            | <<<UrlDefinitionsFactory>>>     |
-*---------------------------------+---------------------------------+
-| <<<XmlParser>>>                 | <<<DigesterDefinitionsReader>>> |
-*---------------------------------+---------------------------------+
-
-   * Previous Migration Pages
-
-     ** {{{./index.html}Introduction }}
-
-     ** {{{./configuration.html}Tiles configuration files}}.
-
-     ** {{{./tags.html}Tiles JSP tags}}
-
-     ** {{{./apis.html}Java APIs considerations}}.
diff --git a/TILES_3_0_X/src/site/apt/migration/index.apt b/TILES_3_0_X/src/site/apt/migration/index.apt
deleted file mode 100644
index 50ec114..0000000
--- a/TILES_3_0_X/src/site/apt/migration/index.apt
+++ /dev/null
@@ -1,57 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Migration from Struts-Tiles
-         -----------
-
-Migration from Struts-Tiles
-
-  This tutorial is intended to provide a help when migrating from the previous
-  version of Tiles, known as
-  <<{{{http://struts.apache.org/1.3.8/struts-tiles/index.html}Struts-Tiles}}>>.
-
-  To use Tiles you need to put in your web application library directory:
-
-  * <<<tiles-api.jar>>>: it contains the API to manipulate and render Tiles.
-
-  * <<<tiles-core.jar>>>: it contains the "engine" of Tiles, and the basic
-  implementation of the APIs.
-
-  * <<<tiles-servlet.jar>>>: it contains the servlet support in Tiles.
-
-  * <<<tiles-jsp.jar>>>: it contains the JSP support to Tiles, i.e. JSP specific
-  classes and the tag library.
-
-  * <<<tiles-compat.jar>>>: it contains the compatibility layer of Tiles to
-  support Struts-Tiles 1.x XML definition files.
-
-* Further steps
-
-   * {{{./configuration.html}Tiles configuration files}}: How to migrate Tiles
-   configuration files, the file usually named <<<tiles-defs.xml>>>.
-
-   * {{{./tags.html}Tiles JSP tags}}: How to migrate Tiles JSP tags, the
-   <<<\<tiles:...\>>>> tags.
-
-   * {{{./apis.html}Java APIs considerations}}: Some information and warnings on
-   the different behaviour of the Tiles Java API.
-
-   * {{{./extension.html}Tiles extensions}}: How to migrate Tiles
-   extensions, with explanation of main changes in the code structure.
diff --git a/TILES_3_0_X/src/site/apt/migration/tags.apt b/TILES_3_0_X/src/site/apt/migration/tags.apt
deleted file mode 100644
index 72a8915..0000000
--- a/TILES_3_0_X/src/site/apt/migration/tags.apt
+++ /dev/null
@@ -1,132 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Translation of JSP tags
-         -----------
-
-Introduction
-
-  Tiles JSP tag library changed a lot, to be clearer and simpler than it was
-  before. This means that you need to change ALL of your JSP pages accordingly.
-
-Tag library inclusion
-
-  To include Tiles tag library, write this row on top of your JSP files:
-
----------------------------------------------------------------------
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
----------------------------------------------------------------------
-
-Tags differences
-
-  Here is the toughest part: Apache Tiles\u0099 tags differ a lot comparing to Struts
-  Tiles. However, after the change you will notice that the JSP code will be
-  easier to understand.
-
-* The <<<\<tiles:insert\>>>> tag replacement
-
-  The <<<\<tiles:insert\>>>> of Struts-Tiles changed, in the sense that it has
-  been split in different parts and many attributes have been removed. The
-  changes are summarized in the table below.
-
-*---------------------------------+----------------------------------+
-| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>           |
-*---------------------------------+----------------------------------+
-| <<<\<tiles:insert\>>>>          | <<<\<tiles:insertTemplate\>>>>   |
-|                                 | <<<\<tiles:insertAttribute\>>>>  |
-|                                 | <<<\<tiles:insertDefinition\>>>> |
-*---------------------------------+----------------------------------+
-| <<<component="definition_name">>> | Use <<<\<tiles:insertDefinition name="definition_name"\>>>> |
-*---------------------------------+----------------------------------+
-| <<<attribute="attribute_name">>>  | Use <<<\<tiles:insertAttribute name="attribute_name"\>>>>   |
-*---------------------------------+----------------------------------+
-| <<<page>>>                      | <<<template>>>                   |
-| <<<template>>>                  |                                  |
-*---------------------------------+----------------------------------+
-| <<<beanName="bean_name">>>         | <<<value="$\{bean_scopeScope.bean_name.bean_property\}">>> |
-| <<<beanProperty="bean_property">>> |                                                            |
-| <<<beanScope="bean_scope">>>       |                                                            |
-*---------------------------------+----------------------------------+
-| <<<controllerClass>>>           | <<<preparer>>> [1]               |
-| <<<controllerUrl>>>             |                                  |
-*---------------------------------+----------------------------------+
-
-
-  * \[1\] The default behaviour of <<<preparer>>> is to create and use a
-  single instance of the specified class. Anyway it is still possible to use a
-  URL as a preparer under a Struts 1 environment by using the
-  {{{http://svn.apache.org/repos/asf/struts/struts1/trunk/tiles2/}Struts 1 - Apache Tiles\u0099}}
-  integration module, still under development.
-
-* Putting and adding attributes values
-
-  The <<<page>>> attribute type has been removed, use <<<template>>> instead.
-
-  The rest of the conversion is in the table below.
-
-*-------------------------+-----------------------------------------------+
-| <<Struts-Tiles>>        | <<Apache Tiles\u0099>>                        |
-*-------------------------+-----------------------------------------------+
-| <<<\<tiles:put\>>>>     | <<<\<tiles:putAttribute\>>>>                  |
-*-------------------------+-----------------------------------------------+
-| <<<\<tiles:putList\>>>> | <<<\<tiles:putAttributeList\>>>>              |
-*-------------------------+-----------------------------------------------+
-| <<<\<tiles:add\>>>>     | <<<\<tiles:addAttribute\>>>>  [2]             |
-|                         | <<<\<tiles:addListAttribute\>>>>  [3]         |
-*-------------------------+-----------------------------------------------+
-| <<<content>>>           | <<<value>>>                                   |
-| <<<value>>>             |                                               |
-*-------------------------+-----------------------------------------------+
-| <<<direct="true">>>     | <<<type="string">>>                           |
-*-------------------------+-----------------------------------------------+
-| <<<beanName="bean_name">>>         | <<<value="$\{bean_scopeScope.bean_name.bean_property\}">>> |
-| <<<beanProperty="bean_property">>> |                                                            |
-| <<<beanScope="bean_scope">>>       |                                                            |
-*---------------------------------+----------------------------------+
-
-  * \[2\] <<<\<tiles:addAttribute\>>>> is used when it is needed to add a single
-  attribute to a list attribute.
-
-  * \[3\] <<<\<tiles:addListAttribute\>>>> is used when it is needed to a list
-  attribute as an element of another list attribute.
-
-* Other changes
-
-*---------------------------------+--------------------------------------------+
-| <<Struts-Tiles>>                | <<Apache Tiles\u0099>>                     |
-*---------------------------------+--------------------------------------------+
-| <<<\<tiles:get\>>>>             | <<<\<tiles:insertAttribute\>>>>            |
-*---------------------------------+--------------------------------------------+
-| <<<\<tiles:definition scope="scope"\>>>> | Removed, definitions are created in request scope. |
-*---------------------------------+--------------------------------------------+
-| <<<\<tiles:initComponentDefinitions\>>>> | <<<\<tiles:initContainer\>>>>     |
-*---------------------------------+--------------------------------------------+
-
-   * Previous Migration Pages
-
-     ** {{{./index.html}Introduction }}
-
-     ** {{{./configuration.html}Tiles configuration files}}.
-
-   * Next Migration Pages
-
-     ** {{{./apis.html}Java APIs considerations}}.
-
-     ** {{{./extension.html}Tiles extensions}}.
diff --git a/TILES_3_0_X/src/site/apt/security/index.apt b/TILES_3_0_X/src/site/apt/security/index.apt
deleted file mode 100644
index 5de2994..0000000
--- a/TILES_3_0_X/src/site/apt/security/index.apt
+++ /dev/null
@@ -1,28 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Security bulletins
-         -----------
-
-Security bulletins
-
-  Here are collected all security bulletins about Tiles.
-
-  * {{{./security-bulletin-1.html}Security Bulletin 1}}.
diff --git a/TILES_3_0_X/src/site/apt/security/security-bulletin-1.apt b/TILES_3_0_X/src/site/apt/security/security-bulletin-1.apt
deleted file mode 100644
index 8d5d6a1..0000000
--- a/TILES_3_0_X/src/site/apt/security/security-bulletin-1.apt
+++ /dev/null
@@ -1,72 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Security bulletin 1
-         -----------
-
-Security bulletin 1
-
-* Summary
-
-  EL expressions in JSP using some Tiles JSP tags are evaluated twice.
-
-*-------------------------+-----------+
-| Who should read this    | All Tiles 2.1 developers |
-*-------------------------+-----------+
-| Impact of vulnerability | Remote server context exposure |
-*-------------------------+-----------+
-| Maximum security rating | High (read-only exposure) |
-*-------------------------+-----------+
-| Recommendation          | Developers should not install Tiles 2.1.1 under a production environment, |
-|                         | upgrade to Tiles 2.1.2 |
-*-------------------------+-----------+
-| Affected Software       | Tiles 2.1.0/2.1.1 (Tiles 2.0.x versions are safe) |
-*-------------------------+-----------+
-| Original JIRA Ticket    | {{{https://issues.apache.org/jira/browse/TILES-351}TILES-351}}       |
-*-------------------------+-----------+
-| Reporter                | Antonio Petrelli (Tiles PMC member) |
-*-------------------------+-----------+
-
-* Problem
-
-  Tiles 2.1.x allows, with the
-  {{{../tutorial/advanced/el-support.html}correct configuration}},
-  to use EL expressions in Tiles configuration files.
-  
-  The problem is that, if attribute values or templates are defined using
-  some JSP tags (tiles:putAttribute, tiles:insertTemplate), the EL expression
-  is evaluated twice, one by the container, one by the ELAttributeEvaluator
-  class.
-  
-  Now, if at the first evaluation the EL expression is connected to a
-  user-entered content, it could be maliciously exploited to access the
-  server context.
-  
-  Therefore, there could be an unwanted exposure of server data or XSS attacks.
-
-* Solution
-
-  The API and the core have been modified to separate the expression evaluation
-  from the attribute/template manipulation made by JSP tags in a safe way.
-
-  Since Tiles 2.1.1 is still in beta, the recommendation is not to install it
-  in a production environment. A release, in this case, is not necessary.
-  Experimenter can download the latest version of Tiles from the
-  {{{http://svn.apache.org/repos/asf/tiles/framework/trunk/}SVN repository}}.
diff --git a/TILES_3_0_X/src/site/apt/selenium.apt b/TILES_3_0_X/src/site/apt/selenium.apt
deleted file mode 100755
index 4be3bd5..0000000
--- a/TILES_3_0_X/src/site/apt/selenium.apt
+++ /dev/null
@@ -1,166 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Selenium Testing
-         -----------
-
-Selenium Testing
-
- <<{{{http://selenium.openqa.org}Selenium}}>> is a test tool for web
- applications. Unlike HtmlUnit or HttpUnit tests which <simulate> a browser,
- Selenium tests run directly in a real browser such as Firefox or Internet
- Explorer. The Selenium JavaScript code is deployed alongside your running
- application, and interacts with it just as your users do.
-
- Apache Tiles\u0099 uses Selenium for functional testing of the example apps.
- The following example apps include Selenium tests:
-
-  * Tiles Test
-
-* Install
-
- Selenium is available in OpenQA's Maven repository, so no installation is
- necessary.
-
- However, you may want to download the Selenium distribution (which includes
- the documentation) from
- {{{http://www.openqa.org/selenium-core/download.action}
- http://www.openqa.org/selenium-core/download.action}}.
-
- While you're there, also install the Firefox plugin <<Selenium IDE>> from
- {{{http://www.openqa.org/selenium-ide/}
- http://www.openqa.org/selenium-ide/}}.
-
-* Run Selenium tests the easy way
-
-  To run Selenium tests you need to add a configuration parameter in your <<<settings.xml>>> file.
-
-------------------------------
-<settings xmlns="http://maven.apache.org/POM/4.0.0"
-	  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
-                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
-...
-	<profiles>
-	...
-		<profile>
-			<id>run-selenium</id>
-			<properties>
-				<cargo.tomcat6x.home>/tomcat/installation/directory</cargo.tomcat6x.home>
-			</properties>
-    	</profile>
-    ...
-    </profiles>
-</settings>
-------------------------------
-
-  After that, if you have Firefox installed, you can launch Selenium tests in the command line:
-
-------------------------------
-mvn verity -Prun-selenium
-------------------------------
-
-* Package
-
- <<Package>> the webapp with the 'selenium' profile activated.
-
- The {{{http://svn.apache.org/viewvc/struts/sandbox/trunk/tiles/tiles-test/pom.xml
-?view=markup}tiles-test pom}} includes a 'selenium' profile that will
-
-  * unpack the Selenium jar under 'target'
-
-  * copy the 'core' directory from the unpacked Selenium jar into the
-  webapp
-
-  * copy any files in 'src/test/selenium' into the webapp
-
-  []
-
-+-----+
-mvn package -P selenium
-+-----+
-
-  The webapp will contain the following additional directories: 'selenium/core'
-  and 'selenium/tests'.
-
-* Deploy
-
-  <<Deploy>> the webapp to your favorite container. The Cargo plugin is
-  configured to make this easy:
-
-+-----+
-mvn package cargo:start -P selenium
-
-   or
-
-mvn package cargo:start -P selenium -Dcargo.tomcat5x.home=/path/to/tomcat5
-+-----+
-
-
-* Run
-
- <<Run>> the tests with the Selenium TestRunner.
-
- * Visit <<<http://localhost:8080/<appname>/selenium/core/TestRunner.html>>>
-
- * Click 'go' in the top left frame to load the TestSuite.html page
-
- * Click 'All' in the top right frame to run the tests
-
- []
-
- <<Run>> the tests <automatically>.
-
- * Check the 'Auto-run' box before clicking 'go' in the top left frame.
-
- []
-
- After it runs the tests automatically, Selenium can <<<POST>>> the results to
- a URL you supply.  If you accept the default, and nothing is there to process
- the request, you will see a 404 Not Found error page in the bottom frame.
-
-
-* Edit
-
-  <<Edit>> an existing test, or write a new one.
-
-  If you add a new test, remember to add it to src/test/selenium/TestSuite.html
-  so the TestRunner will find it.
-
-** Selenium IDE
-
-  The Selenium IDE Firefox plugin is the easiest way to edit tests. With the
-  example app running, open the HTML file (src/test/selenium/TestSomething.html)
-  from your svn checkout of Apache Tiles\u0099. Use the IDE to edit and run the test, and
-  save your changes.
-
-  <<Note>>: Your changes will not be visible to the TestRunner in the deployed
-  webapp unless you re-package and deploy it.
-
-** HTML Editor
-
-  Selenium tests are written in plain HTML tables, so you may edit them with any
-  text editor.
-
-  If you prefer to edit the tests 'in place' in the running webapp, simply copy
-  the files back to your svn checkout directory and commit the changes (or submit
-  a patch).
-
-
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/attribute-rendering.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/attribute-rendering.apt
deleted file mode 100644
index 97a5395..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/attribute-rendering.apt
+++ /dev/null
@@ -1,82 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Attribute rendering
-         -----------
-
-Attribute rendering
-
-  Attribute rendering behaviour can be customized. The "type"
-  of an attribute can be still <<<string>>>, <<<definition>>> or <<<template>>>
-  but you can define new types or use a class name directly.
-
-Default behaviour
-
-  The default behaviour of Tiles is compatible with Tiles 2.0 and it applies
-  both to XML definition files and JSP tags. Tiles follows these steps:
-
-  * If the type is not specified:
-
-  ** if the value is a valid definition name, the definition is rendered;
-
-  ** if the value starts with a '/', a template will be rendered;
-
-  ** otherwise, a string will be rendered.
-
-  * If the type is specified:
-
-  ** if the type is <<<string>>>, <<<definition>>> or <<<template>>>, it will
-  be rendered like in Tiles 2.0;
-
-  ** otherwise, Tiles tries to instantiate (only once) a class whose name is
-  specified in the "type" of the attribute. If an error occurs, it pops up as
-  a runtime exception.
-
-Customize attribute rendering
-
-  With Tiles 2.1+ you can customize rendering in three ways:
-
-  * specifying new renderers;
-
-  * overriding the default renderer for untyped attributes;
-
-  * specifying a new renderer factory.
-
-* Custom attribute renderers
-
-  If you don't want to use class names as attribute types, you can use new
-  "named" custom attribute renderers. You can do it by overriding the
-  {{{../../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#method_summary}registerAttributeRenderers}}
-  of <<<BasicTilesContainerFactory>>> if you are using Java-based configuration.
-
-* Custom default attribute renderer
-
-  The behaviour of Tiles when the type of an attribute is not specified can also be
-  customized. You can do it by overriding the
-  {{{../../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#method_summary}createDefaultAttributeRenderer}}
-  of <<<BasicTilesContainerFactory>>> if you are using Java-based configuration.
-
-* Custom attribute renderer factory
-
-  The attribute renderer factory can be completely customized, leaving to you
-  the maximum freedom of choice in the attribute renderer creation. You can
-  specify the factory's implementation by overriding the
-  {{{../../apidocs/org/apache/tiles/factory/BasicTilesContainerFactory.html#method_summary}createRendererFactory}}
-  of <<<BasicTilesContainerFactory>>> if you are using Java-based configuration.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/el-support.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/el-support.apt
deleted file mode 100644
index ec728de..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/el-support.apt
+++ /dev/null
@@ -1,98 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Expression Language (EL) support
-         -----------
-
-Expression Language support
-
-  With Tiles it is possible to use expression languages not only in JSP pages, but also in XML
-  definition files.
-
-  Currently supported languages are Unified EL (as in javax.el), i.e. the language used in JSP code,
-  {{{http://mvel.codehaus.org/}MVEL}} and {{{http://commons.apache.org/ognl/}OGNL}}.
-
-* Configuration
-
-  By default, Tiles does not use an expression language, attribute values are simply used as they are.
-  
-  <<<CompleteAutoloadTilesContainerFactory>>> enables support of Unified EL, MVEL and OGNL as follows:
-  
-  - an attribute expression starting with "MVEL:" or "OGNL:" is interpreted in one of those languages.
-  - otherwise, the parts of the expression between the braces in <<<$\{...\}>>> are interpreted in Unified EL.  
-
-* Unified EL support
-
-  The EL language is supported since Tiles 2.1.
-
-  Let's use this example:
-
-------------------------------------
-  <definition name="test.composite.el.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="${requestScope.body}"/>
-  </definition>
-------------------------------------
-
-  Before rendering the definition:
-
-  * The template name will be taken from the "layout" attribute, searched in every scope.
-
-  * The body will be taken from the "body" attribute in request scope.
-
-* {MVEL Support}
-
-  Let's use this example:
-
-------------------------------------
-  <definition name="test.composite.mvel.definition" templateExpression="MVEL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="MVEL:requestScope.body"/>
-  </definition>
-------------------------------------
-
-  Before rendering the definition:
-
-  * The template name will be taken from the "layout" attribute, searched in every scope.
-
-  * The body will be taken from the "body" attribute in request scope.
-
-* {OGNL Support}
-
-  Let's use this example:
-
-------------------------------------
-  <definition name="test.composite.mvel.definition" templateExpression="OGNL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="OGNL:requestScope.body"/>
-  </definition>
-------------------------------------
-
-  Before rendering the definition:
-
-  * The template name will be taken from the "layout" attribute, searched in every scope.
-
-  * The body will be taken from the "body" attribute in request scope.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/index.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/index.apt
deleted file mode 100644
index 2f98cbe..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/index.apt
+++ /dev/null
@@ -1,50 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Advanced Topics
-         -----------
-
-Tiles Advanced Topics
-
-  In this section, advanced usage of Tiles is discussed. These topics let you
-  do more complicated tasks, like composing pages one inside another, localize
-  your pages, etc.
-
-  [[1]] {{{./nesting-extending.html}Nesting and Extending Definitions}}
-
-  [[2]] {{{./list-attributes.html}List Attributes}}
-
-  [[3]] {{{./runtime.html}Runtime Composition}}
-
-  [[4]] {{{./preparer.html}View Preparers}}
-
-  [[5]] {{{./utils.html}Rendering Utilities}}
-
-  [[6]] {{{./l10n.html}Tiles Localization}}
-
-  [[7]] {{{./wildcard.html}Wildcard support}}
-
-  [[8]] {{{./el-support.html}EL support}}
-
-  [[9]] {{{./attribute-rendering.html}Attribute rendering}}
-
-  [[10]] {{{./multiple-containers.html}Using multiple containers}}
-
-  [[11]] {{{./security.html}Security}}
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/l10n.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/l10n.apt
deleted file mode 100644
index 80db80b..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/l10n.apt
+++ /dev/null
@@ -1,135 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Localization
-         -----------
-
-Localization support
-
-  Customizing pages for different locales in a common practice: in real-world
-  websites you can see different sites for different languages and countries.
-
-  It can be a matter of changing the layout (for example, in Arab countries the
-  menu should stay on the right, instead of the left), or providing alternate
-  content.
-
-* Creating localized definitions
-
-  Localization is immediately available. To use the benefits of localization you
-  have to create different Tiles definition files for each locale you want to
-  support: it's simply a matter of appending the locale code at the end of the
-  file name (just like <<<.properties>>> files in resource bundles).
-
-  For example, if you have the <<<tiles.xml>>> file and you want to support
-  French and Italian locale, you have to create at least three files:
-
---------------------------------
-tiles.xml
-tiles_fr.xml
-tiles_it.xml
---------------------------------
-
-  You can also distinguish between different languages in different country. So
-  if you want to distinguish between British English and American English, you
-  can create these files:
-
---------------------------------
-tiles_en_GB.xml
-tiles_en_US.xml
---------------------------------
-
-  and so on.
-
-* Inheritance between localizations
-
-  If you want to support different locales, you don't have to rewrite all the
-  definitions, but only those that differ from the main definitions file. In
-  other words, locale-specific definition files contains the "overrides" to the
-  default definitions.
-
-  For example, suppose that the following definition is declared in
-  <<<tiles.xml>>>:
-
-------------------------------------
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="title" value="Tiles tutorial homepage" />
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body" value="myapp.homepage.body" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-
-<definition name="myapp.homepage.body" template="/layouts/three_rows.jsp">
-  <put-attribute name="one" value="/tiles/headlines.jsp" />
-  <put-attribute name="two" value="/tiles/topics.jsp" />
-  <put-attribute name="one" value="/tiles/comments.jsp" />
-</definition>
-------------------------------------
-
-  In <<<tiles_it.xml>>> there is a new declaration of <<<myapp.homepage>>>
-  definition:
-
-------------------------------------
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="title" value="Pagina iniziale del tutorial di Tiles" />
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body" value="myapp.homepage.body" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-------------------------------------
-
-  Using "it" locale, the title will be different from the default, while the
-  rest remains the same.
-  
-  Notice that the <<<myapp.homepage.body>>> definition is the one defined in
-  the default definitions file: you still can reference to the default
-  definitions, both when composing and when extending.
-  
-  You can also override a <<definition that is extended>>. In this case, when
-  resolving inheritance, the overridden definition will be taken as a basis.
-  For example, if in <<<tiles.xml>>> there are the following definitions:
-
-------------------------------------
-<definition name="myapp.page.common" template="/layouts/classic.jsp">
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-
-<definition name="myapp.bugs" extends="myapp.page.common">
-  <put-attribute name="title" value="Bugs" />
-  <put-attribute name="body" value="myapp.homepage.body" />
-</definition>
-------------------------------------
-
-  If in <<<tiles_it.xml>>> you define the following definition:
-
-------------------------------------
-<definition name="myapp.page.common" template="/layouts/classic.jsp">
-  <put-attribute name="header" value="/tiles/banner_it.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu_it.jsp" />
-  <put-attribute name="footer" value="/tiles/credits_it.jsp" />
-</definition>
-------------------------------------
-
-  The <<<myapp.bugs>>> will extend the latter definition, and not the default!
-  This is useful if you want to change an abstract definition for a locale,
-  without redefining all the definitions.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/list-attributes.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/list-attributes.apt
deleted file mode 100644
index 588d8b8..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/list-attributes.apt
+++ /dev/null
@@ -1,96 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         List Attributes
-         -----------
-
-List Attributes
-
-  Up to now we have seen simple attributes, i.e. attributes that have a simple
-  value: a template, a string or a definition. But there are cases where you
-  need a <collection> of values, for example a list of definitions to be
-  redendered one below the other.
-
-* Simple usage
-
-  To include a list attribute you can use the <<<\<put-list-attribute\>>>> tag
-  in your Tiles definitions file:
-
----------------------------------------
-<definition name="myapp.homepage.body" template="/layouts/variable_rows.jsp">
-  <put-list-attribute name="items">
-    <add-attribute value="/tiles/banner.jsp" />
-    <add-attribute value="/tiles/common_menu.jsp" />
-    <add-attribute value="/tiles/credits.jsp" />
-  </put-list-attribute>
-</definition>
----------------------------------------
-
-  In your template page, you can read the list attribute iterating over its
-  elements:
-
----------------------------------------
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
-<tiles:useAttribute id="list" name="items" classname="java.util.List" />
-<c:forEach var="item" items="${list}">
-  <tiles:insertAttribute value="${item}" flush="true" />
-  <br/>
-</c:forEach>
----------------------------------------
-
-  The list attribute is first converted into a scripting variable; after that
-  it is iterated using the <<<\<c:forEach\>>>> tag. The compound attributes are
-  then rendered one after the other.
-
-* {List attribute inheritance}
-
-  When you extend a definition that contains a list attribute, you can
-  "inherit" its elements. For example:
-
----------------------------------------
-<definition name="myapp.homepage.body" template="/layouts/variable_rows.jsp">
-  <put-list-attribute name="items">
-    <add-attribute value="/tiles/banner.jsp" />
-    <add-attribute value="/tiles/common_menu.jsp" />
-    <add-attribute value="/tiles/credits.jsp" />
-  </put-list-attribute>
-</definition>
-
-<definition name="myapp.homepage.body.extended" extends="myapp.homepage.body">
-  <put-list-attribute name="items" inherit="true">
-    <add-attribute value="/tiles/greetings.jsp" />
-  </put-list-attribute>
-</definition>
----------------------------------------
-
-  In this case, the <<<myapp.homepage.body.extended>>> has the <<<items>>>
-  attribute that inherits the content of the <<<items>>> attribute of its
-  parent definition. In other words, the <<<items>>> attribute will container
-  the following elements:
-
-  * /tiles/banner.jsp
-
-  * /tiles/common_menu.jsp
-
-  * /tiles/credits.jsp
-
-  * /tiles/greetings.jsp
- 
\ No newline at end of file
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/multiple-containers.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/multiple-containers.apt
deleted file mode 100644
index 84b93aa..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/multiple-containers.apt
+++ /dev/null
@@ -1,86 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Using multiple containers
-         -----------
-
-Defining multiple containers
-
-  It is possible to use more that one Tiles container in your application.
-
-* Configuration
-
-  To use an alternate container, you need to override the
-  {{{../../apidocs/org/apache/tiles/startup/AbstractTilesInitializer.html#method_summary}getContainerKey}}
-  method of <<<AbstractTilesInitializer>>> this way:
-
-------------------------------------
-public class TestAlternateTilesListener extends AbstractTilesListener {
-
-    /** {@inheritDoc} */
-    @Override
-    protected TilesInitializer createTilesInitializer() {
-        return new TestAlternateTilesInitializer();
-    }
-
-    /**
-     * Test Tiles initializer for Tiles initialization of the alternate container.
-     */
-    private static class TestAlternateTilesInitializer extends AbstractTilesInitializer {
-
-        // Other customizations go here.
-
-        /** {@inheritDoc} */
-        @Override
-        protected String getContainerKey(
-                TilesApplicationContext applicationContext) {
-            return "myContainerKey";
-        }
-    }
-}
-------------------------------------
-
-Selecting one non-default container
-
-  Once defined, it is possible to select a non-default container through Java
-  or JSP
-
-* Selection through Java
-
-  It is possible to use, for the current request, a different container
-  stored under another key, by using
-  {{{../../apidocs/org/apache/tiles/access/TilesAccess.html#method_summary}<<<setCurrentContainer>>>}}
-  method of TilesAccess class. For example:
-
-------------------------------------
-TilesAccess.setCurrentContainer(request, applicationContext, "myContainerKey");
-------------------------------------
-
-  If the last parameter is <<<null>>>, the default container is selected.
-
-* Selection through JSP
-
-  The current container can be selected also through the use of JSP:
-
-------------------------------------
-<tiles:setCurrentContainer containerKey="myContainerKey" />
-------------------------------------
-
-  If the <<<containerKey>>> attribute is not present, the default container is selected.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/nesting-extending.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/nesting-extending.apt
deleted file mode 100644
index 5f91da2..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/nesting-extending.apt
+++ /dev/null
@@ -1,168 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Nesting and Extending Definitions
-         -----------
-
-Nesting Definitions
-
-  Sometimes it is useful to have a structured page with, say, a structured body.
-  Tipically, there is a main layout (for example, the "classic" layout) and the
-  body is made of certain number of sections. In this case, nesting a definition
-  (the one for the body) inside another definition (the main layout) can be
-  useful.
-
-* {Named subdefinitions}
-
-  Tiles supports nesting definitions natively. One way of usng nested definitions
-  is creating a named "subdefinition" and using it as an attribute. For example:
-
-------------------------------------
-<definition name="myapp.homepage.body" template="/layouts/three_rows.jsp">
-  <put-attribute name="one" value="/tiles/headlines.jsp" />
-  <put-attribute name="two" value="/tiles/topics.jsp" />
-  <put-attribute name="one" value="/tiles/comments.jsp" />
-</definition>
-
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="title" value="Tiles tutorial homepage" />
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body" value="myapp.homepage.body" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-------------------------------------
-
-  The <<<myapp.homepage.body>>> definition will be put inside the
-  <<<myapp.homepage>>>, by putting it inside its <<<body>>> attribute. You will
-  be seeing the definition one inside the other.
-
-* {Anonymous nested definitions}
-
-  What you can do with named subdefinitions can be done with nested anonymous
-  definitions. The above example can be rewritten in:
-  
-------------------------------------
-<definition name="myapp.homepage.body" template="/layouts/three_rows.jsp">
-  <put-attribute name="one" value="/tiles/headlines.jsp" />
-  <put-attribute name="two" value="/tiles/topics.jsp" />
-  <put-attribute name="one" value="/tiles/comments.jsp" />
-</definition>
-
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="title" value="Tiles tutorial homepage" />
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body">
-    <definition template="/layouts/three_rows.jsp">
-      <put-attribute name="one" value="/tiles/headlines.jsp" />
-      <put-attribute name="two" value="/tiles/topics.jsp" />
-      <put-attribute name="one" value="/tiles/comments.jsp" />
-    </definition>
-  </put-attribute>
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-------------------------------------
-
-  The anonymous definition put under the "body" attribute can be used only by
-  the surrounding definition. Moreover, you can nest a definition into a nested
-  definition, with the desired level of depth.
-
-* {Cascaded attributes}
-
-  Attributes defined into a definition can be cascaded to be available to all
-  nested definitions and templates. For example the
-  {{{./nesting-extending.html#Named_subdefinitions}sample definition}} detailed above can be rewritten
-  this way:
-
-------------------------------------
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="title" value="Tiles tutorial homepage" />
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body" value="/layouts/three_rows.jsp" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-
-  <put-attribute name="one" value="/tiles/headlines.jsp" cascade="true" />
-  <put-attribute name="two" value="/tiles/topics.jsp" cascade="true" />
-  <put-attribute name="one" value="/tiles/comments.jsp" cascade="true" />
-</definition>
-------------------------------------
-
-  The template of <<<myapp.homepage.body>>> definitionhas been used as the
-  <<<body>>> attribute in the <<<myapp.homepage>>> definition. All of the
-  attributes of <<<myapp.homepage.body>>> has been then moved as attributes
-  of <<<myapp.homepage>>> definition, but with the addition of the "cascade"
-  flag.
-
-Extending Definitions
-
-  You can extend definitions like a Java class. The concepts of <abstract
-  definition>, <extension> and <override> are available.
-  
-  * <<Abstract definition>>: it is a definition in which the template attributes
-  are not completely filled. They are useful to create a base page and a number
-  of extending definitions, reusing already created layout. For example:
-
-------------------------------------
-<definition name="myapp.page.common" template="/layouts/classic.jsp">
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-------------------------------------
-
-  * <<Definition extension>>: a definition can inherit from another definition,
-  to reuse an already made (abstract or not) definition:
-
-------------------------------------
-<definition name="myapp.homepage" extends="myapp.page.common">
-  <put-attribute name="title" value="Tiles tutorial homepage" />
-  <put-attribute name="body" value="myapp.homepage.body" />
-</definition>
-------------------------------------
-
-  In this case, the <<<header>>>, <<<menu>>> and <<<footer>>> are inherited from
-  the <<<myapp.page.common>>> definition, while the rest is defined inside the
-  "concrete" definition.
-
-  * <<Template and attribute override>>: when extending a definition, its
-  template and attributes can be overridden.
-  
-    ** Overriding a template:
-    
-------------------------------------
-<definition name="myapp.homepage.alternate" extends="myapp.homepage"
-    template="/layouts/alternate.jsp" />
-------------------------------------
-
-    The definition has the same attributes, but its template changed. The result
-    is that the content is the same, but the layout is different.
-    
-    ** Overriding attributes:
-
-------------------------------------
-<definition name="myapp.homepage.customer" extends="myapp.homepage">
-  <put-attribute name="menu" value="/tiles/common_menu_for_customers.jsp" />
-</definition>
-------------------------------------
-    
-    In this case, the page will have the same appearance as the
-    <<<myapp.homepage>>> definition, but its menu subpage is different.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/preparer.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/preparer.apt
deleted file mode 100644
index 0cdf30a..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/preparer.apt
+++ /dev/null
@@ -1,70 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles View Preparers
-         -----------
-
-View Preparers
-
-  Sometimes a definition, before it is rendered, needs to be "prepared". For
-  example when showing a menu, the menu structure must be created and stored
-  in the request scope.
-
-  For this reason, a <<View Preparer>> can be used: it is called <<before>> the
-  definition is rendered, so all the things needed to render correctly the
-  definition can be prepared.
-
-* Creating a view preparer
-
-  A View Preparer is simply a class that implement the <<<ViewPreparer>>>
-  interface. The <<<execute>>> method allows to execute code <<before>> a
-  definition is rendered. You can extend the <<<ViewPreparerSupport>>> class to
-  avoid compiling problems in the case the <<<ViewPreparer>>> interface changes.
-
-----------------------------------------------
-package my.package;
-
-import org.apache.tiles.preparer.PreparerException;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Attribute;
-
-public class TestViewPreparer implements ViewPreparer {
-
-    public void execute(Request tilesRequest, AttributeContext attributeContext)
-    throws PreparerException {
-        attributeContext.putAttribute(
-            "body",
-            new Attribute("This is the value added by the ViewPreparer"));
-    }
-}
-----------------------------------------------
-
-* Associating a preparer
-
-  To associate a preparer to a definition, put its complete path name to the
-  <<<preparer>>> attribute of the <<<\<definition\>>>> element:
-
-----------------------------------------------
-<definition name="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer">
-  <put-attribute name="foo" value="/bar/foo.jsp" />
-</definition>
-----------------------------------------------
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/runtime.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/runtime.apt
deleted file mode 100644
index 4ab8258..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/runtime.apt
+++ /dev/null
@@ -1,127 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Runtime Composition
-         -----------
-
-Tiles Runtime Composition
-
-  Tiles allows to create statically-determined page structures, like we've seen
-  in {{{../basic/pages.html}Creating Pages}}. But Tiles allows to fill
-  templates, modify definitions and create new definitions during the execution.
-
-Runtime Composition in JSP pages
-
-  Making runtime changes in JSP pages is pretty simple. You can use special JSP
-  tags that allow to create page structures on-the-fly.
-
-* Inserting templates
-
-  You can insert a template directly inside a JSP page, filling its attributes
-  at runtime. To do it, you can use the <<<\<tiles:insertTemplate\>>>> tag. The
-  attributes can be put using <<<\<tiles:putAttribute\>>>> and related tags.
-
-  Notice that you have all the features present in XML definition files, such as
-  {{{./nesting-extending.html#Anonymous_nested_definitions}anonymous nested definitions}}
-  and {{{./nesting-extending.html#Cascaded_attributes}cascade attributes}}.
-
------------------------------------
-<tiles:insertTemplate template="/layouts/classic.jsp">
-  <tiles:putAttribute name="title" value="Tiles tutorial homepage" />
-  <tiles:putAttribute name="header" value="/tiles/banner.jsp" />
-  <tiles:putAttribute name="menu" value="/tiles/common_menu.jsp" />
-  <tiles:putAttribute name="body">
-    <tiles:insertTemplate template="/layouts/variable_rows.jsp">
-      <tiles:putListAttribute name="items">
-        <tiles:addAttribute value="/tiles/banner.jsp" />
-        <tiles:addAttribute value="/tiles/common_menu.jsp" />
-        <tiles:addAttribute value="/tiles/credits.jsp" />
-      </tiles:putListAttribute>
-    </tiles:insertTemplate>
-  </tiles:putAttribute
-  <tiles:putAttribute name="footer" value="/tiles/credits.jsp" />
-</tiles:insertTemplate>
------------------------------------
-
-* {Inserting modified definitions}
-
-  Definitions can be inserted not only just as they are, but also overriding
-  their attributes and their template at runtime:
-
-------------------------------------
-<tiles:insertDefinition name="myapp.homepage.customer" template="/layouts/alternative_layout.jsp">
-  <tiles:putAttribute name="menu" value="/tiles/common_menu_for_customers.jsp" />
-</tiles:insertDefinition>
-------------------------------------
-
-* Creating Definitions
-
-  To create definitions at runtime, first of all you need to configure your
-  Tiles-based application to use a
-  {{{../../config-reference.html#Feature-Complete_configuration}mutable container}}.
-
-  In your JSP page, now you can create definitions. This definition will be
-  available during the request, and then it will expire.
-
------------------------------------------
-<tiles:definition name="myapp.homepage.customer" extends="myapp.homepage">
-  <tiles:putAttribute name="menu" value="/tiles/common_menu_for_customers.jsp" />
-</tiles:definition>
-<tiles:insertDefinition name="myapp.homepage.customer" />
------------------------------------------
-
-Runtime Composition using APIs
-
-  If you want to compose pages using the Tiles APIs, for example in a servlet
-  environment, you can use the <<container>> feature of Tiles. Essentially Tiles
-  is a container that stores definitions, allow to render pages and allows to
-  modify the configuration at runtime.
-
-* Using the Tiles container
-
-  To get the current container (in a servlet environment) you can use the
-  <<TilesAccess>> class:
-
--------------------------------------
-TilesContainer container = TilesAccess.getContainer(
-        request.getSession().getServletContext());
-Request tilesRequest = new ServletRequest(container.getApplicationContext(), request, response);
-container.render("myapp.homepage", tilesRequest);
--------------------------------------
-
-  <<Warning!>> The direct use of <<<AttributeContext>>> is deprecated. The same purpose can be
-  achieved easier and in a more maintainable way using {{{./el-support.html}Expression Languages}}
-
-* Creating Definitions
-
-  To create definitions at runtime, first of all you need to configure your
-  Tiles-based application to use a
-  {{{../../config-reference.html#Feature-Complete_configuration}mutable container}}.
-
-  This is a snippet to show how to create a definition.
-
--------------------------------------
-MutableTilesContainer container = TilesAccess.getContainer(
-        request.getSession().getServletContext());
-Definition definition = new Definition();
-definition.setTemplate("/layouts/my_layout.jsp");
-definition.putAttribute("body", new Attribute("/tiles/body.jsp");
-container.register(definition, request, response);
--------------------------------------
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/security.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/security.apt
deleted file mode 100644
index 0b610d6..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/security.apt
+++ /dev/null
@@ -1,91 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Security
-         -----------
-
-Security
-
-  Tiles allows the visibility of a template, an attribute or a definition only
-  to selected roles.
-
-* Allowing definitions
-
-  A definition can be allowed to be rendered only by selected roles:
-
-  * in XML definition files:
-
----------------------------------
-<definition name="test.definition"
-    template="/layout/my-template.jsp role="myrole">
-    ...
-</definition>
----------------------------------
-
-  * in JSP pages, when inserting definitions:
-
----------------------------------
-<tiles:insertDefinition name="test.definition" role="myrole" />
----------------------------------
-
-  * in JSP pages, when definining definitions:
-
----------------------------------
-<tiles:definition name="test.definition"
-    template="/layout/my-template.jsp" role="myrole">
-    ...
-</tiles:definition>
----------------------------------
-
-* Allowing attributes
-
-  An attribute can be allowed to be rendered only by selected roles:
-
-  * in XML definition files:
-
----------------------------------
-<definition name="test.definition"
-    template="/layout/my-template.jsp>
-  <put-attribute name="header" value="/header.jsp" role="myrole" />
-</definition>
----------------------------------
-
-  * in JSP pages, when inserting attributes:
-
----------------------------------
-<tiles:insertAttribute name="header" role="myrole" />
----------------------------------
-
-  * in JSP pages, when putting attributes:
-
----------------------------------
-<tiles:putAttribute name="header" value="/header.jsp" role="myrole" />
----------------------------------
-
-* Allowing templates
-
-  Templates can be allowed to be rendered only by selected rows in JSP pages:
-
----------------------------------
-<tiles:insertTemplate name="test.definition"
-    template="/layout/my-template.jsp" "role="myrole">
-    ...
-</tiles:insertTemplate>
----------------------------------
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/utils.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/utils.apt
deleted file mode 100644
index 3d3b244..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/utils.apt
+++ /dev/null
@@ -1,82 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Rendering Utilities
-         -----------
-
-Tiles Rendering Utilities
-
-  The core package of Tiles contains utilities to render Tiles definitions
-  without the need of a JSP page or a supporting framework.
-
-* <<<TilesDispatchServlet>>>
-
-  The <<<TilesDispatchServlet>>> is a servlet that intercepts the URLs ending
-  with "<<<.tiles>>>" and render the definition whose name is the path name
-  before the "<<<.tiles>>>" part.
-  
-  For example, if you call the <<<testdispatchservlet.tiles>>> path, the
-  rendered definition will be <<<testdispatchservlet>>>.
-
-  You can configure the <<<TilesDispatchServlet>>> this way:
-
-------------------------------------
-<servlet>
-    <servlet-name>Tiles Dispatch Servlet</servlet-name>
-    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
-</servlet>
-...
-<servlet-mapping>
-    <servlet-name>Tiles Dispatch Servlet</servlet-name>
-    <url-pattern>*.tiles</url-pattern>
-</servlet-mapping>
-------------------------------------
-
-  By using the <<<org.apache.tiles.web.util.TilesDispatchServlet.CONTAINER_KEY>>>
-  you can use a different container. The value of this parameter will be used
-  as the key under which the container is stored.
-
-* <<<TilesDecorationFilter>>>
-
-  You can use the <<<TilesDecorationFilter>>> to use Tiles as a <decorator>
-  framework. All the requests intercepted by the filter will be put inside the
-  configured attribute of the configured definition, and then that definition is
-  rendered.
-  
-  You can configure the filter this way:
-
-------------------------------------
-<filter>
-    <filter-name>Tiles Decoration Filter</filter-name>
-    <filter-class>org.apache.tiles.web.util.TilesDecorationFilter</filter-class>
-    <init-param>
-        <param-name>definition</param-name>
-        <param-value>test.definition</param-value>
-    </init-param>
-    <init-param>
-        <param-name>attribute-name</param-name>
-        <param-value>body</param-value>
-    </init-param>
-</filter>
-------------------------------------
-
-  By using the <<<org.apache.tiles.web.util.TilesDecorationFilter.CONTAINER_KEY>>>
-  you can use a different container. The value of this parameter will be used
-  as the key under which the container is stored.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/advanced/wildcard.apt b/TILES_3_0_X/src/site/apt/tutorial/advanced/wildcard.apt
deleted file mode 100644
index 4b0b244..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/advanced/wildcard.apt
+++ /dev/null
@@ -1,79 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Wildcard support
-         -----------
-
-Wildcard support
-
-  By default, Tiles supports wildcards in definition names. Wilcards help a
-  lot in writing less code to declare your definitions.
-
-  There are two styles:
-
-  * the wildcard-based style (available by default):
-
-------------------------------------
-<definition name="test.definition*.message*" template="/layout{1}.jsp">
-    <put-attribute name="title"  value="This definition has a message: {2}."/>
-    <put-attribute name="header" value="/header.jsp"/>
-    <put-attribute name="body"   value="/body.jsp"/>
-</definition>
-------------------------------------
-
-* {Using different pattern matching languages}
-
-  If you're using the <<<CompleteAutoloadTilesContainerFactory>>>, you must use a predix to specify
-  the pattern matching language you're using: either WILDCARD or REGEXP:
-
-------------------------------------
-<definition name="WILDCARD:test.definition*.message*" template="/layout{1}.jsp">
-    <put-attribute name="title"  value="This definition has a message: {2}."/>
-    <put-attribute name="header" value="/header.jsp"/>
-    <put-attribute name="body"   value="/body.jsp"/>
-</definition>
-------------------------------------
-
-  And, if you want to use Regular Expressions:
-
-------------------------------------
-<definition name="REGEXP:test\.definition(.*)\.message(.*)" template="/layout{1}.jsp">
-    <put-attribute name="title"  value="This definition has a message: {2}."/>
-    <put-attribute name="header" value="/header.jsp"/>
-    <put-attribute name="body"   value="/body.jsp"/>
-</definition>
-------------------------------------
-
-  In both cases, if you insert a definition that matches the definition, for example:
-
-------------------------------------
-<tiles:insertDefinition name="test.definitionOne.messageThisIsAMessage" />
-------------------------------------
-
-  The definition is automatically mapped, replacing placeholders, marked by
-  curly brackets, with the value of matched definitions. In this case:
-
-------------------------------------
-<definition name="test.definitionOne.messageThisIsAMessage" template="/layoutOne.jsp">
-    <put-attribute name="title"  value="This definition has a message: ThisIsAMessage."/>
-    <put-attribute name="header" value="/header.jsp"/>
-    <put-attribute name="body"   value="/body.jsp"/>
-</definition>
-------------------------------------
diff --git a/TILES_3_0_X/src/site/apt/tutorial/basic/concepts.apt b/TILES_3_0_X/src/site/apt/tutorial/basic/concepts.apt
deleted file mode 100644
index 654d61e..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/basic/concepts.apt
+++ /dev/null
@@ -1,123 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Concepts
-         -----------
-
-Tiles concepts
-
-  Tiles is an implementation of the {{{../pattern.html}Composite View pattern}}.
-  Tiles adds to this pattern its own concepts to make the pattern concrete. The
-  implementation of Tiles around the <Composite View> pattern consists of the
-  {{{./concepts.html#Template}Template}}, {{{./concepts.html#Attribute}Attribute}}
-  and {{{./concepts.html#Definition}Definition}} concepts. The <View Helper>
-  pattern is implemented by the {{{./concepts.html#View Preparer}View Preparer}}
-  concept. 
-
-* {Template}
-
-  In Tiles, a <<template>> is the layout part of a page. You can see as a page
-  structure with some gaps, called <<attributes>>, to be filled.
-  
-  For instance, consider the "classic layout" page structure.
-
-[../../images/tiled_page.png] The "classic layout", a typical structure of a web
-page.
-
-  You can replicate this structure by creating a JSP page, as you can see below.
-
--------------------------------
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<table>
-  <tr>
-    <td colspan="2">
-      <tiles:insertAttribute name="header" />
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <tiles:insertAttribute name="menu" />
-    </td>
-    <td>
-      <tiles:insertAttribute name="body" />
-    </td>
-  </tr>
-  <tr>
-    <td colspan="2">
-      <tiles:insertAttribute name="footer" />
-    </td>
-  </tr>
-</table>
--------------------------------
-  
-  Notice that a template <<can have no attributes>>: in this case it can be used
-  directly.
-
-* {Attribute}
-
-  An <<attribute>> is a gap in a template that needs to be filled in your
-  application. An attribute can be of three types:
-  
-  * <<string>>: it is a string to be directly rendered as it is.
-  
-  * <<template>>: it is a template, with or without attributes. If it has
-  attributes, you have to fill them too to render a page.
-  
-  * <<definition>>: it is a reusable composed page, with all (or some)
-  attributes filled (see below).
-
-* {Definition}
-
-  A <<definition>> is a composition to be rendered to the end user; essentially
-  a definition is composed of a <<template>> and completely or partially
-  <<filled attributes>>.
-  
-  * If <<all>> of its attributes are filled, it can be rendered to the end user.
-  
-  * If <<not all>> of its attributes are filled, it is called an <<abstract
-  definition>>, and it can be used as a base definition for extended
-  definitions, or their missing attributes can be filled at runtime.
-  
-  []
-  
-  For example, you can create a page using the <classic layout> as seen before,
-  by modifying the {{{./pages.html}Tiles configuration file}}.
-  
-------------------------------------
-<definition name="myapp.homepage" template="/layouts/classic.jsp">
-  <put-attribute name="header" value="/tiles/banner.jsp" />
-  <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-  <put-attribute name="body" value="/tiles/home_body.jsp" />
-  <put-attribute name="footer" value="/tiles/credits.jsp" />
-</definition>
-------------------------------------
-
-* {View Preparer}
-
-  Sometimes a definition, before it is rendered, needs to be "prepared". For
-  example when showing a menu, the menu structure must be created and stored
-  in the request scope.
-  
-  For this reason, a <<View Preparer>> can be used: it is called <<before>> the
-  definition is rendered, so all the things needed to render correctly the
-  definition can be prepared.
-  
-  See the {{{../advanced/preparer.html}Tiles View Preparer configuration}} for
-  more information.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/basic/index.apt b/TILES_3_0_X/src/site/apt/tutorial/basic/index.apt
deleted file mode 100644
index b8a4e91..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/basic/index.apt
+++ /dev/null
@@ -1,32 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Basic Usage
-         -----------
-
-Tiles Basic Usage
-
-  In this part of the tutorial, you will learn the basics of Tiles and its
-  simple usage in the most common cases.
-  
-  * {{{./concepts.html}Tiles concepts}}.
-  
-  * {{{./pages.html}Building Tiles-enabled pages}}.
-
diff --git a/TILES_3_0_X/src/site/apt/tutorial/basic/pages.apt b/TILES_3_0_X/src/site/apt/tutorial/basic/pages.apt
deleted file mode 100644
index 6afc4c8..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/basic/pages.apt
+++ /dev/null
@@ -1,134 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Creating Tiles Pages
-         -----------
-
-Creating and using Tiles pages
-
-  After installing and learning some of Tiles concepts, it is time to create
-  some pages. Here you will find the steps to create reusable Tiles pieces and
-  complete pages.
-
-* Create a template
-
-  Let's take the <<classic layout>> page structure:
-
-[../../images/tiled_page.png] The "classic layout", a typical structure of a web
-page.
-
-  Create a JSP page that acts as this layout and place it under
-  <<</layouts/classic.jsp>>> file.
-
--------------------------------
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<html>
-  <head>
-    <title><tiles:getAsString name="title"/></title>
-  </head>
-  <body>
-	<table>
-      <tr>
-        <td colspan="2">
-          <tiles:insertAttribute name="header" />
-        </td>
-      </tr>
-      <tr>
-        <td>
-          <tiles:insertAttribute name="menu" />
-        </td>
-        <td>
-          <tiles:insertAttribute name="body" />
-        </td>
-      </tr>
-      <tr>
-        <td colspan="2">
-          <tiles:insertAttribute name="footer" />
-        </td>
-      </tr>
-    </table>
-  </body>
-</html>
--------------------------------
-
-  This template has five attributes: <<<title>>> (of <<<string>>> type),
-  <<<header>>>, <<<menu>>>, <<<body>>> and <<<footer>>>.
-
-* Create the composing pages
-
-  In this phase, you have to create four JSP pages, that will take place of
-  <<<header>>>, <<<menu>>>, <<<body>>> and <<<footer>>> attributes in the
-  previously created template.
-
-  You can put everything you want in this pages, they are just a test.
-
-* Create a definition
-
-  By default, the definition file is <<</WEB-INF/tiles.xml>>>. If you're using <<<CompleteAutoloadTilesListener>>>,
-  tiles will use any file in the webapp that matches <<</WEB-INF/tiles*.xml>>> or any file in the classpath that matches
-  <<</META-INF/tiles*.xml>>>; if several are found, it will merge them together.  
-  
-  But for now, let's stick to the default and create the <<</WEB-INF/tiles.xml>>> file, with a definition
-  as described in {{{./concepts.html}concepts}}:
-
-------------------------------------
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-<tiles-definitions>
-  <definition name="myapp.homepage" template="/layouts/classic.jsp">
-    <put-attribute name="title" value="Tiles tutorial homepage" />
-    <put-attribute name="header" value="/tiles/banner.jsp" />
-    <put-attribute name="menu" value="/tiles/common_menu.jsp" />
-    <put-attribute name="body" value="/tiles/home_body.jsp" />
-    <put-attribute name="footer" value="/tiles/credits.jsp" />
-  </definition>
-</tiles-definitions>
-------------------------------------
-
-* Render the definition
-
-  After creating the definition, you can render it:
-
-  * by using the <<<\<tiles:insertDefinition /\>>>> tag, inserting it in a JSP
-  page:
-
--------------------------------------
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<tiles:insertDefinition name="myapp.homepage" />
--------------------------------------
-
-  * in other cases, you can render directly in the response, by using the Tiles
-  container:
-
------------------------------------
-TilesContainer container = TilesAccess.getContainer(
-        request.getSession().getServletContext());
-container.render("myapp.homepage", request, response);
------------------------------------
-
-  * by using {{{../advanced/utils.html}Rendering Utilities}} provided by Tiles. For instance,
-  if you've configured <<<TilesDispatchServlet>>>, you can render the definition above by
-  requesting <<<http://example.com/webapp/myapp.homepage.tiles>>>.
-
-  * by using a supporting framework. See
-  {{{../integration/index.html}Integrations}} for a list of supporting
-  frameworks.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/configuration.apt b/TILES_3_0_X/src/site/apt/tutorial/configuration.apt
deleted file mode 100644
index 05b9b74..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/configuration.apt
+++ /dev/null
@@ -1,74 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Configuration
-         -----------
-
-Configuring Tiles in your web application
-
-  Tiles has always been a web application package, usually used in conjunction
-  with Struts. Apache Tiles\u0099 evolved to the point of being technology-independent, but
-  its use in a Servlet-based web application is still the most frequent use case.
-
-* Required libraries
-
-  The first thing is to install the required libraries. For the purpose of this tutorial,
-  we will install everything: the more we can do, the better. Just know that a 
-  more "lightweight" but limited configuration is available.
-  
-  If you're using maven, just include this dependency, it will include the rest:
-  
--------------
-<groupId>org.apache.tiles</groupId>
-<artefactId>tiles-extras</artefactId>
--------------  
-  
-  If you're not using maven, just {{{/download.html}download}} tiles and copy all the jars
-  into the /WEB-INF/lib directory.
-
-* Starting Tiles engine
-
-  Load the tiles container by using the appropriate listener it in your <<<web.xml>>> file. Since we
-  decided to load everything, we'll use <<<CompleteAutoloadTilesListener>>>:
-
--------------------------------
-<listener>
-    <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
-</listener>
--------------------------------
-
-  For this tutorial, we'll configure Tiles to work directly with the servlet API, without a controller.
-  In the real world, you'll probably use an MVC framework like Struts or Shale or Spring. You have to 
-  configure your framework to work with Tiles; please refer to your framework's documentation for that. 
-  For now, we'll just declare <<<TilesDispatchServlet>>> in <<<web.xml>>>:
-  
--------------------------------
-<servlet>
-    <servlet-name>Tiles Dispatch Servlet</servlet-name>
-    <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
-</servlet>
-<servlet-mapping>
-    <servlet-name>Tiles Dispatch Servlet</servlet-name>
-    <url-pattern>*.tiles</url-pattern>
-</servlet-mapping>
--------------------------------
-
-  This means that any request to an URL ending in ".tiles" will be dispatched directly to the matching
-  Tiles Definition.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/index.apt b/TILES_3_0_X/src/site/apt/tutorial/index.apt
deleted file mode 100644
index fb0262c..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/index.apt
+++ /dev/null
@@ -1,68 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tutorial
-         -----------
-
-Introduction
-
-  This tutorial is intended to provide a help for first-time Tiles users, in the context of a web application.
-
-Summary
-
-  [[1]] {{{./pattern.html}The "composite view" pattern}}
-
-  [[2]] {{{./configuration.html}Configuring your web application}}
-
-  [[3]] {{{./basic/index.html}Basic Usage}}
-
-        [[1]] {{{./basic/concepts.html}Tiles Concepts}}
-
-        [[2]] {{{./basic/pages.html}Creating Tiles Pages}}
-
-  [[4]] {{{./advanced/index.html}Advanced Topics}}
-
-        [[1]] {{{./advanced/nesting-extending.html}Nesting and Extending Definitions}}
-
-        [[2]] {{{./advanced/list-attributes.html}List Attributes}}
-
-        [[3]] {{{./advanced/runtime.html}Runtime Composition}}
-
-        [[4]] {{{./advanced/preparer.html}View Preparers}}
-
-        [[5]] {{{./advanced/utils.html}Rendering Utilities}}
-
-        [[6]] {{{./advanced/l10n.html}Tiles Localization}}
-
-        [[7]] {{{./advanced/wildcard.html}Wildcard support}}
-
-        [[8]] {{{./advanced/el-support.html}EL support}}
-
-        [[8]] {{{./advanced/attribute-rendering.html}Attribute rendering}}
-
-        [[9]] {{{./advanced/multiple-containers.html}Using multiple containers}}
-
-        [[10]] {{{./advanced/security.html}Security}}
-
-  [[5]] {{{./integration/index.html}Integration with other technologies}}
-
-        [[1]] {{{./integration/frameworks.html}Integration with other frameworks}}
-
-        [[2]] {{{./integration/view.html}Integration with other view technologies}}
diff --git a/TILES_3_0_X/src/site/apt/tutorial/integration/frameworks.apt b/TILES_3_0_X/src/site/apt/tutorial/integration/frameworks.apt
deleted file mode 100644
index e64ec44..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/integration/frameworks.apt
+++ /dev/null
@@ -1,41 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Integration with other Frameworks
-         -----------
-
-Integration with other web Frameworks
-
-  Tiles can be integrated with other web frameworks. Usually this kind of
-  integration is made through extensions/plugins to Tiles.
-  
-  * {{{http://struts.apache.org/1.x/index.html}Struts 1}}: Currently under
-  development. A Struts 1 plugin is available in the SVN trunk, that presumably
-  will be released along with Struts 1.4.
-  
-  * {{{http://struts.apache.org/2.x/docs/tiles-plugin.html}Struts 2}}: at the time of this 
-  writing, the Struts 2 Tiles plugin still uses Tiles version 2.
-  
-  * {{{http://static.springsource.org/spring/docs/current/spring-framework-reference/html/view.html#view-tiles}Spring MVC}}: 
-  At the time of this writing, Spring uses Tiles version 2.
-  
-  * {{{http://shale.apache.org/shale-tiles/index.html}Shale}}: An integration
-  layer is provided, but it needs to be updated to the latest released version
-  of Tiles.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/integration/freemarker.apt b/TILES_3_0_X/src/site/apt/tutorial/integration/freemarker.apt
deleted file mode 100644
index 0e6b974..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/integration/freemarker.apt
+++ /dev/null
@@ -1,121 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Integration with FreeMarker
-         -----------
-
-Integration with FreeMarker
-
-  {{{http://freemarker.sourceforge.net/}FreeMarker}} is a templating framework
-  that can be used as a replacement for JavaServer Pages (JSP). Tiles can be
-  used with FreeMarker through the use of Tiles FreeMarker package.
-
-* Configuration
-
-  To use FreeMarker together with Tiles
-
-  * Add FreeMarker jars (tested with FreeMarker 2.3.15).
-
-  * Add <<<tiles-template-x.x.x.jar>>> and <<<tiles-freemarker-x.x.x.jar>>> files
-  to your application
-
-  * To access ".ftl" files from HTTP requests, add this piece of configuration in <<<web.xml>>>
-  (the parameters can be modified as needed).
-
-----------------------------------
-<servlet>
-    <servlet-name>freemarker</servlet-name>
-    <servlet-class>org.apache.tiles.freemarker.servlet.TilesFreemarkerServlet</servlet-class>
-
-    <!-- FreemarkerServlet settings: -->
-    <init-param>
-        <param-name>TemplatePath</param-name>
-        <param-value>/</param-value>
-    </init-param>
-    <init-param>
-        <param-name>NoCache</param-name>
-        <param-value>true</param-value>
-    </init-param>
-    <init-param>
-        <param-name>ContentType</param-name>
-        <param-value>text/html</param-value>
-    </init-param>
-
-    <!-- FreeMarker settings: -->
-    <init-param>
-        <param-name>template_update_delay</param-name>
-        <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
-    </init-param>
-    <init-param>
-        <param-name>default_encoding</param-name>
-        <param-value>ISO-8859-1</param-value>
-    </init-param>
-    <init-param>
-        <param-name>number_format</param-name>
-        <param-value>0.##########</param-value>
-    </init-param>
-
-    <load-on-startup>5</load-on-startup>
-</servlet>
-----------------------------------
-
-  * To access ".ftl" files as attributes, register FreeMarkerAttributeRenderer
-  this way (only available in a servlet environment):
-
-----------------------------------
-@Override
-protected void registerAttributeRenderers(
-        BasicRendererFactory rendererFactory, TilesApplicationContext applicationContext,
-        TilesRequestContextFactory contextFactory,
-        TilesContainer container, AttributeEvaluator evaluator) {
-    super.registerAttributeRenderers(rendererFactory, applicationContext, contextFactory,
-            container, evaluator);
-    FreeMarkerAttributeRenderer freemarkerRenderer = new FreeMarkerAttributeRenderer();
-    freemarkerRenderer.setApplicationContext(applicationContext);
-    freemarkerRenderer.setEvaluator(evaluator);
-    freemarkerRenderer.setRequestContextFactory(contextFactory);
-    freemarkerRenderer.setParameter("TemplatePath", "/");
-    freemarkerRenderer.setParameter("NoCache", "true");
-    freemarkerRenderer.setParameter("ContentType", "text/html");
-    freemarkerRenderer.setParameter("template_update_delay", "0");
-    freemarkerRenderer.setParameter("default_encoding", "ISO-8859-1");
-    freemarkerRenderer.setParameter("number_format", "0.##########");
-    freemarkerRenderer.commit();
-    rendererFactory.registerRenderer("freemarker", freemarkerRenderer);
-}
-----------------------------------
-
-  This way you can specify an attribute that is rendered directly using this syntax:
-
-----------------------------------
-<put-attribute name="myAttribute" value="/pages/myPage.ftl" type="freemarker" />
-----------------------------------
-
-* Usage in FreeMarker templates
-
-  Tiles directives are available this way:
-
-----------------------------------
-<@tiles.nameOfDirective>
-  Other stuff...
-</@tiles.nameOfDirective>
-----------------------------------
-
-  For details about directives see the {{{../../apidocs/index.html}Javadocs}}.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/integration/index.apt b/TILES_3_0_X/src/site/apt/tutorial/integration/index.apt
deleted file mode 100644
index 1593ad8..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/integration/index.apt
+++ /dev/null
@@ -1,32 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Tiles Integrations
-         -----------
-
-Tiles integrations
-
-  Tiles can be integrated with various frameworks and view technologies, to
-  include Tiles elements into their specific features.
-  
-  * {{{./frameworks.html}Integration in web frameworks}}.
-  
-  * {{{./view.html}Integration in view technologies}}.
-
diff --git a/TILES_3_0_X/src/site/apt/tutorial/integration/velocity.apt b/TILES_3_0_X/src/site/apt/tutorial/integration/velocity.apt
deleted file mode 100644
index a5c5529..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/integration/velocity.apt
+++ /dev/null
@@ -1,163 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Integration with Apache Velocity
-         -----------
-
-Integration with Apache Velocity
-
-  {{{http://velocity.apache.org/}Apache Velocity}} is a templating framework
-  that can be used as a replacement for JavaServer Pages (JSP). Tiles can be
-  used with Velocity through the use of Tiles Velocity package.
-
-* Configuration
-
-  To use Velocity together with Tiles
-
-  * Add Velocity (1.7 or better) and Velocity Tools (2.0 or better) jars to your application.
-
-  * Add <<<tiles-template-x.x.x.jar>>> and <<<tiles-velocity-x.x.x.jar>>> files
-  to your application.
-  * Add this code in you <<<velocity.properties>>> file:
-
-----------------------------------
-userdirective=org.apache.tiles.velocity.template.AddAttributeDirective,\
-  org.apache.tiles.velocity.template.AddListAttributeDirective,\
-  org.apache.tiles.velocity.template.DefinitionDirective,\
-  org.apache.tiles.velocity.template.GetAsStringDirective,\
-  org.apache.tiles.velocity.template.ImportAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertDefinitionDirective,\
-  org.apache.tiles.velocity.template.InsertTemplateDirective,\
-  org.apache.tiles.velocity.template.PutAttributeDirective,\
-  org.apache.tiles.velocity.template.PutListAttributeDirective
-----------------------------------
-
-
-  * To access ".vm" files from HTTP requests, add this piece of configuration in <<<web.xml>>>
-  (the parameters can be modified as needed).
-
-----------------------------------
-<servlet>
-  <servlet-name>velocity</servlet-name>
-  <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
-
-  <init-param>
-    <param-name>org.apache.velocity.toolbox</param-name>
-    <param-value>/WEB-INF/tools.xml</param-value>
-  </init-param>
-
-  <init-param>
-    <param-name>org.apache.velocity.properties</param-name>
-    <param-value>/WEB-INF/velocity.properties</param-value>
-  </init-param>
-</servlet>
-----------------------------------
-
-  * To access ".vm" files as attributes, register VelocityAttributeRenderer
-  this way (only available in a servlet environment):
-
-----------------------------------
-@Override
-protected void registerAttributeRenderers(
-        BasicRendererFactory rendererFactory, TilesApplicationContext applicationContext,
-        TilesRequestContextFactory contextFactory,
-        TilesContainer container, AttributeEvaluator evaluator) {
-    super.registerAttributeRenderers(rendererFactory, applicationContext, contextFactory,
-            container, evaluator);
-
-    VelocityAttributeRenderer velocityRenderer = new VelocityAttributeRenderer();
-    velocityRenderer.setApplicationContext(applicationContext);
-    velocityRenderer.setEvaluator(evaluator);
-    velocityRenderer.setRequestContextFactory(contextFactory);
-    velocityRenderer.setParameter("org.apache.velocity.toolbox", "/WEB-INF/tools.xml");
-    velocityRenderer.setParameter("org.apache.velocity.properties", "/WEB-INF/velocity.properties");
-    velocityRenderer.commit();
-    rendererFactory.registerRenderer("velocity", velocityRenderer);
-}
-----------------------------------
-
-  This way you can specify an attribute that is rendered directly using this syntax:
-
-----------------------------------
-<put-attribute name="myAttribute" value="/pages/myPage.vm" type="velocity" />
-----------------------------------
-
-* Usage in Velocity templates
-
-  There are two ways to use Tiles-Velocity integration:
-
-  * the <<<tiles>>> tool, that is a Velocity-style tool:
-
-----------------------------------
-$tilesAlt.startAttributeContext()
-$set($templateAttribute = $tilesAlt.createTemplateAttribute("/page/myTemplate.vm"))
-$set($attributeContext = $tilesAlt.getAttributeContext())
-  $set($attribute = $tilesAlt.createAttribute())
-  $attribute.setValue("This is the title.")
-  $attributeContext.putAttribute("title", $attribute})
-
-  $set($attribute = $tilesAlt.createAttribute())
-  $attribute.setValue("/velocity/header.vm")
-  $attribute.setRenderer("velocity")
-  $attributeContext.putAttribute("header", $attribute})
-
-  $set($attribute = $tilesAlt.createAttribute())
-  $attribute.setValue("/velocity/body.vm")
-  $attribute.setRenderer("velocity")
-  $attributeContext.putAttribute("body", $attribute})
-
-$tilesAlt.render($templateAttribute)
-$tilesAlt.endAttributeContext()
-----------------------------------
-
-  * the <<<tiles>>> directives, that have a tag-like meaning.
-
-----------------------------------
-#tiles_insertTemplate({"template":"/page/myTemplate.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-----------------------------------
-
-  Other <<<tiles>>> directives are:
-  
-      * <<<getAsString(String attributeName)>>> - get the value of named attribute as string.
-
-      * <<<importAttribute(String attributeName, String toName)>>> - import the named attribute into the scope of
-  	template context under the (optional) custom name.
-
-      * <<<insertAttribute(String attributeName)>>> - inserts given attribute in the output in its own context.
-        If this is a string a string is printed, if this is a definition - it is included in the output.
-
-      * <<<insertAttribute(String attributeName, boolean ownContext)>>> - inserts given attribute in the output.
-        If this is a string a string is printed, if this is a definition - it is included in the output. You can specify whether
-        a separate context is created for rendering the definition - in this case variables with duplicate names
-        will not be inherited from the parent definition
-
-      * <<<insertDefinition(String definitionName)>>> - renders a definition in its own context.
-
-      * <<<insertDefinition(String definitionName, boolean ownContext)>>> - inserts definition, optionally in the shared context.
-
-      * <<<insertTemplate(String template)>>> - inserts a named page, equivalent to Velocity's <<<#parse>>>.
-
-
-  For details about the tool and directives see the {{{../../apidocs/index.html}Javadocs}}.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/integration/view.apt b/TILES_3_0_X/src/site/apt/tutorial/integration/view.apt
deleted file mode 100644
index 170015b..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/integration/view.apt
+++ /dev/null
@@ -1,31 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         Integration with other View Technologies
-         -----------
-
-Integration with other View Technologies
-
-  Currently Apache Tiles\u0099 is not only integrated with JavaServer Pages, but it can be used
-  with:
-
-  * {{{./freemarker.html}FreeMarker}}.
-
-  * {{{./velocity.html}Velocity}}.
diff --git a/TILES_3_0_X/src/site/apt/tutorial/pattern.apt b/TILES_3_0_X/src/site/apt/tutorial/pattern.apt
deleted file mode 100644
index 2d39d4d..0000000
--- a/TILES_3_0_X/src/site/apt/tutorial/pattern.apt
+++ /dev/null
@@ -1,109 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         The Composite View Pattern
-         -----------
-
-The Composite View Pattern
-
-  All websites have something in common: they are made of pages that share
-  similar structures. The pages share the same layout, while each page is made
-  of different independent pieces, but always placed in the same position across
-  all the site.
-
-  The <<Composite View>> pattern formalizes this typical use, by allowing to
-  create pages that have a similar structure, in which each section of the page
-  vary in different situations.
-
-* How the pattern works
-
-  To understand this pattern, let's take an example. In the following picture
-  you can see a typical structure of a web page.
-
-[../images/tiled_page.png] The "classic layout", a typical structure of a web
-page.
-
-  This structure is called "Classic Layout". The template organizes the page
-  according to this layout, putting each "piece" in the needed place, so that
-  the header goes up, the footer down, etc.
-
-  It can happen that, for example clicking on a link, it is needed to change
-  only a part of the page, typically the body.
-
-[../images/page_to_page.png] The body changes, while the rest remains the same.
-
-  As you can see, the pages are different, but their difference is only in the
-  body part. Note that, however, <<the pages are distinct>>, it is not like a
-  refresh of a frame in a frameset!
-  
-  Using the composite view pattern, the other part of the page have been reused,
-  and the layout consistence has been preserved.
-  
-* The role of the View Helper
-
-  Each piece of the composed page can have a "view helper". This pattern allows
-  the preparation of the data to be displayed in a consistent way for the page
-  piece itself, for example to create a menu.
-
-* Composite View vs. Decorator
-
-  Tiles is a composite view framework: it allows to reuse page pieces across
-  the application. But another approach to achieve the same result is using the
-  <<Decorator pattern>>. For example,
-  {{{http://www.sitemesh.org/}Sitemesh}} is based on the Decorator
-  pattern.
-  
-  Instead of creating a template and organizing the pieces together, the
-  Decorator pattern (in this case) takes a simple HTML page, transforms it
-  adding the missing pieces (in our example, adding header, footer and menu) and
-  finally renders it.
-  
-  Here you can find a comparison table between the two patterns.
-  
-*---------------+--------------------------------+-----------------------------+
-| <<Aspect>>    | <<Composite View>>             | <<Decorator>>               |
-*---------------+--------------------------------+-----------------------------+
-| Reusability   | The different parts of the     | Each decorator can be       |
-|               | page (template and pieces) can | reused, but the decoration  |
-|               | be reused across the whole     | itself can be applied to    |
-|               | application.                   | one page at a time.         |
-*---------------+--------------------------------+-----------------------------+
-| Ease of       | Each page must be defined      | The decorator can be        |
-| configuration | explicitly.                    | applied even to the entire  |
-|               |                                | application.                |
-*---------------+--------------------------------+-----------------------------+
-| Runtime       | The pages can be configured    | Since one page is decorated |
-| configuration | and organized at runtime       | at a time, this feature is  |
-|               |                                | not present.                |
-*---------------+--------------------------------+-----------------------------+
-| Performances  | Low overhead for composition.  | The page to be decorated    |
-|               |                                | has to be parsed.           |
-*---------------+--------------------------------+-----------------------------+
-
-
-* References
-
-  You can see the complete description of the Composite View pattern at:
-  
-  * {{{http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html}
-  Sun's Core J2EE Patterns}}
-  
-  * {{{http://java.sun.com/blueprints/patterns/CompositeView.html}
-  Sun's Blueprints Patterns}}
diff --git a/TILES_3_0_X/src/site/apt/whats-new.apt b/TILES_3_0_X/src/site/apt/whats-new.apt
deleted file mode 100644
index dedac2d..0000000
--- a/TILES_3_0_X/src/site/apt/whats-new.apt
+++ /dev/null
@@ -1,52 +0,0 @@
-~~ $Id$
-~~
-~~ 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.
-~~
-         -----------
-         What's new in Tiles 3.0
-         -----------
-
-What's new in Tiles 3.0
-
-* New features in Tiles 3.0
-
-  * {{{/tiles-request/}Apache Request}}: a framework independent request abstraction. Implementations for Servlet, 
-  Portlet, JSP, Velocity, FreeMarker and Mustache.
-
-  * {{{/tiles-autotag/}Apache Autotag}}: a tool that automatically generates tags (or tag-like) artifact from a common template code for a range of templating languages.
-  All the Tiles 3 boilerplate code to templating models has been removed and uses the Autotag plugins instead:
-  it's a lot of boilerplate, boring code, now generated automatically.
-
-* Deprecations in Tiles 3.0
-
-  * Starting Tiles in a web environment using a dummy Servlet. Use a SerlvetContextListener instead.
-  
-  * Don't use the AttributeContext interface to pass attribute values to Tiles. Expression Languages are an easier, more maintainable 
-  way to change the value of attributes on a per-render basis.
-
-  * ...
-
-* Removals in Tiles 3.0
-
-  * Upgraded from JavaSE 5.0 to JavaSE 6.0.
-  
-  * Upgraded from Servlet 2.4 and JSP 2.0 to Servlet 2.5 and JSP 2.1.
-  
-  * Changed the Java API to adopt the Request API. The XML files and taglibs are compatible with tiles 2.2.
-  
-  * Dropped the parameter based configuration that was deprecated in 2.2.
diff --git a/TILES_3_0_X/src/site/resources/images/page_to_page.png b/TILES_3_0_X/src/site/resources/images/page_to_page.png
deleted file mode 100644
index 78883ad..0000000
--- a/TILES_3_0_X/src/site/resources/images/page_to_page.png
+++ /dev/null
Binary files differ
diff --git a/TILES_3_0_X/src/site/resources/images/tiled_page.png b/TILES_3_0_X/src/site/resources/images/tiled_page.png
deleted file mode 100644
index f8f2ee1..0000000
--- a/TILES_3_0_X/src/site/resources/images/tiled_page.png
+++ /dev/null
Binary files differ
diff --git a/TILES_3_0_X/src/site/site.xml b/TILES_3_0_X/src/site/site.xml
deleted file mode 100644
index ab8686e..0000000
--- a/TILES_3_0_X/src/site/site.xml
+++ /dev/null
@@ -1,183 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Framework">
-    <bannerLeft>
-        <name>Apache Software Foundation</name>
-        <src>http://www.apache.org/images/asf-logo.gif</src>
-        <href>http://www.apache.org</href>
-    </bannerLeft>
-    <bannerRight>
-        <name>Apache Tiles&#8482;</name>
-        <src>http://tiles.apache.org/images/logo.png</src>
-        <href>http://tiles.apache.org</href>
-    </bannerRight>
-    <body>
-
-        <links>
-            <item name="Apache" href="http://www.apache.org" />
-            <item name="Tiles" href="http://tiles.apache.org" />
-        </links>
-
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../index.html"/>
-            <item
-                   name="Tiles project start page"
-                   href="./index.html"/>
-            <item
-                   name="Security bulletins"
-                   href="security/index.html"/>
-        </menu>
-        <menu name="Documentation">
-            <item
-                    name="What's new"
-                    href="whats-new.html"/>
-            <item
-                    name="Tutorial"
-                    href="tutorial/index.html"
-                    collapse="true">
-                <item
-                        name="The composite view pattern"
-                        href="tutorial/pattern.html"/>
-                <item
-                        name="Configuration"
-                        href="tutorial/configuration.html"/>
-                <item
-                        name="Basic Usage"
-                        href="tutorial/basic/index.html"
-                        collapse="true">
-                    <item
-                            name="Tiles Concepts"
-                            href="tutorial/basic/concepts.html"/>
-                    <item
-                            name="Creating Pages"
-                            href="tutorial/basic/pages.html"/>
-                </item>
-                <item
-                        name="Advanced Topics"
-                        href="tutorial/advanced/index.html"
-                        collapse="true">
-                    <item
-                            name="Nesting and Extending"
-                            href="tutorial/advanced/nesting-extending.html"/>
-                    <item
-                            name="List Attributes"
-                            href="tutorial/advanced/list-attributes.html"/>
-                    <item
-                            name="Runtime Composition"
-                            href="tutorial/advanced/runtime.html"/>
-                    <item
-                            name="View Preparers"
-                            href="tutorial/advanced/preparer.html"/>
-                    <item
-                            name="Rendering Utilities"
-                            href="tutorial/advanced/utils.html"/>
-                    <item
-                            name="Localization"
-                            href="tutorial/advanced/l10n.html"/>
-                    <item
-                            name="Wildcard support"
-                            href="tutorial/advanced/wildcard.html"/>
-                    <item
-                            name="EL support"
-                            href="tutorial/advanced/el-support.html"/>
-                    <item
-                            name="Attribute rendering"
-                            href="tutorial/advanced/attribute-rendering.html"/>
-                    <item
-                            name="Multiple containers"
-                            href="tutorial/advanced/multiple-containers.html"/>
-                    <item
-                            name="Security"
-                            href="tutorial/advanced/security.html"/>
-                </item>
-                <item
-                        name="Integrations"
-                        href="tutorial/integration/index.html"
-                        collapse="true">
-                    <item
-                            name="Frameworks"
-                            href="tutorial/integration/frameworks.html"/>
-                    <item
-                            name="View technologies"
-                            href="tutorial/integration/view.html">
-                        <item
-                                name="FreeMarker"
-                                href="tutorial/integration/freemarker.html"/>
-                        <item
-                                name="Velocity"
-                                href="tutorial/integration/velocity.html"/>
-                    </item>
-                </item>
-            </item>
-            <item
-                    name="Wiki"
-                    href="http://cwiki.apache.org/TILES/"/>
-            <item
-                    name="Migration"
-                    href="migration/index.html"/>
-        </menu>
-        <menu name="Reference">
-            <item
-                    name="Getting Started"
-                    href="getting_started.html"/>
-            <item
-                    name="Configuration reference"
-                    href="config-reference.html"/>
-            <item
-                    name="Javadoc"
-                    href="apidocs/index.html"/>
-            <item
-                    name="Taglibdoc"
-                    href="tiles-jsp/tlddoc/index.html"/>
-            <item
-                    name="Taglib Reference"
-                    href="tiles-jsp/tagreference.html"/>
-            <item
-                    name="DTD Doc"
-                    href="tiles-core/dtddoc/index.html"/>
-        </menu>
-
-        <menu name="Developers">
-            <item
-                    name="Building"
-                    href="/dev/building.html"/>
-            <item
-                    name="Snapshots"
-                    href="/dev/snapshots.html"/>
-            <item
-                    name="Release Process"
-                    href="/dev/release.html"/>
-            <item
-                    name="Selenium Testing"
-                    href="/selenium.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/src/site/xdoc/dev/building.xml b/TILES_3_0_X/src/site/xdoc/dev/building.xml
deleted file mode 100644
index 7fb099a..0000000
--- a/TILES_3_0_X/src/site/xdoc/dev/building.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<document>
-
-    <properties>
-        <title>Apache Tiles</title>
-    </properties>
-
-    <body>
-        <section name="Building Tiles">
-          <subsection name="Prerequisites">
-            <p>For all the next instructions, we assume that you downloaded and
-            installed <a href="http://maven.apache.org/">Maven</a>.</p>
-            <p>To download packages from the source repository, you need to
-            download and install <a href="http://subversion.tigris.org/">
-            Subversion</a>.</p>
-            <p>If you want to build something including JavaDocs (assemblies,
-            sites and JavaDoc report itself) you need to install
-            <a href="http://www.graphviz.org/">GraphViz</a>, otherwise you will
-            notice missing pictures inside JavaDocs pages.</p>
-          </subsection>
-          <subsection name="Building main packages">
-            <p>To build Tiles from source you need to:</p>
-            <ul>
-            <li><p><a href="/download.html">download</a> the source
-            distribution, or checkout the latest version:</p>
-            <p><source>svn co http://svn.apache.org/repos/asf/tiles/framework/trunk/tiles-parent</source></p></li>
-            <li><p>go into the source directory and type:</p>
-            <p><source>mvn package</source></p></li>
-            </ul>
-            <p>You will find the generated JARs under:</p>
-            <ul>
-            <li>{tiles-dir}/tiles-{module}/target/tiles-{module}-${version}.jar</li>
-            </ul>
-          </subsection>
-          <subsection name="Building Tiles Test webapp">
-            <p>See <a href="../selenium.html">Selenium testing with Tiles Test
-            webapp</a>.</p>
-          </subsection>
-          <subsection name="Building distributions">
-            <p>To build distributions, you need to:</p>
-            <ul>
-            <li><p><a href="/download.html">download</a> the source
-            distribution, or checkout the latest version:</p>
-            <p><source>svn co http://svn.apache.org/repos/asf/tiles/framework/trunk/</source></p></li>
-            <li><p>go into the source directory and type:</p>
-            <p><source>mvn install site</source></p></li>
-            <li><p>go into the <code>{tiles-dir}/assembly</code> directory and
-            type:</p>
-            <p><source>mvn assembly:assembly</source></p></li>
-            </ul>
-            <p>You will find the generated distribution under
-            <code>{tiles-dir}/assembly/target/assembly/out</code>.</p>
-          </subsection>
-        </section>
-        <section name="Building Tiles websites">
-          <p>There are four Tiles websites: the main website and the projects
-          websitesi (tiles-request, tiles-autotag, framework).</p>
-          <subsection name="Building main website">
-            <p>To build the main website:</p>
-            <ul>
-            <li><p>checkout the site from the source repository:</p>
-            <p><source>svn co http://svn.apache.org/repos/asf/tiles/site/</source></p></li>
-            <li><p>go into the site directory and type:</p>
-            <p><source>mvn site</source></p></li>
-            </ul>
-            <p>You will find the generated distribution under
-            <code>{tiles-site-dir}/target/site</code>.</p>
-          </subsection>
-          <subsection name="Building a project's website">
-            <p>To build the framework website:</p>
-            <ul>
-            <li><p><a href="/download.html">download</a> the source
-            distribution, or checkout the latest version:</p>
-            <p><source>svn co http://svn.apache.org/repos/asf/tiles/framework/trunk/tiles-parent/</source></p></li>
-            <li><p>go into the source directory and type:</p>
-            <p><source>mvn site site:stage</source></p></li>
-            </ul>
-            <p>You will find the generated website under:</p>
-            <ul>
-            <li>{tiles-dir}/target/staging</li>
-            </ul>
-          </subsection>
-        </section>
-    </body>
-
-</document>
diff --git a/TILES_3_0_X/src/site/xdoc/dev/snapshots.xml b/TILES_3_0_X/src/site/xdoc/dev/snapshots.xml
deleted file mode 100644
index d73af59..0000000
--- a/TILES_3_0_X/src/site/xdoc/dev/snapshots.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<document>
-
-    <properties>
-        <title>Apache Tiles</title>
-    </properties>
-
-    <body>
-        <section name="Apache Tiles&#8482;">
-        <subsection name="Snapshots">
-
-        <p>Looking for snapshot builds of the latest version of Tiles?
-           Snapshots are occasionally published to Apache's Maven snapshot
-           repository, which can be accessed with the following configuration:</p>
-
-        <source>
-        <![CDATA[
-          <repository>
-              <id>apache.snapshots</id>
-              <name>Apache Maven Snapshot Repository</name>
-              <url>http://repository.apache.org/snapshots</url>
-          </repository>
-        ]]>
-        </source>
-
-        <p>After configuring the repository, declare a dependency on
-        Tiles:</p>
-
-        <source><![CDATA[
-          <dependency>
-              <groupId>org.apache.tiles</groupId>
-              <artifactId>tiles-core</artifactId>
-              <version>3.0.0-SNAPSHOT</version>
-          </dependency>
-        ]]>
-        </source>
-
-   <p>You can see Tiles in action by downloading a snapshot of the 'tiles-test' webapp,
-   <a href="http://repository.apache.org/snapshots/org/apache/tiles/tiles-test/3.0.0-SNAPSHOT">
-   here</a>.</p>
-
-    </subsection>
-</section>
-</body>
-
-</document>
diff --git a/TILES_3_0_X/src/site/xdoc/images/page_to_page.svg b/TILES_3_0_X/src/site/xdoc/images/page_to_page.svg
deleted file mode 100644
index 72ac013..0000000
--- a/TILES_3_0_X/src/site/xdoc/images/page_to_page.svg
+++ /dev/null
@@ -1,450 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="297mm"
-   height="210mm"
-   id="svg17456"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="C:\Documents and Settings\Administrator\Documenti\devs\workspace\tiles-site\src\site\xdoc\images"
-   sodipodi:docname="page_to_page.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="C:\Documents and Settings\Administrator\Documenti\devs\workspace\tiles-site\src\site\xdoc\images\page_to_page.png"
-   inkscape:export-xdpi="45.738995"
-   inkscape:export-ydpi="45.738995">
-  <defs
-     id="defs17458">
-    <marker
-       inkscape:stockid="Arrow1Lstart"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lstart"
-       style="overflow:visible">
-      <path
-         id="path10215"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
-         transform="scale(0.8) translate(12.5,0)" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0.0"
-       refX="0.0"
-       id="Arrow1Lend"
-       style="overflow:visible;">
-      <path
-         id="path10218"
-         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
-         transform="scale(0.8) rotate(180) translate(12.5,0)" />
-    </marker>
-    <filter
-       y="-0.11950515"
-       x="-0.025476923"
-       height="1.2390103"
-       inkscape:collect="always"
-       id="filter16368"
-       width="1.0509538">
-      <feGaussianBlur
-         stdDeviation="5.9752577"
-         id="feGaussianBlur16370"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       y="-0.026283871"
-       x="-0.10446155"
-       height="1.0525677"
-       inkscape:collect="always"
-       id="filter16360"
-       width="1.2089231">
-      <feGaussianBlur
-         stdDeviation="5.7574194"
-         id="feGaussianBlur16362"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       id="filter16364"
-       inkscape:collect="always">
-      <feGaussianBlur
-         stdDeviation="8.1709926"
-         id="feGaussianBlur16366"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       y="-0.1026308"
-       x="-0.026569395"
-       height="1.2052616"
-       inkscape:collect="always"
-       id="filter15383"
-       width="1.0531388">
-      <feGaussianBlur
-         stdDeviation="6.2311555"
-         id="feGaussianBlur15385"
-         inkscape:collect="always" />
-    </filter>
-    <linearGradient
-       id="linearGradient9013">
-      <stop
-         offset="0"
-         style="stop-color:#0000f1;stop-opacity:1;"
-         id="stop9015" />
-      <stop
-         offset="1"
-         style="stop-color:#0000e7;stop-opacity:1;"
-         id="stop9017" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient9013"
-       id="linearGradient3270"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-85.176716,-201.15627)"
-       x1="100"
-       y1="179.50504"
-       x2="662.85712"
-       y2="179.50504" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient9013"
-       id="linearGradient3293"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="translate(-85.176716,-201.15627)"
-       x1="100"
-       y1="179.50504"
-       x2="662.85712"
-       y2="179.50504" />
-  </defs>
-  <sodipodi:namedview
-     inkscape:document-units="mm"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.73377778"
-     inkscape:cx="526.18109"
-     inkscape:cy="372.04724"
-     inkscape:current-layer="layer1"
-     id="namedview17460"
-     inkscape:window-width="1024"
-     inkscape:window-height="742"
-     inkscape:window-x="-4"
-     inkscape:window-y="-4" />
-  <metadata
-     id="metadata17462">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <rect
-       width="562.85712"
-       id="rect2164"
-       style="fill:url(#linearGradient3270);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter15383)"
-       height="145.71428"
-       x="14.823284"
-       y="-94.508362"
-       ry="39.891556"
-       rx="39.891556"
-       transform="matrix(0.5314768,0,0,0.5314768,61.511991,173.91617)" />
-    <rect
-       width="408.08701"
-       id="rect2160"
-       style="fill:#a56f63;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.97929907px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16364)"
-       height="525.74072"
-       x="169.61116"
-       y="68.342117"
-       ry="47.144566"
-       rx="47.144566"
-       transform="matrix(0.5314768,0,0,0.5314768,61.511991,173.91617)" />
-    <rect
-       width="132.27649"
-       id="rect2166"
-       style="fill:#a42ae3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99249059px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16360)"
-       height="525.71429"
-       x="14.81953"
-       y="68.34877"
-       ry="36.265053"
-       rx="36.265053"
-       transform="matrix(0.5314768,0,0,0.5314768,61.511991,173.91617)" />
-    <rect
-       width="562.8866"
-       id="rect2168"
-       style="fill:#d34ba1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.98513663px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16368)"
-       height="120"
-       x="14.815853"
-       y="614.06311"
-       ry="43.518063"
-       rx="43.518063"
-       transform="matrix(0.5314768,0,0,0.5314768,61.511991,173.91617)" />
-    <rect
-       width="335.80774"
-       id="rect2178"
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01408041;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       height="471.15994"
-       x="50.299847"
-       y="108.69428"
-       ry="0"
-       rx="0" />
-    <text
-       x="155.08797"
-       y="173.56755"
-       id="text9029"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="155.08797"
-         y="173.56755"
-         id="tspan9031"
-         sodipodi:role="line">Header</tspan></text>
-    <text
-       x="174.85722"
-       y="255.69447"
-       id="text12917"
-       style="font-size:32.03010941px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan18497"
-         x="174.85722"
-         y="255.69447">Body 1</tspan></text>
-    <text
-       inkscape:transform-center-x="-61.281104"
-       xml:space="preserve"
-       inkscape:transform-center-y="218.68718"
-       id="text12921"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="-389.19147"
-       y="113.1748"
-       transform="matrix(0,-1,1,0,0,0)"><tspan
-         x="-389.19147"
-         y="113.1748"
-         id="tspan12923"
-         sodipodi:role="line">Menu</tspan></text>
-    <text
-       x="170.38945"
-       y="539.88239"
-       id="text12925"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="170.38945"
-         y="539.88239"
-         id="tspan12927"
-         sodipodi:role="line">Footer</tspan></text>
-    <text
-       x="54.635624"
-       y="100.42758"
-       id="text12929"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="54.635624"
-         y="100.42758"
-         id="tspan12931"
-         sodipodi:role="line">Template</tspan></text>
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 371.94791,611.12074 L 22.947911,611.12074 L 22.947911,57.120742 L 418.94791,57.120742 L 418.94791,562.12074"
-       id="rect2193"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#e0cdda;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.95418596;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 417.97082,562.3824 L 372.54218,611.05262 C 380.85914,591.75202 374.67472,574.86832 367.26476,558.18888 C 385.05185,567.20981 390.43537,571.137 417.97082,562.3824 z "
-       id="path2208"
-       sodipodi:nodetypes="cccc" />
-    <text
-       x="20.474751"
-       y="45.45446"
-       id="text3182"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="20.474751"
-         y="45.45446"
-         id="tspan3184"
-         sodipodi:role="line">Page 1</tspan></text>
-    <rect
-       width="562.85712"
-       id="rect3186"
-       style="fill:url(#linearGradient3293);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter15383)"
-       height="145.71428"
-       x="14.823284"
-       y="-94.508362"
-       ry="39.891556"
-       rx="39.891556"
-       transform="matrix(0.5314768,0,0,0.5314768,665.06438,174.33843)" />
-    <rect
-       width="408.08701"
-       id="rect3188"
-       style="fill:#d24d31;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.97929907px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16364)"
-       height="525.74072"
-       x="169.61116"
-       y="68.342117"
-       ry="47.144566"
-       rx="47.144566"
-       transform="matrix(0.5314768,0,0,0.5314768,665.06438,174.33843)" />
-    <rect
-       width="132.27649"
-       id="rect3190"
-       style="fill:#a42ae3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99249059px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16360)"
-       height="525.71429"
-       x="14.81953"
-       y="68.34877"
-       ry="36.265053"
-       rx="36.265053"
-       transform="matrix(0.5314768,0,0,0.5314768,665.06438,174.33843)" />
-    <rect
-       width="562.8866"
-       id="rect3192"
-       style="fill:#d34ba1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.98513663px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16368)"
-       height="120"
-       x="14.815853"
-       y="614.06311"
-       ry="43.518063"
-       rx="43.518063"
-       transform="matrix(0.5314768,0,0,0.5314768,665.06438,174.33843)" />
-    <rect
-       width="335.80774"
-       id="rect3194"
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.01408041;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       height="471.15994"
-       x="653.85223"
-       y="109.11654"
-       ry="0"
-       rx="0" />
-    <text
-       x="758.64038"
-       y="173.98979"
-       id="text3196"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="758.64038"
-         y="173.98979"
-         id="tspan3198"
-         sodipodi:role="line">Header</tspan></text>
-    <text
-       x="811.11707"
-       y="352.87628"
-       id="text3200"
-       style="font-size:32.03010941px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         x="811.11707"
-         y="352.87628"
-         id="tspan3314">Body 2</tspan></text>
-    <text
-       inkscape:transform-center-x="-61.281104"
-       xml:space="preserve"
-       inkscape:transform-center-y="218.68718"
-       id="text3204"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="-389.61377"
-       y="716.72717"
-       transform="matrix(0,-1,1,0,0,0)"><tspan
-         x="-389.61377"
-         y="716.72717"
-         id="tspan3206"
-         sodipodi:role="line">Menu</tspan></text>
-    <text
-       x="773.94183"
-       y="540.30469"
-       id="text3208"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="773.94183"
-         y="540.30469"
-         id="tspan3210"
-         sodipodi:role="line">Footer</tspan></text>
-    <text
-       x="658.18799"
-       y="100.84985"
-       id="text3212"
-       style="font-size:32.03010941px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="658.18799"
-         y="100.84985"
-         id="tspan3214"
-         sodipodi:role="line">Template</tspan></text>
-    <path
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 975.5003,611.543 L 626.5003,611.543 L 626.5003,57.543004 L 1022.5003,57.543004 L 1022.5003,562.543"
-       id="path3216"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="fill:#e0cdda;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.95418596;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 1021.5232,562.80466 L 976.09457,611.47488 C 984.41153,592.17428 978.22711,575.29058 970.81715,558.61114 C 988.60424,567.63207 993.98776,571.55926 1021.5232,562.80466 z "
-       id="path3218"
-       sodipodi:nodetypes="cccc" />
-    <text
-       x="624.0271"
-       y="45.876732"
-       id="text3220"
-       style="font-size:32.03010941px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan3226"
-         x="624.0271"
-         y="45.876732">Page 2</tspan></text>
-    <g
-       id="g7251"
-       transform="translate(-24.530587,0)">
-      <text
-         sodipodi:linespacing="125%"
-         xml:space="preserve"
-         style="font-size:22.17276764px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-         id="text4326"
-         y="336.59854"
-         x="189.11517"><tspan
-           y="336.59854"
-           x="189.11517"
-           id="tspan4328"
-           sodipodi:role="line">Link to Page 2</tspan></text>
-      <path
-         id="path4338"
-         d="M 190.79346,343.42822 C 195.47152,343.42822 209.08858,343.42822 218.04967,343.42822 C 225.31799,343.42822 232.58631,343.42822 239.85463,343.42822 C 247.12295,343.42822 254.39128,343.42822 261.6596,343.42822 C 269.38219,343.42822 277.10478,343.42822 284.82738,343.42822 C 292.54997,343.42822 300.27256,343.42822 307.99515,343.42822 C 314.8092,343.42822 321.62326,343.42822 328.43731,343.42822 C 333.88855,343.42822 339.33979,343.42822 344.79103,343.42822"
-         style="fill:none;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.06220484;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
-    </g>
-    <path
-       style="opacity:1;fill:#2e54e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.84306264;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       d="M 596.5625 312.96875 L 596.5625 325.4375 L 322.71875 325.4375 L 322.71875 331.4375 L 596.5625 331.4375 L 596.5625 343.71875 L 623.1875 328.34375 L 596.5625 312.96875 z "
-       id="rect14612" />
-  </g>
-</svg>
diff --git a/TILES_3_0_X/src/site/xdoc/images/tiled_page.svg b/TILES_3_0_X/src/site/xdoc/images/tiled_page.svg
deleted file mode 100644
index 7fe04ff..0000000
--- a/TILES_3_0_X/src/site/xdoc/images/tiled_page.svg
+++ /dev/null
@@ -1,277 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="744.09448819"
-   height="1052.3622047"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="C:\Documents and Settings\Administrator\Documenti\devs\workspace\tiles-site\src\site\xdoc\images"
-   sodipodi:docname="tiled_page.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="C:\Documents and Settings\PTRNTN77A26E506O\Documenti\disegno.png"
-   inkscape:export-xdpi="23.716087"
-   inkscape:export-ydpi="23.716087">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="0.51883278"
-     inkscape:cx="372.04724"
-     inkscape:cy="526.18109"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     inkscape:window-width="1024"
-     inkscape:window-height="742"
-     inkscape:window-x="-4"
-     inkscape:window-y="-4"
-     showguides="true"
-     showgrid="false"
-     width="131.10236px"
-     height="184.25197px" />
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient9013">
-      <stop
-         offset="0"
-         style="stop-color:#0000f1;stop-opacity:1;"
-         id="stop9015" />
-      <stop
-         offset="1"
-         style="stop-color:#0000e7;stop-opacity:1;"
-         id="stop9017" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient6077">
-      <stop
-         offset="0"
-         style="stop-color:#0000ff;stop-opacity:1;"
-         id="stop6079" />
-      <stop
-         offset="0.125"
-         style="stop-color:#0000ff;stop-opacity:0.8745098;"
-         id="stop7064" />
-      <stop
-         offset="0.25"
-         style="stop-color:#0000ff;stop-opacity:0.74901961;"
-         id="stop6091" />
-      <stop
-         offset="0.5"
-         style="stop-color:#0000ff;stop-opacity:0.49803922;"
-         id="stop6089" />
-      <stop
-         offset="1"
-         style="stop-color:#0000ff;stop-opacity:0;"
-         id="stop6081" />
-    </linearGradient>
-    <linearGradient
-       x2="662.85712"
-       y2="179.50504"
-       inkscape:collect="always"
-       x1="100"
-       id="linearGradient9019"
-       y1="179.50504"
-       xlink:href="#linearGradient9013"
-       gradientUnits="userSpaceOnUse" />
-    <filter
-       y="-0.1026308"
-       x="-0.026569395"
-       height="1.2052616"
-       inkscape:collect="always"
-       id="filter15383"
-       width="1.0531388">
-      <feGaussianBlur
-         stdDeviation="6.2311555"
-         id="feGaussianBlur15385"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       y="-0.026283871"
-       x="-0.10446155"
-       height="1.0525677"
-       inkscape:collect="always"
-       id="filter16360"
-       width="1.2089231">
-      <feGaussianBlur
-         stdDeviation="5.7574194"
-         id="feGaussianBlur16362"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       id="filter16364"
-       inkscape:collect="always">
-      <feGaussianBlur
-         stdDeviation="8.1709926"
-         id="feGaussianBlur16366"
-         inkscape:collect="always" />
-    </filter>
-    <filter
-       y="-0.11950515"
-       x="-0.025476923"
-       height="1.2390103"
-       inkscape:collect="always"
-       id="filter16368"
-       width="1.0509538">
-      <feGaussianBlur
-         stdDeviation="5.9752577"
-         id="feGaussianBlur16370"
-         inkscape:collect="always" />
-    </filter>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient9013"
-       id="linearGradient16485"
-       gradientUnits="userSpaceOnUse"
-       x1="100"
-       y1="179.50504"
-       x2="662.85712"
-       y2="179.50504" />
-  </defs>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Livello 1"
-     id="layer1"
-     inkscape:groupmode="layer">
-    <rect
-       width="562.85712"
-       id="rect2164"
-       style="fill:url(#linearGradient16485);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter15383)"
-       height="145.71428"
-       x="100"
-       y="106.6479"
-       ry="21.201435"
-       rx="21.201435" />
-    <rect
-       width="408.08701"
-       id="rect2160"
-       style="fill:#a56f63;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.97929907px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16364)"
-       height="525.74072"
-       x="254.78787"
-       y="269.49838"
-       ry="25.056242"
-       rx="25.056242" />
-    <rect
-       width="132.27649"
-       id="rect2166"
-       style="fill:#a42ae3;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99249059px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16360)"
-       height="525.71429"
-       x="99.996246"
-       y="269.50504"
-       ry="19.274033"
-       rx="19.274033" />
-    <rect
-       width="562.8866"
-       id="rect2168"
-       style="fill:#d34ba1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.98513663px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter16368)"
-       height="120"
-       x="99.992569"
-       y="815.21936"
-       ry="23.128839"
-       rx="23.128839" />
-    <rect
-       width="631.83899"
-       id="rect2178"
-       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.90804267;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       height="886.51086"
-       x="64.080521"
-       y="78.438026"
-       ry="22.219292"
-       rx="21.853825" />
-    <text
-       x="261.2446"
-       y="200.50032"
-       id="text9029"
-       style="font-size:60.2662468px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="261.2446"
-         y="200.50032"
-         id="tspan9031"
-         sodipodi:role="line">Header</tspan></text>
-    <text
-       x="378.79764"
-       y="537.08411"
-       id="text12917"
-       style="font-size:60.2662468px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="378.79764"
-         y="537.08411"
-         id="tspan12919"
-         sodipodi:role="line">Body</tspan></text>
-    <text
-       inkscape:transform-center-x="-29.162036"
-       xml:space="preserve"
-       inkscape:transform-center-y="-34.693259"
-       id="text12921"
-       style="font-size:60.2662468px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="-606.20746"
-       y="182.38286"
-       transform="matrix(0,-1,1,0,0,0)"><tspan
-         x="-606.20746"
-         y="182.38286"
-         id="tspan12923"
-         sodipodi:role="line">Menu</tspan></text>
-    <text
-       x="290.0351"
-       y="889.73987"
-       id="text12925"
-       style="font-size:60.2662468px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="290.0351"
-         y="889.73987"
-         id="tspan12927"
-         sodipodi:role="line">Footer</tspan></text>
-    <text
-       x="72.238495"
-       y="62.883839"
-       id="text12929"
-       style="font-size:60.2662468px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       xml:space="preserve"><tspan
-         x="72.238495"
-         y="62.883839"
-         id="tspan12931"
-         sodipodi:role="line">Template</tspan></text>
-  </g>
-</svg>
diff --git a/TILES_3_0_X/tiles-api/pom.xml b/TILES_3_0_X/tiles-api/pom.xml
deleted file mode 100644
index ece72cc..0000000
--- a/TILES_3_0_X/tiles-api/pom.xml
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <parent>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-parent</artifactId>
-        <version>3.0.1</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-    <artifactId>tiles-api</artifactId>
-    <packaging>jar</packaging>
-    <name>Tiles - API</name>
-    <description>Tiles APIs, containing interfaces and classes to interact with
-    Tiles.</description>
-
-    <properties>
-        <tiles.osgi.symbolicName>org.apache.tiles.api</tiles.osgi.symbolicName>
-    </properties>
-
-    <build>
-
-        <resources>
-            <resource>
-                <directory>src/main/resources</directory>
-                <excludes>
-                    <exclude>LICENSE.txt</exclude>
-                    <exclude>NOTICE.txt</exclude>
-                </excludes>
-            </resource>
-            <resource>
-                <directory>src/main/resources</directory>
-                <includes>
-                    <include>LICENSE.txt</include>
-                    <include>NOTICE.txt</include>
-                </includes>
-                <targetPath>META-INF</targetPath>
-            </resource>
-        </resources>
-
-    </build>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-              <groupId>junit</groupId>
-              <artifactId>junit</artifactId>
-              <scope>test</scope>
-          </dependency>
-        <dependency>
-              <groupId>org.easymock</groupId>
-              <artifactId>easymockclassextension</artifactId>
-              <scope>test</scope>
-          </dependency>
-        <dependency>
-        	<groupId>org.slf4j</groupId>
-        	<artifactId>slf4j-jdk14</artifactId>
-        	<optional>true</optional>
-        </dependency>
-        <dependency>
-        	<groupId>org.apache.tiles</groupId>
-        	<artifactId>tiles-request-api</artifactId>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Attribute.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Attribute.java
deleted file mode 100644
index ee0652c..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Attribute.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.apache.tiles.CompareUtil.*;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Common implementation of attribute definition.
- *
- * @version $Rev$ $Date$
- */
-public class Attribute implements Serializable, Cloneable {
-
-    /**
-     * The name of the template renderer.
-     */
-    private static final String TEMPLATE_RENDERER = "template";
-
-    /**
-     * The roles that can render this attribute.
-     * @since 2.0.6
-     */
-    protected Set<String> roles = null;
-
-    /**
-     * The value of the attribute.
-     */
-    protected Object value = null;
-
-    /**
-     * The expression to evaluate. Ignored if {@link #value} is not
-     * <code>null</code>.
-     *
-     * @since 2.2.0
-     */
-    protected Expression expressionObject = null;
-
-    /**
-     * The renderer name of the attribute. Default names are <code>string</code>,
-     * <code>template</code>, <code>definition</code>, <code>object</code>.
-     */
-    private String renderer = null;
-
-    /**
-     * Constructor.
-     *
-     */
-    public Attribute() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param value Object to store.
-     */
-    public Attribute(Object value) {
-        this.value = value;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param attribute The attribute to copy from.
-     */
-    public Attribute(Attribute attribute) {
-        this.roles = attribute.roles;
-        this.value = attribute.getValue();
-        if (attribute.expressionObject != null) {
-            this.expressionObject = new Expression(attribute.expressionObject);
-        } else {
-            this.expressionObject = null;
-        }
-        this.renderer = attribute.renderer;
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param value Object to store.
-     * @param role  Asociated role.
-     */
-    public Attribute(Object value, String role) {
-        this.value = value;
-        setRole(role);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param value Object to store. If specified, the <code>expression</code>
-     * parameter will be ignored.
-     * @param expression The expression to be evaluated. Ignored if the
-     * <code>value</code> is not null.
-     * @param role Associated role.
-     * @param rendererName The renderer name.
-     * @since 2.2.0
-     */
-    public Attribute(Object value, Expression expression, String role, String rendererName) {
-        this.value = value;
-        this.expressionObject = expression;
-        this.renderer = rendererName;
-        setRole(role);
-    }
-
-    /**
-     * Creates a template attribute, starting from the name of the template.
-     *
-     * @param template The template that will be rendered.
-     * @return The template attribute.
-     * @since 2.1.2
-     */
-    public static Attribute createTemplateAttribute(String template) {
-        Attribute attribute = new Attribute();
-        attribute.setValue(template);
-        attribute.setRenderer(TEMPLATE_RENDERER);
-        return attribute;
-    }
-
-    /**
-     * Creates a template attribute, starting from the name of the template.
-     *
-     * @param template The template that will be rendered.
-     * @param templateExpression The template expression that will be evaluated
-     * to a template.
-     * @param templateType The type, or renderer, of the template. If null, the
-     * default <code>template</code> will be used.
-     * @param role The comma-separated roles for which the template is
-     * authorized to be rendered.
-     * @return The template attribute.
-     * @since 2.2.2
-     */
-    public static Attribute createTemplateAttribute(String template,
-            String templateExpression, String templateType, String role) {
-        Attribute templateAttribute = createTemplateAttribute(template);
-        templateAttribute.setRole(role);
-        if (templateType != null) {
-            templateAttribute.setRenderer(templateType);
-        }
-        templateAttribute
-                .setExpressionObject(Expression
-                        .createExpressionFromDescribedExpression(templateExpression));
-        return templateAttribute;
-    }
-
-    /**
-     * Creates a template attribute, starting from the expression to evaluate to
-     * obtain the template.
-     *
-     * @param templateExpression The expression to evaluate.
-     * @return The template attribute.
-     * @since 2.1.2
-     */
-    public static Attribute createTemplateAttributeWithExpression(
-            String templateExpression) {
-        Attribute attribute = new Attribute();
-        attribute.setExpressionObject(new Expression(templateExpression));
-        attribute.setRenderer(TEMPLATE_RENDERER);
-        return attribute;
-    }
-
-    /**
-     * Get role.
-     * @return the name of the required role(s)
-     */
-    public String getRole() {
-        String retValue = null;
-
-        if (roles != null && !roles.isEmpty()) {
-            StringBuilder builder = new StringBuilder();
-            Iterator<String> roleIt = roles.iterator();
-            if (roleIt.hasNext()) {
-                builder.append(roleIt.next());
-                while (roleIt.hasNext()) {
-                    builder.append(",");
-                    builder.append(roleIt.next());
-                }
-                retValue = builder.toString();
-            }
-        }
-
-        return retValue;
-    }
-
-    /**
-     * Returns the roles that can render this attribute.
-     *
-     * @return The enabled roles.
-     * @since 2.0.6
-     */
-    public Set<String> getRoles() {
-        return roles;
-    }
-
-    /**
-     * Set role.
-     *
-     * @param role Associated role.
-     */
-    public void setRole(String role) {
-        if (role != null && role.trim().length() > 0) {
-            String[] rolesStrings = role.split("\\s*,\\s*");
-            roles = new HashSet<String>();
-            for (int i = 0; i < rolesStrings.length; i++) {
-                roles.add(rolesStrings[i]);
-            }
-        } else {
-            roles = null;
-        }
-    }
-
-    /**
-     * Sets the roles that can render this attribute.
-     *
-     * @param roles The enabled roles.
-     * @since 2.0.6
-     */
-    public void setRoles(Set<String> roles) {
-        this.roles = roles;
-    }
-
-    /**
-     * Get value.
-     * @return the value
-     */
-    public Object getValue() {
-        return value;
-    }
-
-    /**
-     * Set value.
-     *
-     * @param value New value.
-     */
-    public void setValue(Object value) {
-        this.value = value;
-    }
-
-    /**
-     * Returns The expression to evaluate. Ignored if {@link #value} is not
-     * <code>null</code>.
-     *
-     * @return The expression to be evaluated.
-     * @since 2.2.0
-     */
-    public Expression getExpressionObject() {
-        return expressionObject;
-    }
-
-    /**
-     * Sets The expression to evaluate. Ignored if {@link #value} is not
-     * <code>null</code>.
-     *
-     * @param expressionObject The expression to be evaluated.
-     * @since 2.2.0
-     */
-    public void setExpressionObject(Expression expressionObject) {
-        this.expressionObject = expressionObject;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        if (value != null) {
-            return value.toString();
-        }
-        return null;
-    }
-
-    /**
-     * Returns the renderer name to use.
-     *
-     * @return The renderer name.
-     * @since 2.1.0
-     */
-    public String getRenderer() {
-        return renderer;
-    }
-
-    /**
-     * Sets the renderer name to use.
-     *
-     * @param rendererName The renderer.
-     * @since 2.1.0
-     */
-    public void setRenderer(String rendererName) {
-        this.renderer = rendererName;
-    }
-
-    /**
-     * Inherits an attribute, i.e. overwrites null properties with the ones
-     * provided by the attribute.
-     *
-     * @param attribute The attribute to inherit.
-     * @since 2.1.2
-     */
-    public void inherit(Attribute attribute) {
-        if (value == null) {
-            value = attribute.getValue();
-        }
-        Expression targetExpressionObject = attribute.getExpressionObject();
-        if (targetExpressionObject != null
-                && (expressionObject == null || expressionObject
-                        .getExpression() == null)) {
-            expressionObject = new Expression(targetExpressionObject);
-        }
-        if (roles == null || roles.isEmpty()) {
-            roles = attribute.getRoles();
-        }
-        if (renderer == null) {
-            renderer = attribute.getRenderer();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object obj) {
-        Attribute attribute = (Attribute) obj;
-        return nullSafeEquals(value, attribute.value)
-                && nullSafeEquals(renderer, attribute.renderer)
-                && nullSafeEquals(roles, attribute.roles)
-                && nullSafeEquals(expressionObject, attribute.expressionObject);
-    }
-
-    /**
-     * Checks if the current user can use this attribute.
-     *
-     * @param request The request context.
-     * @return <code>true</code> if the current user can see this attribute.
-     * @since 3.0.0
-     */
-    public boolean isPermitted(Request request) {
-        if (roles == null || roles.isEmpty()) {
-            return true;
-        }
-
-        boolean retValue = false;
-
-        for (Iterator<String> roleIt = roles.iterator(); roleIt.hasNext()
-                && !retValue;) {
-            retValue = request.isUserInRole(roleIt.next());
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return nullSafeHashCode(value) + nullSafeHashCode(renderer)
-                + nullSafeHashCode(roles) + nullSafeHashCode(expressionObject);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Attribute clone() {
-        return new Attribute(this);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/AttributeContext.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/AttributeContext.java
deleted file mode 100644
index ab899ec..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/AttributeContext.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Encapsulation of the current state of execution.
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public interface AttributeContext {
-
-    /**
-     * Returns the attribute that will be used to render a template.
-     *
-     * @return The template attribute.
-     * @since 2.1.2
-     */
-    Attribute getTemplateAttribute();
-
-    /**
-     * Sets the template attribute, that will be used to render the template
-     * page.
-     *
-     * @param templateAttribute The template attribute.
-     * @since 2.1.2
-     */
-    void setTemplateAttribute(Attribute templateAttribute);
-
-    /**
-     * Get associated preparer instance.
-     *
-     * @return The preparer name.
-     * @since 2.1.0
-     */
-    String getPreparer();
-
-    /**
-     * Set associated preparer instance.
-     *
-     * @param url The preparer name.
-     * @since 2.1.0
-     */
-    void setPreparer(String url);
-
-    /**
-     * Add all attributes to the context.
-     *
-     * @param newAttributes the attributes to be added.
-     */
-    void addAll(Map<String, Attribute> newAttributes);
-
-    /**
-     * Add all attributes to the context.
-     *
-     * @param defaultAttributes attributes which should be present.
-     */
-    void addMissing(Map<String, Attribute> defaultAttributes);
-
-    /**
-     * Copies the cascaded attributes to this attribute context.
-     *
-     * @param parent The parent context to be used.
-     * @since 2.1.0
-     */
-    void inheritCascadedAttributes(AttributeContext parent);
-
-    /**
-     * Copies all missing attributes from the <code>parent</code> attribute
-     * context to this one.
-     *
-     * @param parent The attribute context to copy attributes from.
-     * @since 2.1.0
-     */
-    void inherit(AttributeContext parent);
-
-    /**
-     * Retrieve the named attribute, either cascaded or not.
-     *
-     * @param name key name for the attribute.
-     * @return Attribute associated with the given name.
-     */
-    Attribute getAttribute(String name);
-
-    /**
-     * Retrieve the attribute that has been defined in this context (i.e. not
-     * cascaded).
-     *
-     * @param name key name for the attribute.
-     * @return Attribute The local attribute associated with the given name, if
-     * present, or <code>null</code> otherwise.
-     * @since 2.1.0
-     */
-    Attribute getLocalAttribute(String name);
-
-    /**
-     * Retrieve the attribute that has been cascaded at upper levels.
-     *
-     * @param name key name for the attribute.
-     * @return Attribute The cascaded attribute associated with the given name,
-     * if present, or <code>null</code> otherwise.
-     * @since 2.1.0
-     */
-    Attribute getCascadedAttribute(String name);
-
-    /**
-     * Returns the names of the local attributes, i.e. the one that have not
-     * been cascaded.
-     *
-     * @return The local attribute names.
-     * @since 2.1.0
-     */
-    Set<String> getLocalAttributeNames();
-
-    /**
-     * Returns the names of the cascaded attributes.
-     *
-     * @return The cascaded attribute names.
-     * @since 2.1.0
-     */
-    Set<String> getCascadedAttributeNames();
-
-    /**
-     * Add the specified attribute. The attribute value will be available only
-     * in the current context, i.e. it is like calling
-     * {@link AttributeContext#putAttribute(String, Attribute, boolean)} with
-     * <code>cascade = false</code>.
-     *
-     * @param name name of the attribute
-     * @param value value of the attribute
-     */
-    void putAttribute(String name, Attribute value);
-
-    /**
-     * Add the specified attribute.
-     *
-     * @param name name of the attribute
-     * @param value value of the attribute
-     * @param cascade If <code>true</code>, the attribute value will be
-     * available in all nested contexts. If <code>false</code>, it will be
-     * available only in the current context.
-     * @since 2.1.0
-     */
-    void putAttribute(String name, Attribute value, boolean cascade);
-
-    /**
-     * Clear the attributes.
-     */
-    void clear();
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java
deleted file mode 100644
index d6cfc7f..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/BasicAttributeContext.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.apache.tiles.CompareUtil.*;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-
-/**
- * Basic implementation for <code>AttributeContext</code>.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class BasicAttributeContext implements AttributeContext, Serializable {
-
-    /**
-     * The template attribute, to render a template.
-     *
-     * @since 2.1.2
-     */
-    protected Attribute templateAttribute;
-
-    /**
-     * Associated ViewPreparer URL or classname, if defined.
-     *
-     * @since 2.1.0
-     */
-    protected String preparer = null;
-
-    /**
-     * Template attributes.
-     * @since 2.1.0
-     */
-    protected Map<String, Attribute> attributes = null;
-
-    /**
-     * Cascaded template attributes.
-     * @since 2.1.0
-     */
-    protected Map<String, Attribute> cascadedAttributes = null;
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public BasicAttributeContext() {
-    }
-
-    /**
-     * Constructor.
-     * Create a context and set specified attributes.
-     *
-     * @param attributes Attributes to initialize context.
-     * @since 2.1.0
-     */
-    public BasicAttributeContext(Map<String, Attribute> attributes) {
-        if (attributes != null) {
-            this.attributes = deepCopyAttributeMap(attributes);
-        }
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param context The constructor to copy.
-     * @since 2.1.0
-     */
-    public BasicAttributeContext(AttributeContext context) {
-        if (context instanceof BasicAttributeContext) {
-            copyBasicAttributeContext((BasicAttributeContext) context);
-        } else {
-            Attribute parentTemplateAttribute = context.getTemplateAttribute();
-            if (parentTemplateAttribute != null) {
-                this.templateAttribute = new Attribute(parentTemplateAttribute);
-            }
-            this.preparer = context.getPreparer();
-            this.attributes = new HashMap<String, Attribute>();
-            Set<String> parentAttributeNames = context.getLocalAttributeNames();
-            if (parentAttributeNames != null) {
-                for (String name : parentAttributeNames) {
-                    attributes.put(name, new Attribute(context.getLocalAttribute(name)));
-                }
-            }
-            inheritCascadedAttributes(context);
-        }
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param context The constructor to copy.
-     * @since 2.1.0
-     */
-    public BasicAttributeContext(BasicAttributeContext context) {
-        copyBasicAttributeContext(context);
-    }
-
-    /** {@inheritDoc} */
-    public Attribute getTemplateAttribute() {
-        return templateAttribute;
-    }
-
-    /** {@inheritDoc} */
-    public void setTemplateAttribute(Attribute templateAttribute) {
-        this.templateAttribute = templateAttribute;
-    }
-
-    /** {@inheritDoc} */
-    public String getPreparer() {
-        return preparer;
-    }
-
-    /** {@inheritDoc} */
-    public void setPreparer(String url) {
-        this.preparer = url;
-    }
-
-    /** {@inheritDoc} */
-    public void inheritCascadedAttributes(AttributeContext context) {
-        if (context instanceof BasicAttributeContext) {
-            copyCascadedAttributes((BasicAttributeContext) context);
-        } else {
-            this.cascadedAttributes = new HashMap<String, Attribute>();
-            Set<String> parentAttributeNames = context.getCascadedAttributeNames();
-            if (parentAttributeNames != null) {
-                for (String name : parentAttributeNames) {
-                    cascadedAttributes.put(name, new Attribute(context
-                            .getCascadedAttribute(name)));
-                }
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void inherit(AttributeContext parent) {
-        if (parent instanceof BasicAttributeContext) {
-            inherit((BasicAttributeContext) parent);
-        } else {
-            // Inheriting template, roles and preparer.
-            Attribute parentTemplateAttribute = parent.getTemplateAttribute();
-            inheritParentTemplateAttribute(parentTemplateAttribute);
-            if (preparer == null) {
-                preparer = parent.getPreparer();
-            }
-
-            // Inheriting attributes.
-            Set<String> names = parent.getCascadedAttributeNames();
-            if (names != null && !names.isEmpty()) {
-                for (String name : names) {
-                    Attribute attribute = parent.getCascadedAttribute(name);
-                    Attribute destAttribute = getCascadedAttribute(name);
-                    if (destAttribute == null) {
-                        putAttribute(name, attribute, true);
-                    } else if (attribute instanceof ListAttribute
-                            && destAttribute instanceof ListAttribute
-                            && ((ListAttribute) destAttribute).isInherit()) {
-                        ((ListAttribute) destAttribute).inherit((ListAttribute) attribute);
-                    }
-                }
-            }
-            names = parent.getLocalAttributeNames();
-            if (names != null && !names.isEmpty()) {
-                for (String name : names) {
-                    Attribute attribute = parent.getLocalAttribute(name);
-                    Attribute destAttribute = getLocalAttribute(name);
-                    if (destAttribute == null) {
-                        putAttribute(name, attribute, false);
-                    } else if (attribute instanceof ListAttribute
-                            && destAttribute instanceof ListAttribute
-                            && ((ListAttribute) destAttribute).isInherit()) {
-                        ((ListAttribute) destAttribute).inherit((ListAttribute) attribute);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Inherits the attribute context, inheriting, i.e. copying if not present,
-     * the attributes.
-     *
-     * @param parent The attribute context to inherit.
-     * @since 2.1.0
-     */
-    public void inherit(BasicAttributeContext parent) {
-        // Set template, roles and preparer if not set.
-        inheritParentTemplateAttribute(parent.getTemplateAttribute());
-        if (preparer == null) {
-            preparer = parent.preparer;
-        }
-
-        // Sets attributes.
-        cascadedAttributes = addMissingAttributes(parent.cascadedAttributes,
-                cascadedAttributes);
-        attributes = addMissingAttributes(parent.attributes, attributes);
-    }
-
-    /**
-     * Add all attributes to this context.
-     * Copies all of the mappings from the specified attribute map to this context.
-     * New attribute mappings will replace any mappings that this context had for any of the keys
-     * currently in the specified attribute map.
-     *
-     * @param newAttributes Attributes to add.
-     * @since 2.1.0
-     */
-    public void addAll(Map<String, Attribute> newAttributes) {
-        if (newAttributes == null) {
-            return;
-        }
-
-        if (attributes == null) {
-            attributes = new HashMap<String, Attribute>(newAttributes);
-            return;
-        }
-
-        attributes.putAll(newAttributes);
-    }
-
-    /**
-     * Add all missing attributes to this context.
-     * Copies all of the mappings from the specified attributes map to this context.
-     * New attribute mappings will be added only if they don't already exist in
-     * this context.
-     *
-     * @param defaultAttributes Attributes to add.
-     * @since 2.1.0
-     */
-    public void addMissing(Map<String, Attribute> defaultAttributes) {
-        if (defaultAttributes == null) {
-            return;
-        }
-
-        if (attributes == null) {
-            attributes = new HashMap<String, Attribute>();
-            if (cascadedAttributes == null || cascadedAttributes.isEmpty()) {
-                attributes.putAll(defaultAttributes);
-                return;
-            }
-        }
-
-        Set<Map.Entry<String, Attribute>> entries = defaultAttributes.entrySet();
-        for (Map.Entry<String, Attribute> entry : entries) {
-            String key = entry.getKey();
-            if (!attributes.containsKey(key)
-                    && (cascadedAttributes == null || !cascadedAttributes
-                            .containsKey(key))) {
-                attributes.put(entry.getKey(), entry.getValue());
-            }
-        }
-    }
-
-    /** {@inheritDoc} */
-    public Attribute getAttribute(String name) {
-        Attribute retValue = null;
-        if (attributes != null) {
-            retValue = attributes.get(name);
-        }
-
-        if (retValue == null && cascadedAttributes != null) {
-            retValue = cascadedAttributes.get(name);
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    public Attribute getLocalAttribute(String name) {
-        if (attributes == null) {
-            return null;
-        }
-
-        return attributes.get(name);
-    }
-
-    /** {@inheritDoc} */
-    public Attribute getCascadedAttribute(String name) {
-        if (cascadedAttributes == null) {
-            return null;
-        }
-
-        return cascadedAttributes.get(name);
-    }
-
-    /** {@inheritDoc} */
-    public Set<String> getLocalAttributeNames() {
-        if (attributes != null && !attributes.isEmpty()) {
-            return attributes.keySet();
-        }
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    public Set<String> getCascadedAttributeNames() {
-        if (cascadedAttributes != null && !cascadedAttributes.isEmpty()) {
-            return cascadedAttributes.keySet();
-        }
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    public void putAttribute(String name, Attribute value) {
-        if (attributes == null) {
-            attributes = new HashMap<String, Attribute>();
-        }
-
-        attributes.put(name, value);
-    }
-
-    /** {@inheritDoc} */
-    public void putAttribute(String name, Attribute value, boolean cascade) {
-        Map<String, Attribute> mapToUse;
-        if (cascade) {
-            if (cascadedAttributes == null) {
-                cascadedAttributes = new HashMap<String, Attribute>();
-            }
-            mapToUse = cascadedAttributes;
-        } else {
-            if (attributes == null) {
-                attributes = new HashMap<String, Attribute>();
-            }
-            mapToUse = attributes;
-        }
-        mapToUse.put(name, value);
-    }
-
-    /** {@inheritDoc} */
-    public void clear() {
-        templateAttribute = null;
-        preparer = null;
-        attributes.clear();
-        cascadedAttributes.clear();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object obj) {
-        BasicAttributeContext bac = (BasicAttributeContext) obj;
-        return nullSafeEquals(templateAttribute, bac.templateAttribute)
-                && nullSafeEquals(preparer, bac.preparer)
-                && nullSafeEquals(attributes, bac.attributes)
-                && nullSafeEquals(cascadedAttributes, bac.cascadedAttributes);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return nullSafeHashCode(templateAttribute) + nullSafeHashCode(preparer)
-                + nullSafeHashCode(attributes)
-                + nullSafeHashCode(cascadedAttributes);
-    }
-
-    /**
-     * Inherits the parent template attribute.
-     *
-     * @param parentTemplateAttribute The parent template attribute.
-     */
-    private void inheritParentTemplateAttribute(
-            Attribute parentTemplateAttribute) {
-        if (parentTemplateAttribute != null) {
-            if (templateAttribute == null) {
-                templateAttribute = new Attribute(parentTemplateAttribute);
-            } else {
-                templateAttribute.inherit(parentTemplateAttribute);
-            }
-        }
-    }
-
-    /**
-     * Copies a BasicAttributeContext in an easier way.
-     *
-     * @param context The context to copy.
-     */
-    private void copyBasicAttributeContext(BasicAttributeContext context) {
-        Attribute parentTemplateAttribute = context.getTemplateAttribute();
-        if (parentTemplateAttribute != null) {
-            this.templateAttribute = new Attribute(parentTemplateAttribute);
-        }
-        preparer = context.preparer;
-        if (context.attributes != null && !context.attributes.isEmpty()) {
-            attributes = deepCopyAttributeMap(context.attributes);
-        }
-        copyCascadedAttributes(context);
-    }
-
-    /**
-     * Copies the cascaded attributes to the current context.
-     *
-     * @param context The context to copy from.
-     */
-    private void copyCascadedAttributes(BasicAttributeContext context) {
-        if (context.cascadedAttributes != null
-                && !context.cascadedAttributes.isEmpty()) {
-            cascadedAttributes = deepCopyAttributeMap(context.cascadedAttributes);
-        }
-    }
-
-    /**
-     * Adds missing attributes to the destination map.
-     *
-     * @param source The source attribute map.
-     * @param destination The destination attribute map.
-     * @return The destination attribute map if not null, a new one otherwise.
-     */
-    private Map<String, Attribute> addMissingAttributes(Map<String, Attribute> source,
-            Map<String, Attribute> destination) {
-        if (source != null && !source.isEmpty()) {
-            if (destination == null) {
-                destination = new HashMap<String, Attribute>();
-            }
-            for (Map.Entry<String, Attribute> entry : source.entrySet()) {
-                String key = entry.getKey();
-                Attribute destAttribute = destination.get(key);
-                if (destAttribute == null) {
-                    destination.put(key, entry.getValue());
-                } else if (destAttribute instanceof ListAttribute
-                        && entry.getValue() instanceof ListAttribute
-                        && ((ListAttribute) destAttribute).isInherit()) {
-                    ((ListAttribute) destAttribute)
-                            .inherit((ListAttribute) entry.getValue());
-                }
-            }
-        }
-
-        return destination;
-    }
-
-    /**
-     * Deep copies the attribute map, by creating clones (using copy
-     * constructors) of the attributes.
-     *
-     * @param attributes The attribute map to copy.
-     * @return The copied map.
-     */
-    private Map<String, Attribute> deepCopyAttributeMap(
-            Map<String, Attribute> attributes) {
-        Map<String, Attribute> retValue = new HashMap<String, Attribute>(attributes.size());
-        for (Map.Entry<String, Attribute> entry : attributes.entrySet()) {
-            Attribute toCopy = entry.getValue();
-            if (toCopy != null) {
-                retValue.put(entry.getKey(), toCopy.clone());
-            }
-        }
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/CompareUtil.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/CompareUtil.java
deleted file mode 100644
index a3cce93..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/CompareUtil.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-/**
- * Utilities to work with comparation between objects.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public final class CompareUtil {
-
-    /**
-     * Private constructor to avoid instantiation.
-     */
-    private CompareUtil() { }
-
-    /**
-     * Checks if two objects (eventually null) are the same. They are considered the same
-     * even if they are both null.
-     *
-     * @param obj1 The first object to check.
-     * @param obj2 The second object to check.
-     * @return <code>true</code> if the objects are the same.
-     * @since 2.2.0
-     */
-    public static boolean nullSafeEquals(Object obj1, Object obj2) {
-        if (obj1 != null) {
-            return obj1.equals(obj2);
-        }
-        return obj2 == null;
-    }
-
-    /**
-     * Returns <code>0</code> if the object is null, the hash code of the object
-     * otherwise.
-     *
-     * @param obj The object from which the hash code must be calculated..
-     * @return The hash code.
-     * @since 2.2.0
-     */
-    public static int nullSafeHashCode(Object obj) {
-        if (obj != null) {
-            return obj.hashCode();
-        }
-        return 0;
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Definition.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Definition.java
deleted file mode 100644
index 8584b2c..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Definition.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import static org.apache.tiles.CompareUtil.*;
-
-import java.util.Map;
-
-/**
- * A definition, i.e. a template with (completely or not) filled attributes.
- * Attributes of a template can be defined with the help of this class.<br>
- * It can be used as a data transfer object used for registering new
- * definitions with the Container.
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public class Definition extends BasicAttributeContext {
-    /**
-     * Extends attribute value.
-     */
-    protected String inherit;
-    /**
-     * Definition name.
-     */
-    protected String name = null;
-
-    /**
-     * Constructor.
-     */
-    public Definition() {
-    }
-
-    /**
-     * Copy Constructor.
-     * Create a new definition initialized with parent definition.
-     * Do a shallow copy : attributes are shared between copies, but not the Map
-     * containing attributes.
-     *
-     * @param definition The definition to copy.
-     */
-    public Definition(Definition definition) {
-        super(definition);
-        this.name = definition.name;
-        this.inherit = definition.inherit;
-    }
-
-    /**
-     * Constructor.
-     * @param name The name of the definition.
-     * @param templateAttribute The template attribute of the definition.
-     * @param attributes The attribute map of the definition.
-     *
-     * @since 2.1.2
-     */
-    public Definition(String name, Attribute templateAttribute,
-                               Map<String, Attribute> attributes) {
-        super(attributes);
-        this.name = name;
-        this.templateAttribute = templateAttribute;
-    }
-
-    /**
-     * Access method for the name property.
-     *
-     * @return the current value of the name property
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Sets the value of the name property.
-     *
-     * @param aName the new value of the name property
-     */
-    public void setName(String aName) {
-        name = aName;
-    }
-
-    /**
-     * Set extends.
-     *
-     * @param name Name of the extended definition.
-     */
-    public void setExtends(String name) {
-        inherit = name;
-    }
-
-    /**
-     * Get extends.
-     *
-     * @return Name of the extended definition.
-     */
-    public String getExtends() {
-        return inherit;
-    }
-
-
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object obj) {
-        Definition def = (Definition) obj;
-        return nullSafeEquals(name, def.name)
-                && nullSafeEquals(inherit, def.inherit) && super.equals(def);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return nullSafeHashCode(name) + nullSafeHashCode(inherit)
-                + super.hashCode();
-    }
-
-    /**
-     * Get extends flag.
-     *
-     * @return <code>true</code> if this definition extends another.
-     */
-    public boolean isExtending() {
-        return inherit != null;
-    }
-
-    /**
-     * Returns a description of the attributes.
-     *
-     * @return A string representation of the content of this definition.
-     */
-    @Override
-    public String toString() {
-        return "{name="
-            + name
-            + ", template="
-            + (templateAttribute != null ? templateAttribute.getValue() : "<null>")
-            + ", role="
-            + (templateAttribute != null ? templateAttribute.getRoles() : "<null>")
-            + ", preparerInstance="
-            + preparer
-            + ", attributes="
-            + attributes
-            + "}";
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Expression.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Expression.java
deleted file mode 100644
index 4b495af..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/Expression.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.apache.tiles.CompareUtil.*;
-
-/**
- * It is an expression, along with the expression language (e.g. EL, MVEL, OGNL)
- * it is expressed with.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class Expression {
-
-    /**
-     * The expression itself.
-     */
-    private String expression;
-
-    /**
-     * The language of the expression.
-     */
-    private String language;
-
-    /**
-     * Constructor.
-     *
-     * @param expression The expression itself.
-     * @param language The language of the expression.
-     * @since 2.2.0
-     */
-    public Expression(String expression, String language) {
-        this.expression = expression;
-        this.language = language;
-    }
-
-    /**
-     * Constructor, using the default (i.e. <code>null</code>) language.
-     *
-     * @param expression The expression itself.
-     * @since 2.2.0
-     */
-    public Expression(String expression) {
-        this(expression, null);
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param toCopy The expression to copy.
-     * @since 2.2.0
-     */
-    public Expression(Expression toCopy) {
-        this.expression = toCopy.expression;
-        this.language = toCopy.language;
-    }
-
-    /**
-     * Creates an Expression object from a string in the form
-     * <code>LANGUAGE:EXPRESSION</code>.
-     *
-     * @param describedExpression The expression in the form
-     * <code>LANGUAGE:EXPRESSION</code>. The LANGUAGE part should be expressed
-     * only with letters and numbers.
-     * @return The created object, or <code>null</code> if the expression is null.
-     * @since 2.2.0
-     */
-    public static Expression createExpressionFromDescribedExpression(String describedExpression) {
-        if (describedExpression != null) {
-            String language = null;
-            String expression = describedExpression;
-            if (describedExpression.matches("[a-zA-Z0-9]+:.+")) {
-                language = describedExpression.substring(0, describedExpression.indexOf(':'));
-                expression = describedExpression.substring(describedExpression.indexOf(':') + 1);
-            }
-            return new Expression(expression, language);
-        }
-
-        return null;
-    }
-
-    /**
-     * Creates an Expression object from the expression and its language.
-     *
-     * @param expression The expression itself.
-     * @param language The language of the expression.
-     * @return The created object, or <code>null</code> if the expression is null.
-     * @since 2.2.0
-     */
-    public static Expression createExpression(String expression, String language) {
-        if (expression != null) {
-            return new Expression(expression, language);
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the expression string.
-     *
-     * @return The expression itself.
-     * @since 2.2.0
-     */
-    public String getExpression() {
-        return expression;
-    }
-
-    /**
-     * Returns the language in which the expression is expressed.
-     *
-     * @return The expression language.
-     * @since 2.2.0
-     */
-    public String getLanguage() {
-        return language;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object obj) {
-        Expression exp = (Expression) obj;
-        return nullSafeEquals(expression, exp.expression)
-                && nullSafeEquals(language, exp.language);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return nullSafeHashCode(expression) + nullSafeHashCode(language);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        return (language == null ? "DEFAULT" : language) + ":" + expression;
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java
deleted file mode 100644
index ae3b25a..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/ListAttribute.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An attribute as a <code>List</code>.
- * This attribute associates a name with a list. The list can be found by the
- * property name.
- * Elements in list are retrieved using List methods.
- * This class is used to read configuration files.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class ListAttribute extends Attribute {
-
-    /**
-     * If true, the attribute will put the elements of the attribute with the
-     * same name of the parent definition before the ones specified here. By
-     * default, it is 'false'.
-     */
-    private boolean inherit = false;
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public ListAttribute() {
-        setValue(new ArrayList<Object>());
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param value List.
-     * @since 2.1.0
-     */
-    public ListAttribute(List<Attribute> value) {
-        setValue(value);
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param toCopy The list attribute to copy.
-     * @since 2.1.3
-     */
-    public ListAttribute(ListAttribute toCopy) {
-        super(toCopy);
-        List<Attribute> attributesToCopy = toCopy.getValue();
-        if (attributesToCopy != null) {
-            List<Attribute> attributes = new ArrayList<Attribute>(attributesToCopy.size());
-            for (Attribute attribute : attributesToCopy) {
-                if (attribute != null) {
-                    attributes.add(attribute.clone());
-                } else {
-                    attributes.add(null);
-                }
-            }
-            setValue(attributes);
-        }
-        this.inherit = toCopy.inherit;
-    }
-
-    /**
-     * Sets the list of the attributes that are elements of this attribute.
-     *
-     * @param attributes The attributes.
-     * @since 3.0.0
-     */
-    public void setValue(List<Attribute> attributes) {
-        super.setValue(attributes);
-    }
-
-    /**
-     * Returns the list of the attributes that are elements of this attribute.
-     *
-     * @return The attributes.
-     * @since 3.0.0
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public List<Attribute> getValue() {
-        return (List<Attribute>) super.getValue();
-    }
-
-    /**
-     * Add an element in list.
-     * We use a property to avoid rewriting a new class.
-     *
-     * @param element XmlAttribute to add.
-     * @since 2.1.0
-     */
-    public void add(Attribute element) {
-        getValue().add(element);
-    }
-
-    /**
-     * If true, the attribute will put the elements of the attribute with the
-     * same name of the parent definition before the ones specified here. By
-     * default, it is 'false'
-     *
-     * @param inherit The "inherit" value.
-     * @since 2.1.0
-     */
-    public void setInherit(boolean inherit) {
-        this.inherit = inherit;
-    }
-
-    /**
-     * If true, the attribute will put the elements of the attribute with the
-     * same name of the parent definition before the ones specified here. By
-     * default, it is 'false'
-     *
-     * @return inherit The "inherit" value.
-     * @since 2.1.0
-     */
-    public boolean isInherit() {
-        return inherit;
-    }
-
-    /**
-     * Inherits elements present in a "parent" list attribute. The elements will
-     * be put before the ones already present.
-     *
-     * @param parent The parent list attribute.
-     * @since 2.1.0
-     */
-    @SuppressWarnings("unchecked")
-    public void inherit(ListAttribute parent) {
-        List<Attribute> tempList = new ArrayList<Attribute>();
-        tempList.addAll((List<Attribute>) parent.value);
-        tempList.addAll((List<Attribute>) value);
-        setValue(tempList);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object obj) {
-        ListAttribute attribute = (ListAttribute) obj;
-        return super.equals(attribute) && this.inherit == attribute.inherit;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return super.hashCode() + Boolean.valueOf(inherit).hashCode();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public ListAttribute clone() {
-        return new ListAttribute(this);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/NoSuchContainerException.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/NoSuchContainerException.java
deleted file mode 100644
index 631e5c0..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/NoSuchContainerException.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-
-/**
- * Indicates that a keyed container has not been found.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class NoSuchContainerException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public NoSuchContainerException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @since 2.1.0
-     */
-    public NoSuchContainerException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public NoSuchContainerException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public NoSuchContainerException(String message, Throwable e) {
-        super(message, e);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
deleted file mode 100644
index da426a9..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainer.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import java.io.IOException;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-
-/**
- * An encapsulation of the tiles framework.  This interface is
- * used to expose tiles features to frameworks which leverage
- * it as a plugin.  It can alternately be used by web applications
- * which would like a programmatic interface.
- *
- * @since 2.0
- * @version $Rev$ $Date$
- */
-public interface TilesContainer {
-
-    /**
-     * Retrieve the containers context.
-     *
-     * @return current application context
-     */
-    ApplicationContext getApplicationContext();
-
-    /**
-     * Retrive the attribute context of the current request.
-     * @param request The request.
-     * @return map of the attributes in the current attribute context.
-     */
-    AttributeContext getAttributeContext(Request request);
-
-    /**
-     * Starts a new context, where attribute values are stored independently
-     * from others.<br>
-     * When the use of the contexts is finished, call
-     * {@link TilesContainer#endContext(Request)}
-     * @param request The request.
-     *
-     * @return The newly created context.
-     */
-    AttributeContext startContext(Request request);
-
-    /**
-     * Ends a context, where attribute values are stored independently
-     * from others.<br>
-     * It must be called after a
-     * {@link TilesContainer#startContext(Request)} call.
-     * @param request The request.
-     */
-    void endContext(Request request);
-
-    /**
-     * Renders the current context, as it is.
-     * @param request The request.
-     *
-     * @since 2.1.0
-     */
-    void renderContext(Request request);
-
-    /**
-     * Executes a preparer.
-     *
-     * @param preparer The name of the preparer to execute.
-     * @param request The request.
-     */
-    void prepare(String preparer, Request request);
-
-    /**
-     * Render the given tiles request.
-     *
-     * @param definition the current definition.
-     * @param request The request.
-     */
-    void render(String definition, Request request);
-
-    /**
-     * Renders the specified definition.
-     * @param definition The definition to render.
-     * @param request The request context.
-     */
-    void render(Definition definition, Request request);
-
-    /**
-     * Render the given Attribute.
-     *
-     * @param attribute The attribute to render.
-     * @param request The request.
-     * @throws IOException If something goes wrong during writing to the output.
-     * @since 2.1.2
-     */
-    void render(Attribute attribute, Request request)
-        throws IOException;
-
-    /**
-     * Evaluates the given attribute.
-     *
-     * @param attribute The attribute to evaluate.
-     * @param request The request.
-     * @return The evaluated object.
-     * @since 2.1.0
-     */
-    Object evaluate(Attribute attribute, Request request);
-
-    /**
-     * Returns a definition specifying its name.
-     *
-     * @param definitionName The name of the definition to find.
-     * @param request The request context.
-     * @return The definition, if found.
-     */
-    Definition getDefinition(String definitionName,
-            Request request);
-
-    /**
-     * Determine whether or not the definition exists.
-     *
-     * @param definition the name of the definition.
-     * @param request The request.
-     * @return true if the definition is found.
-     */
-    boolean isValidDefinition(String definition, Request request);
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java
deleted file mode 100644
index 4a2ac7c..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesContainerWrapper.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import java.io.IOException;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-
-/**
- * Wraps a Tiles container to allow easy decoration.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContainerWrapper implements TilesContainer {
-
-    /**
-     * The container to wrap.
-     */
-    protected TilesContainer container;
-
-    /**
-     * Constructor.
-     *
-     * @param container The container to wrap.
-     */
-    public TilesContainerWrapper(TilesContainer container) {
-        this.container = container;
-        if (container == null) {
-            throw new NullPointerException("The wrapped container must be not null");
-        }
-    }
-
-    /**
-     * Returns the wrapped container.
-     *
-     * @return The wrapped container.
-     */
-    public TilesContainer getWrappedContainer() {
-        return container;
-    }
-
-    @Override
-    public void endContext(Request request) {
-        container.endContext(request);
-    }
-
-    @Override
-    public Object evaluate(Attribute attribute, Request request) {
-        return container.evaluate(attribute, request);
-    }
-
-    @Override
-    public ApplicationContext getApplicationContext() {
-        return container.getApplicationContext();
-    }
-
-    @Override
-    public AttributeContext getAttributeContext(Request request) {
-        return container.getAttributeContext(request);
-    }
-
-    @Override
-    public Definition getDefinition(String definitionName, Request request) {
-        return container.getDefinition(definitionName, request);
-    }
-
-    @Override
-    public boolean isValidDefinition(String definition, Request request) {
-        return container.isValidDefinition(definition, request);
-    }
-
-    @Override
-    public void prepare(String preparer, Request request) {
-        container.prepare(preparer, request);
-    }
-
-    @Override
-    public void render(String definition, Request request) {
-        container.render(definition, request);
-    }
-
-    @Override
-    public void render(Definition definition, Request request) {
-        container.render(definition, request);
-    }
-
-    @Override
-    public void render(Attribute attribute, Request request) throws IOException {
-        container.render(attribute, request);
-    }
-
-    @Override
-    public void renderContext(Request request) {
-        container.renderContext(request);
-    }
-
-    @Override
-    public AttributeContext startContext(Request request) {
-        return container.startContext(request);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesException.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesException.java
deleted file mode 100644
index 674584d..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/TilesException.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-
-/**
- * Root class for all Tiles-exceptions.
- *
- * @version $Rev$ $Date$
- */
-public class TilesException extends RuntimeException {
-
-    /**
-     * Constructor.
-     */
-    public TilesException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The error or warning message.
-     */
-    public TilesException(String message) {
-        super(message);
-    }
-
-
-    /**
-     * Create a new <code>TilesException</code> wrapping an existing exception.
-     * <p/>
-     * <p>The existing exception will be embedded in the new
-     * one, and its message will become the default message for
-     * the TilesException.</p>
-     *
-     * @param e The cause to be wrapped.
-     */
-    public TilesException(Throwable e) {
-        super(e);
-    }
-
-
-    /**
-     * Create a new <code>TilesException</code> from an existing exception.
-     * <p/>
-     * <p>The existing exception will be embedded in the new
-     * one, but the new exception will have its own message.</p>
-     *
-     * @param message The detail message.
-     * @param e       The cause to be wrapped.
-     */
-    public TilesException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/TilesAccess.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/TilesAccess.java
deleted file mode 100644
index 5df14cd..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/TilesAccess.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.access;
-
-import java.util.Map;
-
-import org.apache.tiles.NoSuchContainerException;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * Provides static access to the tiles container.
- *
- * @version $Rev$ $Date$
- */
-public final class TilesAccess {
-
-    /**
-     * Name of the attribute used to store the current used container.
-     */
-    public static final String CURRENT_CONTAINER_ATTRIBUTE_NAME =
-        "org.apache.tiles.servlet.context.ServletTilesRequestContext.CURRENT_CONTAINER_KEY";
-
-    /**
-     * Constructor, private to avoid instantiation.
-     */
-    private TilesAccess() {
-    }
-
-    /**
-     * The name of the attribute to use when getting and setting the container
-     * object in a context.
-     */
-    public static final String CONTAINER_ATTRIBUTE =
-        "org.apache.tiles.CONTAINER";
-
-    /**
-     * Configures the default container to be used in the application.
-     *
-     * @param context The Tiles application context object to use.
-     * @param container The container object to set.
-     * @since 2.1.2
-     */
-    public static void setContainer(ApplicationContext context,
-            TilesContainer container) {
-        setContainer(context, container, CONTAINER_ATTRIBUTE);
-    }
-
-    /**
-     * Configures the container to be used in the application.
-     *
-     * @param context The Tiles application context object to use.
-     * @param container The container object to set.
-     * @param key The key under which the container will be stored.
-     * @since 2.1.2
-     */
-    public static void setContainer(ApplicationContext context,
-            TilesContainer container, String key) {
-        Logger log = LoggerFactory.getLogger(TilesAccess.class);
-        if (key == null) {
-            key = CONTAINER_ATTRIBUTE;
-        }
-
-        if (container == null) {
-            if (log.isInfoEnabled()) {
-                log.info("Removing TilesContext for context: " + context.getClass().getName());
-            }
-            context.getApplicationScope().remove(key);
-        } else {
-            if (log.isInfoEnabled()) {
-                log.info("Publishing TilesContext for context: " + context.getClass().getName());
-            }
-            context.getApplicationScope().put(key, container);
-        }
-    }
-
-    /**
-     * Returns default the container to be used in the application.
-     *
-     * @param context The Tiles application context object to use.
-     * @return The default container object.
-     * @since 3.0.0
-     */
-    public static TilesContainer getContainer(ApplicationContext context) {
-        return getContainer(context, CONTAINER_ATTRIBUTE);
-    }
-
-    /**
-     * Returns the container to be used in the application registered under a specific key.
-     *
-     * @param context The Tiles application context object to use.
-     * @param key The key under which the container will be stored.
-     * @return The container object.
-     * @since 3.0.0
-     */
-    public static TilesContainer getContainer(ApplicationContext context,
-            String key) {
-        if (key == null) {
-            key = CONTAINER_ATTRIBUTE;
-        }
-
-        return (TilesContainer) context.getApplicationScope().get(key);
-    }
-
-    /**
-     * Sets the current container to use in web pages.
-     *
-     * @param request The request to use.
-     * @param key The key under which the container is stored.
-     * @since 2.1.0
-     */
-    public static void setCurrentContainer(Request request,
-            String key) {
-        ApplicationContext applicationContext = request.getApplicationContext();
-        TilesContainer container = getContainer(applicationContext, key);
-        if (container != null) {
-            request.getContext("request").put(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        } else {
-            throw new NoSuchContainerException("The container with the key '"
-                    + key + "' cannot be found");
-        }
-    }
-
-    /**
-     * Sets the current container to use in web pages.
-     *
-     * @param request The request to use.
-     * @param container The container to use as the current container.
-     * @since 2.1.0
-     */
-    public static void setCurrentContainer(Request request,
-            TilesContainer container) {
-        if (container != null) {
-            request.getContext("request").put(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        } else {
-            throw new NullPointerException("The container cannot be null");
-        }
-    }
-
-    /**
-     * Returns the current container that has been set, or the default one.
-     *
-     * @param request The request to use.
-     * @return The current Tiles container to use in web pages.
-     * @since 2.1.0
-     */
-    public static TilesContainer getCurrentContainer(Request request) {
-        ApplicationContext context = request.getApplicationContext();
-        Map<String, Object> requestScope = request.getContext("request");
-        TilesContainer container = (TilesContainer) requestScope.get(CURRENT_CONTAINER_ATTRIBUTE_NAME);
-        if (container == null) {
-            container = getContainer(context);
-            requestScope.put(CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        }
-
-        return container;
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/package-info.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/package-info.java
deleted file mode 100644
index 45ab9b7..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/access/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Tiles access package. Utility classes to access Tiles funcionality from an application.
- */
-package org.apache.tiles.access;
-
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java
deleted file mode 100644
index 88865a5..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/MutableTilesContainer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mgmt;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-
-/**
- * Defines a mutable version of the TilesContainer.
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public interface MutableTilesContainer extends TilesContainer {
-
-    /**
-     * Register a new definition with the container.
-     *
-     * @param definition The definition to register.
-     * @param request TODO
-     */
-    void register(Definition definition, Request request);
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/package-info.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/package-info.java
deleted file mode 100644
index 7ce089d..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/mgmt/package-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes and interfaces to be used when it is needed to create Tiles definitions
- * during the execution of the application.
- */
-package org.apache.tiles.mgmt;
-
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/package-info.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/package-info.java
deleted file mode 100644
index 3234f7d..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/package-info.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * The Tiles taglib and framework allows building web pages by assembling reusable
- pieces of pages, called Tiles. A Tiles is usually a simple JSP page.
-
- <div class="section">
- <h2>Introduction</h2>
-
- <p>The Tiles framework allows building pages by assembling reusable Tiles.
- As an example, the page in the next figure can be build by assembling a
- header, a footer, a menu and a body.</p>
-
- <p><img src="doc-files/image001.gif" height="169" width="145" alt="doc-files/image001"></p>
-
- <p>Each Tiles (header, menu, body, ...) is a JSP page and can itself be build
- by assembling other Tiles.</p>
-
- <p>Using Tiles can be compared as using Java methods: You need to define the Tiles (the method body), and then you
- can &quot;call&quot; this body anywhere you want, passing it some parameters. In Tiles, parameters are called
- &quot;attributes&quot; in order to avoid confusion with the request parameters.</p>
-
- <p>The Tiles body can be a simple JSP page, a Struts action or any URI pointing
- to a resource inside the current web site.</p>
-
- <p>Inserting the body, or calling it, is done with the tag &lt;tiles:insert
- ...&gt; anywhere in a JSP page. Insertion can also be done by specifying
- a <em>definition name </em>as the path of a Struts forward or as input,
- forward or include attributes of a Struts action.</p>
-
- <p>Tiles bodies are used to create layouts, reusable parts, ... Tiles insertions
- are used to insert Tiles. The same Tiles can be reused several times in
- the same site, or even in the same page.</p>
-
- <p>Insertion of a Tiles body can be associated to a logical name in what Tiles calls a &quot;definition&quot;. A
- definition contains a logical name, a page used as body and some attribute values. The definition declaration
- doesn't insert the associated Tiles body. It just associates it with the name. A definition name can be used
- anywhere insertion of a Tiles body can occur. The associated Tiles body is then inserted with associated
- attributes.</p>
-
- <p>The definition declarations can be done in JSP pages or in one or more
- centralized files. A definition can extend another one, overload some attributes,
- add new attributes ... This allows the declaration of a &quot;master&quot; definition
- declaring the common layout, header, menu and footer. All other definitions
- extend this master layout thereby making it possible to change the entire
- site look &amp; feel simply by changing the master definition. </p>
- </div>
- <div class="section">
- <h2>Simple Examples</h2>
-
- <div class="subsection1">
- <h3>Insert a JSP page</h3>
- <pre>&lt;tiles:insert <strong>page</strong>=&quot;/layouts/commonLayout.jsp&quot; flush=&quot;true&quot; /&gt;
- </pre>
- <p>This example inserts the specified page in place of the tag. The page attribute is any valid URL pointing to
- a resource inside the current site.</p>
- </div>
- <div class="subsection1">
- <a name="doc.InsertPageWithAttributes"></a>
-
- <h3>Insert a Tiles passing some attributes</h3>
- <pre>
- &lt;tiles:insert page=&quot;/layouts/classicLayout.jsp&quot; flush=&amp;quot;true&quot;&gt;
- &lt;tiles:put name=&quot;title&quot;  value=&quot;Page Title&quot; /&gt;
- &lt;tiles:put name=&quot;header&quot; value=&quot;/common/header.jsp&quot; /&gt;
- &lt;tiles:put name=&quot;footer&quot; value=&quot;/common/footer.jsp&quot; /&gt;
- &lt;tiles:put name=&quot;menu&quot;   value=&quot;/common/menu.jsp&quot; /&gt;
- &lt;tiles:put name=&quot;body&quot;   value=&quot;/tiles/mainBody.jsp&quot; /&gt;
- &lt;/tiles:insert&gt;
- </pre>
- <p>This example inserts the specified page, passing it the attributes. Attributes
- are stored in a Tiles context which is passed to the inserted pag and
- can then be accesssed by their names.</p>
- </div>
- <div class="subsection1">
- <h3>Retrieve an attribute value as String</h3>
- <pre>
- &lt;tiles:getAsString name=&quot;title&quot; /&gt;
- </pre>
- <p>This example retrieves the value of the attribute &quot;title&quot; and prints it as a String in the current
- output stream. The method toString() is applied on the attribute value, allowing to pass any kind of object
- as value.</p>
- </div>
- <div class="subsection1">
- <h3>Insert Tiles referenced by an attribute</h3>
- <pre>
- &lt;tiles:insert attribute='menu' /&gt;
- </pre>
- <p>This inserts the Tiles referenced by the attribute &quot;menu&quot; value. The
- specified attribute value is first retrieved from current Tiles's context,
- and then the value is used as a page target to insert.</p>
- </div>
- <div class="subsection1">
- <h3>Classic Layout </h3>
-
- <p>This example is a layout assembling a page in the classic header-footer-menu-body
- fashion.</p>
- <pre>
- &lt;%@ taglib uri=&quot;http://tiles.apache.org/tags-tiles&quot; prefix=&quot;tiles&quot; %&gt;
- &lt;HTML&gt;
- &lt;HEAD&gt;
- &lt;link rel=&quot;stylesheet&quot; href=&quot;&lt;%=request.getContextPath()%&gt;/layouts/stylesheet.css&quot;
- type=&quot;text/css&quot;/&gt;
- &lt;title&gt;&lt;tiles:getAsString name=&quot;title&quot;/&gt;&lt;/title&gt;
- &lt;/HEAD&gt;
- &lt;body&gt;
- &lt;table border=&quot;0&quot; width=&quot;100%&quot; cellspacing=&quot;5&quot;&gt;
- &lt;tr&gt;
- &lt;td colspan=&quot;2&quot;&gt;&lt;tiles:insert attribute=&quot;header&quot; /&gt;&lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td width=&quot;140&quot; valign=&quot;top&quot;&gt;
- &lt;tiles:insert attribute='menu' /&gt;
- &lt;/td&gt;
- &lt;td valign=&quot;top&quot;  align=&quot;left&quot;&gt;
- &lt;tiles:insert attribute='body' /&gt;
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;tr&gt;
- &lt;td colspan=&quot;2&quot;&gt;
- &lt;tiles:insert attribute=&quot;footer&quot; /&gt;
- &lt;/td&gt;
- &lt;/tr&gt;
- &lt;/table&gt;
- &lt;/body&gt;
- &lt;/html&gt;
- </pre>
- <p>The layout is declared in a JSP page (ex: /layouts/classicLayout.jsp).
- It can be used in conjunction with the tag described in &quot;<a href="#doc.InsertPageWithAttributes">Insert
- a page passing some attributes</a>&quot;. </p>
- </div>
- </div>
- <div class="section">
- <h2>Definitions</h2>
-
- <p>A definition associates a logical name with the URL of a Tiles to be inserted
- and some attribute values. A definition doesn't insert the Tiles. This is
- done later using the definition name. A definition name can be inserted
- as often as you want in your site, making it easy to reuse a Tiles. </p>
-
- <p>A definition can extend another definition and overload some attributes
- or add new ones. This makes easy factorization of definitions differing
- by some attributes. For example, you can define a master definition declaring
- the main header, menu, footer, and a default title. Then let each of your
- page definitions extend this master definition and overload the title and
- the body.</p>
-
- <p>Definitions can be declared in a JSP page, or in one or more centralized
- files. To enable the definitions from centralized files, you need to initialize
- the &quot;definitions factory&amp;&amp;quot; which will parse the definitions from the files
- and provide them to the Tiles framework.</p>
-
- <div class="subsection1">
- <h3>Enabling Definition Factory</h3>
-
- <p>To enable Tiles definitions described in one or more files, you need to write these files and to initialize the
- definition factory. </p>
-
- <p>Initialization is different depending on the Struts version you use,
- or if you do not use Struts at all.</p>
-
- <div class="subsection2">
- <h4>Struts1.1</h4>
-
- <p>Use the Tiles plug-in to enable Tiles definitions. This plug-in creates
- the definition factory and passese it a configuration object populated
- with parameters. Parameters can be specified in the web.xml file or
- as plug-in parameters. The plug-in first reads parameters from web.xml,
- and then overloads them with the ones found in the plug-in. All parameters
- are optional and can be omitted. The plug-in should be declared in each
- struts-config file:</p>
- <pre>
- &lt;plug-in className=&amp;&amp;quot;org.apache.struts.tiles.TilesPlugin&amp;&amp;quot; &gt;
- &lt;set-property property=&amp;&amp;quot;definitions-config&amp;&amp;quot;
- value=&amp;&amp;quot;/WEB-INF/tiles-defs.xml,
- /WEB-INF/tiles-tests-defs.xml,/WEB-INF/tiles-tutorial-defs.xml,
- /WEB-INF/tiles-examples-defs.xml&amp;&amp;quot; /&gt;
- &lt;set-property property=&amp;&amp;quot;moduleAware&amp;&amp;quot; value=&amp;&amp;quot;true&amp;&amp;quot; /&gt;
- &lt;set-property
- property=&amp;&amp;quot;org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE&amp;&amp;quot;
- value=&amp;&amp;quot;true&amp;&amp;quot; /&gt;
- &lt;/plug-in&gt;
- </pre>
- <ul>
- <li>definitions-config: (optional)
- <ul>
- <li>Specify configuration file names. There can be several comma separated file names (default: ?? )
- </li>
- </ul>
- </li>
- <li>org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE: (optional)
- <ul>
- <li>Specify if XML parser should validate the Tiles configuration
- file
- <ul>
- <li>true : validate. DTD should be specified in file header (default)</li>
- <li>false : no validation</li>
-
- </ul>
- </li>
- </ul>
- </li>
-
- <li>moduleAware: (optional)
- <ul>
- <li>Specify if the Tiles definition factory is module aware. If true (default),
- there will be one factory for each Struts module.
- If false, there will be one common factory for all module. In this later case,
- it is still needed to declare one plugin per module. The factory will be
- initialized with parameters found in the first initialized plugin (generally the
- one associated with the default module).
- <ul>
- <li>true : Tiles framework is module aware</li>
- <li>false :Tiles framework has one single factoy shared among modules (default)</li>
- </ul>
- </li>
- </ul>
- </li>
-
- <li>tilesUtilImplClassname: (optional - for advanced user)
- <ul>
- <li>Specify The classname of the TilesUtil implementation to use. The specified class should
- be a subclass of TilesUtilStrutsImpl. This option disable the moduleAware option.
- <br>Specifying &amp;&amp;&quot;TilesUtilStrutsImpl&amp;&amp;&quot; is equivalent to moduleAware =
- false.
- <br>Specifying &amp;&amp;&quot;TilesUtilStrutsModuleImpl&amp;&amp;&quot; is equivalent to moduleAware
- = true.
- This option is taken into account only once, when it is first encountered. To avoid problems,
- it is advice to specify the same values in all TilesPlugin declaration.
- </li>
- </ul>
- </li>
-
- </ul>
- <p>The TilesPlugin class creates one definition factory for each struts module.
- </p>
-
- <p>
- If the flag moduleAware is false, only one shared factory is created for all modules.
- In this later case, the factory is initialized with parameters found in the first plugin.
- The plugins should be declared in all modules, and the moduleAware flag should be
- the same for the entire application.</p>
-
- <p>
- Paths found in Tiles definitions are relative to the main context.</p>
-
- <p>You don't need to specify a TilesRequestProcessor, this is automatically
- done by the plug-in. If, however, you want to specify your own RequestProcessor,
- it should extend the TilesRequestProcessor. The plug-in checks this
- constraint.</p>
- </div>
- <div class="subsection2">
- <h4>Struts1.0.x</h4>
-
- <p>You need to use a special servlet extending the Struts servlet. This is specified in the web.xml file of your
- application:</p>
- <pre>
- &lt;servlet&gt;
- &lt;servlet-name&gt;action&lt;/servlet-name&gt;
- &lt;servlet-class&gt;org.apache.tiles.web.startup.TilesServlet&lt;/servlet-class&gt;
- &lt;!-- Tiles Servlet parameter
- Specify configuration file names. There can be several comma
- separated file names
- --&gt;
- &lt;init-param&gt;
- &lt;param-name&gt;definitions-config&lt;/param-name&gt;
- &lt;param-value&gt;/WEB-INF/tiles-defs.xml&lt;/param-value&gt;
- &lt;/init-param&gt;
- &lt;!-- Tiles Servlet parameter
- Specify if XML parser should validate the Tiles configuration file(s).
- true : validate. DTD should be specified in file header.
- false : no validation
- --&gt;
- &lt;init-param&gt;
- &lt;param-name&gt;org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE&lt;/param-name&gt;
- &lt;param-value&gt;true&lt;/param-value&gt;
- &lt;/init-param&gt;
- ...
- &lt;/servlet&gt;
- </pre>
- </div>
- <div class="subsection2">
- <h4>Without Struts</h4>
-
- <p>Tiles can be used without Struts. To initialize the definition factory, you can use the provided servlet. Declare
- it in the web.xml file of your application:</p>
- <pre>
- &lt;servlet&gt;
- &lt;servlet-name&gt;action&lt;/servlet-name&gt;
- &lt;servlet-class&gt;org.apache.struts.tiles.TilesServlet&lt;/servlet-class&gt;
-
-
- &lt;init-param&gt;
- &lt;param-name&gt;definitions-config&lt;/param-name&gt;
- &lt;param-value&gt;/WEB-INF/tiles-defs.xml&lt;/param-value&gt;
- &lt;/init-param&gt;
- &lt;init-param&gt;
- &lt;param-name&gt;org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE&lt;/param-name&gt;
- &lt;param-value&gt;true&lt;/param-value&gt;
- &lt;/init-param&gt;
- ...
- </pre>
- <p>The parameters are the same as for Struts1.1 or 1.0.</p>
- </div>
- </div>
- <div class="subsection1">
- <h3>Definition File Syntax</h3>
-
- <p>The definition file syntax can be found in the
- <a href="http://tiles.apache.org/dtds/tiles-config_2_0.dtd">tiles-config_2_0.dtd file</a>.
- </p>
-
- <p>Following is a simple example:</p>
- <pre>
- &lt;!DOCTYPE tiles-definitions PUBLIC
- &amp;&amp;quot;-//Apache Software Foundation//DTD Tiles Configuration//EN&amp;&amp;quot;
- &amp;&amp;quot;http://tiles.apache.org/dtds/tiles-config_2_0.dtd&amp;&amp;quot;&gt;
-
- &lt;!-- Definitions for Tiles documentation   --&gt;
- &lt;tiles-definitions&gt;
-
- &lt;!-- ========================================================== --&gt;
- &lt;!-- Master definition                                          --&gt;
- &lt;!-- ========================================================== --&gt;
- &lt;!-- Main page layout used as a root for other page definitions --&gt;
-
- &lt;definition name=&amp;&amp;quot;site.mainLayout&amp;&amp;quot;
-   template=&amp;&amp;quot;/layouts/classicLayout.jsp&amp;&amp;quot;&gt;
- &lt;put name=&amp;&amp;quot;title&amp;&amp;quot;  value=&amp;&amp;quot;Tiles Blank Site&amp;&amp;quot; /&gt;
- &lt;put name=&amp;&amp;quot;header&amp;&amp;quot; value=&amp;&amp;quot;/tiles/common/header.jsp&amp;&amp;quot; /&gt;
- &lt;put name=&amp;&amp;quot;menu&amp;&amp;quot;   value=&amp;&amp;quot;site.menu.bar&amp;&amp;quot; /&gt;
- &lt;put name=&amp;&amp;quot;footer&amp;&amp;quot; value=&amp;&amp;quot;/tiles/common/footer.jsp&amp;&amp;quot; /&gt;
- &lt;put name=&amp;&amp;quot;body&amp;&amp;quot;   value=&amp;&amp;quot;/tiles/body.jsp&amp;&amp;quot; /&gt;
- &lt;/definition&gt;
-
- &lt;!-- ========================================================== --&gt;
- &lt;!-- Index page definition                                      --&gt;
- &lt;!-- ========================================================== --&gt;
- &lt;!-- This definition inherits from the main definition.
- It overloads the page title and the body used.
- Use the same mechanism to define new pages sharing common
- properties (here header, menu, footer, layout)
- --&gt;
-
- &lt;definition name=&amp;&amp;quot;site.index.page&amp;&amp;quot;
-   extends=&amp;&amp;quot;site.mainLayout&amp;&amp;quot; &gt;
- &lt;put name=&amp;&amp;quot;title&amp;&amp;quot;  value=&amp;&amp;quot;Tiles Blank Site Index&amp;&amp;quot; /&gt;
- &lt;put name=&amp;&amp;quot;body&amp;&amp;quot;   value=&amp;&amp;quot;/tiles/body.jsp&amp;&amp;quot; /&gt;
- &lt;/definition&gt;
-
- &lt;/tiles-definition&gt;
- </pre>
- </div>
- <div class="subsection1">
- <h3>Debugging</h3>
-
- <p>To debug a page made of Tiles, you can use following advices:</p>
- <ul>
- <li>Check each Tiles separatly. Try to access nested Tiles directly to test
- if thes work properly.
- </li>
- <li>Enable Tiles logging. See the commons-logging package help.</li>
- </ul>
- </div>
- </div>
-
- */
-package org.apache.tiles;
-
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/PreparerException.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/PreparerException.java
deleted file mode 100644
index e518843..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/PreparerException.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer;
-
-import org.apache.tiles.TilesException;
-
-
-/**
- * <p>
- * Thrown when an exception occurs while processing
- * a prepare request.
- * </p>
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public class PreparerException extends TilesException {
-
-    /**
-     * Constructor.
-     */
-    public PreparerException() {
-        super();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The cause exception.
-     */
-    public PreparerException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to include.
-     */
-    public PreparerException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to include.
-     * @param e The cause exception.
-     */
-    public PreparerException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/ViewPreparer.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/ViewPreparer.java
deleted file mode 100644
index 00f7743..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/ViewPreparer.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * Executed prior to rendering a view.
- * </p>
- *
- * <p>
- * A view preparer is typically used to provide last minute
- * translations of the data within the attribute context.
- * A preparer is not intended to replace the controller within an
- * MVC architecture.
- * </p>
- *
- * See
- * <ul>
- * <li>&lt;insert&gt;</li>
- * <li>&lt;definition&gt;</li>
- * </ul>>
- *
- * @version $Rev$ $Date$
- */
-public interface ViewPreparer {
-
-    /**
-     * Method associated to a tile and called immediately before the tile
-     * is included.
-     *
-     * @param tilesContext     Current tiles application context.
-     * @param attributeContext Current tile context.
-     * @throws PreparerException If something goes wrong during execution.
-     */
-    void execute(Request tilesContext,
-        AttributeContext attributeContext);
-}
diff --git a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/package-info.java b/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/package-info.java
deleted file mode 100644
index e4533e2..0000000
--- a/TILES_3_0_X/tiles-api/src/main/java/org/apache/tiles/preparer/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * "View preparers" are objects that allows the "preparation" of a Tiles artifact
- * (definition, template or attribute) before it is rendered.<br>
- * It is useful, for example, when a view item should be built and stored in a
- * particular context (e.g. a menu) and then rendered.
- */
-package org.apache.tiles.preparer;
-
diff --git a/TILES_3_0_X/tiles-api/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-api/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-api/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-api/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-api/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-api/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-api/src/site/site.xml b/TILES_3_0_X/tiles-api/src/site/site.xml
deleted file mode 100644
index 34d95ef..0000000
--- a/TILES_3_0_X/tiles-api/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - API">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/AttributeTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/AttributeTest.java
deleted file mode 100644
index 68105f3..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/AttributeTest.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import static org.apache.tiles.CompareUtil.*;
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link Attribute}.
- *
- * @version $Rev$ $Date$
- */
-public class AttributeTest {
-
-
-    /**
-     * Tests {@link Attribute#createTemplateAttribute(String)}.
-     */
-    @Test
-    public void testCreateTemplateAttribute1() {
-        Attribute attribute = Attribute.createTemplateAttribute("/my/template.jsp");
-        assertEquals("/my/template.jsp", attribute.getValue());
-        assertEquals("template", attribute.getRenderer());
-    }
-
-    /**
-     * Tests {@link Attribute#createTemplateAttributeWithExpression(String)}.
-     */
-    @Test
-    public void testCreateTemplateAttribute2() {
-        Attribute attribute = Attribute.createTemplateAttributeWithExpression("my.expression");
-        assertEquals("template", attribute.getRenderer());
-        assertEquals("my.expression", attribute.getExpressionObject().getExpression());
-        assertNull(attribute.getExpressionObject().getLanguage());
-    }
-
-    /**
-     * Tests {@link Attribute#Attribute()}.
-     */
-    @Test
-    public void testAttribute() {
-        Attribute attribute = new Attribute();
-        assertNull(attribute.getValue());
-    }
-
-    /**
-     * Tests {@link Attribute#Attribute(Object)}.
-     */
-    @Test
-    public void testAttributeObject() {
-        Attribute attribute = new Attribute("my.value");
-        assertEquals("my.value", attribute.getValue());
-        assertNull(attribute.getRenderer());
-    }
-
-    /**
-     * Tests {@link Attribute#Attribute(Object, String)}.
-     */
-    @Test
-    public void testAttributeObjectString() {
-        Attribute attribute = new Attribute("my.value", "role1,role2");
-        assertEquals("my.value", attribute.getValue());
-        assertNull(attribute.getRenderer());
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(roles, attribute.getRoles());
-    }
-
-    /**
-     * Tests {@link Attribute#Attribute(Object, Expression, String, String)}.
-     */
-    @Test
-    public void testAttributeComplete() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        assertEquals("my.value", attribute.getValue());
-        assertEquals("myrenderer", attribute.getRenderer());
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(roles, attribute.getRoles());
-        assertEquals("my.expression", attribute.getExpressionObject().getExpression());
-        assertEquals("MYLANG", attribute.getExpressionObject().getLanguage());
-    }
-
-    /**
-     * Tests {@link Attribute#Attribute(Attribute)}.
-     */
-    @Test
-    public void testAttributeCopy() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        attribute = new Attribute(attribute);
-        assertEquals("my.value", attribute.getValue());
-        assertEquals("myrenderer", attribute.getRenderer());
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(roles, attribute.getRoles());
-        assertEquals("my.expression", attribute.getExpressionObject().getExpression());
-        assertEquals("MYLANG", attribute.getExpressionObject().getLanguage());
-
-        attribute = new Attribute("my.value", null, "role1,role2", "myrenderer");
-        attribute = new Attribute(attribute);
-        assertEquals("my.value", attribute.getValue());
-        assertEquals("myrenderer", attribute.getRenderer());
-        roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(roles, attribute.getRoles());
-        assertNull(attribute.getExpressionObject());
-    }
-
-    /**
-     * Tests {@link Attribute#equals(Object)}.
-     */
-    @Test
-    public void testEquals() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        Attribute attribute2 = new Attribute(attribute);
-        assertTrue(attribute.equals(attribute2));
-        attribute2.setRenderer("anotherRenderer");
-        assertFalse(attribute.equals(attribute2));
-        attribute2 = new Attribute(attribute);
-        attribute2.setRole("otherrole");
-        assertFalse(attribute.equals(attribute2));
-        attribute2 = new Attribute(attribute);
-        attribute2.setExpressionObject(new Expression("another.expression", "MYLANG"));
-        assertFalse(attribute.equals(attribute2));
-        attribute2 = new Attribute(attribute);
-        attribute2.setValue("anothervalue");
-        assertFalse(attribute.equals(attribute2));
-    }
-
-    /**
-     * Tests {@link Attribute#getRole()} and {@link Attribute#setRole(String)}.
-     */
-    @Test
-    public void testGetRole() {
-        Attribute attribute = new Attribute("my.value");
-        assertNull(attribute.getRole());
-        Set<String> roles = new LinkedHashSet<String>();
-        attribute.setRoles(roles);
-        assertNull(attribute.getRole());
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals("role1,role2", attribute.getRole());
-    }
-
-    /**
-     * Tests {@link Attribute#hashCode()}.
-     */
-    @Test
-    public void testHashCode() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(nullSafeHashCode("my.value")
-                + nullSafeHashCode(expression) + nullSafeHashCode(roles)
-                + nullSafeHashCode("myrenderer"), attribute.hashCode());
-    }
-
-    /**
-     * Tests {@link Attribute#toString()}.
-     */
-    @Test
-    public void testToString() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals("my.value", attribute.toString());
-        attribute.setValue(null);
-        assertNull(attribute.toString());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Attribute#inherit(org.apache.tiles.Attribute)}.
-     */
-    @Test
-    public void testInherit() {
-        Attribute attribute = new Attribute(null, (Expression) null, null, (String) null);
-        Attribute parentAttribute = new Attribute("value", Expression
-                .createExpression("expression", "language"), "role", "renderer");
-        attribute.inherit(parentAttribute);
-        assertEquals("value", attribute.getValue());
-        assertEquals("expression", attribute.getExpressionObject().getExpression());
-        assertEquals("language", attribute.getExpressionObject().getLanguage());
-        assertEquals("role", attribute.getRole());
-        assertEquals("renderer", attribute.getRenderer());
-        Expression expression = new Expression(null, "MYLANG");
-        attribute = new Attribute(null, expression, null, (String) null);
-        attribute.setRoles(new HashSet<String>());
-        attribute.inherit(parentAttribute);
-        assertEquals("value", attribute.getValue());
-        assertEquals("expression", attribute.getExpressionObject().getExpression());
-        assertEquals("language", attribute.getExpressionObject().getLanguage());
-        assertEquals("role", attribute.getRole());
-        assertEquals("renderer", attribute.getRenderer());
-    }
-
-    /**
-     * Tests {@link Attribute#clone()}.
-     */
-    @Test
-    public void testClone() {
-        Expression expression = new Expression("my.expression", "MYLANG");
-        Attribute attribute = new Attribute("my.value", expression, "role1,role2", "myrenderer");
-        attribute = attribute.clone();
-        assertEquals("my.value", attribute.getValue());
-        assertEquals("myrenderer", attribute.getRenderer());
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        assertEquals(roles, attribute.getRoles());
-        assertEquals("my.expression", attribute.getExpressionObject().getExpression());
-        assertEquals("MYLANG", attribute.getExpressionObject().getLanguage());
-    }
-
-    /**
-     * Tests {@link Attribute#createTemplateAttribute(String, String, String, String)}.
-     */
-    @Test
-    public void testCreateTemplateAttribute() {
-        Attribute attribute = Attribute.createTemplateAttribute("myTemplate",
-                "MYLANG:myExpression", "myType", "myRole");
-        assertEquals("myTemplate", attribute.getValue());
-        assertEquals("MYLANG", attribute.getExpressionObject().getLanguage());
-        assertEquals("myExpression", attribute.getExpressionObject().getExpression());
-        assertEquals("myType", attribute.getRenderer());
-        Set<String> roles = attribute.getRoles();
-        assertEquals(1, roles.size());
-        assertTrue(roles.contains("myRole"));
-    }
-
-    /**
-     * Tests {@link Attribute#isPermitted(Request)}.
-     */
-    @Test
-    public void testIsPermitted() {
-        Attribute attribute = new Attribute("myvalue");
-        Request requestContext = createMock(Request.class);
-        expect(requestContext.isUserInRole("first")).andReturn(Boolean.TRUE)
-                .anyTimes();
-        expect(requestContext.isUserInRole("second")).andReturn(Boolean.FALSE)
-                .anyTimes();
-        replay(requestContext);
-        assertTrue(attribute.isPermitted(requestContext));
-        Set<String> roles = new HashSet<String>();
-        roles.add("first");
-        attribute.setRoles(roles);
-        assertTrue("The role is not permitted", attribute.isPermitted(
-                requestContext));
-        roles.clear();
-        roles.add("second");
-        assertFalse("The role is not permitted", attribute.isPermitted(
-                requestContext));
-        verify(requestContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java
deleted file mode 100644
index 32cf836..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/BasicAttributeContextTest.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.Test;
-
-/**
- * Tests <code>BasicAttributeContext</code>.
- *
- * @version $Rev$ $Date$
- */
-public class BasicAttributeContextTest {
-
-    /**
-     * Tests {@link BasicAttributeContext#BasicAttributeContext()}.
-     */
-    @Test
-    public void testBasicAttributeContext() {
-        AttributeContext context = new BasicAttributeContext();
-        assertNull("There are some spurious attributes", context
-                .getLocalAttributeNames());
-        assertNull("There are some spurious attributes", context
-                .getCascadedAttributeNames());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#BasicAttributeContext(Map)}.
-     */
-    @Test
-    public void testBasicAttributeContextMapOfStringAttribute() {
-        Map<String, Attribute> name2attrib = new HashMap<String, Attribute>();
-        Attribute attribute = new Attribute("Value 1");
-        name2attrib.put("name1", attribute);
-        attribute = new Attribute("Value 2");
-        name2attrib.put("name2", attribute);
-        AttributeContext context = new BasicAttributeContext(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#BasicAttributeContext(AttributeContext)}.
-     */
-    @Test
-    public void testBasicAttributeContextAttributeContext() {
-        Set<String> localAttributes = new LinkedHashSet<String>();
-        Set<String> cascadedAttributes = new LinkedHashSet<String>();
-        localAttributes.add("local1");
-        localAttributes.add("local2");
-        cascadedAttributes.add("cascaded1");
-        cascadedAttributes.add("cascaded2");
-        AttributeContext toCopy = createMock(AttributeContext.class);
-        expect(toCopy.getLocalAttributeNames()).andReturn(localAttributes);
-        expect(toCopy.getLocalAttribute("local1")).andReturn(
-                new Attribute("value1")).anyTimes();
-        expect(toCopy.getLocalAttribute("local2")).andReturn(
-                new Attribute("value2")).anyTimes();
-        expect(toCopy.getCascadedAttributeNames())
-                .andReturn(cascadedAttributes);
-        expect(toCopy.getCascadedAttribute("cascaded1")).andReturn(
-                new Attribute("value3")).anyTimes();
-        expect(toCopy.getCascadedAttribute("cascaded2")).andReturn(
-                new Attribute("value4")).anyTimes();
-        Attribute templateAttribute = new Attribute("/template.jsp", Expression
-                .createExpression("expression", null), "role1,role2",
-                "template");
-        expect(toCopy.getTemplateAttribute()).andReturn(templateAttribute);
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        expect(toCopy.getPreparer()).andReturn("my.preparer.Preparer");
-        replay(toCopy);
-        BasicAttributeContext context = new BasicAttributeContext(toCopy);
-        assertEquals("The template has not been set correctly",
-                "/template.jsp", context.getTemplateAttribute().getValue());
-        assertEquals("The template expression has not been set correctly",
-                "expression", context.getTemplateAttribute()
-                        .getExpressionObject().getExpression());
-        assertEquals("The roles are not the same", roles, context
-                .getTemplateAttribute().getRoles());
-        assertEquals("The preparer has not been set correctly",
-                "my.preparer.Preparer", context.getPreparer());
-        Attribute attribute = context.getLocalAttribute("local1");
-        assertNotNull("Attribute local1 not found", attribute);
-        assertEquals("Attribute local1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("local2");
-        assertNotNull("Attribute local2 not found", attribute);
-        assertEquals("Attribute local2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("cascaded1");
-        assertNotNull("Attribute cascaded1 not found", attribute);
-        assertEquals("Attribute cascaded1 has not been set correctly",
-                "value3", attribute.getValue());
-        attribute = context.getCascadedAttribute("cascaded2");
-        assertNotNull("Attribute cascaded2 not found", attribute);
-        assertEquals("Attribute cascaded2 has not been set correctly",
-                "value4", attribute.getValue());
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#BasicAttributeContext(BasicAttributeContext)}
-     * .
-     */
-    @Test
-    public void testBasicAttributeContextBasicAttributeContext() {
-        BasicAttributeContext toCopy = new BasicAttributeContext();
-        toCopy.putAttribute("name1", new Attribute("value1"), false);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        Attribute templateAttribute = Attribute
-                .createTemplateAttribute("/template.jsp");
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        templateAttribute.setRoles(roles);
-        toCopy.setTemplateAttribute(templateAttribute);
-        toCopy.setPreparer("my.preparer.Preparer");
-        AttributeContext context = new BasicAttributeContext(toCopy);
-        assertEquals("The template has not been set correctly",
-                "/template.jsp", context.getTemplateAttribute().getValue());
-        assertEquals("The roles are not the same", roles, context
-                .getTemplateAttribute().getRoles());
-        assertEquals("The preparer has not been set correctly",
-                "my.preparer.Preparer", context.getPreparer());
-        Attribute attribute = context.getLocalAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#inheritCascadedAttributes(AttributeContext)}
-     * .
-     */
-    @Test
-    public void testInheritCascadedAttributes() {
-        AttributeContext toCopy = new BasicAttributeContext();
-        toCopy.putAttribute("name1", new Attribute("value1"), false);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        AttributeContext context = new BasicAttributeContext();
-        context.inheritCascadedAttributes(toCopy);
-        Attribute attribute = context.getLocalAttribute("name1");
-        assertNull("Attribute name1 found", attribute);
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#inherit(BasicAttributeContext)}
-     * testing inheritance between {@link ListAttribute} instances.
-     */
-    @Test
-    public void testInheritListAttribute() {
-        AttributeContext toCopy = new BasicAttributeContext();
-        ListAttribute parentListAttribute = new ListAttribute();
-        Attribute first = new Attribute("first");
-        Attribute second = new Attribute("second");
-        parentListAttribute.add(first);
-        toCopy.putAttribute("list", parentListAttribute);
-        AttributeContext context = new BasicAttributeContext();
-        ListAttribute listAttribute = new ListAttribute();
-        listAttribute.setInherit(true);
-        listAttribute.add(second);
-        context.putAttribute("list", listAttribute);
-        context.inherit(toCopy);
-        ListAttribute result = (ListAttribute) context.getAttribute("list");
-        assertNotNull("The attribute must exist", result);
-        List<Attribute> value = result.getValue();
-        assertNotNull("The list must exist", value);
-        assertEquals("The size is not correct", 2, value.size());
-        assertEquals("The first element is not correct", first, value.get(0));
-        assertEquals("The second element is not correct", second, value
-                .get(1));
-
-        context = new BasicAttributeContext();
-        listAttribute = new ListAttribute();
-        listAttribute.add(second);
-        context.putAttribute("list", listAttribute);
-        context.inherit(toCopy);
-        result = (ListAttribute) context.getAttribute("list");
-        assertNotNull("The attribute must exist", result);
-        value = result.getValue();
-        assertNotNull("The list must exist", value);
-        assertEquals("The size is not correct", 1, value.size());
-        assertEquals("The second element is not correct", second, value
-                .get(0));
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#inheritCascadedAttributes(AttributeContext)}
-     * .
-     */
-    @Test
-    public void testInherit() {
-        AttributeContext toCopy = new BasicAttributeContext();
-        Attribute parentTemplateAttribute = new Attribute();
-        parentTemplateAttribute.setValue("/parent/template.jsp");
-        toCopy.setTemplateAttribute(parentTemplateAttribute);
-        toCopy.putAttribute("name1", new Attribute("value1"), true);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        toCopy.putAttribute("name3", new Attribute("value3"), false);
-        toCopy.putAttribute("name4", new Attribute("value4"), false);
-        AttributeContext context = new BasicAttributeContext();
-        Attribute templateAttribute = new Attribute();
-        templateAttribute.setRole("role1,role2");
-        context.setTemplateAttribute(templateAttribute);
-        context.putAttribute("name1", new Attribute("newValue1"), true);
-        context.putAttribute("name3", new Attribute("newValue3"), false);
-        context.inherit(toCopy);
-        Attribute attribute = context.getTemplateAttribute();
-        assertEquals("/parent/template.jsp", attribute.getValue());
-        assertTrue(attribute.getRoles().contains("role1"));
-        assertTrue(attribute.getRoles().contains("role2"));
-        attribute = context.getCascadedAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "newValue1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "newValue3",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name4");
-        assertNotNull("Attribute name4 not found", attribute);
-        assertEquals("Attribute name4 has not been set correctly", "value4",
-                attribute.getValue());
-
-        toCopy = new BasicAttributeContext();
-        toCopy.putAttribute("name1", new Attribute("value1"), true);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        toCopy.putAttribute("name3", new Attribute("value3"), false);
-        toCopy.putAttribute("name4", new Attribute("value4"), false);
-        context = new BasicAttributeContext();
-        context.inherit(toCopy);
-        attribute = context.getCascadedAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "value3",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name4");
-        assertNotNull("Attribute name4 not found", attribute);
-        assertEquals("Attribute name4 has not been set correctly", "value4",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#inherit(AttributeContext)}
-     * .
-     */
-    @Test
-    public void testInheritAttributeContext() {
-        AttributeContext toCopy = createMock(AttributeContext.class);
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-        expect(toCopy.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(toCopy.getPreparer()).andReturn("my.preparer");
-        Set<String> cascadedNames = new HashSet<String>();
-        cascadedNames.add("name1");
-        cascadedNames.add("name2");
-        expect(toCopy.getCascadedAttributeNames()).andReturn(cascadedNames);
-        expect(toCopy.getCascadedAttribute("name1")).andReturn(new Attribute("value1"));
-        expect(toCopy.getCascadedAttribute("name2")).andReturn(new Attribute("value2"));
-        Set<String> names = new HashSet<String>();
-        names.add("name3");
-        names.add("name4");
-        expect(toCopy.getLocalAttributeNames()).andReturn(names);
-        expect(toCopy.getLocalAttribute("name3")).andReturn(new Attribute("value3"));
-        expect(toCopy.getLocalAttribute("name4")).andReturn(new Attribute("value4"));
-
-        replay(toCopy);
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("newValue1"), true);
-        context.putAttribute("name3", new Attribute("newValue3"), false);
-        context.inherit(toCopy);
-        Attribute attribute = context.getCascadedAttribute("name1");
-        assertEquals("/my/template.jsp", context.getTemplateAttribute().getValue());
-        assertEquals("my.preparer", context.getPreparer());
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "newValue1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "newValue3",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name4");
-        assertNotNull("Attribute name4 not found", attribute);
-        assertEquals("Attribute name4 has not been set correctly", "value4",
-                attribute.getValue());
-        verify(toCopy);
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#inherit(AttributeContext)}
-     * testing inheritance between {@link ListAttribute} instances.
-     */
-    @Test
-    public void testInheritAttributeContextListAttribute() {
-        AttributeContext toCopy = createMock(AttributeContext.class);
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-        expect(toCopy.getTemplateAttribute()).andReturn(templateAttribute).times(2);
-        expect(toCopy.getPreparer()).andReturn("my.preparer").times(2);
-        ListAttribute parentListAttribute = new ListAttribute();
-        Attribute first = new Attribute("first");
-        Attribute second = new Attribute("second");
-        Attribute third = new Attribute("third");
-        Attribute fourth = new Attribute("fourth");
-        parentListAttribute.add(first);
-        ListAttribute parentListAttribute2 = new ListAttribute();
-        parentListAttribute2.add(third);
-        Set<String> names = new HashSet<String>();
-        names.add("list");
-        Set<String> cascadedNames = new HashSet<String>();
-        cascadedNames.add("list2");
-        expect(toCopy.getCascadedAttributeNames()).andReturn(cascadedNames).times(2);
-        expect(toCopy.getCascadedAttribute("list2")).andReturn(parentListAttribute2).times(2);
-        expect(toCopy.getLocalAttributeNames()).andReturn(names).times(2);
-        expect(toCopy.getLocalAttribute("list")).andReturn(parentListAttribute).times(2);
-
-        replay(toCopy);
-        AttributeContext context = new BasicAttributeContext();
-        ListAttribute listAttribute = new ListAttribute();
-        listAttribute.setInherit(true);
-        listAttribute.add(second);
-        context.putAttribute("list", listAttribute, false);
-        ListAttribute listAttribute2 = new ListAttribute();
-        listAttribute2.setInherit(true);
-        listAttribute2.add(fourth);
-        context.putAttribute("list2", listAttribute2, true);
-        context.inherit(toCopy);
-        ListAttribute result = (ListAttribute) context.getAttribute("list");
-        assertNotNull("The attribute must exist", result);
-        List<Attribute> value = result.getValue();
-        assertNotNull("The list must exist", value);
-        assertEquals("The size is not correct", 2, value.size());
-        assertEquals("The first element is not correct", first, value.get(0));
-        assertEquals("The second element is not correct", second, value
-                .get(1));
-        result = (ListAttribute) context.getAttribute("list2");
-        assertNotNull("The attribute must exist", result);
-        value = result.getValue();
-        assertNotNull("The list must exist", value);
-        assertEquals("The size is not correct", 2, value.size());
-        assertEquals("The first element is not correct", third, value.get(0));
-        assertEquals("The second element is not correct", fourth, value
-                .get(1));
-
-        context = new BasicAttributeContext();
-        listAttribute = new ListAttribute();
-        listAttribute.add(second);
-        context.putAttribute("list", listAttribute);
-        context.inherit(toCopy);
-        result = (ListAttribute) context.getAttribute("list");
-        assertNotNull("The attribute must exist", result);
-        value = result.getValue();
-        assertNotNull("The list must exist", value);
-        assertEquals("The size is not correct", 1, value.size());
-        assertEquals("The second element is not correct", second, value
-                .get(0));
-        verify(toCopy);
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#addAll(Map)}.
-     */
-    @Test
-    public void testAddAll() {
-        AttributeContext context = new BasicAttributeContext();
-        Map<String, Attribute> name2attrib = new HashMap<String, Attribute>();
-        Attribute attribute = new Attribute("Value 1");
-        name2attrib.put("name1", attribute);
-        attribute = new Attribute("Value 2");
-        name2attrib.put("name2", attribute);
-        context.addAll(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-
-        context.addAll(null);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-
-        name2attrib = new HashMap<String, Attribute>();
-        name2attrib.put("name3", new Attribute("Value 3"));
-        context.addAll(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#addMissing(Map)}.
-     */
-    @Test
-    public void testAddMissing() {
-        Map<String, Attribute> name2attrib = new HashMap<String, Attribute>();
-        Attribute attribute = new Attribute("Value 1");
-        name2attrib.put("name1", attribute);
-        attribute = new Attribute("Value 2");
-        name2attrib.put("name2", attribute);
-        AttributeContext context = new BasicAttributeContext(name2attrib);
-        name2attrib.remove("name2");
-        name2attrib.put("name1", new Attribute("Value 1a"));
-        name2attrib.put("name3", new Attribute("Value 3"));
-        context.addMissing(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-
-        context.addMissing(null);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-
-        context = new BasicAttributeContext();
-        name2attrib = new HashMap<String, Attribute>();
-        name2attrib.put("name1", new Attribute("Value 1a"));
-        name2attrib.put("name3", new Attribute("Value 3"));
-        context.addMissing(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1a",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-
-        context = new BasicAttributeContext();
-        context.putAttribute("name2", new Attribute("Value 2a"), true);
-        name2attrib = new HashMap<String, Attribute>();
-        name2attrib.put("name1", new Attribute("Value 1a"));
-        name2attrib.put("name3", new Attribute("Value 3"));
-        context.addMissing(name2attrib);
-        attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "Value 1a",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2a",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-
-        context = new BasicAttributeContext();
-        context.putAttribute("name2", new Attribute("Value 2a"), true);
-        name2attrib = new HashMap<String, Attribute>();
-        name2attrib.put("name2", new Attribute("Value 2b"));
-        name2attrib.put("name3", new Attribute("Value 3"));
-        context.addMissing(name2attrib);
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "Value 2a",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "Value 3",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#getAttribute(String)}.
-     */
-    @Test
-    public void testGetAttribute() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.putAttribute("name3", new Attribute("value3a"), true);
-        context.putAttribute("name3", new Attribute("value3"), false);
-        Attribute attribute = context.getAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "value3",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#getLocalAttribute(String)}.
-     */
-    @Test
-    public void testGetLocalAttribute() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.putAttribute("name3", new Attribute("value3a"), true);
-        context.putAttribute("name3", new Attribute("value3"), false);
-        Attribute attribute = context.getLocalAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name2");
-        assertNull("Attribute name2 found", attribute);
-        attribute = context.getLocalAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "value3",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#getCascadedAttribute(String)}.
-     */
-    @Test
-    public void testGetCascadedAttribute() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.putAttribute("name3", new Attribute("value3a"), true);
-        context.putAttribute("name3", new Attribute("value3"), false);
-        Attribute attribute = context.getCascadedAttribute("name1");
-        assertNull("Attribute name1 found", attribute);
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "value3a",
-                attribute.getValue());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#getLocalAttributeNames()}.
-     */
-    @Test
-    public void testGetLocalAttributeNames() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.putAttribute("name3", new Attribute("value3a"), true);
-        context.putAttribute("name3", new Attribute("value3"), false);
-        Set<String> names = context.getLocalAttributeNames();
-        assertTrue("Attribute name1 is not present", names.contains("name1"));
-        assertFalse("Attribute name2 is present", names.contains("name2"));
-        assertTrue("Attribute name3 is not present", names.contains("name3"));
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#getCascadedAttributeNames()}.
-     */
-    @Test
-    public void testGetCascadedAttributeNames() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.putAttribute("name3", new Attribute("value3a"), true);
-        context.putAttribute("name3", new Attribute("value3"), false);
-        Set<String> names = context.getCascadedAttributeNames();
-        assertFalse("Attribute name1 is present", names.contains("name1"));
-        assertTrue("Attribute name2 is not present", names.contains("name2"));
-        assertTrue("Attribute name3 is not present", names.contains("name3"));
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#putAttribute(String, Attribute)}.
-     */
-    @Test
-    public void testPutAttributeStringAttribute() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"));
-        Attribute attribute = context.getLocalAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name1");
-        assertNull("Attribute name1 found", attribute);
-    }
-
-    /**
-     * Tests
-     * {@link BasicAttributeContext#putAttribute(String, Attribute, boolean)}.
-     */
-    @Test
-    public void testPutAttributeStringAttributeBoolean() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        Attribute attribute = context.getLocalAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "value1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name1");
-        assertNull("Attribute name1 found", attribute);
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name2");
-        assertNull("Attribute name2 found", attribute);
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#clear()}.
-     */
-    @Test
-    public void testClear() {
-        AttributeContext context = new BasicAttributeContext();
-        context.putAttribute("name1", new Attribute("value1"), false);
-        context.putAttribute("name2", new Attribute("value2"), true);
-        context.clear();
-        Set<String> names = context.getLocalAttributeNames();
-        assertTrue("There are local attributes", names == null
-                || names.isEmpty());
-        names = context.getCascadedAttributeNames();
-        assertTrue("There are cascaded attributes", names == null
-                || names.isEmpty());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#equals(Object)}.
-     */
-    @Test
-    public void testEquals() {
-        BasicAttributeContext attributeContext = new BasicAttributeContext();
-        attributeContext.setPreparer("my.preparer");
-        attributeContext.setTemplateAttribute(Attribute.createTemplateAttribute("/my/template.jsp"));
-        attributeContext.putAttribute("attribute1", new Attribute("value1"), true);
-        attributeContext.putAttribute("attribute2", new Attribute("value2"), true);
-        attributeContext.putAttribute("attribute3", new Attribute("value3"), false);
-        BasicAttributeContext toCompare = new BasicAttributeContext(attributeContext);
-        assertTrue(toCompare.equals(attributeContext));
-        toCompare = new BasicAttributeContext(attributeContext);
-        toCompare.putAttribute("attribute4", new Attribute("value4"), true);
-        assertFalse(toCompare.equals(attributeContext));
-        toCompare = new BasicAttributeContext(attributeContext);
-        toCompare.putAttribute("attribute4", new Attribute("value4"), false);
-        assertFalse(toCompare.equals(attributeContext));
-        toCompare = new BasicAttributeContext(attributeContext);
-        toCompare.setPreparer("another.preparer");
-        assertFalse(toCompare.equals(attributeContext));
-        toCompare = new BasicAttributeContext(attributeContext);
-        toCompare.setTemplateAttribute(Attribute.createTemplateAttribute("/another/template.jsp"));
-        assertFalse(toCompare.equals(attributeContext));
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext#hashCode()}.
-     */
-    @Test
-    public void testHashCode() {
-        BasicAttributeContext attributeContext = new BasicAttributeContext();
-        attributeContext.setPreparer("my.preparer");
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-        attributeContext.setTemplateAttribute(templateAttribute);
-        Attribute attribute1 = new Attribute("value1");
-        Attribute attribute2 = new Attribute("value2");
-        Attribute attribute3 = new Attribute("value3");
-        attributeContext.putAttribute("attribute1", attribute1, true);
-        attributeContext.putAttribute("attribute2", attribute2, true);
-        attributeContext.putAttribute("attribute3", attribute3, false);
-        Map<String, Attribute> cascadedAttributes = new HashMap<String, Attribute>();
-        cascadedAttributes.put("attribute1", attribute1);
-        cascadedAttributes.put("attribute2", attribute2);
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("attribute3", attribute3);
-        assertEquals(templateAttribute.hashCode() + "my.preparer".hashCode()
-                + attributes.hashCode() + cascadedAttributes.hashCode(),
-                attributeContext.hashCode());
-    }
-
-    /**
-     * Tests {@link BasicAttributeContext} for the TILES-429 bug.
-     */
-    @Test
-    public void testTiles429() {
-        AttributeContext toCopy = new BasicAttributeContext();
-        toCopy.putAttribute("name1", new Attribute("value1"), false);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        List<Attribute> listOfObjects = new ArrayList<Attribute>();
-        Attribute attribute1 = new Attribute(1);
-        listOfObjects.add(attribute1);
-        ListAttribute listAttribute = new ListAttribute(listOfObjects);
-        listAttribute.setInherit(true);
-        toCopy.putAttribute("name3", listAttribute);
-        Attribute templateAttribute = Attribute
-                .createTemplateAttribute("/template.jsp");
-        Set<String> roles = new HashSet<String>();
-        roles.add("role1");
-        roles.add("role2");
-        templateAttribute.setRoles(roles);
-        toCopy.setTemplateAttribute(templateAttribute);
-        toCopy.setPreparer("my.preparer.Preparer");
-        AttributeContext context = new BasicAttributeContext(toCopy);
-        Attribute attribute = context.getAttribute("name1");
-        attribute.setValue("newValue1");
-        attribute = context.getAttribute("name1");
-        assertEquals("newValue1", attribute.getValue());
-        attribute = toCopy.getAttribute("name1");
-        assertEquals("value1", attribute.getValue());
-        attribute = context.getAttribute("name3");
-        assertTrue(attribute instanceof ListAttribute);
-        assertTrue(((ListAttribute) attribute).isInherit());
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/CompareUtilTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/CompareUtilTest.java
deleted file mode 100644
index d87201d..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/CompareUtilTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link CompareUtil}.
- *
- * @version $Rev$ $Date$
- */
-public class CompareUtilTest {
-
-    /**
-     * A test value.
-     */
-    private static final Integer TEST_VALUE = 10;
-
-    /**
-     * Test method for {@link org.apache.tiles.CompareUtil#nullSafeEquals(java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testNullSafeEquals() {
-        assertTrue(CompareUtil.nullSafeEquals(1, 1));
-        assertFalse(CompareUtil.nullSafeEquals(1, 2));
-        assertFalse(CompareUtil.nullSafeEquals(1, null));
-        assertFalse(CompareUtil.nullSafeEquals(null, 1));
-        assertTrue(CompareUtil.nullSafeEquals(null, null));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.CompareUtil#nullSafeHashCode(java.lang.Object)}.
-     */
-    @Test
-    public void testNullSafeHashCode() {
-        assertEquals(TEST_VALUE.hashCode(), CompareUtil.nullSafeHashCode(TEST_VALUE));
-        assertEquals(0, CompareUtil.nullSafeHashCode(null));
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ExpressionTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ExpressionTest.java
deleted file mode 100644
index dc23f69..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ExpressionTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link Expression}.
- *
- * @version $Rev$ $Date$
- */
-public class ExpressionTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#hashCode()}.
-     */
-    @Test
-    public void testHashCode() {
-        Expression expression = new Expression("hello", "there");
-        assertEquals("hello".hashCode() + "there".hashCode(), expression.hashCode());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#Expression(java.lang.String, java.lang.String)}.
-     */
-    @Test
-    public void testExpressionStringString() {
-        Expression expression = new Expression("hello", "there");
-        assertEquals("hello", expression.getExpression());
-        assertEquals("there", expression.getLanguage());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#Expression(java.lang.String)}.
-     */
-    @Test
-    public void testExpressionString() {
-        Expression expression = new Expression("hello");
-        assertEquals("hello", expression.getExpression());
-        assertNull(expression.getLanguage());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#Expression(org.apache.tiles.Expression)}.
-     */
-    @Test
-    public void testExpressionExpression() {
-        Expression expression = new Expression("hello", "there");
-        Expression expression2 = new Expression(expression);
-        assertEquals("hello", expression2.getExpression());
-        assertEquals("there", expression2.getLanguage());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#createExpressionFromDescribedExpression(java.lang.String)}.
-     */
-    @Test
-    public void testCreateExpressionFromDescribedExpression() {
-        Expression expression = Expression.createExpressionFromDescribedExpression("hello");
-        assertEquals("hello", expression.getExpression());
-        assertNull(expression.getLanguage());
-        expression = Expression.createExpressionFromDescribedExpression("there:hello");
-        assertEquals("hello", expression.getExpression());
-        assertEquals("there", expression.getLanguage());
-        expression = Expression.createExpressionFromDescribedExpression("there_:hello");
-        assertEquals("there_:hello", expression.getExpression());
-        assertNull(expression.getLanguage());
-        assertNull(Expression.createExpressionFromDescribedExpression(null));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#createExpression(java.lang.String, java.lang.String)}.
-     */
-    @Test
-    public void testCreateExpression() {
-        Expression expression = Expression.createExpression("hello", "there");
-        assertEquals("hello", expression.getExpression());
-        assertEquals("there", expression.getLanguage());
-        expression = Expression.createExpression("hello", null);
-        assertEquals("hello", expression.getExpression());
-        assertNull(expression.getLanguage());
-        expression = Expression.createExpression(null, "there");
-        assertNull(expression);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#equals(java.lang.Object)}.
-     */
-    @Test
-    public void testEqualsObject() {
-        Expression expression = new Expression("hello", "there");
-        Expression expression2 = new Expression("hello", "there");
-        assertEquals(expression, expression2);
-        expression2 = new Expression("hello", "there2");
-        assertFalse(expression.equals(expression2));
-        expression2 = new Expression("hello");
-        assertFalse(expression.equals(expression2));
-        expression = new Expression("hello");
-        assertEquals(expression, expression2);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.Expression#toString()}.
-     */
-    @Test
-    public void testToString() {
-        Expression expression = new Expression("hello", "there");
-        assertEquals("there:hello", expression.toString());
-        expression = new Expression("hello");
-        assertEquals("DEFAULT:hello", expression.toString());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ListAttributeTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ListAttributeTest.java
deleted file mode 100644
index 314e639..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/ListAttributeTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Test;
-
-/**
- * Tests {@link ListAttribute}.
- *
- * @version $Rev$ $Date$
- */
-public class ListAttributeTest {
-
-    /**
-     * The list size.
-     */
-    private static final int LIST_SIZE = 3;
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#hashCode()}.
-     */
-    @Test
-    public void testHashCode() {
-        ListAttribute attribute = new ListAttribute();
-        List<Attribute> list = new ArrayList<Attribute>();
-        list.add(new Attribute("value1"));
-        list.add(new Attribute("value2"));
-        attribute.setValue(list);
-        attribute.setInherit(true);
-        assertEquals(list.hashCode() + Boolean.TRUE.hashCode(), attribute.hashCode());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#equals(java.lang.Object)}.
-     */
-    @Test
-    public void testEqualsObject() {
-        ListAttribute attribute = new ListAttribute();
-        List<Attribute> list = new ArrayList<Attribute>();
-        list.add(new Attribute("value1"));
-        list.add(new Attribute("value2"));
-        attribute.setValue(list);
-        attribute.setInherit(true);
-        ListAttribute toCheck = new ListAttribute(attribute);
-        assertTrue(attribute.equals(toCheck));
-        toCheck = new ListAttribute(attribute);
-        toCheck.setInherit(false);
-        assertFalse(attribute.equals(toCheck));
-        toCheck = new ListAttribute(attribute);
-        toCheck.add(new Attribute("value3"));
-        assertFalse(attribute.equals(toCheck));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#ListAttribute(java.util.List)}.
-     */
-    @Test
-    public void testListAttributeListOfAttribute() {
-        List<Attribute> attributes = new ArrayList<Attribute>();
-        attributes.add(new Attribute("value1"));
-        attributes.add(new Attribute("value2"));
-        ListAttribute attribute = new ListAttribute(attributes);
-        assertEquals(attributes, attribute.getValue());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#ListAttribute(org.apache.tiles.ListAttribute)}.
-     */
-    @Test
-    public void testListAttributeListAttribute() {
-        ListAttribute attribute = new ListAttribute();
-        List<Attribute> list = new ArrayList<Attribute>();
-        list.add(new Attribute("value1"));
-        list.add(new Attribute("value2"));
-        list.add(null);
-        attribute.setValue(list);
-        attribute.setInherit(true);
-        ListAttribute toCheck = new ListAttribute(attribute);
-        assertEquals(attribute, toCheck);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#setValue(java.util.List)}.
-     */
-    @Test
-    public void testSetValue() {
-        ListAttribute attribute = new ListAttribute();
-        List<Attribute> list = new ArrayList<Attribute>();
-        list.add(new Attribute("value1"));
-        list.add(new Attribute("value2"));
-        attribute.setValue(list);
-        assertEquals(list, attribute.getValue());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#add(org.apache.tiles.Attribute)}.
-     */
-    @Test
-    public void testAdd() {
-        List<Attribute> list = new ArrayList<Attribute>();
-        Attribute attribute1 = new Attribute("value1");
-        list.add(attribute1);
-        Attribute attribute2 = new Attribute("value2");
-        list.add(attribute2);
-        ListAttribute attribute = new ListAttribute(list);
-        Attribute attribute3 = new Attribute("value3");
-        attribute.add(attribute3);
-        list = attribute.getValue();
-        assertEquals(LIST_SIZE, list.size());
-        assertEquals(attribute1, list.get(0));
-        assertEquals(attribute2, list.get(1));
-        assertEquals(attribute3, list.get(2));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#setInherit(boolean)}.
-     */
-    @Test
-    public void testSetInherit() {
-        ListAttribute attribute = new ListAttribute();
-        attribute.setInherit(true);
-        assertTrue(attribute.isInherit());
-        attribute.setInherit(false);
-        assertFalse(attribute.isInherit());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#inherit(org.apache.tiles.ListAttribute)}.
-     */
-    @Test
-    public void testInherit() {
-        List<Attribute> list = new ArrayList<Attribute>();
-        Attribute attribute1 = new Attribute("value1");
-        list.add(attribute1);
-        Attribute attribute2 = new Attribute("value2");
-        list.add(attribute2);
-        ListAttribute parent = new ListAttribute(list);
-        Attribute attribute3 = new Attribute("value3");
-        ListAttribute child = new ListAttribute();
-        child.add(attribute3);
-        child.inherit(parent);
-        list = child.getValue();
-        assertEquals(LIST_SIZE, list.size());
-        assertEquals(attribute1, list.get(0));
-        assertEquals(attribute2, list.get(1));
-        assertEquals(attribute3, list.get(2));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.ListAttribute#clone()}.
-     */
-    @Test
-    public void testClone() {
-        ListAttribute attribute = new ListAttribute();
-        List<Attribute> list = new ArrayList<Attribute>();
-        list.add(new Attribute("value1"));
-        list.add(new Attribute("value2"));
-        attribute.setValue(list);
-        attribute.setInherit(true);
-        ListAttribute toCheck = attribute.clone();
-        assertEquals(attribute, toCheck);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/NoSuchContainerExceptionTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/NoSuchContainerExceptionTest.java
deleted file mode 100644
index c700a1b..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/NoSuchContainerExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link NoSuchContainerException}.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchContainerExceptionTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.NoSuchContainerException#NoSuchContainerException()}.
-     */
-    @Test
-    public void testNoSuchContainerException() {
-        NoSuchContainerException exception = new NoSuchContainerException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.NoSuchContainerException#NoSuchContainerException(java.lang.String)}.
-     */
-    @Test
-    public void testNoSuchContainerExceptionString() {
-        NoSuchContainerException exception = new NoSuchContainerException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.NoSuchContainerException#NoSuchContainerException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testNoSuchContainerExceptionThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchContainerException exception = new NoSuchContainerException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.NoSuchContainerException#NoSuchContainerException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testNoSuchContainerExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchContainerException exception = new NoSuchContainerException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TestDefinition.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TestDefinition.java
deleted file mode 100644
index 0f28554..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TestDefinition.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Test;
-
-/**
- * Tests the Definition class.
- *
- * @version $Rev$ $Date$
- */
-public class TestDefinition {
-
-    /**
-     * Tests {@link Definition#Definition(Definition)}.
-     */
-    @Test
-    public void testDefinitionCopy() {
-        Definition definition = new Definition();
-        definition.setName("myDefinition");
-        definition.setExtends("myExtends");
-        Attribute attribute1 = new Attribute("value1");
-        definition.putAttribute("name1", attribute1);
-        Attribute attribute2 = new Attribute("value2");
-        definition.putAttribute("name2", attribute2);
-        Definition toCheck = new Definition(definition);
-        assertEquals("myDefinition", toCheck.getName());
-        assertEquals("myExtends", toCheck.getExtends());
-        assertEquals(attribute1, toCheck.getAttribute("name1"));
-        assertEquals(attribute2, toCheck.getAttribute("name2"));
-    }
-
-    /**
-     * Tests {@link Definition#Definition(Definition)}.
-     */
-    @Test
-    public void testDefinitionComplete() {
-        Map<String, Attribute> attributeMap = new HashMap<String, Attribute>();
-        Attribute attribute1 = new Attribute("value1");
-        Attribute attribute2 = new Attribute("value2");
-        attributeMap.put("name1", attribute1);
-        attributeMap.put("name2", attribute2);
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-        Definition definition = new Definition("myDefinition",
-                templateAttribute, attributeMap);
-        assertEquals("myDefinition", definition.getName());
-        assertEquals(templateAttribute, definition.getTemplateAttribute());
-        assertEquals(attribute1, definition.getAttribute("name1"));
-        assertEquals(attribute2, definition.getAttribute("name2"));
-    }
-
-    /**
-     * Verifies the put Attribute functionality.
-     *
-     * Attributes are added or replaced in the definition.
-     */
-    @Test
-    public void testPutAttribute() {
-        Definition def = new Definition();
-        def.setName("test1");
-        def.setTemplateAttribute(Attribute
-                .createTemplateAttribute("/page1.jsp"));
-        Attribute attr1 = new Attribute("test.definition.name",
-                (Expression) null, null, "definition");
-        def.putAttribute("attr1",  attr1);
-
-        attr1 = def.getAttribute("attr1");
-        assertNotNull("Null attribute.", attr1);
-        assertTrue("Wrong attribute type", "definition".equals(attr1
-                .getRenderer()));
-    }
-
-    /**
-     * Tests the {@link Definition#inherit(BasicAttributeContext)} method.
-     */
-    @Test
-    public void testInherit() {
-        Definition toCopy = new Definition();
-        toCopy.putAttribute("name1", new Attribute("value1"), true);
-        toCopy.putAttribute("name2", new Attribute("value2"), true);
-        toCopy.putAttribute("name3", new Attribute("value3"), false);
-        toCopy.putAttribute("name4", new Attribute("value4"), false);
-        Definition context = new Definition();
-        toCopy.putAttribute("name1", new Attribute("newValue1"), true);
-        toCopy.putAttribute("name3", new Attribute("newValue3"), false);
-        context.inherit(toCopy);
-        Attribute attribute = context.getCascadedAttribute("name1");
-        assertNotNull("Attribute name1 not found", attribute);
-        assertEquals("Attribute name1 has not been set correctly", "newValue1",
-                attribute.getValue());
-        attribute = context.getCascadedAttribute("name2");
-        assertNotNull("Attribute name2 not found", attribute);
-        assertEquals("Attribute name2 has not been set correctly", "value2",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name3");
-        assertNotNull("Attribute name3 not found", attribute);
-        assertEquals("Attribute name3 has not been set correctly", "newValue3",
-                attribute.getValue());
-        attribute = context.getLocalAttribute("name4");
-        assertNotNull("Attribute name4 not found", attribute);
-        assertEquals("Attribute name4 has not been set correctly", "value4",
-                attribute.getValue());
-
-        toCopy = new Definition();
-        toCopy.setPreparer("ExtendedPreparer");
-        Attribute templateAttribute = new Attribute("extendedTemplate.jsp",
-                Expression.createExpression("expression", "language"),
-                "extendedRole", "template");
-        toCopy.setTemplateAttribute(templateAttribute);
-        context = new Definition();
-        context.inherit(toCopy);
-        assertEquals("Preparer not inherited", "ExtendedPreparer", context
-                .getPreparer());
-        assertNotNull("Roles not inherited", context.getTemplateAttribute()
-                .getRoles());
-        assertEquals("Roles not inherited", context.getTemplateAttribute()
-                .getRoles().size(), 1);
-        assertTrue("Roles not inherited", context.getTemplateAttribute()
-                .getRoles().contains(
-                "extendedRole"));
-        assertEquals("Template not inherited", "extendedTemplate.jsp", context
-                .getTemplateAttribute().getValue());
-        assertEquals("Template expression not inherited", "expression", context
-                .getTemplateAttribute().getExpressionObject().getExpression());
-        assertEquals("Template expression language not inherited", "language",
-                context.getTemplateAttribute().getExpressionObject()
-                        .getLanguage());
-        context = new Definition();
-        context.setPreparer("LocalPreparer");
-        templateAttribute = new Attribute("localTemplate.jsp", Expression
-                .createExpression("localExpression", "localLanguage"),
-                "localRole", "template");
-        context.setTemplateAttribute(templateAttribute);
-        assertEquals("Preparer inherited", "LocalPreparer", context
-                .getPreparer());
-        assertNotNull("Roles not correct", context.getTemplateAttribute()
-                .getRoles());
-        assertEquals("Roles not correct", context.getTemplateAttribute()
-                .getRoles().size(), 1);
-        assertTrue("Roles inherited", context.getTemplateAttribute().getRoles()
-                .contains("localRole"));
-        assertEquals("Template inherited", "localTemplate.jsp", context
-                .getTemplateAttribute().getValue());
-        assertEquals("Template expression inherited", "localExpression",
-                context.getTemplateAttribute().getExpressionObject()
-                        .getExpression());
-        assertEquals("Template expression language not inherited",
-                "localLanguage", context.getTemplateAttribute()
-                        .getExpressionObject().getLanguage());
-    }
-
-    /**
-     * Tests {@link Definition#toString()}.
-     */
-    @Test
-    public void testToString() {
-        Definition definition = new Definition();
-        definition.setName("myDefinitionName");
-        assertEquals(
-                "{name=myDefinitionName, template=<null>, role=<null>, preparerInstance=null, attributes=null}",
-                definition.toString());
-        definition.setTemplateAttribute(Attribute.createTemplateAttribute("myTemplate"));
-        assertEquals(
-                "{name=myDefinitionName, template=myTemplate, role=null, preparerInstance=null, attributes=null}",
-                definition.toString());
-        definition.putAttribute("myAttributeName", new Attribute("myAttributeValue"));
-        assertEquals(
-                "{name=myDefinitionName, template=myTemplate, role=null, preparerInstance=null, "
-                        + "attributes={myAttributeName=myAttributeValue}}",
-                definition.toString());
-    }
-
-    /**
-     * Tests {@link Definition#equals(Object)}.
-     */
-    @Test
-    public void testEquals() {
-        Definition definition = new Definition();
-        definition.setName("myDefinition");
-        definition.setExtends("myExtends");
-        Attribute attribute1 = new Attribute("value1");
-        definition.putAttribute("name1", attribute1);
-        Attribute attribute2 = new Attribute("value2");
-        definition.putAttribute("name2", attribute2);
-        Definition toCheck = new Definition(definition);
-        assertTrue(definition.equals(toCheck));
-        toCheck = new Definition(definition);
-        toCheck.setName("anotherDefinition");
-        assertFalse(definition.equals(toCheck));
-        toCheck = new Definition(definition);
-        toCheck.setExtends("anotherExtends");
-        assertFalse(definition.equals(toCheck));
-        toCheck = new Definition(definition);
-        toCheck.putAttribute("name1", new Attribute("anotherAttribute"));
-        assertFalse(definition.equals(toCheck));
-    }
-
-    /**
-     * Tests {@link Definition#hashCode()}.
-     */
-    @Test
-    public void testHashCode() {
-        Definition definition = new Definition();
-        definition.setName("myDefinition");
-        definition.setExtends("myExtends");
-        Attribute attribute1 = new Attribute("value1");
-        definition.putAttribute("name1", attribute1);
-        Attribute attribute2 = new Attribute("value2");
-        definition.putAttribute("name2", attribute2);
-        BasicAttributeContext attributeContext = new BasicAttributeContext();
-        attributeContext.putAttribute("name1", attribute1);
-        attributeContext.putAttribute("name2", attribute2);
-        assertEquals("myDefinition".hashCode() + "myExtends".hashCode()
-                + attributeContext.hashCode(), definition.hashCode());
-    }
-
-    /**
-     * Tests {@link Definition#isExtending()}.
-     */
-    @Test
-    public void testIsExtending() {
-        Definition definition = new Definition();
-        definition.setName("myDefinition");
-        assertFalse(definition.isExtending());
-        definition.setExtends("myExtends");
-        assertTrue(definition.isExtending());
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java
deleted file mode 100644
index 46f7ada..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesContainerWrapperTest.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesContainerWrapper}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContainerWrapperTest {
-
-    /**
-     * The container.
-     */
-    private TilesContainer container;
-
-    /**
-     * The wrapper to test.
-     */
-    private TilesContainerWrapper wrapper;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        container = createMock(TilesContainer.class);
-        wrapper = new TilesContainerWrapper(container);
-    }
-
-    /**
-     * Tests {@link TilesContainerWrapper#TilesContainerWrapper(TilesContainer)}.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testTilesContainerWrapperNPE() {
-        new TilesContainerWrapper(null);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getWrappedContainer()}.
-     */
-    @Test
-    public void testGetWrappedContainer() {
-        replay(container);
-        assertSame(container, wrapper.getWrappedContainer());
-        verify(container);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesContainerWrapper#endContext(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testEndContext() {
-        Request request = createMock(Request.class);
-
-        container.endContext(request);
-
-        replay(container, request);
-        wrapper.endContext(request);
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#evaluate(Attribute, Request)}.
-     */
-    @Test
-    public void testEvaluate() {
-        Request request = createMock(Request.class);
-        Attribute attribute = createMock(Attribute.class);
-
-        expect(container.evaluate(attribute, request)).andReturn(new Integer(1));
-
-        replay(container, request, attribute);
-        assertEquals(new Integer(1), wrapper.evaluate(attribute, request));
-        verify(container, request, attribute);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesContainerWrapper#getApplicationContext()}.
-     */
-    @Test
-    public void testGetApplicationContext() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(container.getApplicationContext()).andReturn(applicationContext);
-
-        replay(container, applicationContext);
-        assertSame(applicationContext, wrapper.getApplicationContext());
-        verify(container, applicationContext);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#getAttributeContext(Request)}.
-     */
-    @Test
-    public void testGetAttributeContext() {
-        Request request = createMock(Request.class);
-        AttributeContext attribute = createMock(AttributeContext.class);
-
-        expect(container.getAttributeContext(request)).andReturn(attribute);
-
-        replay(container, request, attribute);
-        assertSame(attribute, wrapper.getAttributeContext(request));
-        verify(container, request, attribute);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#getDefinition(String, Request)}.
-     */
-    @Test
-    public void testGetDefinition() {
-        Request request = createMock(Request.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(container.getDefinition("definition", request)).andReturn(definition);
-
-        replay(container, request, definition);
-        assertSame(definition, wrapper.getDefinition("definition", request));
-        verify(container, request, definition);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#isValidDefinition(String, Request)}.
-     */
-    @Test
-    public void testIsValidDefinition() {
-        Request request = createMock(Request.class);
-
-        expect(container.isValidDefinition("definition", request)).andReturn(true);
-
-        replay(container, request);
-        assertTrue(wrapper.isValidDefinition("definition", request));
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#prepare(String, Request)}.
-     */
-    @Test
-    public void testPrepare() {
-        Request request = createMock(Request.class);
-
-        container.prepare("preparer", request);
-
-        replay(container, request);
-        wrapper.prepare("preparer", request);
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#render(String, Request)}.
-     */
-    @Test
-    public void testRenderStringRequest() {
-        Request request = createMock(Request.class);
-
-        container.render("definition", request);
-
-        replay(container, request);
-        wrapper.render("definition", request);
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#render(Definition, Request)}.
-     */
-    @Test
-    public void testRenderDefinitionRequest() {
-        Request request = createMock(Request.class);
-        Definition definition = createMock(Definition.class);
-
-        container.render(definition, request);
-
-        replay(container, request, definition);
-        wrapper.render(definition, request);
-        verify(container, request, definition);
-    }
-
-    /**
-     * Test method for {@link TilesContainerWrapper#render(Attribute, Request)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRenderAttributeRequest() throws IOException {
-        Request request = createMock(Request.class);
-        Attribute attribute = createMock(Attribute.class);
-
-        container.render(attribute, request);
-
-        replay(container, request, attribute);
-        wrapper.render(attribute, request);
-        verify(container, request, attribute);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesContainerWrapper#renderContext(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testRenderContext() {
-        Request request = createMock(Request.class);
-
-        container.renderContext(request);
-
-        replay(container, request);
-        wrapper.renderContext(request);
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesContainerWrapper#startContext(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testStartContext() {
-        Request request = createMock(Request.class);
-        AttributeContext attribute = createMock(AttributeContext.class);
-
-        expect(container.startContext(request)).andReturn(attribute);
-
-        replay(container, request, attribute);
-        assertSame(attribute, wrapper.startContext(request));
-        verify(container, request, attribute);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesExceptionTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesExceptionTest.java
deleted file mode 100644
index 95ffb22..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/TilesExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link TilesException}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesExceptionTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesException#TilesException()}.
-     */
-    @Test
-    public void testTilesException() {
-        TilesException exception = new TilesException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesException#TilesException(java.lang.String)}.
-     */
-    @Test
-    public void testTilesExceptionString() {
-        TilesException exception = new TilesException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesException#TilesException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testTilesExceptionThrowable() {
-        Throwable cause = new Throwable();
-        TilesException exception = new TilesException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.TilesException#TilesException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testTilesExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        TilesException exception = new TilesException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/access/TilesAccessTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/access/TilesAccessTest.java
deleted file mode 100644
index 6f07633..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/access/TilesAccessTest.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.access;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.junit.Test;
-import org.apache.tiles.NoSuchContainerException;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-
-/**
- * Tests {@link TilesAccess}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesAccessTest {
-
-    /**
-     * Tests {@link TilesAccess#setContainer(ApplicationContext, TilesContainer)}.
-     */
-    @Test
-    public void testSetContainer() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        expect(context.getApplicationScope()).andReturn(attribs);
-        replay(context, container);
-        TilesAccess.setContainer(context, container);
-        assertEquals(attribs.size(), 1);
-        assertEquals(attribs.get(TilesAccess.CONTAINER_ATTRIBUTE), container);
-        verify(context, container);
-    }
-
-    /**
-     * Tests {@link TilesAccess#setContainer(ApplicationContext, TilesContainer, String)}.
-     */
-    @Test
-    public void testSetContainerWithKey() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        replay(context, container);
-        TilesAccess.setContainer(context, container, "myKey");
-        assertEquals(1, attribs.size());
-        assertEquals(container, attribs.get("myKey"));
-
-        TilesAccess.setContainer(context, null, "myKey");
-        assertEquals(0, attribs.size());
-
-        TilesAccess.setContainer(context, container, null);
-        assertEquals(1, attribs.size());
-        assertEquals(container, attribs.get(TilesAccess.CONTAINER_ATTRIBUTE));
-        verify(context, container);
-    }
-
-    /**
-     * Tests {@link TilesAccess#getContainer(ApplicationContext)}.
-     */
-    @Test
-    public void testGetContainer() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-
-        replay(context, container);
-        attribs.put(TilesAccess.CONTAINER_ATTRIBUTE, container);
-        assertEquals(container, TilesAccess.getContainer(context));
-        verify(context, container);
-    }
-
-    /**
-     * Tests {@link TilesAccess#getContainer(TilesApplicationContext, String))}.
-     */
-    @Test
-    public void testGetContainerWithKey() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-
-        replay(context, container);
-        attribs.put(TilesAccess.CONTAINER_ATTRIBUTE, container);
-        attribs.put("myKey", container);
-        assertEquals(container, TilesAccess.getContainer(context, null));
-        assertEquals(container, TilesAccess.getContainer(context, "myKey"));
-        verify(context, container);
-    }
-
-    /**
-     * Tests
-     * {@link ServletUtil#setCurrentContainer(ServletRequest, String)}.
-     */
-    @Test
-    public void testSetCurrentContainer() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        attribs.put("myKey", container);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(request.getApplicationContext()).andReturn(context);
-        replay(request, context, container);
-        TilesAccess.setCurrentContainer(request, "myKey");
-        assertEquals(container, requestScope.get(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME));
-        verify(request, context, container);
-    }
-
-    /**
-     * Tests
-     * {@link ServletUtil#setCurrentContainer(ServletRequest, String)}.
-     */
-    @Test(expected = NoSuchContainerException.class)
-    public void testSetCurrentContainerException() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-
-        expect(request.getApplicationContext()).andReturn(context);
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        replay(request, context);
-        try {
-            TilesAccess.setCurrentContainer(request, "myKey");
-        } finally {
-            verify(request, context);
-        }
-    }
-
-    /**
-     * Tests
-     * {@link ServletUtil#setCurrentContainer(ServletRequest, TilesContainer)}.
-     */
-    @Test
-    public void testSetCurrentContainerWithContainer() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        attribs.put("myKey", container);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request, context, container);
-        TilesAccess.setCurrentContainer(request, container);
-        assertEquals(container, requestScope.get(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME));
-        verify(request, context, container);
-    }
-
-    /**
-     * Tests
-     * {@link ServletUtil#setCurrentContainer(ServletRequest, TilesContainer)}.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testSetCurrentContainerWithContainerException() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-
-        replay(request, context);
-        try {
-            TilesAccess.setCurrentContainer(request, (TilesContainer) null);
-        } finally {
-            verify(request, context);
-        }
-    }
-
-    /**
-     * Tests {@link ServletUtil#getCurrentContainer(ServletRequest)}.
-     */
-    @Test
-    public void testGetCurrentContainer() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        attribs.put("myKey", container);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(context);
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request, context, container);
-        assertEquals(container, TilesAccess.getCurrentContainer(request));
-        verify(request, context, container);
-    }
-
-    /**
-     * Tests {@link ServletUtil#getCurrentContainer(ServletRequest)}.
-     */
-    @Test
-    public void testGetCurrentContainerDefault() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        attribs.put(TilesAccess.CONTAINER_ATTRIBUTE, container);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-
-        expect(request.getApplicationContext()).andReturn(context);
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request, context, container);
-        assertEquals(container, TilesAccess.getCurrentContainer(request));
-        verify(request, context, container);
-    }
-}
diff --git a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/preparer/PreparerExceptionTest.java b/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/preparer/PreparerExceptionTest.java
deleted file mode 100644
index 110ee79..0000000
--- a/TILES_3_0_X/tiles-api/src/test/java/org/apache/tiles/preparer/PreparerExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.preparer;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link PreparerException}.
- *
- * @version $Rev$ $Date$
- */
-public class PreparerExceptionTest {
-
-    /**
-     * Test method for {@link PreparerException#PreparerException()}.
-     */
-    @Test
-    public void testPreparerException() {
-        PreparerException exception = new PreparerException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link PreparerException#PreparerException(java.lang.String)}.
-     */
-    @Test
-    public void testPreparerExceptionString() {
-        PreparerException exception = new PreparerException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link PreparerException#PreparerException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testPreparerExceptionThrowable() {
-        Throwable cause = new Throwable();
-        PreparerException exception = new PreparerException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link PreparerException#PreparerException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testPreparerExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        PreparerException exception = new PreparerException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-compat/pom.xml b/TILES_3_0_X/tiles-compat/pom.xml
deleted file mode 100644
index cecc785..0000000
--- a/TILES_3_0_X/tiles-compat/pom.xml
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-compat</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - Compatibility</name>
-  <description>Tiles compatibility library, to help migration from Struts-Tiles.
-  </description>
-
-  <properties>
-      <tiles.osgi.symbolicName>org.apache.tiles.compat</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>net.sf.dtddoc</groupId>
-        <artifactId>dtddoc-maven-plugin</artifactId>
-        <version>1.1</version>
-        <configuration>
-          <docTitle>Tiles Definition File</docTitle>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-jsp</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.shale</groupId>
-      <artifactId>shale-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/MenuItem.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/MenuItem.java
deleted file mode 100644
index ca5e107..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/MenuItem.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.beans;
-
-import java.io.Serializable;
-
-/**
- * Interface for MenuItems.
- *
- * @see SimpleMenuItem
- * @version $Rev$ $Date$
- */
-public interface MenuItem extends Serializable {
-
-    /**
-     * Sets the value (i.e. the visible part) of this menu item.
-     *
-     * @param value The value of this item.
-     */
-    void setValue(String value);
-
-    /**
-     * Returns the value (i.e. the visible part) of this menu item.
-     *
-     * @return The value of this item.
-     */
-    String getValue();
-
-    /**
-     * Sets the URL of this menu item.
-     *
-     * @param link The URL of this item.
-     */
-    void setLink(String link);
-
-    /**
-     * Returns the URL of this menu item.
-     *
-     * @return The URL of this item.
-     */
-    String getLink();
-
-    /**
-     * Sets the icon URL of this menu item.
-     *
-     * @param link The icon URL.
-     */
-    void setIcon(String link);
-
-    /**
-     * Returns the icon URL of this menu item.
-     *
-     * @return The icon URL.
-     */
-    String getIcon();
-
-    /**
-     * Sets the tooltip text.
-     *
-     * @param link The tooltip text.
-     */
-    void setTooltip(String link);
-
-    /**
-     * Returns the tooltip text.
-     *
-     * @return The tooltip text.
-     */
-    String getTooltip();
-}
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/SimpleMenuItem.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/SimpleMenuItem.java
deleted file mode 100644
index 757f3a1..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/SimpleMenuItem.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.beans;
-
-import java.io.Serializable;
-
-/**
- * A MenuItem implementation.
- * Used to read menu items in definitions.
- *
- * @version $Rev$ $Date$
- */
-public class SimpleMenuItem implements MenuItem, Serializable {
-
-    /**
-     * The value of the item, i.e. what is really visible to the user.
-     */
-    private String value = null;
-
-    /**
-     * The link where the menu item points to.
-     */
-    private String link = null;
-
-    /**
-     * The (optional) icon image URL.
-     */
-    private String icon = null;
-
-    /**
-     * The (optional) tooltip text.
-     */
-    private String tooltip = null;
-
-    /**
-     * Constructor.
-     */
-    public SimpleMenuItem() {
-        super();
-    }
-
-    /**
-     * Sets the value of the item, i.e. what is really visible to the user.
-     *
-     * @param value The value of the item.
-     */
-    public void setValue(String value) {
-        this.value = value;
-    }
-
-    /**
-     * Returns the value of the item, i.e. what is really visible to the user.
-     *
-     * @return The value of the item.
-     */
-    public String getValue() {
-        return value;
-    }
-
-    /**
-     * Sets the link where the menu item points to.
-     *
-     * @param link The link.
-     */
-    public void setLink(String link) {
-        this.link = link;
-    }
-
-    /**
-     * Returns the link where the menu item points to.
-     *
-     * @return The link.
-     */
-    public String getLink() {
-        return link;
-    }
-
-    /**
-     * Sets the (optional) icon image URL.
-     *
-     * @param icon The icon URL.
-     */
-    public void setIcon(String icon) {
-        this.icon = icon;
-    }
-
-    /**
-     * Returns the (optional) icon image URL.
-     *
-     * @return The icon URL.
-     */
-    public String getIcon() {
-        return icon;
-    }
-
-    /**
-     * Sets the (optional) tooltip text.
-     *
-     * @param tooltip The tooltip text.
-     */
-    public void setTooltip(String tooltip) {
-        this.tooltip = tooltip;
-    }
-
-    /**
-     * Returns the (optional) tooltip text.
-     *
-     * @return The tooltip text.
-     */
-    public String getTooltip() {
-        return tooltip;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        StringBuffer buff = new StringBuffer("SimpleMenuItem[");
-
-        if (getValue() != null) {
-            buff.append("value=").append(getValue()).append(", ");
-        }
-
-        if (getLink() != null) {
-            buff.append("link=").append(getLink()).append(", ");
-        }
-
-        if (getTooltip() != null) {
-            buff.append("tooltip=").append(getTooltip()).append(", ");
-        }
-
-        if (getIcon() != null) {
-            buff.append("icon=").append(getIcon()).append(", ");
-        }
-
-        buff.append("]");
-        return buff.toString();
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/package-info.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/package-info.java
deleted file mode 100644
index 7ce4956..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/beans/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes to work with Tiles menu items and beans.
- */
-package org.apache.tiles.beans;
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/CompatibilityDigesterDefinitionsReader.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/CompatibilityDigesterDefinitionsReader.java
deleted file mode 100644
index 7a5f597..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/CompatibilityDigesterDefinitionsReader.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.definition.digester;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.Rule;
-import org.apache.tiles.Attribute;
-import org.apache.tiles.beans.SimpleMenuItem;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.xml.sax.Attributes;
-
-/**
- * Digester reader that can read Tiles 1.1, 1.2, 1.3, 1.4 and 2.0 files.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class CompatibilityDigesterDefinitionsReader extends
-        DigesterDefinitionsReader {
-
-    /**
-     * Intercepts a &lt;item&gt; tag.
-     */
-    private static final String ADD_WILDCARD = "*/item";
-
-    /**
-     * Intercepts a &lt;bean&gt; tag.
-     */
-    private static final String BEAN_TAG = "*/bean";
-
-    /**
-     * The set of public identifiers, and corresponding resource names for the
-     * versions of the configuration file DTDs we know about. There <strong>MUST</strong>
-     * be an even number of Strings in this list!
-     *
-     * @since 2.1.0
-     */
-    protected String[] registrations;
-
-    /** {@inheritDoc} */
-    @Override
-    protected void initSyntax(Digester digester) {
-        super.initSyntax(digester);
-        initDigesterForComponentsDefinitionsSyntax(digester);
-        initDigesterForInstancesSyntax(digester);
-        initDigesterForTilesDefinitionsSyntax(digester);
-        initDigesterForBeans(digester);
-    }
-
-    /**
-     * Init digester for components syntax. This is an old set of rules, left
-     * for backward compatibility.
-     *
-     * @param digester Digester instance to use.
-     */
-    private void initDigesterForComponentsDefinitionsSyntax(Digester digester) {
-        // Common constants
-        String definitionTag = "component-definitions/definition";
-
-        String putTag = definitionTag + "/put";
-
-        String listTag = definitionTag + "/putList";
-
-        String addListElementTag = listTag + "/add";
-
-        // syntax rules
-        digester.addObjectCreate(definitionTag, DEFINITION_HANDLER_CLASS);
-        digester.addRule(definitionTag, new FillDefinitionRule());
-        digester.addSetNext(definitionTag, "addDefinition",
-                DEFINITION_HANDLER_CLASS);
-        // put / putAttribute rules
-        digester.addObjectCreate(putTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(putTag, new FillAttributeRule());
-        digester.addRule(putTag, new PutAttributeRule());
-        // list rules
-        digester.addObjectCreate(listTag, LIST_HANDLER_CLASS);
-        digester.addSetProperties(listTag);
-        digester.addRule(listTag, new PutAttributeRule());
-        // list elements rules
-        // We use Attribute class to avoid rewriting a new class.
-        // Name part can't be used in listElement attribute.
-        digester.addObjectCreate(addListElementTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(addListElementTag, new FillAttributeRule());
-        digester.addSetNext(addListElementTag, "add",
-                PUT_ATTRIBUTE_HANDLER_CLASS);
-    }
-
-    /**
-     * Init digester for Tiles syntax. Same as components, but with first
-     * element = tiles-definitions
-     *
-     * @param digester Digester instance to use.
-     */
-    private void initDigesterForTilesDefinitionsSyntax(Digester digester) {
-        // Common constants
-        String definitionTag = "tiles-definitions/definition";
-
-        String putTag = definitionTag + "/put";
-
-        // String LIST_TAG = DEFINITION_TAG + "/putList";
-        // List tag value
-        String listTag = "putList";
-        String definitionListTag = definitionTag + "/" + listTag;
-        // Tag value for adding an element in a list
-        String addListElementTag = "*/" + listTag + "/add";
-
-        // put / putAttribute rules
-        // Rules for a same pattern are called in order, but rule.end() are
-        // called
-        // in reverse order.
-        // SetNext and CallMethod use rule.end() method. So, placing SetNext in
-        // first position ensure it will be called last (sic).
-        digester.addObjectCreate(putTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(putTag, new FillAttributeRule());
-        digester.addRule(putTag, new PutAttributeRule());
-        // Definition level list rules
-        // This is rules for lists nested in a definition
-        digester.addObjectCreate(definitionListTag, LIST_HANDLER_CLASS);
-        digester.addSetProperties(definitionListTag);
-        digester.addRule(definitionListTag, new PutAttributeRule());
-        // list elements rules
-        // We use Attribute class to avoid rewriting a new class.
-        // Name part can't be used in listElement attribute.
-        digester.addObjectCreate(addListElementTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(addListElementTag, new FillAttributeRule());
-        digester.addSetNext(addListElementTag, "add",
-                PUT_ATTRIBUTE_HANDLER_CLASS);
-
-        // nested list elements rules
-        // Create a list handler, and add it to parent list
-        String nestedList = "*/" + listTag + "/" + listTag;
-        digester.addObjectCreate(nestedList, LIST_HANDLER_CLASS);
-        digester.addSetProperties(nestedList);
-        digester.addSetNext(nestedList, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-    }
-
-    /**
-     * Init digester in order to parse instances definition file syntax.
-     * Instances is an old name for "definition". This method is left for
-     * backwards compatibility.
-     *
-     * @param digester Digester instance to use.
-     */
-    private void initDigesterForInstancesSyntax(Digester digester) {
-        // Build a digester to process our configuration resource
-        String instanceTag = "component-instances/instance";
-
-        String putTag = instanceTag + "/put";
-        String putAttributeTag = instanceTag + "/putAttribute";
-
-        String listTag = instanceTag + "/putList";
-
-        String addListElementTag = listTag + "/add";
-
-        // component instance rules
-        digester.addObjectCreate(instanceTag, DEFINITION_HANDLER_CLASS);
-        digester.addRule(instanceTag, new FillDefinitionRule());
-        digester
-                .addSetNext(instanceTag, "addDefinition", DEFINITION_HANDLER_CLASS);
-        // put / putAttribute rules
-        digester.addObjectCreate(putAttributeTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(putTag, new FillAttributeRule());
-        digester.addRule(putTag, new PutAttributeRule());
-        // put / putAttribute rules
-        digester.addObjectCreate(putTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addSetProperties(putTag);
-        digester.addRule(putTag, new PutAttributeRule());
-        // list rules
-        digester.addObjectCreate(listTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addSetProperties(listTag);
-        digester.addRule(listTag, new PutAttributeRule());
-        // list elements rules
-        // We use Attribute class to avoid rewriting a new class.
-        // Name part can't be used in listElement attribute.
-        digester.addObjectCreate(addListElementTag, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(addListElementTag, new FillAttributeRule());
-        digester.addSetNext(addListElementTag, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-    }
-
-    /**
-     * Init digester for Tiles syntax with first element = tiles-definitions.
-     *
-     * @param digester Digester instance to use.
-     */
-    private void initDigesterForBeans(Digester digester) {
-
-        // item elements rules
-        // We use Attribute class to avoid rewriting a new class.
-        // Name part can't be used in listElement attribute.
-        //String ADD_WILDCARD = LIST_TAG + "/addItem";
-        // non String ADD_WILDCARD = LIST_TAG + "/addx*";
-        String menuItemDefaultClass = SimpleMenuItem.class.getName();
-        digester.addObjectCreate(ADD_WILDCARD, menuItemDefaultClass, "classtype");
-        digester.addSetProperties(ADD_WILDCARD);
-        digester.addRule(ADD_WILDCARD, new SetValueToAttributeRule());
-        digester.addSetNext(ADD_WILDCARD, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-
-        // bean elements rules
-        String beanDefaultClass = SimpleMenuItem.class.getName();
-        digester.addObjectCreate(BEAN_TAG, beanDefaultClass, "classtype");
-        digester.addSetProperties(BEAN_TAG);
-        digester.addRule(BEAN_TAG, new SetValueToAttributeRule());
-        digester.addSetNext(BEAN_TAG, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-
-        // Set properties to surrounding element
-        digester.addSetProperty(BEAN_TAG + "/set-property", "property", "value");
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected String[] getRegistrations() {
-        if (registrations == null) {
-            registrations = new String[] {
-                "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN",
-                "/org/apache/tiles/resources/tiles-config_3_0.dtd",
-                "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN",
-                "/org/apache/tiles/compat/resources/tiles-config_2_0.dtd",
-                "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN",
-                "/org/apache/tiles/compat/resources/tiles-config_2_1.dtd",
-                "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN",
-                "/org/apache/tiles/compat/resources/tiles-config_1_1.dtd",
-                "-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN",
-                "/org/apache/tiles/compat/resources/tiles-config_1_3.dtd",
-                "-//Apache Software Foundation//DTD Tiles Configuration 1.4//EN",
-                "/org/apache/tiles/compat/resources/tiles-config_1_4.dtd"};
-        }
-        return registrations;
-    }
-
-    /**
-     * Digester rule to manage assignment of an object as an attribute value.
-     *
-     * @since 3.0.0
-     */
-    public static class SetValueToAttributeRule extends Rule {
-
-        /** {@inheritDoc} */
-        @Override
-        public void begin(String namespace, String name, Attributes attributes) {
-            Object obj = digester.pop();
-            Attribute attribute = new Attribute(obj);
-            digester.push(attribute);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/package-info.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/package-info.java
deleted file mode 100644
index a3826db..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/definition/digester/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Contains code to read old-format Tiles definition files.
- */
-package org.apache.tiles.compat.definition.digester;
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactory.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactory.java
deleted file mode 100644
index 300aafa..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.preparer;
-
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.preparer.factory.BasicPreparerFactory;
-
-/**
- * Factory used to instantiate preparers in a Struts 1 / Tiles 2 environment.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class CompatibilityPreparerFactory extends BasicPreparerFactory {
-
-    /** {@inheritDoc} */
-    @Override
-    protected ViewPreparer createPreparer(String name) {
-        ViewPreparer retValue;
-
-        if (name.startsWith("/")) {
-            retValue = new UrlPreparer(name);
-        } else {
-            retValue = super.createPreparer(name);
-        }
-
-        return retValue;
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/UrlPreparer.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/UrlPreparer.java
deleted file mode 100644
index 0082d2e..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/UrlPreparer.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.preparer;
-
-import java.io.IOException;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.PreparerException;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.DispatchRequest;
-
-/**
- * Uses a URL that acts as a preparer. When
- * {@link org.apache.tiles.preparer.factory.factory.ViewPreparer#execute(Request, AttributeContext)}
- * is called, the URL is got, but its response is discarded.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class UrlPreparer implements ViewPreparer {
-
-    /**
-     * The URL to be used as a preparer.
-     */
-    private String url;
-
-    /**
-     * Constructor.
-     *
-     * @param url The URL to be used as a preparer.
-     */
-    public UrlPreparer(String url) {
-        this.url = url;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void execute(Request tilesContext,
-            AttributeContext attributeContext) {
-
-        if (tilesContext instanceof DispatchRequest) {
-            try {
-                ((DispatchRequest) tilesContext).include(url);
-            } catch (IOException e) {
-                throw new PreparerException("The inclusion of the URL " + url
-                        + " threw an I/O exception", e);
-            }
-        } else {
-            throw new PreparerException("This preparer is restricted to web environments");
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/package-info.java b/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/package-info.java
deleted file mode 100644
index e84df12..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/java/org/apache/tiles/compat/preparer/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * <p>"View preparers" are objects that allows the "preparation" of a Tiles artifact
- * (definition, template or attribute) before it is rendered.</p>
- * <p>This package contains "compatibility" preparers, i.e. ViewPreparers that are
- * compatibile with Tiles 1 "controllers".</p>
- */
-package org.apache.tiles.compat.preparer;
-
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-compat/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-compat/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_1.dtd b/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_1.dtd
deleted file mode 100644
index 0a4db13..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_1.dtd
+++ /dev/null
@@ -1,299 +0,0 @@
-<!--
-    $Id$
-
-    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.
--->
-<!--
-     DTD for the Tile Definition File, Version 1.1
-
-     To support validation of your configuration file, include the following
-     DOCTYPE element at the beginning (after the "xml" declaration):
-
-     <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
-
-     $Id$
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a tile
-     component.
--->
-<!ENTITY % ContentType "(string|page|template|definition)">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
-     and also serves as the name of the corresponding scripting variable
-     and the name of the JSP attribute under which the bean is accessed.
-     Therefore, it must conform to the rules for a Java identifier.
--->
-<!ENTITY % BeanName "CDATA">
-
-<!-- A "PropName" is the name of a JavaBeans property, and must begin with
-     a lower case letter and contain only characters that are legal in a
-     Java identifier.
--->
-<!ENTITY % PropName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-  <!-- deprecated: use tiles-definitions instead.-->
-<!ELEMENT component-definitions (definition+)>
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
-
-     controllerClass The fully qualified Java class name of the controller
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     controllerUrl   The context-relative path to the resource used as controller
-                     called immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     extends         Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
-
-     name            The unique identifier for this definition.
-
-     page            Same as path.
-
-     path            The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
-
-     role            Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
-
-     template        Same as path. For compatibility with the template tag library.
--->
-<!ELEMENT definition (icon?, display-name?, description?, put*, putList*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!ATTLIST definition       controllerClass  %ClassName;      #IMPLIED>
-<!ATTLIST definition       controllerUrl    %RequestPath;    #IMPLIED>
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!ATTLIST definition       name             %DefinitionName; #REQUIRED>
-<!ATTLIST definition       page             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       path             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-
-
-<!-- The "put" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put> tag.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     name            The unique identifier for this put.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT put (#PCDATA)>
-<!ATTLIST put              id               ID              #IMPLIED>
-<!ATTLIST put              content          CDATA           #IMPLIED>
-<!ATTLIST put              direct           %Boolean;       #IMPLIED>
-<!ATTLIST put              name             CDATA           #REQUIRED>
-<!ATTLIST put              type             %ContentType;   #IMPLIED>
-<!ATTLIST put              value            CDATA           #IMPLIED>
-
-
-<!-- The "putList" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add>, <item> or
-     <putList>.
-
-     name            The unique identifier for this put list.
--->
-<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >
-<!ATTLIST putList          id               ID              #IMPLIED>
-<!ATTLIST putList          name             CDATA           #REQUIRED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-<!-- The "add" element describes an element of a list. It is similar to the
-     <put> element.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT add (#PCDATA)>
-<!ATTLIST add              id               ID              #IMPLIED>
-<!ATTLIST add              content          CDATA           #IMPLIED>
-<!ATTLIST add              direct           %Boolean;       #IMPLIED>
-<!ATTLIST add              type             %ContentType;   #IMPLIED>
-<!ATTLIST add              value            CDATA           #IMPLIED>
-
-
-<!-- The "bean" element describes an element of a list. It create a bean of the
-     specified java classtype. This bean is initialized with appropriate nested
-     <set-property>.
-
-     classtype       The fully qualified classname for this bean.
--->
-<!ELEMENT bean (set-property*)>
-<!ATTLIST bean             id               ID              #IMPLIED>
-<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
-
-<!-- The "set-property" element specifies the method name and initial value of
-     a bean property. When the object representing
-     the surrounding element is instantiated, the accessor for the indicated
-     property is called and passed the indicated value.
-
-     property        Name of the JavaBeans property whose setter method
-                     will be called.
-
-     value           String representation of the value to which this
-                     property will be set, after suitable type conversion
--->
-<!ELEMENT set-property   EMPTY>
-<!ATTLIST set-property   id             ID              #IMPLIED>
-<!ATTLIST set-property   property       %PropName;      #REQUIRED>
-<!ATTLIST set-property   value          CDATA           #REQUIRED>
-
-
-<!-- The "item" element describes an element of a list. It create a bean added as
-     element to the list. Each bean can contain different properties: value, link,
-     icon, tooltip. These properties are to be interpreted by the jsp page using
-     them.
-     By default the bean is of type
-     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
-     create a list of beans used as menu items.
-
-     classtype       The fully qualified classtype for this bean.
-                     If specified, the classtype must be a subclass of the interface
-                     "org.apache.struts.tiles.beans.MenuItem".
-
-     icon            The bean 'icon' property.
-
-     link            The bean 'link' property.
-
-     tooltip         The bean 'tooltip' property.
-
-     value           The bean 'value' property.
--->
-<!ELEMENT item (#PCDATA)>
-<!ATTLIST item             id               ID              #IMPLIED>
-<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
-<!ATTLIST item             icon             CDATA           #IMPLIED>
-<!ATTLIST item             link             CDATA           #REQUIRED>
-<!ATTLIST item             tooltip          CDATA           #IMPLIED>
-<!ATTLIST item             value            CDATA           #REQUIRED>
-
-
-<!-- ========== Info Elements ====================================== -->
-
-<!-- The "description" element contains descriptive (paragraph length) text
-     about the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT description    (#PCDATA)>
-<!ATTLIST description    id             ID              #IMPLIED>
-
-
-<!-- The "display-name" element contains a short (one line) description of
-     the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT display-name (#PCDATA)>
-<!ATTLIST display-name   id             ID              #IMPLIED>
-
-
-<!-- The "icon" element contains a small-icon and large-icon element which
-     specify the location, relative to the Struts configuration file, for small
-     and large images used to represent the surrounding element in GUI tools.
--->
-<!ELEMENT icon           (small-icon?, large-icon?)>
-<!ATTLIST icon           id             ID              #IMPLIED>
-
-
-<!-- The "large-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a large (32x32 pixel)
-     icon image.
--->
-<!ELEMENT large-icon     (%Location;)>
-<!ATTLIST large-icon     id             ID              #IMPLIED>
-
-
-<!-- The "small-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a small (16x16 pixel)
-     icon image.
--->
-<!ELEMENT small-icon     (%Location;)>
-<!ATTLIST small-icon     id             ID              #IMPLIED>
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_3.dtd b/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_3.dtd
deleted file mode 100644
index a532cb0..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_3.dtd
+++ /dev/null
@@ -1,299 +0,0 @@
-<!--
-    $Id$
-
-    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.
--->
-<!--
-     DTD for the Tile Definition File, Version 1.3
-
-     To support validation of your configuration file, include the following
-     DOCTYPE element at the beginning (after the "xml" declaration):
-
-     <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_3.dtd">
-
-     $Id$
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a tile
-     component.
--->
-<!ENTITY % ContentType "(string|page|template|definition)">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
-     and also serves as the name of the corresponding scripting variable
-     and the name of the JSP attribute under which the bean is accessed.
-     Therefore, it must conform to the rules for a Java identifier.
--->
-<!ENTITY % BeanName "CDATA">
-
-<!-- A "PropName" is the name of a JavaBeans property, and must begin with
-     a lower case letter and contain only characters that are legal in a
-     Java identifier.
--->
-<!ENTITY % PropName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-  <!-- deprecated: use tiles-definitions instead.-->
-<!ELEMENT component-definitions (definition+)>
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
-
-     controllerClass The fully qualified Java class name of the controller
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     controllerUrl   The context-relative path to the resource used as controller
-                     called immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     extends         Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
-
-     name            The unique identifier for this definition.
-
-     page            Same as path.
-
-     path            The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
-
-     role            Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
-
-     template        Same as path. For compatibility with the template tag library.
--->
-<!ELEMENT definition (icon?, display-name?, description?, put*, putList*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!ATTLIST definition       controllerClass  %ClassName;      #IMPLIED>
-<!ATTLIST definition       controllerUrl    %RequestPath;    #IMPLIED>
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!ATTLIST definition       name             %DefinitionName; #REQUIRED>
-<!ATTLIST definition       page             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       path             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-
-
-<!-- The "put" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put> tag.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     name            The unique identifier for this put.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT put (#PCDATA)>
-<!ATTLIST put              id               ID              #IMPLIED>
-<!ATTLIST put              content          CDATA           #IMPLIED>
-<!ATTLIST put              direct           %Boolean;       #IMPLIED>
-<!ATTLIST put              name             CDATA           #REQUIRED>
-<!ATTLIST put              type             %ContentType;   #IMPLIED>
-<!ATTLIST put              value            CDATA           #IMPLIED>
-
-
-<!-- The "putList" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add>, <item> or
-     <putList>.
-
-     name            The unique identifier for this put list.
--->
-<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >
-<!ATTLIST putList          id               ID              #IMPLIED>
-<!ATTLIST putList          name             CDATA           #REQUIRED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-<!-- The "add" element describes an element of a list. It is similar to the
-     <put> element.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT add (#PCDATA)>
-<!ATTLIST add              id               ID              #IMPLIED>
-<!ATTLIST add              content          CDATA           #IMPLIED>
-<!ATTLIST add              direct           %Boolean;       #IMPLIED>
-<!ATTLIST add              type             %ContentType;   #IMPLIED>
-<!ATTLIST add              value            CDATA           #IMPLIED>
-
-
-<!-- The "bean" element describes an element of a list. It create a bean of the
-     specified java classtype. This bean is initialized with appropriate nested
-     <set-property>.
-
-     classtype       The fully qualified classname for this bean.
--->
-<!ELEMENT bean (set-property*)>
-<!ATTLIST bean             id               ID              #IMPLIED>
-<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
-
-<!-- The "set-property" element specifies the method name and initial value of
-     a bean property. When the object representing
-     the surrounding element is instantiated, the accessor for the indicated
-     property is called and passed the indicated value.
-
-     property        Name of the JavaBeans property whose setter method
-                     will be called.
-
-     value           String representation of the value to which this
-                     property will be set, after suitable type conversion
--->
-<!ELEMENT set-property   EMPTY>
-<!ATTLIST set-property   id             ID              #IMPLIED>
-<!ATTLIST set-property   property       %PropName;      #REQUIRED>
-<!ATTLIST set-property   value          CDATA           #REQUIRED>
-
-
-<!-- The "item" element describes an element of a list. It create a bean added as
-     element to the list. Each bean can contain different properties: value, link,
-     icon, tooltip. These properties are to be interpreted by the jsp page using
-     them.
-     By default the bean is of type
-     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
-     create a list of beans used as menu items.
-
-     classtype       The fully qualified classtype for this bean.
-                     If specified, the classtype must be a subclass of the interface
-                     "org.apache.struts.tiles.beans.MenuItem".
-
-     icon            The bean 'icon' property.
-
-     link            The bean 'link' property.
-
-     tooltip         The bean 'tooltip' property.
-
-     value           The bean 'value' property.
--->
-<!ELEMENT item (#PCDATA)>
-<!ATTLIST item             id               ID              #IMPLIED>
-<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
-<!ATTLIST item             icon             CDATA           #IMPLIED>
-<!ATTLIST item             link             CDATA           #REQUIRED>
-<!ATTLIST item             tooltip          CDATA           #IMPLIED>
-<!ATTLIST item             value            CDATA           #REQUIRED>
-
-
-<!-- ========== Info Elements ====================================== -->
-
-<!-- The "description" element contains descriptive (paragraph length) text
-     about the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT description    (#PCDATA)>
-<!ATTLIST description    id             ID              #IMPLIED>
-
-
-<!-- The "display-name" element contains a short (one line) description of
-     the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT display-name (#PCDATA)>
-<!ATTLIST display-name   id             ID              #IMPLIED>
-
-
-<!-- The "icon" element contains a small-icon and large-icon element which
-     specify the location, relative to the Struts configuration file, for small
-     and large images used to represent the surrounding element in GUI tools.
--->
-<!ELEMENT icon           (small-icon?, large-icon?)>
-<!ATTLIST icon           id             ID              #IMPLIED>
-
-
-<!-- The "large-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a large (32x32 pixel)
-     icon image.
--->
-<!ELEMENT large-icon     (%Location;)>
-<!ATTLIST large-icon     id             ID              #IMPLIED>
-
-
-<!-- The "small-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a small (16x16 pixel)
-     icon image.
--->
-<!ELEMENT small-icon     (%Location;)>
-<!ATTLIST small-icon     id             ID              #IMPLIED>
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_4.dtd b/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_4.dtd
deleted file mode 100644
index 85abdfb..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_1_4.dtd
+++ /dev/null
@@ -1,299 +0,0 @@
-<!--
-    $Id$
-
-    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.
--->
-<!--
-     DTD for the Tile Definition File, Version 1.4
-
-     To support validation of your configuration file, include the following
-     DOCTYPE element at the beginning (after the "xml" declaration):
-
-     <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.4//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_4.dtd">
-
-     $Id$
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a tile
-     component.
--->
-<!ENTITY % ContentType "(string|page|template|definition)">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
-     and also serves as the name of the corresponding scripting variable
-     and the name of the JSP attribute under which the bean is accessed.
-     Therefore, it must conform to the rules for a Java identifier.
--->
-<!ENTITY % BeanName "CDATA">
-
-<!-- A "PropName" is the name of a JavaBeans property, and must begin with
-     a lower case letter and contain only characters that are legal in a
-     Java identifier.
--->
-<!ENTITY % PropName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-  <!-- deprecated: use tiles-definitions instead.-->
-<!ELEMENT component-definitions (definition+)>
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
-
-     controllerClass The fully qualified Java class name of the controller
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     controllerUrl   The context-relative path to the resource used as controller
-                     called immediately before the tiles is inserted.
-                     Only one of controllerClass or controllerUrl should be
-                     specified.
-
-     extends         Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
-
-     name            The unique identifier for this definition.
-
-     page            Same as path.
-
-     path            The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
-
-     role            Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
-
-     template        Same as path. For compatibility with the template tag library.
--->
-<!ELEMENT definition (icon?, display-name?, description?, put*, putList*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!ATTLIST definition       controllerClass  %ClassName;      #IMPLIED>
-<!ATTLIST definition       controllerUrl    %RequestPath;    #IMPLIED>
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!ATTLIST definition       name             %DefinitionName; #REQUIRED>
-<!ATTLIST definition       page             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       path             %RequestPath;    #IMPLIED>
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-
-
-<!-- The "put" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put> tag.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     name            The unique identifier for this put.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT put (#PCDATA)>
-<!ATTLIST put              id               ID              #IMPLIED>
-<!ATTLIST put              content          CDATA           #IMPLIED>
-<!ATTLIST put              direct           %Boolean;       #IMPLIED>
-<!ATTLIST put              name             CDATA           #REQUIRED>
-<!ATTLIST put              type             %ContentType;   #IMPLIED>
-<!ATTLIST put              value            CDATA           #IMPLIED>
-
-
-<!-- The "putList" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add>, <item> or
-     <putList>.
-
-     name            The unique identifier for this put list.
--->
-<!ELEMENT putList ( (add* | item* | bean* | putList*)+) >
-<!ATTLIST putList          id               ID              #IMPLIED>
-<!ATTLIST putList          name             CDATA           #REQUIRED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-<!-- The "add" element describes an element of a list. It is similar to the
-     <put> element.
-
-     content         Same as value. For compatibility with the template tag library.
-
-     direct          Same as type="string". For compatibility with the template
-                     tag library.
-
-     type            The type of the value. Can be: string, page, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
-
-     value           The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ELEMENT add (#PCDATA)>
-<!ATTLIST add              id               ID              #IMPLIED>
-<!ATTLIST add              content          CDATA           #IMPLIED>
-<!ATTLIST add              direct           %Boolean;       #IMPLIED>
-<!ATTLIST add              type             %ContentType;   #IMPLIED>
-<!ATTLIST add              value            CDATA           #IMPLIED>
-
-
-<!-- The "bean" element describes an element of a list. It create a bean of the
-     specified java classtype. This bean is initialized with appropriate nested
-     <set-property>.
-
-     classtype       The fully qualified classname for this bean.
--->
-<!ELEMENT bean (set-property*)>
-<!ATTLIST bean             id               ID              #IMPLIED>
-<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
-
-<!-- The "set-property" element specifies the method name and initial value of
-     a bean property. When the object representing
-     the surrounding element is instantiated, the accessor for the indicated
-     property is called and passed the indicated value.
-
-     property        Name of the JavaBeans property whose setter method
-                     will be called.
-
-     value           String representation of the value to which this
-                     property will be set, after suitable type conversion
--->
-<!ELEMENT set-property   EMPTY>
-<!ATTLIST set-property   id             ID              #IMPLIED>
-<!ATTLIST set-property   property       %PropName;      #REQUIRED>
-<!ATTLIST set-property   value          CDATA           #REQUIRED>
-
-
-<!-- The "item" element describes an element of a list. It create a bean added as
-     element to the list. Each bean can contain different properties: value, link,
-     icon, tooltip. These properties are to be interpreted by the jsp page using
-     them.
-     By default the bean is of type
-     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
-     create a list of beans used as menu items.
-
-     classtype       The fully qualified classtype for this bean.
-                     If specified, the classtype must be a subclass of the interface
-                     "org.apache.struts.tiles.beans.MenuItem".
-
-     icon            The bean 'icon' property.
-
-     link            The bean 'link' property.
-
-     tooltip         The bean 'tooltip' property.
-
-     value           The bean 'value' property.
--->
-<!ELEMENT item (#PCDATA)>
-<!ATTLIST item             id               ID              #IMPLIED>
-<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
-<!ATTLIST item             icon             CDATA           #IMPLIED>
-<!ATTLIST item             link             CDATA           #REQUIRED>
-<!ATTLIST item             tooltip          CDATA           #IMPLIED>
-<!ATTLIST item             value            CDATA           #REQUIRED>
-
-
-<!-- ========== Info Elements ====================================== -->
-
-<!-- The "description" element contains descriptive (paragraph length) text
-     about the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT description    (#PCDATA)>
-<!ATTLIST description    id             ID              #IMPLIED>
-
-
-<!-- The "display-name" element contains a short (one line) description of
-     the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT display-name (#PCDATA)>
-<!ATTLIST display-name   id             ID              #IMPLIED>
-
-
-<!-- The "icon" element contains a small-icon and large-icon element which
-     specify the location, relative to the Struts configuration file, for small
-     and large images used to represent the surrounding element in GUI tools.
--->
-<!ELEMENT icon           (small-icon?, large-icon?)>
-<!ATTLIST icon           id             ID              #IMPLIED>
-
-
-<!-- The "large-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a large (32x32 pixel)
-     icon image.
--->
-<!ELEMENT large-icon     (%Location;)>
-<!ATTLIST large-icon     id             ID              #IMPLIED>
-
-
-<!-- The "small-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a small (16x16 pixel)
-     icon image.
--->
-<!ELEMENT small-icon     (%Location;)>
-<!ATTLIST small-icon     id             ID              #IMPLIED>
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_0.dtd b/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_0.dtd
deleted file mode 100644
index 21140af..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_0.dtd
+++ /dev/null
@@ -1,322 +0,0 @@
-<!--
-%
-   $Id$
-
-   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.
-
-%
-
-@hidden $Id$
-@title DTD for the Tiles Definition File, Version 2.0
-@doctype tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"
-@root tiles-definitions
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a template.
--->
-<!ENTITY % ContentType "(string|template|definition|object)">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
-     and also serves as the name of the corresponding scripting variable
-     and the name of the JSP attribute under which the bean is accessed.
-     Therefore, it must conform to the rules for a Java identifier.
--->
-<!ENTITY % BeanName "CDATA">
-
-<!-- A "PropName" is the name of a JavaBeans property, and must begin with
-     a lower case letter and contain only characters that are legal in a
-     Java identifier.
--->
-<!ENTITY % PropName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
--->
-<!ELEMENT definition (icon?, display-name?, description?, put-attribute*, put-list-attribute*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!--
-@attr preparer       The fully qualified Java class name of the preparer
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of preparerClass or preparerUrl should be
-                     specified.
--->
-<!ATTLIST definition       preparer         %ClassName;      #IMPLIED>
-<!--
-@attr extends        Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
--->
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!--
-@attr name           The unique identifier for this definition.
--->
-<!ATTLIST definition       name             %DefinitionName; #REQUIRED>
-<!--
-@attr role           Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!--
-@attr template       The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
--->
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-
-
-<!-- The "put-attribute" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put-attribute> tag.
--->
-<!ELEMENT put-attribute (#PCDATA)>
-<!ATTLIST put-attribute     id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put-attribute.
--->
-<!ATTLIST put-attribute     name             CDATA           #REQUIRED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST put-attribute     type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST put-attribute     value            CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-attribute     role             CDATA            #IMPLIED>
-
-
-<!-- The "put-list-attribute" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add-attribute>, <item> or
-     <add-list-attribute>.
--->
-<!ELEMENT put-list-attribute ( (add-attribute* | item* | bean* | add-list-attribute*)+) >
-<!ATTLIST put-list-attribute id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put attribute list.
--->
-<!ATTLIST put-list-attribute name             CDATA           #REQUIRED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-list-attribute role             CDATA            #IMPLIED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-
-<!-- The "add-attribute" element describes an element of a list. It is similar to the
-     <put> element.
--->
-<!ELEMENT add-attribute (#PCDATA)>
-<!ATTLIST add-attribute              id               ID              #IMPLIED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST add-attribute              type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST add-attribute              value            CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-attribute              role             CDATA            #IMPLIED>
-
-<!-- The "add-list-attribute" element describes a list attribute subordinate to another
-     list attribute. It allows to specify an attribute value that is a java List
-     containing any kind of values. In the config file, the list elements are specified
-     by nested <add-attribute>, <item> or
-     <add-list-attribute>.
--->
-<!ELEMENT add-list-attribute ( (add-attribute* | item* | bean* | add-list-attribute*)+) >
-<!ATTLIST add-list-attribute id               ID              #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-list-attribute role             CDATA            #IMPLIED>
-
-
-<!-- The "bean" element describes an element of a list. It create a bean of the
-     specified java classtype. This bean is initialized with appropriate nested
-     <set-property>.
--->
-<!ELEMENT bean (set-property*)>
-<!ATTLIST bean             id               ID              #IMPLIED>
-<!--
-@attr classtype      The fully qualified classname for this bean.
--->
-<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
-
-<!-- The "set-property" element specifies the method name and initial value of
-     a bean property. When the object representing
-     the surrounding element is instantiated, the accessor for the indicated
-     property is called and passed the indicated value.
--->
-<!ELEMENT set-property   EMPTY>
-<!ATTLIST set-property   id             ID              #IMPLIED>
-<!--
-@attr property       Name of the JavaBeans property whose setter method
-                     will be called.
--->
-<!ATTLIST set-property   property       %PropName;      #REQUIRED>
-<!--
-@attr value          String representation of the value to which this
-                     property will be set, after suitable type conversion
--->
-<!ATTLIST set-property   value          CDATA           #REQUIRED>
-
-
-<!-- The "item" element describes an element of a list. It create a bean added as
-     element to the list. Each bean can contain different properties: value, link,
-     icon, tooltip. These properties are to be interpreted by the jsp page using
-     them.
-     By default the bean is of type
-     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
-     create a list of beans used as menu items.
--->
-<!ELEMENT item (#PCDATA)>
-<!ATTLIST item             id               ID              #IMPLIED>
-<!--
-@attr classtype      The fully qualified classtype for this bean.
-                     If specified, the classtype must be a subclass of the interface
-                     "org.apache.struts.tiles.beans.MenuItem".
--->
-<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
-<!--
-@attr icon           The bean 'icon' property.
--->
-<!ATTLIST item             icon             CDATA           #IMPLIED>
-<!--
-@attr link           The bean 'link' property.
--->
-<!ATTLIST item             link             CDATA           #REQUIRED>
-<!--
-@attr tooltip        The bean 'tooltip' property.
--->
-<!ATTLIST item             tooltip          CDATA           #IMPLIED>
-<!--
-@attr value          The bean 'value' property.
--->
-<!ATTLIST item             value            CDATA           #REQUIRED>
-
-
-<!-- ========== Info Elements ====================================== -->
-
-<!-- The "description" element contains descriptive (paragraph length) text
-     about the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT description    (#PCDATA)>
-<!ATTLIST description    id             ID              #IMPLIED>
-
-
-<!-- The "display-name" element contains a short (one line) description of
-     the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT display-name (#PCDATA)>
-<!ATTLIST display-name   id             ID              #IMPLIED>
-
-
-<!-- The "icon" element contains a small-icon and large-icon element which
-     specify the location, relative to the Struts configuration file, for small
-     and large images used to represent the surrounding element in GUI tools.
--->
-<!ELEMENT icon           (small-icon?, large-icon?)>
-<!ATTLIST icon           id             ID              #IMPLIED>
-
-
-<!-- The "large-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a large (32x32 pixel)
-     icon image.
--->
-<!ELEMENT large-icon     (%Location;)>
-<!ATTLIST large-icon     id             ID              #IMPLIED>
-
-
-<!-- The "small-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a small (16x16 pixel)
-     icon image.
--->
-<!ELEMENT small-icon     (%Location;)>
-<!ATTLIST small-icon     id             ID              #IMPLIED>
diff --git a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_1.dtd b/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_1.dtd
deleted file mode 100644
index 689b6e7..0000000
--- a/TILES_3_0_X/tiles-compat/src/main/resources/org/apache/tiles/compat/resources/tiles-config_2_1.dtd
+++ /dev/null
@@ -1,364 +0,0 @@
-<!--
-%
-   $Id$
-
-   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.
-
-%
-
-@hidden $Id$
-@title DTD for the Tiles Definition File, Version 2.1
-@doctype tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"
-@root tiles-definitions
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a template.
--->
-<!ENTITY % ContentType "CDATA">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "BeanName" is the identifier of a JavaBean, such as a form bean,
-     and also serves as the name of the corresponding scripting variable
-     and the name of the JSP attribute under which the bean is accessed.
-     Therefore, it must conform to the rules for a Java identifier.
--->
-<!ENTITY % BeanName "CDATA">
-
-<!-- A "PropName" is the name of a JavaBeans property, and must begin with
-     a lower case letter and contain only characters that are legal in a
-     Java identifier.
--->
-<!ENTITY % PropName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
--->
-<!ELEMENT definition (icon?, display-name?, description?, put-attribute*, put-list-attribute*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!--
-@attr preparer       The fully qualified Java class name of the preparer
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of preparerClass or preparerUrl should be
-                     specified.
--->
-<!ATTLIST definition       preparer         %ClassName;      #IMPLIED>
-<!--
-@attr extends        Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
--->
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!--
-@attr name           The unique identifier for this definition. Required when
-                     it is a root definition, while it is implied in nested
-                     definitions.
--->
-<!ATTLIST definition       name             %DefinitionName; #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!--
-@attr template       The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
--->
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-<!--
-@attr templateExpression The expression that will evaluate to a template for this definition.
-               This attribute will be ignored if template is specified.
-
--->
-<!ATTLIST definition       templateExpression       CDATA    #IMPLIED>
-<!--
-@attr templateType   The type of the template attribute. Can be: string,
-           template or definition.
-                     By default, the type is "template". If a type is
-                     associated, the desidered renderer will be invoked.
--->
-<!ATTLIST definition       templateType             %ContentType;   #IMPLIED>
-
-<!-- The "put-attribute" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put-attribute> tag.
--->
-<!ELEMENT put-attribute ( (definition*) )>
-<!ATTLIST put-attribute     id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put-attribute.
--->
-<!ATTLIST put-attribute     name             CDATA           #REQUIRED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST put-attribute     type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST put-attribute     value            CDATA           #IMPLIED>
-<!--
-@attr expression     The expression associated to this tiles attribute. This
-           attribute will be ignored if value is specified.
-
--->
-<!ATTLIST put-attribute     expression       CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-attribute     role             CDATA            #IMPLIED>
-<!--
-@attr cascade        If true, the attribute will be cascaded to all inner
-                     definitions. By default, cascade is false.
--->
-<!ATTLIST put-attribute     cascade          %Boolean;    #IMPLIED>
-
-
-<!-- The "put-list-attribute" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add-attribute>, <item> or
-     <add-list-attribute>.
--->
-<!ELEMENT put-list-attribute ( (add-attribute* | item* | bean* | add-list-attribute*)+) >
-<!ATTLIST put-list-attribute id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put attribute list.
--->
-<!ATTLIST put-list-attribute name             CDATA           #REQUIRED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-list-attribute role             CDATA            #IMPLIED>
-<!--
-@attr inherit        If true, the attribute will put the elements of the attribute
-                     with the same name of the parent definition before the ones
-                     specified here. By default, it is 'false'.
--->
-<!ATTLIST put-list-attribute inherit          %Boolean;        #IMPLIED>
-<!--
-@attr cascade        If true, the attribute will be cascaded to all inner
-                     definitions. By default, cascade is false.
--->
-<!ATTLIST put-list-attribute cascade          %Boolean;        #IMPLIED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-
-<!-- The "add-attribute" element describes an element of a list. It is similar to the
-     <put> element.
--->
-<!ELEMENT add-attribute ( (definition*) )>
-<!ATTLIST add-attribute              id               ID              #IMPLIED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST add-attribute              type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST add-attribute              value            CDATA           #IMPLIED>
-<!--
-@attr expression     The expression associated to this tiles attribute. This
-           attribute will be ignored if value is specified.
-
--->
-<!ATTLIST add-attribute              expression       CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-attribute              role             CDATA            #IMPLIED>
-
-<!-- The "add-list-attribute" element describes a list attribute subordinate to another
-     list attribute. It allows to specify an attribute value that is a java List
-     containing any kind of values. In the config file, the list elements are specified
-     by nested <add-attribute>, <item> or
-     <add-list-attribute>.
--->
-<!ELEMENT add-list-attribute ( (add-attribute* | item* | bean* | add-list-attribute*)+) >
-<!ATTLIST add-list-attribute id               ID              #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-list-attribute role             CDATA            #IMPLIED>
-
-
-<!-- The "bean" element describes an element of a list. It create a bean of the
-     specified java classtype. This bean is initialized with appropriate nested
-     <set-property>.
--->
-<!ELEMENT bean (set-property*)>
-<!ATTLIST bean             id               ID              #IMPLIED>
-<!--
-@attr classtype      The fully qualified classname for this bean.
--->
-<!ATTLIST bean             classtype        %ClassName;     #REQUIRED>
-
-<!-- The "set-property" element specifies the method name and initial value of
-     a bean property. When the object representing
-     the surrounding element is instantiated, the accessor for the indicated
-     property is called and passed the indicated value.
--->
-<!ELEMENT set-property   EMPTY>
-<!ATTLIST set-property   id             ID              #IMPLIED>
-<!--
-@attr property       Name of the JavaBeans property whose setter method
-                     will be called.
--->
-<!ATTLIST set-property   property       %PropName;      #REQUIRED>
-<!--
-@attr value          String representation of the value to which this
-                     property will be set, after suitable type conversion
--->
-<!ATTLIST set-property   value          CDATA           #REQUIRED>
-
-
-<!-- The "item" element describes an element of a list. It create a bean added as
-     element to the list. Each bean can contain different properties: value, link,
-     icon, tooltip. These properties are to be interpreted by the jsp page using
-     them.
-     By default the bean is of type
-     "org.apache.struts.tiles.beans.SimpleMenuItem". This bean is useful to
-     create a list of beans used as menu items.
--->
-<!ELEMENT item (#PCDATA)>
-<!ATTLIST item             id               ID              #IMPLIED>
-<!--
-@attr classtype      The fully qualified classtype for this bean.
-                     If specified, the classtype must be a subclass of the interface
-                     "org.apache.struts.tiles.beans.MenuItem".
--->
-<!ATTLIST item             classtype        %ClassName;     #IMPLIED>
-<!--
-@attr icon           The bean 'icon' property.
--->
-<!ATTLIST item             icon             CDATA           #IMPLIED>
-<!--
-@attr link           The bean 'link' property.
--->
-<!ATTLIST item             link             CDATA           #REQUIRED>
-<!--
-@attr tooltip        The bean 'tooltip' property.
--->
-<!ATTLIST item             tooltip          CDATA           #IMPLIED>
-<!--
-@attr value          The bean 'value' property.
--->
-<!ATTLIST item             value            CDATA           #REQUIRED>
-
-
-<!-- ========== Info Elements ====================================== -->
-
-<!-- The "description" element contains descriptive (paragraph length) text
-     about the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT description    (#PCDATA)>
-<!ATTLIST description    id             ID              #IMPLIED>
-
-
-<!-- The "display-name" element contains a short (one line) description of
-     the surrounding element, suitable for use in GUI tools.
--->
-<!ELEMENT display-name (#PCDATA)>
-<!ATTLIST display-name   id             ID              #IMPLIED>
-
-
-<!-- The "icon" element contains a small-icon and large-icon element which
-     specify the location, relative to the Struts configuration file, for small
-     and large images used to represent the surrounding element in GUI tools.
--->
-<!ELEMENT icon           (small-icon?, large-icon?)>
-<!ATTLIST icon           id             ID              #IMPLIED>
-
-
-<!-- The "large-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a large (32x32 pixel)
-     icon image.
--->
-<!ELEMENT large-icon     (%Location;)>
-<!ATTLIST large-icon     id             ID              #IMPLIED>
-
-
-<!-- The "small-icon" element specifies the location, relative to the Struts
-     configuration file, of a resource containing a small (16x16 pixel)
-     icon image.
--->
-<!ELEMENT small-icon     (%Location;)>
-<!ATTLIST small-icon     id             ID              #IMPLIED>
diff --git a/TILES_3_0_X/tiles-compat/src/site/site.xml b/TILES_3_0_X/tiles-compat/src/site/site.xml
deleted file mode 100644
index e2c7a3d..0000000
--- a/TILES_3_0_X/tiles-compat/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Compatibility Library">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/beans/SimpleMenuItemTest.java b/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/beans/SimpleMenuItemTest.java
deleted file mode 100644
index fd4b6c5..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/beans/SimpleMenuItemTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.beans;
-
-import static org.junit.Assert.*;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link SimpleMenuItem}.
- *
- * @version $Rev$ $Date$
- */
-public class SimpleMenuItemTest {
-
-    /**
-     * The item to test.
-     */
-    private SimpleMenuItem item;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        item = new SimpleMenuItem();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.beans.SimpleMenuItem#setValue(java.lang.String)}.
-     */
-    @Test
-    public void testSetValue() {
-        item.setValue("value");
-        assertEquals("value", item.getValue());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.beans.SimpleMenuItem#setLink(java.lang.String)}.
-     */
-    @Test
-    public void testSetLink() {
-        item.setLink("value");
-        assertEquals("value", item.getLink());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.beans.SimpleMenuItem#setIcon(java.lang.String)}.
-     */
-    @Test
-    public void testSetIcon() {
-        item.setIcon("value");
-        assertEquals("value", item.getIcon());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.beans.SimpleMenuItem#setTooltip(java.lang.String)}.
-     */
-    @Test
-    public void testSetTooltip() {
-        item.setTooltip("value");
-        assertEquals("value", item.getTooltip());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.beans.SimpleMenuItem#toString()}.
-     */
-    @Test
-    public void testToString() {
-        item.setIcon("icon");
-        item.setLink("link");
-        item.setTooltip("tooltip");
-        item.setValue("value");
-        assertEquals(
-                "SimpleMenuItem[value=value, link=link, tooltip=tooltip, icon=icon, ]",
-                item.toString());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/definition/digester/TestCompatibilityDigesterDefinitionsReader.java b/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/definition/digester/TestCompatibilityDigesterDefinitionsReader.java
deleted file mode 100644
index 958a894..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/definition/digester/TestCompatibilityDigesterDefinitionsReader.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.definition.digester;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Map;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.DefinitionsFactoryException;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Tests the <code>org.apache.tiles.definition.digester.DigesterDefinitionsReader</code> class.
- *
- * @version $Rev$ $Date$
- */
-public class TestCompatibilityDigesterDefinitionsReader extends TestCase {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(TestCompatibilityDigesterDefinitionsReader.class);
-
-    /**
-     * The definitions reader.
-     */
-    private DefinitionsReader reader;
-
-    /**
-     * Creates a new instance of TestDigesterDefinitionsReader.
-     *
-     * @param name The name of the test.
-     */
-    public TestCompatibilityDigesterDefinitionsReader(String name) {
-        super(name);
-    }
-
-    /**
-     * @return a test suite (<code>TestSuite</code>) that includes all methods
-     *         starting with "test"
-     */
-    public static Test suite() {
-        return new TestSuite(TestCompatibilityDigesterDefinitionsReader.class);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        reader = new CompatibilityDigesterDefinitionsReader();
-    }
-
-    /**
-     * Tests the read method to read Tiles 1.1 files.
-     *
-     * @throws DefinitionsFactoryException If the definitions factory fails.
-     * @throws IOException If an I/O exception happens.
-     */
-    public void testReadOldFormat() throws IOException {
-        URL configFile = this.getClass().getClassLoader().getResource(
-                "org/apache/tiles/config/tiles-defs-1.1.xml");
-        assertNotNull("Config file not found", configFile);
-
-        InputStream source = configFile.openStream();
-        Map<String, Definition> definitions = reader.read(source);
-
-        assertNotNull("Definitions not returned.", definitions);
-        assertNotNull("Couldn't find doc.mainLayout tile.",
-                definitions.get("doc.mainLayout"));
-        assertNotNull("Couldn't Find title attribute.", definitions.get(
-                "doc.mainLayout").getAttribute("title").getValue());
-        assertEquals("Incorrect Find title attribute.",
-                "Tiles Library Documentation", definitions.get(
-                        "doc.mainLayout").getAttribute("title").getValue());
-    }
-
-    /**
-     * Tests the read method to read Tiles 2.0 files.
-     *
-     * @throws IOException If an I/O exception happens.
-     */
-    public void testReadNewFormat() throws IOException {
-        URL configFile = this.getClass().getClassLoader().getResource(
-                "org/apache/tiles/config/tiles-defs-2.0.xml");
-        assertNotNull("Config file not found", configFile);
-
-        InputStream source = configFile.openStream();
-        Map<String, Definition> definitions = reader.read(source);
-
-        assertNotNull("Definitions not returned.", definitions);
-        assertNotNull("Couldn't find doc.mainLayout tile.",
-                definitions.get("doc.mainLayout"));
-        assertNotNull("Couldn't Find title attribute.", definitions.get(
-                "doc.mainLayout").getAttribute("title").getValue());
-        assertEquals("Incorrect Find title attribute.",
-                "Tiles Library Documentation", definitions.get(
-                        "doc.mainLayout").getAttribute("title").getValue());
-    }
-
-    /**
-     * Tests the read method under normal conditions for the new features in 2.1
-     * version of the DTD.
-     */
-    public void testRead21Version() {
-        try {
-            URL configFile = this.getClass().getClassLoader().getResource(
-                    "org/apache/tiles/config/tiles-defs-2.1.xml");
-            assertNotNull("Config file not found", configFile);
-
-            InputStream source = configFile.openStream();
-            Map<String, Definition> definitions = reader.read(source);
-
-            assertNotNull("Definitions not returned.", definitions);
-            Definition def = definitions.get("doc.cascaded.test");
-
-            assertNotNull("Couldn't find doc.role.test tile.", def);
-            Attribute attribute = def.getLocalAttribute("title");
-            assertNotNull("Couldn't Find title local attribute.", attribute);
-            attribute = def.getCascadedAttribute("title2");
-            assertNotNull("Couldn't Find title2 cascaded attribute.", attribute);
-            attribute = def.getLocalAttribute("items1");
-            assertNotNull("Couldn't Find items1 local attribute.", attribute);
-            attribute = def.getCascadedAttribute("items2");
-            assertNotNull("Couldn't Find items2 cascaded attribute.", attribute);
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-    }
-
-    /**
-     * Tests read with bad input source.
-     */
-    public void testBadSource() {
-        try {
-            // Read definitions.
-            reader.read(new String("Bad Input"));
-            fail("Should've thrown an exception.");
-        } catch (DefinitionsFactoryException e) {
-            // correct.
-            if (log.isDebugEnabled()) {
-                log.debug("Exception caught, it is OK", e);
-            }
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactoryTest.java b/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactoryTest.java
deleted file mode 100644
index 03265d1..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/CompatibilityPreparerFactoryTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.preparer;
-
-import junit.framework.TestCase;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-/**
- * Tests {@link CompatibilityPreparerFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class CompatibilityPreparerFactoryTest extends TestCase {
-
-    /**
-     * The factory to test.
-     */
-    private CompatibilityPreparerFactory factory;
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() {
-        factory = new CompatibilityPreparerFactory();
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.compat.preparer.CompatibilityPreparerFactory#createPreparer(java.lang.String)}
-     * .
-     */
-    public void testCreatePreparer() {
-        ViewPreparer preparer = factory.createPreparer("/my/url.do");
-        assertTrue("The preparer is not an UrlPreparer",
-                preparer instanceof UrlPreparer);
-        preparer = factory.createPreparer(MockViewPreparer.class.getName());
-        assertTrue("The preparer is not an class ViewPreparer",
-                preparer instanceof MockViewPreparer);
-    }
-
-    /**
-     * Mock view preparer to test preparer instantiation.
-     */
-    public static final class MockViewPreparer implements ViewPreparer {
-        /** {@inheritDoc} */
-        public void execute(Request tilesContext,
-                AttributeContext attributeContext) {
-            // Nothing here.
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/UrlPreparerTest.java b/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/UrlPreparerTest.java
deleted file mode 100644
index 2c8e8bb..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/java/org/apache/tiles/compat/preparer/UrlPreparerTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.compat.preparer;
-
-import static org.easymock.EasyMock.*;
-
-import java.io.IOException;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.PreparerException;
-import org.apache.tiles.request.DispatchRequest;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link UrlPreparer}.
- *
- * @version $Rev$ $Date$
- */
-public class UrlPreparerTest {
-
-    /**
-     * The preparer to test.
-     */
-    private UrlPreparer preparer;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        preparer = new UrlPreparer("/my/url.do");
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.compat.preparer.UrlPreparer#execute(
-     * org.apache.tiles.request.Request, org.apache.tiles.AttributeContext)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        DispatchRequest requestContext = createMock(DispatchRequest.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        requestContext.include("/my/url.do");
-        replay(requestContext, attributeContext);
-        preparer.execute(requestContext, attributeContext);
-        verify(requestContext, attributeContext);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.compat.preparer.UrlPreparer#execute(
-     * org.apache.tiles.request.Request, org.apache.tiles.AttributeContext)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test(expected = PreparerException.class)
-    public void testExecuteException() throws IOException {
-        DispatchRequest requestContext = createMock(DispatchRequest.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        requestContext.include("/my/url.do");
-        expectLastCall().andThrow(new IOException());
-
-        replay(requestContext, attributeContext);
-        try {
-            preparer.execute(requestContext, attributeContext);
-        } finally {
-            verify(requestContext, attributeContext);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-1.1.xml b/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-1.1.xml
deleted file mode 100644
index 96a0499..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-1.1.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="doc.mainLayout" template="/layout/classicLayout.jsp">
-    <put name="title"  value="Tiles Library Documentation" />
-    <put name="header" value="/common/header.jsp" />
-    <put name="menu"   value="doc.menu.main" />
-    <put name="footer" value="/common/footer.jsp" />
-    <put name="body"   value="doc.portal.body" />
-      <put name="bean"   value="This is an object" type="string" />
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Main page body definitions  									-->
-  <!-- =======================================================  -->
-
-  <definition name="doc.portal.body" template="/layout/columnsLayout.jsp">
-    <put name="numCols" value="2" />
-    <putList name="list0" >
-      <add value="/doc/portal/welcome.jsp" />
-      <add value="/doc/portal/features.jsp" />
-      <!--<add value="/doc/portal/todo.jsp" /> -->
-      <add value="/doc/portal/documentation.jsp" />
-    </putList>
-    <putList name="list1" >
-      <add value="/doc/portal/news.jsp" />
-      <add value="/doc/portal/download.jsp" />
-      <add value="/doc/portal/tilesCompsTemplates.jsp" />
-      <add value="/doc/portal/strutsIntegration.jsp" />
-      <add value="/doc/portal/comments.jsp" />
-      <add value="/doc/portal/revisions.jsp" />
-    </putList>
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Menus definitions  									-->
-  <!-- =======================================================  -->
-
-  <!-- Menu bar definition -->
-<definition name="doc.menu.main" template="/layout/vboxLayout.jsp" >
-  <putList name="componentsList" >
-    <add value="doc.menu.links" />
-    <add value="doc.menu.taglib.references" />
-    <add value="doc.menu.printer.friendly" />
-    <add value="doc.menu.old.documents" />
-  </putList>
-</definition>
-
-  <!-- Documentation menu definition v1.1-->
-<definition name="doc.menu.links" template="/layouts/menu.jsp" >
-  <put name="title" value="Documentation" />
-    <putList name="items" >
-      <item value="Home"           link="/index.jsp"  />
-      <item value="Live Examples (new)" link="/examples/index.jsp"  />
-      <!--
-    <item> <value>Commented Examples</value>
-        <link>/examples/index.jsp</link>
-      <classtype>org.apache.tiles.beans.SimpleMenuItem</classtype>
-    </item>
-    -->
-      <item value="Quick overview" link="/doc/quickOverview.jsp"  />
-      <!--
-      <item value="Tutorial"       link="/doc/tutorial.jsp"  />
-      -->
-      <item value="Tutorial Live Examples" link="/tutorial/index.jsp" />
-      <item value="Download"       link="/doc/download.jsp" />
-      <item value="Installation"   link="/doc/installation.jsp" />
-      <item value="User Guide"	   link="/doc/userGuide.jsp" />
-      <item value="Javadoc"        link="/api/index.html" />
-      <item value="Struts Home"    link="http://www.apache.org"   icon="/images/struts-power.gif"
-      classtype="org.apache.tiles.beans.SimpleMenuItem" />
-    </putList>
-</definition>
-
-  <!-- Printer friendly menu definition -->
-<definition name="doc.menu.printer.friendly" template="/layouts/menu.jsp" >
-  <put name="title" value="Printer Versions" />
-  <putList name="items" >
-    <item value="Quick Overview"     link="/test/testAll.jsp" />
-    <item value="Tutorial"           link="/doc/tutorialBody.html" />
-    <item value="User Guide"         link="/doc/userGuideBody.html" />
-    <item value="Overview (old)"  	 link="/doc/overviewBody.html" />
-  </putList>
-</definition>
-
-  <!-- Taglib menu definition -->
-<definition name="doc.menu.taglib.references" template="/layouts/menu.jsp" >
-  <put name="title" value="Tag Library Reference" />
-    <putList name="items" >
-      <item value="Tiles Tags"     link="/doc/tilesTags.jsp" />
-      <!-- <item value="Extension Tags (old)"   link="/doc/extensionsTags.jsp" /> -->
-    </putList>
-</definition>
-
-  <!-- Oldies menu definition -->
-<definition name="doc.menu.old.documents" template="/layouts/menu.jsp" >
-  <put name="title" value="Old Documents" />
-  <putList name="items" >
-    <item value="Overview (old)"     link="/doc/overview.jsp" />
-  </putList>
-</definition>
-
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.0.xml b/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.0.xml
deleted file mode 100644
index b03def5..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.0.xml
+++ /dev/null
@@ -1,138 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="doc.mainLayout" template="/layout/classicLayout.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-      <put-attribute name="bean"   value="This is an object" type="object" />
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Main page body definitions  									-->
-  <!-- =======================================================  -->
-
-  <definition name="doc.portal.body" template="/layout/columnsLayout.jsp">
-    <put-attribute name="numCols" value="2" />
-    <put-list-attribute name="list0" >
-      <add-attribute value="/doc/portal/welcome.jsp" />
-      <add-attribute value="/doc/portal/features.jsp" />
-      <!--<add-attribute value="/doc/portal/todo.jsp" /> -->
-      <add-attribute value="/doc/portal/documentation.jsp" />
-    </put-list-attribute>
-    <put-list-attribute name="list1" >
-      <add-attribute value="/doc/portal/news.jsp" />
-      <add-attribute value="/doc/portal/download.jsp" />
-      <add-attribute value="/doc/portal/tilesCompsTemplates.jsp" />
-      <add-attribute value="/doc/portal/strutsIntegration.jsp" />
-      <add-attribute value="/doc/portal/comments.jsp" />
-      <add-attribute value="/doc/portal/revisions.jsp" />
-    </put-list-attribute>
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Menus definitions  									-->
-  <!-- =======================================================  -->
-
-  <!-- Menu bar definition -->
-<definition name="doc.menu.main" template="/layout/vboxLayout.jsp" >
-  <put-list-attribute name="componentsList" >
-    <add-attribute value="doc.menu.links" />
-    <add-attribute value="doc.menu.taglib.references" />
-    <add-attribute value="doc.menu.printer.friendly" />
-    <add-attribute value="doc.menu.old.documents" />
-  </put-list-attribute>
-</definition>
-
-  <!-- Documentation menu definition v1.1-->
-<definition name="doc.menu.links" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Documentation" />
-    <put-list-attribute name="items" >
-      <item value="Home"           link="/index.jsp"  />
-      <item value="Live Examples (new)" link="/examples/index.jsp"  />
-      <!--
-    <item> <value>Commented Examples</value>
-        <link>/examples/index.jsp</link>
-      <classtype>org.apache.tiles.beans.SimpleMenuItem</classtype>
-    </item>
-    -->
-      <item value="Quick overview" link="/doc/quickOverview.jsp"  />
-      <!--
-      <item value="Tutorial"       link="/doc/tutorial.jsp"  />
-      -->
-      <item value="Tutorial Live Examples" link="/tutorial/index.jsp" />
-      <item value="Download"       link="/doc/download.jsp" />
-      <item value="Installation"   link="/doc/installation.jsp" />
-      <item value="User Guide"	   link="/doc/userGuide.jsp" />
-      <item value="Javadoc"        link="/api/index.html" />
-      <item value="Struts Home"    link="http://www.apache.org"   icon="/images/struts-power.gif"
-      classtype="org.apache.tiles.beans.SimpleMenuItem" />
-    </put-list-attribute>
-</definition>
-
-  <!-- Printer friendly menu definition -->
-<definition name="doc.menu.printer.friendly" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Printer Versions" />
-  <put-list-attribute name="items" >
-    <item value="Quick Overview"     link="/test/testAll.jsp" />
-    <item value="Tutorial"           link="/doc/tutorialBody.html" />
-    <item value="User Guide"         link="/doc/userGuideBody.html" />
-    <item value="Overview (old)"  	 link="/doc/overviewBody.html" />
-  </put-list-attribute>
-</definition>
-
-  <!-- Taglib menu definition -->
-<definition name="doc.menu.taglib.references" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Tag Library Reference" />
-    <put-list-attribute name="items" >
-      <item value="Tiles Tags"     link="/doc/tilesTags.jsp" />
-      <!-- <item value="Extension Tags (old)"   link="/doc/extensionsTags.jsp" /> -->
-    </put-list-attribute>
-</definition>
-
-  <!-- Oldies menu definition -->
-<definition name="doc.menu.old.documents" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Old Documents" />
-  <put-list-attribute name="items" >
-    <item value="Overview (old)"     link="/doc/overview.jsp" />
-  </put-list-attribute>
-</definition>
-
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml b/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml
deleted file mode 100644
index 95668f8..0000000
--- a/TILES_3_0_X/tiles-compat/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="doc.cascaded.test" template="/layout/classicLayout.jsp">
-    <put-attribute name="title" value="Test title" cascade="false" />
-    <put-attribute name="title2" value="Test title two" cascade="true" />
-    <put-list-attribute name="items1" cascade="false">
-        <add-attribute value="value1" type="string" />
-    </put-list-attribute>
-    <put-list-attribute name="items2" cascade="true">
-        <add-attribute value="value2" type="string" />
-    </put-list-attribute>
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/pom.xml b/TILES_3_0_X/tiles-core/pom.xml
deleted file mode 100644
index c27f34c..0000000
--- a/TILES_3_0_X/tiles-core/pom.xml
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-core</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - Core Library</name>
-  <description>Tiles Core Library, including basic implementation of the APIs.
-  </description>
-
-  <properties>
-      <tiles.osgi.symbolicName>org.apache.tiles.core</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>net.sf.dtddoc</groupId>
-        <artifactId>dtddoc-maven-plugin</artifactId>
-        <version>1.1</version>
-        <configuration>
-          <docTitle>Tiles Definition File</docTitle>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-api</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.shale</groupId>
-      <artifactId>shale-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/TilesContainerAware.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/TilesContainerAware.java
deleted file mode 100644
index 5c958b5..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/TilesContainerAware.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.awareness;
-
-import org.apache.tiles.TilesContainer;
-
-/**
- * It represents an object that can have a reference to the
- * {@link TilesContainer}.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public interface TilesContainerAware {
-
-    /**
-     * Sets the Tiles container.
-     *
-     * @param container The Tiles container.
-     * @since 2.1.0
-     */
-    void setContainer(TilesContainer container);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/package-info.java
deleted file mode 100644
index faec1df..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/awareness/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Interfaces that let the Tiles engine to inject dependencies to its objects.
- */
-package org.apache.tiles.awareness;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextHolder.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextHolder.java
deleted file mode 100644
index e9497e3..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/TilesRequestContextHolder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.context;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Holds in a {@link ThreadLocal} object a {@link Request}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesRequestContextHolder {
-
-    /**
-     * The Tiles request context holder.
-     */
-    private ThreadLocal<Request> requestHolder = new ThreadLocal<Request>();
-
-    /**
-     * Sets the Tiles request context to use.
-     *
-     * @param request The Tiles request.
-     * @since 2.2.0
-     */
-    public void setTilesRequestContext(Request request) {
-        requestHolder.set(request);
-    }
-
-    /**
-     * Returns the Tiles request context to use.
-     *
-     * @return The Tiles request.
-     * @since 2.2.0
-     */
-    public Request getTilesRequestContext() {
-        return requestHolder.get();
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/package-info.java
deleted file mode 100644
index b25fa4f..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/context/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes and interfaces that allow to access the various contexts in an
- * application in a uniformed way.
- */
-package org.apache.tiles.context;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java
deleted file mode 100644
index 2f52ada..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.request.Request;
-
-/**
- * Interface for creating a {@link Definition}s and managing their contents.
- * <p/>
- * <p>
- * DefinitionsFactory implementations are responsible for maintaining the data
- * sources of Tiles configuration data and using the data to create Definitions
- * sets. Implementations also know how to append locale-specific configuration
- * data to an existing Definitions set.
- * </p>
- *
- * @version $Rev$ $Date$
- */
-public interface DefinitionsFactory {
-
-    /**
-     * Property name that specifies the implementation of the DefinitionsReader.
-     */
-    String READER_IMPL_PROPERTY =
-        "org.apache.tiles.definition.DefinitionsReader";
-
-    /**
-     * Property name that specifies the implementation of
-     * {@link org.apache.tiles.locale.LocaleResolver}.
-     */
-    String LOCALE_RESOLVER_IMPL_PROPERTY =
-        "org.apache.tiles.locale.LocaleResolver";
-
-    /**
-     * Constant representing the configuration parameter
-     * used to define the tiles definition resources.
-     *
-     * @since 2.1.0
-     */
-    String DEFINITIONS_CONFIG = "org.apache.tiles.definition.DefinitionsFactory.DEFINITIONS_CONFIG";
-
-    /**
-     * Constant representing the configuration parameter used to define the
-     * definition DAO to use.
-     */
-    String DEFINITION_DAO_INIT_PARAM =
-        "org.apache.tiles.definition.DefinitionsFactory.DefinitionDAO";
-
-    /**
-     * Returns a Definition object that matches the given name and
-     * Tiles context.
-     *
-     * @param name         The name of the Definition to return.
-     * @param tilesContext The Tiles context to use to resolve the definition.
-     * @return the Definition matching the given name or null if none
-     *         is found.
-     */
-    Definition getDefinition(String name, Request tilesContext);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactoryException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactoryException.java
deleted file mode 100644
index bba845d..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsFactoryException.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-
-package org.apache.tiles.definition;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Exception thrown when an error occurs while the impl tries to
- * create a new instance mapper.
- *
- * @version $Rev$ $Date$
- */
-public class DefinitionsFactoryException extends TilesException {
-    /**
-     * Constructor.
-     */
-    public DefinitionsFactoryException() {
-        super();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The error or warning message.
-     */
-    public DefinitionsFactoryException(String message) {
-        super(message);
-    }
-
-
-    /**
-     * Create a new <code>DefinitionsFactoryException</code> wrapping an existing exception.
-     * <p/>
-     * <p>The existing exception will be embedded in the new
-     * one and its message will become the default message for
-     * the DefinitionsFactoryException.</p>
-     *
-     * @param e The exception to be wrapped.
-     */
-    public DefinitionsFactoryException(Throwable e) {
-        super(e);
-    }
-
-
-    /**
-     * Create a new <code>DefinitionsFactoryException</code> from an existing exception.
-     * <p/>
-     * <p>The existing exception will be embedded in the new
-     * one, but the new exception will have its own message.</p>
-     *
-     * @param message The detail message.
-     * @param e       The exception to be wrapped.
-     */
-    public DefinitionsFactoryException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsReader.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsReader.java
deleted file mode 100644
index 3a3e599..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/DefinitionsReader.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-
-/**
- * Interface for reading <code>{@link Definition}</code> from a source.
- * <p/>
- * <p>This interface provides a standard way to read
- * <code>{@link Definition}</code> objects from a source.  Implementations
- * should define what the source is, whether it be a persistent store such as a
- * configuration file or database, or something like a web service.  The
- * DefinitionsReader is responsible for reading from a single location.  It does
- * not perform any internationalization duties or inheritance of Definitions.
- * It only reads from the source and returns a Map of objects read.</p>
- *
- * @version $Rev$ $Date$
- */
-public interface DefinitionsReader {
-
-    /**
-     * Reads <code>{@link Definition}</code> objects from a source.
-     * <p/>
-     * Implementations should publish what type of source object is expected.
-     *
-     * @param source The source from which definitions will be read.
-     * @return a Map of <code>Definition</code> objects read from
-     *         the source.
-     * @throws DefinitionsFactoryException if the source is invalid or
-     *                                     an error occurs when reading definitions.
-     */
-    Map<String, Definition> read(Object source);
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/FactoryNotFoundException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/FactoryNotFoundException.java
deleted file mode 100644
index d5df00b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/FactoryNotFoundException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-
-package org.apache.tiles.definition;
-
-/**
- * Exception thrown when definitions impl is not found.
- *
- * @version $Rev$ $Date$
- */
-public class FactoryNotFoundException extends DefinitionsFactoryException {
-    /**
-     * Constructor.
-     */
-    public FactoryNotFoundException() {
-        super();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param msg Message.
-     */
-    public FactoryNotFoundException(String msg) {
-        super(msg);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message Message.
-     * @param e Cause.
-     */
-    public FactoryNotFoundException(String message, Throwable e) {
-        super(message, e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e Cause.
-     */
-    public FactoryNotFoundException(Throwable e) {
-        super(e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/LocaleDefinitionsFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/LocaleDefinitionsFactory.java
deleted file mode 100644
index 49b69dc..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/LocaleDefinitionsFactory.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import java.util.Locale;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.request.Request;
-
-/**
- * {@link DefinitionsFactory DefinitionsFactory} implementation that manages
- * Definitions configuration data from URLs, but resolving definition
- * inheritance when a definition is returned.. <p/>
- * <p>
- * The Definition objects are read from the
- * {@link org.apache.tiles.definition.digester.DigesterDefinitionsReader DigesterDefinitionsReader}
- * class unless another implementation is specified.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class LocaleDefinitionsFactory extends
-        UnresolvingLocaleDefinitionsFactory {
-
-    /** {@inheritDoc} */
-    @Override
-    public Definition getDefinition(String name,
-            Request tilesContext) {
-        Definition retValue;
-        Locale locale = null;
-
-        if (tilesContext != null) {
-            locale = localeResolver.resolveLocale(tilesContext);
-        }
-
-        retValue = definitionDao.getDefinition(name, locale);
-        if (retValue != null) {
-            retValue = new Definition(retValue);
-            String parentDefinitionName = retValue.getExtends();
-            while (parentDefinitionName != null) {
-                Definition parent = definitionDao.getDefinition(
-                        parentDefinitionName, locale);
-                if (parent == null) {
-                    throw new NoSuchDefinitionException("Cannot find definition '"
-                            + parentDefinitionName + "' ancestor of '"
-                            + retValue.getName() + "'");
-                }
-                retValue.inherit(parent);
-                parentDefinitionName = parent.getExtends();
-            }
-        }
-
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/NoSuchDefinitionException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/NoSuchDefinitionException.java
deleted file mode 100644
index a3e2f37..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/NoSuchDefinitionException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-
-package org.apache.tiles.definition;
-
-/**
- * Exception thrown when a definition is not found.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchDefinitionException extends DefinitionsFactoryException {
-    /**
-     * Constructor.
-     */
-    public NoSuchDefinitionException() {
-        super();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param msg Message.
-     */
-    public NoSuchDefinitionException(String msg) {
-        super(msg);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message Message.
-     * @param e Cause.
-     */
-    public NoSuchDefinitionException(String message, Throwable e) {
-        super(message, e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e Cause.
-     */
-    public NoSuchDefinitionException(Throwable e) {
-        super(e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java
deleted file mode 100644
index d682ff6..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/RefreshMonitor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.definition;
-
-/**
- * Implementing this interface means that the object monitors the sources it
- * uses to check when they change.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public interface RefreshMonitor {
-
-    /**
-     * Indicates whether the sources are out of date and need to be reloaded.
-     *
-     * @return <code>true</code> if the sources need to be refreshed.
- * @since 2.1.0
-     */
-    boolean refreshRequired();
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactory.java
deleted file mode 100644
index b2a691b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import java.util.Locale;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.Request;
-
-/**
- * {@link DefinitionsFactory DefinitionsFactory} implementation that manages
- * Definitions configuration data from URLs, without resolving definition
- * inheritance when a definition is returned.<p/>
- * <p>
- * The Definition objects are read from the
- * {@link org.apache.tiles.definition.digester.DigesterDefinitionsReader DigesterDefinitionsReader}
- * class unless another implementation is specified.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class UnresolvingLocaleDefinitionsFactory implements DefinitionsFactory {
-
-    /**
-     * The definition DAO that extracts the definitions from the sources.
-     *
-     * @since 2.2.1
-     */
-    protected DefinitionDAO<Locale> definitionDao;
-
-    /**
-     * The locale resolver object.
-     *
-     * @since 2.2.1
-     */
-    protected LocaleResolver localeResolver;
-
-    /**
-     * Sets the locale resolver to use.
-     *
-     * @param localeResolver The locale resolver.
-     * @since 2.2.1
-     */
-    public void setLocaleResolver(LocaleResolver localeResolver) {
-        this.localeResolver = localeResolver;
-    }
-
-    /**
-     * Sets the definition DAO to use. It must be locale-based.
-     *
-     * @param definitionDao The definition DAO.
-     * @since 2.2.1
-     */
-    public void setDefinitionDAO(DefinitionDAO<Locale> definitionDao) {
-        this.definitionDao = definitionDao;
-    }
-
-    /** {@inheritDoc} */
-    public Definition getDefinition(String name,
-            Request tilesContext) {
-        Locale locale = null;
-
-        if (tilesContext != null) {
-            locale = localeResolver.resolveLocale(tilesContext);
-        }
-
-        return definitionDao.getDefinition(name, locale);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAO.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAO.java
deleted file mode 100644
index 6849f9b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAO.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.DefinitionsFactoryException;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.RefreshMonitor;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Base abstract class for a DAO that is based on URLs and locale as a
- * customization key.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public abstract class BaseLocaleUrlDefinitionDAO implements
-        DefinitionDAO<Locale>, RefreshMonitor {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(BaseLocaleUrlDefinitionDAO.class);
-
-    /**
-     * Contains the URL objects identifying where configuration data is found.
-     *
-     * @since 2.1.0
-     */
-    protected List<ApplicationResource> sources;
-
-    /**
-     * Contains the dates that the URL sources were last modified.
-     *
-     * @since 2.1.0
-     */
-    protected Map<String, Long> lastModifiedDates;
-
-    /**
-     * Reader used to get definitions from the sources.
-     *
-     * @since 2.1.0
-     */
-    protected DefinitionsReader reader;
-
-    /**
-     * ApplicationContext to locate the source files.
-     * 
-     * @since 3.0.0
-     */
-    protected ApplicationContext applicationContext;
-    
-    /**
-     * Constructor.
-     */
-    public BaseLocaleUrlDefinitionDAO(ApplicationContext applicationContext) {
-        this.applicationContext = applicationContext;
-        lastModifiedDates = new HashMap<String, Long>();
-    }
-
-    public void setSources(List<ApplicationResource> sources) {
-        // filter out any sources that are already localized
-        ArrayList<ApplicationResource> defaultSources = new ArrayList<ApplicationResource>();
-        for(ApplicationResource source: sources) {
-            if(Locale.ROOT.equals(source.getLocale())) {
-                defaultSources.add(source);
-            }
-        }
-        this.sources = defaultSources;
-    }
-
-    public void setReader(DefinitionsReader reader) {
-        this.reader = reader;
-    }
-
-    /** {@inheritDoc} */
-    public boolean refreshRequired() {
-        boolean status = false;
-
-        Set<String> paths = lastModifiedDates.keySet();
-
-        try {
-            for (String path : paths) {
-                Long lastModifiedDate = lastModifiedDates.get(path);
-                ApplicationResource resource = applicationContext.getResource(path);
-                long newModDate = resource.getLastModified();
-                if (newModDate != lastModifiedDate) {
-                    status = true;
-                    break;
-                }
-            }
-        } catch (IOException e) {
-            log.warn("Exception while monitoring update times.", e);
-            return true;
-        }
-        return status;
-    }
-
-    /**
-     * Loads definitions from an URL without loading from "parent" URLs.
-     *
-     * @param resource The URL to read.
-     * @return The definition map that has been read.
-     */
-    protected Map<String, Definition> loadDefinitionsFromResource(ApplicationResource resource) {
-        Map<String, Definition> defsMap = null;
-
-        InputStream stream = null;
-        try {
-            lastModifiedDates.put(resource.getLocalePath(), resource
-                    .getLastModified());
-
-            // Definition must be collected, starting from the base
-            // source up to the last localized file.
-            stream = resource.getInputStream();
-            defsMap = reader.read(stream);
-        } catch (FileNotFoundException e) {
-            // File not found. continue.
-            if (log.isDebugEnabled()) {
-                log.debug("File " + resource.toString() + " not found, continue");
-            }
-        } catch (IOException e) {
-            throw new DefinitionsFactoryException(
-                    "I/O error processing configuration.", e);
-        } finally {
-            try {
-                if (stream != null) {
-                    stream.close();
-                }
-            } catch (IOException e) {
-                throw new DefinitionsFactoryException(
-                        "I/O error closing " + resource.toString(), e);
-            }
-        }
-
-        return defsMap;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java
deleted file mode 100644
index 542d8d7..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAO.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolverAware;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.LocaleUtil;
-
-/**
- * <p>
- * A definitions DAO (loading URLs and using Locale as a customization key) that
- * caches definitions that have been loaded in a raw way (i.e. with inheritance
- * that is not resolved).
- * </p>
- * <p>
- * It can check if the URLs change, but by default this feature is turned off.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class CachingLocaleUrlDefinitionDAO extends BaseLocaleUrlDefinitionDAO
-        implements PatternDefinitionResolverAware<Locale> {
-
-    /**
-     * Initialization parameter to set whether we want to refresh URLs when they
-     * change.
-     *
-     * @since 2.1.0
-     */
-    public static final String CHECK_REFRESH_INIT_PARAMETER =
-        "org.apache.tiles.definition.dao.LocaleUrlDefinitionDAO.CHECK_REFRESH";
-
-    /**
-     * The locale-specific set of definitions objects.
-     *
-     * @since 2.1.0
-     */
-    protected Map<Locale, Map<String, Definition>> locale2definitionMap;
-
-    /**
-     * Flag that, when <code>true</code>, enables automatic checking of URLs
-     * changing.
-     *
-     * @since 2.1.0
-     */
-    protected boolean checkRefresh = false;
-
-    /**
-     * Resolves definitions using patterns.
-     *
-     * @since 2.2.0
-     */
-    protected PatternDefinitionResolver<Locale> definitionResolver;
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public CachingLocaleUrlDefinitionDAO(ApplicationContext applicationContext) {
-        super(applicationContext);
-        locale2definitionMap = new HashMap<Locale, Map<String, Definition>>();
-    }
-
-    /** {@inheritDoc} */
-    public void setPatternDefinitionResolver(
-            PatternDefinitionResolver<Locale> definitionResolver) {
-        this.definitionResolver = definitionResolver;
-    }
-
-    /** {@inheritDoc} */
-    public Definition getDefinition(String name, Locale customizationKey) {
-        Definition retValue = null;
-        if (customizationKey == null) {
-            customizationKey = Locale.ROOT;
-        }
-        Map<String, Definition> definitions = getDefinitions(customizationKey);
-        if (definitions != null) {
-            retValue = definitions.get(name);
-
-            if (retValue == null) {
-                retValue = getDefinitionFromResolver(name, customizationKey);
-
-                if (retValue != null) {
-                    synchronized (definitions) {
-                        definitions.put(name, retValue);
-                    }
-                }
-            }
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    public Map<String, Definition> getDefinitions(Locale customizationKey) {
-        if (customizationKey == null) {
-            customizationKey = Locale.ROOT;
-        }
-        Map<String, Definition> retValue = locale2definitionMap
-                .get(customizationKey);
-        if (retValue == null || (checkRefresh && refreshRequired())) {
-            retValue = checkAndloadDefinitions(customizationKey);
-        }
-        return retValue;
-    }
-
-    /**
-     * Sets the flag to check source refresh. If not called, the default is
-     * <code>false</code>.
-     *
-     * @param checkRefresh When <code>true</code>, enables automatic checking
-     * of sources changing.
-     * @since 2.1.0
-     */
-    public void setCheckRefresh(boolean checkRefresh) {
-        this.checkRefresh = checkRefresh;
-    }
-
-    /**
-     * Returns a definition from the definition resolver.
-     *
-     * @param name The name of the definition.
-     * @param customizationKey The customization key to use.
-     * @return The resolved definition.
-     */
-    protected Definition getDefinitionFromResolver(String name,
-            Locale customizationKey) {
-        return definitionResolver.resolveDefinition(name,
-                customizationKey);
-    }
-
-    /**
-     * Checks if sources have changed. If yes, it clears the cache. Then continues
-     * loading definitions.
-     *
-     * @param customizationKey The locale to use when loading sources.
-     * @return The loaded definitions.
-     * @since 2.1.0
-     */
-    protected synchronized Map<String, Definition> checkAndloadDefinitions(
-            Locale customizationKey) {
-        if (checkRefresh && refreshRequired()) {
-            locale2definitionMap.clear();
-        }
-        loadDefinitions(customizationKey);
-        return locale2definitionMap.get(customizationKey);
-    }
-
-    /**
-     * Tries to load definitions if necessary.
-     *
-     * @param customizationKey The locale to use when loading sources.
-     * @return The loaded definitions.
-     * @since 2.1.0
-     */
-    protected Map<String, Definition> loadDefinitions(Locale customizationKey) {
-        Map<String, Definition> localeDefsMap = locale2definitionMap
-                .get(customizationKey);
-        if (localeDefsMap != null) {
-            return localeDefsMap;
-        }
-
-        return loadDefinitionsFromResources(customizationKey);
-    }
-
-    /**
-     * Loads definitions from the sources.
-     *
-     * @param customizationKey The locale to use when loading Resources.
-     * @return The loaded definitions.
-     * @since 2.1.0
-     */
-    protected Map<String, Definition> loadDefinitionsFromResources(Locale customizationKey) {
-        Map<String, Definition> localeDefsMap = loadRawDefinitionsFromResources(customizationKey);
-        Map<String, Definition> defsMap = definitionResolver
-                .storeDefinitionPatterns(copyDefinitionMap(localeDefsMap),
-                        customizationKey);
-        locale2definitionMap.put(customizationKey, defsMap);
-        return localeDefsMap;
-    }
-
-    /**
-     * Loads the raw definitions from the sources associated with a locale.
-     *
-     * @param customizationKey The locale to use when loading Resources.
-     * @return The loaded definitions.
-     * @since 2.1.3
-     */
-    protected Map<String, Definition> loadRawDefinitionsFromResources(
-            Locale customizationKey) {
-        Map<String, Definition> localeDefsMap;
-
-        Locale parentLocale = LocaleUtil.getParentLocale(customizationKey);
-        localeDefsMap = new LinkedHashMap<String, Definition>();
-        if (parentLocale != null) {
-            Map<String, Definition> parentDefs = loadRawDefinitionsFromResources(parentLocale);
-            if (parentDefs != null) {
-                localeDefsMap.putAll(parentDefs);
-            }
-        }
-        // For each source, the resource must be loaded.
-        for (ApplicationResource resource : sources) {
-            ApplicationResource newResource = applicationContext.getResource(resource, customizationKey);
-            if (newResource != null) {
-                Map<String, Definition> defsMap = loadDefinitionsFromResource(newResource);
-                if (defsMap != null) {
-                    localeDefsMap.putAll(defsMap);
-                }
-            }
-        }
-        return localeDefsMap;
-    }
-
-    /**
-     * Loads parent definitions, i.e. definitions mapped to a parent locale.
-     *
-     * @param parentLocale The locale to use when loading URLs.
-     * @return The loaded parent definitions.
-     * @since 2.1.0
-     */
-    protected Map<String, Definition> loadParentDefinitions(Locale parentLocale) {
-        return loadDefinitions(parentLocale);
-    }
-
-    /**
-     * Copies the definition map to be passed to a higher level of customization
-     * key.
-     *
-     * @param localeDefsMap The map of definition to be copied.
-     * @return The copy of the definition map. This particular implementation
-     * return the <code>localeDefsMap</code> itself.
-     * @since 2.1.4
-     */
-    protected Map<String, Definition> copyDefinitionMap(
-            Map<String, Definition> localeDefsMap) {
-        return localeDefsMap;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java
deleted file mode 100644
index a5461e4..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/DefinitionDAO.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.definition.dao;
-
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-
-/**
- * It represents an object that provides definitions, depending on a
- * customization key.
- *
- * @param <K> The customization key class.
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public interface DefinitionDAO<K> {
-
-    /**
-     * Returns a definition, given its name and the customization key.
-     *
-     * @param name The name of the definition.
-     * @param customizationKey The customization key.
-     * @return The requested definition, if found, otherwise <code>null</code>.
-     * The inheritance of the definition must not be resolved.
-     * @since 2.1.0
-     */
-    Definition getDefinition(String name, K customizationKey);
-
-    /**
-     * Returns all the definitions used of a customization key.
-     *
-     * @param customizationKey The customization key.
-     * @return All the definitions that are connected to the customization key.
-     * The inheritance of the definitions must not be resolved.
-     * @since 2.1.0
-     */
-    Map<String, Definition> getDefinitions(K customizationKey);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java
deleted file mode 100644
index 4f50437..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAO.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.definition.dao;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.LocaleUtil;
-
-/**
- * A definition DAO that uses {@link Locale} as a customization key and loads
- * definitions from URLs. It does not cache definitions in any way.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class LocaleUrlDefinitionDAO extends BaseLocaleUrlDefinitionDAO {
-
-    public LocaleUrlDefinitionDAO(ApplicationContext applicationContext) {
-        super(applicationContext);
-    }
-
-    /**
-     * <p>
-     * Returns a definition, given its name and the customization key.
-     * </p>
-     * <strong>WARNING!</strong> This method is slow! It loads all the
-     * definitions and then selects the needed one.
-     *
-     * @param name The name of the definition.
-     * @param customizationKey The customization key.
-     * @return The requested definition, if found, otherwise <code>null</code>.
-     * The inheritance of the definition must not be resolved.
-     * @since 2.1.0
-     */
-    public Definition getDefinition(String name, Locale customizationKey) {
-        Map<String, Definition> defsMap = getDefinitions(customizationKey);
-        return defsMap.get(name);
-    }
-
-    /** {@inheritDoc} */
-    public Map<String, Definition> getDefinitions(Locale customizationKey) {
-        ArrayList<Locale> postfixes = computeLocales(customizationKey);
-        Map<String, Definition> localeDefsMap = new HashMap<String, Definition>();
-        // process the postfixes from the root to the most specific
-        for (Locale postfix : postfixes) {
-            // For each postfix, all the sources must be loaded.
-            for (ApplicationResource resource : sources) {
-                ApplicationResource newResource = applicationContext.getResource(resource, postfix);
-                if (newResource != null) {
-                    Map<String, Definition> defsMap = loadDefinitionsFromResource(newResource);
-                    if (defsMap != null) {
-                        localeDefsMap.putAll(defsMap);
-                    }
-                }
-            }
-        }
-        return localeDefsMap;
-    }
-
-    /**
-     * Returns a list of locales from root to the customizationKey.
-     * @param customizationKey the target Locale.
-     * @return the list of its ancestors.
-     */
-    private ArrayList<Locale> computeLocales(Locale customizationKey) {
-        Locale postfix;
-        if(customizationKey == null) {
-            postfix = Locale.ROOT;
-        } else {
-            postfix = customizationKey;
-        }
-        ArrayList<Locale> postfixes = new ArrayList<Locale>();
-        while (postfix != null) {
-            postfixes.add(postfix);
-            postfix = LocaleUtil.getParentLocale(postfix);
-        }
-        Collections.reverse(postfixes);
-        return postfixes;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAO.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAO.java
deleted file mode 100644
index 7c7b352..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAO.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.request.ApplicationContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * A definitions DAO (loading URLs and using Locale as a customization key) that
- * caches definitions that have been loaded and resolves inheritances.
- * </p>
- * <p>
- * It can check if the URLs change, but by default this feature is turned off.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class ResolvingLocaleUrlDefinitionDAO extends
-        CachingLocaleUrlDefinitionDAO {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory.getLogger(ResolvingLocaleUrlDefinitionDAO.class);
-
-    public ResolvingLocaleUrlDefinitionDAO(ApplicationContext applicationContext) {
-        super(applicationContext);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected Map<String, Definition> loadParentDefinitions(Locale parentLocale) {
-        return loadRawDefinitionsFromResources(parentLocale);
-    }
-
-    @Override
-    protected Map<String, Definition> loadDefinitions(Locale customizationKey) {
-        Map<String, Definition> localeDefsMap = super.loadDefinitions(customizationKey);
-        Map<String, Definition> defsMap = definitionResolver
-                .storeDefinitionPatterns(copyDefinitionMap(localeDefsMap),
-                        customizationKey);
-        resolveInheritances(defsMap, customizationKey);
-        locale2definitionMap.put(customizationKey, defsMap);
-        return defsMap;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected Definition getDefinitionFromResolver(String name,
-            Locale customizationKey) {
-        Definition retValue = super.getDefinitionFromResolver(name, customizationKey);
-        if (retValue != null && retValue.getExtends() != null) {
-            Definition parent = getDefinition(retValue.getExtends(), customizationKey);
-            retValue.inherit(parent);
-        }
-
-        return retValue;
-    }
-
-    /**
-     * Resolve locale-specific extended instances.
-     *
-     * @param map The definition map containing the definitions to resolve.
-     * @param locale The locale to use.
-     * @throws NoSuchDefinitionException If a parent definition is not found.
-     * @since 2.1.0
-     */
-    protected void resolveInheritances(Map<String, Definition> map, Locale locale) {
-        if (map != null) {
-            Set<String> alreadyResolvedDefinitions = new HashSet<String>();
-            for (Definition definition : map.values()) {
-                resolveInheritance(definition, map, locale,
-                        alreadyResolvedDefinitions);
-            }  // end loop
-        }
-    }
-
-    /**
-     * Resolve locale-specific inheritance. First, resolve parent's inheritance,
-     * then set template to the parent's template. Also copy attributes setted
-     * in parent, and not set in child If instance doesn't extend anything, do
-     * nothing.
-     *
-     * @param definition The definition to resolve
-     * @param definitions The definitions to take when obtaining a parent
-     * definition.
-     * @param locale The locale to use.
-     * @param alreadyResolvedDefinitions The set of the definitions that have
-     * been already resolved.
-     * @throws NoSuchDefinitionException If an inheritance can not be solved.
-     * @since 2.1.0
-     */
-    protected void resolveInheritance(Definition definition,
-            Map<String, Definition> definitions, Locale locale,
-            Set<String> alreadyResolvedDefinitions) {
-        // Already done, or not needed ?
-        if (!definition.isExtending()
-                || alreadyResolvedDefinitions.contains(definition.getName())) {
-            return;
-        }
-
-        log.debug("Resolve definition for child name='{}' extends='{}.",
-                definition.getName(), definition.getExtends());
-
-        // Set as visited to avoid endless recursivity.
-        alreadyResolvedDefinitions.add(definition.getName());
-
-        // Resolve parent before itself.
-        Definition parent = definitions.get(definition.getExtends());
-        if (parent == null) { // error
-            String msg = "Error while resolving definition inheritance: child '"
-                + definition.getName()
-                + "' can't find its ancestor '"
-                + definition.getExtends()
-                + "'. Please check your description file.";
-            // to do : find better exception
-            throw new NoSuchDefinitionException(msg);
-        }
-
-        resolveInheritance(parent, definitions, locale,
-                alreadyResolvedDefinitions);
-
-        definition.inherit(parent);
-    }
-
-    /**
-     * Copies the definition map to be passed to a higher level of customization
-     * key.
-     *
-     * @param localeDefsMap The map of definition to be copied.
-     * @return The copy of the definition map. This particular implementation
-     * deep-copies the <code>localeDefsMap</code> into a {@link LinkedHashMap}.
-     * @since 2.1.4
-     */
-    @Override
-    protected Map<String, Definition> copyDefinitionMap(
-            Map<String, Definition> localeDefsMap) {
-        Map<String, Definition> retValue = new LinkedHashMap<String, Definition>(
-                localeDefsMap.size());
-
-        for (Map.Entry<String, Definition> entry : localeDefsMap.entrySet()) {
-            Definition definition = new Definition(entry.getValue());
-            retValue.put(entry.getKey(), definition);
-        }
-
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/package-info.java
deleted file mode 100644
index 61ec23e..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/dao/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes to simply load definitions depending on a customization key.
- * The package contains also basic implementations.
- */
-package org.apache.tiles.definition.dao;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
deleted file mode 100644
index b7c4560..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReader.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.digester;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.digester.Rule;
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.Expression;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.definition.DefinitionsFactoryException;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.xml.sax.Attributes;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * Reads {@link Definition} objects from
- * an XML InputStream using Digester. <p/>
- * <p>
- * This <code>DefinitionsReader</code> implementation expects the source to be
- * passed as an <code>InputStream</code>. It parses XML data from the source
- * and builds a Map of Definition objects.
- * </p>
- * <p/>
- * <p>
- * The Digester object can be configured by passing in initialization
- * parameters. Currently the only parameter that is supported is the
- * <code>validating</code> parameter. This value is set to <code>false</code>
- * by default. To enable DTD validation for XML Definition files, give the init
- * method a parameter with a key of
- * <code>org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE</code>
- * and a value of <code>&quot;true&quot;</code>. <p/>
- * <p>
- * The Definition objects are stored internally in a Map. The Map is stored as
- * an instance variable rather than a local variable in the <code>read</code>
- * method. This means that instances of this class are <strong>not</strong>
- * thread-safe and access by multiple threads must be synchronized.
- * </p>
- *
- * @version $Rev$ $Date$
- */
-public class DigesterDefinitionsReader implements DefinitionsReader {
-
-    /**
-     * Digester validation parameter name.
-     */
-    public static final String PARSER_VALIDATE_PARAMETER_NAME =
-        "org.apache.tiles.definition.digester.DigesterDefinitionsReader.PARSER_VALIDATE";
-
-    // Digester rules constants for tag interception.
-
-    /**
-     * Intercepts a &lt;definition&gt; tag.
-     */
-    private static final String DEFINITION_TAG = "tiles-definitions/definition";
-
-    /**
-     * Intercepts a &lt;put-attribute&gt; tag.
-     */
-    private static final String PUT_TAG = "*/definition/put-attribute";
-
-    /**
-     * Intercepts a &lt;definition&gt; inside a  &lt;put-attribute&gt; tag.
-     */
-    private static final String PUT_DEFINITION_TAG = "*/put-attribute/definition";
-
-    /**
-     * Intercepts a &lt;definition&gt; inside an &lt;add-attribute&gt; tag.
-     */
-    private static final String ADD_DEFINITION_TAG = "*/add-attribute/definition";
-
-    /**
-     * Intercepts a &lt;put-list-attribute&gt; tag inside a %lt;definition&gt;
-     * tag.
-     */
-    private static final String DEF_LIST_TAG = "*/definition/put-list-attribute";
-
-    /**
-     * Intercepts a &lt;add-attribute&gt; tag.
-     */
-    private static final String ADD_LIST_ELE_TAG = "*/add-attribute";
-
-    /**
-     * Intercepts a &lt;add-list-attribute&gt; tag.
-     */
-    private static final String NESTED_LIST = "*/add-list-attribute";
-
-    // Handler class names.
-
-    /**
-     * The handler to create definitions.
-     *
-     * @since 2.1.0
-     */
-    protected static final String DEFINITION_HANDLER_CLASS =
-        Definition.class.getName();
-
-    /**
-     * The handler to create attributes.
-     *
-     * @since 2.1.0
-     */
-    protected static final String PUT_ATTRIBUTE_HANDLER_CLASS =
-        Attribute.class.getName();
-
-    /**
-     * The handler to create list attributes.
-     *
-     * @since 2.1.0
-     */
-    protected static final String LIST_HANDLER_CLASS =
-        ListAttribute.class.getName();
-
-    /**
-     * Digester rule to manage definition filling.
-     *
-     * @since 2.1.2
-     */
-    public static class FillDefinitionRule extends Rule {
-
-        /** {@inheritDoc} */
-        @Override
-        public void begin(String namespace, String name, Attributes attributes) {
-            Definition definition = (Definition) digester.peek();
-            definition.setName(attributes.getValue("name"));
-            definition.setPreparer(attributes.getValue("preparer"));
-            String extendsAttribute = attributes.getValue("extends");
-            definition.setExtends(extendsAttribute);
-
-            String template = attributes.getValue("template");
-            Attribute attribute = Attribute.createTemplateAttribute(template);
-            attribute.setExpressionObject(Expression
-                    .createExpressionFromDescribedExpression(attributes
-                            .getValue("templateExpression")));
-            attribute.setRole(attributes.getValue("role"));
-            String templateType = attributes.getValue("templateType");
-            if (templateType != null) {
-                attribute.setRenderer(templateType);
-            } else if (extendsAttribute != null && templateType == null) {
-                attribute.setRenderer(null);
-            }
-            definition.setTemplateAttribute(attribute);
-        }
-    }
-
-    /**
-     * Digester rule to manage attribute filling.
-     *
-     * @since 2.1.0
-     */
-    public static class FillAttributeRule extends Rule {
-
-        /** {@inheritDoc} */
-        @Override
-        public void begin(String namespace, String name, Attributes attributes) {
-            Attribute attribute = (Attribute) digester.peek();
-            attribute.setValue(attributes.getValue("value"));
-            String expression = attributes.getValue("expression");
-            attribute.setExpressionObject(Expression
-                    .createExpressionFromDescribedExpression(expression));
-            attribute.setRole(attributes.getValue("role"));
-            attribute.setRenderer(attributes.getValue("type"));
-        }
-    }
-
-    /**
-     * Digester rule to manage assignment of the attribute to the parent
-     * element.
-     *
-     * @since 2.1.0
-     */
-    public static class PutAttributeRule extends Rule {
-
-        /** {@inheritDoc} */
-        @Override
-        public void begin(String namespace, String name, Attributes attributes) {
-            Attribute attribute = (Attribute) digester.peek(0);
-            Definition definition = (Definition) digester.peek(1);
-            definition.putAttribute(attributes.getValue("name"), attribute,
-                    "true".equals(attributes.getValue("cascade")));
-        }
-    }
-
-    /**
-     * Digester rule to manage assignment of a nested definition in an attribute
-     * value.
-     *
-     * @since 2.1.0
-     */
-    public class AddNestedDefinitionRule extends Rule {
-
-        /** {@inheritDoc} */
-        @Override
-        public void begin(String namespace, String name, Attributes attributes) {
-            Definition definition = (Definition) digester.peek(0);
-            if (definition.getName() == null) {
-                definition.setName(getNextUniqueDefinitionName(definitions));
-            }
-            Attribute attribute = (Attribute) digester.peek(1);
-            attribute.setValue(definition.getName());
-            attribute.setRenderer("definition");
-        }
-    }
-
-    /**
-     * <code>Digester</code> object used to read Definition data
-     * from the source.
-     */
-    protected Digester digester;
-
-    /**
-     * The set of public identifiers, and corresponding resource names for
-     * the versions of the configuration file DTDs we know about.  There
-     * <strong>MUST</strong> be an even number of Strings in this list!
-     */
-    protected String[] registrations;
-
-    /**
-     * Stores Definition objects.
-     */
-    private Map<String, Definition> definitions;
-
-    /**
-     * Index to be used to create unique definition names for anonymous
-     * (nested) definitions.
-     */
-    private int anonymousDefinitionIndex = 1;
-
-    /**
-     * Creates a new instance of DigesterDefinitionsReader.
-     */
-    public DigesterDefinitionsReader() {
-        digester = new Digester();
-        digester.setNamespaceAware(true);
-        digester.setUseContextClassLoader(true);
-        digester.setErrorHandler(new ThrowingErrorHandler());
-
-        // Register our local copy of the DTDs that we can find
-        String[] registrations = getRegistrations();
-        for (int i = 0; i < registrations.length; i += 2) {
-            URL url = this.getClass().getResource(
-                registrations[i + 1]);
-            if (url != null) {
-                digester.register(registrations[i], url.toString());
-            }
-        }
-
-        initSyntax(digester);
-    }
-
-    /**
-     * Sets the validation of XML files.
-     *
-     * @param validating <code>true</code> means that XML validation is turned
-     * on. <code>false</code> otherwise.
-     * @since 3.3.0
-     */
-    public void setValidating(boolean validating) {
-        digester.setValidating(validating);
-    }
-
-    /**
-     * Reads <code>{@link Definition}</code> objects from a source.
-     * <p/>
-     * Implementations should publish what type of source object is expected.
-     *
-     * @param source The <code>InputStream</code> source from which definitions
-     *               will be read.
-     * @return a Map of <code>Definition</code> objects read from
-     *         the source.
-     * @throws DefinitionsFactoryException If the source is invalid or
-     *          an error occurs when reading definitions.
-     */
-    public Map<String, Definition> read(Object source) {
-        // This is an instance variable instead of a local variable because
-        // we want to be able to call the addDefinition method to populate it.
-        // But we reset the Map here, which, of course, has threading implications.
-        definitions = new LinkedHashMap<String, Definition>();
-
-        if (source == null) {
-            // Perhaps we should throw an exception here.
-            return null;
-        }
-
-        InputStream input;
-        try {
-            input = (InputStream) source;
-        } catch (ClassCastException e) {
-            throw new DefinitionsFactoryException(
-                "Invalid source type.  Requires java.io.InputStream.", e);
-        }
-
-        try {
-            // set first object in stack
-            //digester.clear();
-            digester.push(this);
-            // parse
-            digester.parse(input);
-
-        } catch (SAXException e) {
-            throw new DefinitionsFactoryException(
-                "XML error reading definitions.", e);
-        } catch (IOException e) {
-            throw new DefinitionsFactoryException(
-                "I/O Error reading definitions.", e);
-        } finally {
-            digester.clear();
-        }
-
-        return definitions;
-    }
-
-    /**
-     * Initialised the syntax for reading XML files containing Tiles
-     * definitions.
-     *
-     * @param digester The digester to initialize.
-     */
-    protected void initSyntax(Digester digester) {
-        initDigesterForTilesDefinitionsSyntax(digester);
-    }
-
-
-    /**
-     * Init digester for Tiles syntax with first element = tiles-definitions.
-     *
-     * @param digester Digester instance to use.
-     */
-    private void initDigesterForTilesDefinitionsSyntax(Digester digester) {
-        // syntax rules
-        digester.addObjectCreate(DEFINITION_TAG, DEFINITION_HANDLER_CLASS);
-        digester.addRule(DEFINITION_TAG, new FillDefinitionRule());
-        digester.addSetNext(DEFINITION_TAG, "addDefinition", DEFINITION_HANDLER_CLASS);
-
-        // nested definition rules
-        digester.addObjectCreate(PUT_DEFINITION_TAG, DEFINITION_HANDLER_CLASS);
-        digester.addRule(PUT_DEFINITION_TAG, new FillDefinitionRule());
-        digester.addSetRoot(PUT_DEFINITION_TAG, "addDefinition");
-        digester.addRule(PUT_DEFINITION_TAG, new AddNestedDefinitionRule());
-        digester.addObjectCreate(ADD_DEFINITION_TAG, DEFINITION_HANDLER_CLASS);
-        digester.addRule(ADD_DEFINITION_TAG, new FillDefinitionRule());
-        digester.addSetRoot(ADD_DEFINITION_TAG, "addDefinition");
-        digester.addRule(ADD_DEFINITION_TAG, new AddNestedDefinitionRule());
-
-        // put / putAttribute rules
-        // Rules for a same pattern are called in order, but rule.end() are called
-        // in reverse order.
-        // SetNext and CallMethod use rule.end() method. So, placing SetNext in
-        // first position ensure it will be called last (sic).
-        digester.addObjectCreate(PUT_TAG, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(PUT_TAG, new FillAttributeRule());
-        digester.addRule(PUT_TAG, new PutAttributeRule());
-        // Definition level list rules
-        // This is rules for lists nested in a definition
-        digester.addObjectCreate(DEF_LIST_TAG, LIST_HANDLER_CLASS);
-        digester.addSetProperties(DEF_LIST_TAG);
-        digester.addRule(DEF_LIST_TAG, new PutAttributeRule());
-        // list elements rules
-        // We use Attribute class to avoid rewriting a new class.
-        // Name part can't be used in listElement attribute.
-        digester.addObjectCreate(ADD_LIST_ELE_TAG, PUT_ATTRIBUTE_HANDLER_CLASS);
-        digester.addRule(ADD_LIST_ELE_TAG, new FillAttributeRule());
-        digester.addSetNext(ADD_LIST_ELE_TAG, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-
-        // nested list elements rules
-        // Create a list handler, and add it to parent list
-        digester.addObjectCreate(NESTED_LIST, LIST_HANDLER_CLASS);
-        digester.addSetProperties(NESTED_LIST);
-        digester.addSetNext(NESTED_LIST, "add", PUT_ATTRIBUTE_HANDLER_CLASS);
-    }
-
-    /**
-     * Adds a new <code>Definition</code> to the internal Map or replaces
-     * an existing one.
-     *
-     * @param definition The Definition object to be added.
-     */
-    public void addDefinition(Definition definition) {
-        String name = definition.getName();
-        if (name == null) {
-            throw new DigesterDefinitionsReaderException(
-                    "A root definition has been defined with no name");
-        }
-
-        definitions.put(name, definition);
-    }
-
-    /**
-     * Error Handler that throws every exception it receives.
-     */
-    private static class ThrowingErrorHandler implements ErrorHandler {
-
-        /** {@inheritDoc} */
-        public void warning(SAXParseException exception) throws SAXException {
-            throw exception;
-        }
-
-        /** {@inheritDoc} */
-        public void error(SAXParseException exception) throws SAXException {
-            throw exception;
-        }
-
-        /** {@inheritDoc} */
-        public void fatalError(SAXParseException exception) throws SAXException {
-            throw exception;
-        }
-    }
-
-    /**
-     * Returns the registrations for local DTDs.
-     *
-     * @return An array containing the locations for registrations of local
-     * DTDs.
-     * @since 2.1.0
-     */
-    protected String[] getRegistrations() {
-        if (registrations == null) {
-            registrations = new String[] {
-                "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN",
-                "/org/apache/tiles/resources/tiles-config_3_0.dtd"};
-        }
-        return registrations;
-    }
-
-    /**
-     * Create a unique definition name usable to store anonymous definitions.
-     *
-     * @param definitions The already created definitions.
-     * @return The unique definition name to be used to store the definition.
-     * @since 2.1.0
-     */
-    protected String getNextUniqueDefinitionName(
-            Map<String, Definition> definitions) {
-        String candidate;
-
-        do {
-            candidate = "$anonymousDefinition" + anonymousDefinitionIndex;
-            anonymousDefinitionIndex++;
-        } while (definitions.containsKey(candidate));
-
-        return candidate;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderException.java
deleted file mode 100644
index 644f38a..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderException.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.definition.digester;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Indicates that something went wrong during the use of
- * {@link DigesterDefinitionsReader}.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class DigesterDefinitionsReaderException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public DigesterDefinitionsReaderException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @since 2.1.0
-     */
-    public DigesterDefinitionsReaderException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public DigesterDefinitionsReaderException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public DigesterDefinitionsReaderException(String message, Throwable e) {
-        super(message, e);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/package-info.java
deleted file mode 100644
index 129c2d3..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/digester/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Allows reading definitions with the use of Jakarta Commons Digester.
- */
-package org.apache.tiles.definition.digester;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/package-info.java
deleted file mode 100644
index 3e154ec..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * It contains classes and interfaces to allow manipulations of "definitions", i.e.
- * objects made of a template page and a number of filled attributes.
- */
-package org.apache.tiles.definition;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java
deleted file mode 100644
index 65ff73d..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolver.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-
-/**
- * A pattern definition resolver that stores {@link DefinitionPatternMatcher}
- * separated by customization key. <br>
- * Implementations should provide a way to translate a definition to a
- * {@link DefinitionPatternMatcher}.
- *
- * @param <T> The type of the customization key.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public abstract class AbstractPatternDefinitionResolver<T> implements
-        PatternDefinitionResolver<T> {
-
-    /**
-     * Stores patterns depending on the locale they refer to.
-     */
-    private Map<T, List<DefinitionPatternMatcher>> localePatternPaths =
-        new HashMap<T, List<DefinitionPatternMatcher>>();
-
-    /** {@inheritDoc} */
-    public Definition resolveDefinition(String name, T customizationKey) {
-        Definition retValue = null;
-        if (localePatternPaths.containsKey(customizationKey)) {
-            retValue = searchAndResolveDefinition(localePatternPaths
-                    .get(customizationKey), name);
-        }
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    public Map<String, Definition> storeDefinitionPatterns(Map<String, Definition> localeDefsMap,
-            T customizationKey) {
-        List<DefinitionPatternMatcher> lpaths = localePatternPaths
-                .get(customizationKey);
-        if (lpaths == null) {
-            lpaths = new ArrayList<DefinitionPatternMatcher>();
-            localePatternPaths.put(customizationKey, lpaths);
-        }
-
-        return addDefinitionsAsPatternMatchers(lpaths, localeDefsMap);
-    }
-
-    /**
-     * Adds definitions, filtering and adding them to the list of definition
-     * pattern matchers. Only a subset of definitions will be transformed into
-     * definition pattern matchers.
-     *
-     * @param matchers The list containing the currently stored definition pattern
-     * matchers.
-     * @param defsMap The definition map to parse.
-     * @return The map of the definitions not recognized as containing
-     * definition patterns.
-     * @since 2.2.1
-     */
-    protected abstract Map<String, Definition> addDefinitionsAsPatternMatchers(
-            List<DefinitionPatternMatcher> matchers,
-            Map<String, Definition> defsMap);
-
-    /**
-     * Try to resolve a definition by iterating all pattern matchers.
-     *
-     * @param paths The list containing the currently stored paths.
-     * @param name The name of the definition to resolve.
-     * @return A definition, if found, or <code>null</code> if not.
-     */
-    private Definition searchAndResolveDefinition(
-            List<DefinitionPatternMatcher> paths, String name) {
-        Definition d = null;
-
-        for (DefinitionPatternMatcher wm : paths) {
-            d = wm.createDefinition(name);
-            if (d != null) {
-                break;
-            }
-        }
-
-        return d;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolver.java
deleted file mode 100644
index 9f6bf4e..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolver.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Definition;
-
-/**
- * A pattern definition resolver that stores {@link DefinitionPatternMatcher}
- * separated by customization key. <br>
- * It delegates creation of definition pattern matchers to a
- * {@link DefinitionPatternMatcherFactory} and recgnizes patterns through the
- * use of a {@link PatternRecognizer}.
- *
- * @param <T> The type of the customization key.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class BasicPatternDefinitionResolver<T> extends
-        AbstractPatternDefinitionResolver<T> {
-
-    /**
-     * The factory of pattern matchers.
-     */
-    private DefinitionPatternMatcherFactory definitionPatternMatcherFactory;
-
-    /**
-     * The pattern recognizer.
-     */
-    private PatternRecognizer patternRecognizer;
-
-    /**
-     * Constructor.
-     *
-     * @param definitionPatternMatcherFactory The definition pattern matcher factory.
-     * @param patternRecognizer The pattern recognizer.
-     */
-    public BasicPatternDefinitionResolver(DefinitionPatternMatcherFactory definitionPatternMatcherFactory,
-            PatternRecognizer patternRecognizer) {
-        this.definitionPatternMatcherFactory = definitionPatternMatcherFactory;
-        this.patternRecognizer = patternRecognizer;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected Map<String, Definition> addDefinitionsAsPatternMatchers(List<DefinitionPatternMatcher> matchers,
-            Map<String, Definition> defsMap) {
-        Set<String> excludedKeys = new LinkedHashSet<String>();
-        for (Map.Entry<String, Definition> de : defsMap.entrySet()) {
-            String key = de.getKey();
-            if (patternRecognizer.isPatternRecognized(key)) {
-                matchers.add(definitionPatternMatcherFactory
-                        .createDefinitionPatternMatcher(key, de.getValue()));
-            } else {
-                excludedKeys.add(key);
-            }
-        }
-        return PatternUtil.createExtractedMap(defsMap, excludedKeys);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcher.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcher.java
deleted file mode 100644
index e003acc..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcher.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import org.apache.tiles.Definition;
-
-/**
- * Matches a definition name to a definition, through pattern-matching. The
- * matched pattern should be a single one.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface DefinitionPatternMatcher {
-
-    /**
-     * Creates a definition, given the definition name, through the use of
-     * pattern matching.
-     *
-     * @param definitionName The definition name to match.
-     * @return The created definition, if matched, or <code>null</code> if not
-     * matched.
-     * @since 2.2.0
-     */
-    Definition createDefinition(String definitionName);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcherFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcherFactory.java
deleted file mode 100644
index 64a0deb..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/DefinitionPatternMatcherFactory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import org.apache.tiles.Definition;
-
-/**
- * Creates a new definition pattern matcher for the given pattern and the given
- * base definition with pattern expressions.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface DefinitionPatternMatcherFactory {
-
-    /**
-     * Creates a new definition pattern matcher.
-     *
-     * @param pattern The pattern to be matched.
-     * @param definition The base definition. Created definitions by
-     * {@link DefinitionPatternMatcher#createDefinition(String)} will created
-     * with this one as a basis.
-     * @return The definition pattern matcher.
-     * @since 2.2.0
-     */
-    DefinitionPatternMatcher createDefinitionPatternMatcher(String pattern,
-            Definition definition);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java
deleted file mode 100644
index 539f8dd..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolver.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-
-/**
- * Resolves a definition starting from patterns stored in definition maps.
- *
- * @param <T> The type of the customization key.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface PatternDefinitionResolver<T> {
-
-    /**
-     * Stores definition patterns.
-     *
-     * @param localeDefsMap The map of definitions that may contain also
-     * patterns.
-     * @param customizationKey The customization key.
-     * @return The map of the definitions not recognized as containing
-     * definition patterns.
-     * @since 2.2.1
-     */
-    Map<String, Definition> storeDefinitionPatterns(Map<String, Definition> localeDefsMap,
-            T customizationKey);
-
-    /**
-     * Resolves a definition searching in all patterns for the requested
-     * customization key.
-     *
-     * @param name The name of the definition.
-     * @param customizationKey The customization key.
-     * @return The resolved definition.
-     * @since 2.2.0
-     */
-    Definition resolveDefinition(String name, T customizationKey);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolverAware.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolverAware.java
deleted file mode 100644
index b353b34..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternDefinitionResolverAware.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-/**
- * It indicates an object that uses a {@link PatternDefinitionResolver}.
- *
- * @param <T> The type of the customization key.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface PatternDefinitionResolverAware<T> {
-
-    /**
-     * Sets the pattern definition resolver to use.
-     *
-     * @param definitionResolver The pattern definition resolver.
-     * @since 2.2.0
-     */
-    void setPatternDefinitionResolver(PatternDefinitionResolver<T> definitionResolver);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternRecognizer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternRecognizer.java
deleted file mode 100644
index 052fb03..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternRecognizer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-/**
- * Checks if a pattern (or a candidate one) is recognized as a pattern.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface PatternRecognizer {
-
-    /**
-     * Checks if a pattern is recognized as a pattern.
-     *
-     * @param candidatePattern The pattern to check.
-     * @return <code>true</code> if the pattern has been recognized.
-     * @since 2.2.0
-     */
-    boolean isPatternRecognized(String candidatePattern);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
deleted file mode 100644
index 569416e..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PatternUtil.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import java.text.MessageFormat;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.Expression;
-import org.apache.tiles.ListAttribute;
-
-/**
- * Utilities for pattern matching and substitution.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public final class PatternUtil {
-
-    /**
-     * The root locale. Notice that this is a replacement for Locale.ROOT for
-     * Java 1.6.
-     */
-    private static final Locale ROOT_LOCALE = new Locale("", "");
-
-    /** Pattern to find {.*} occurrences that do not match {[0-9]+} so to prevent MessageFormat from crashing.
-     */
-    private static final Pattern INVALID_FORMAT_ELEMENT = Pattern.compile("\\Q{\\E[\\D^}]+\\Q}\\E");
-
-    /**
-     * Private constructor to avoid instantiation.
-     */
-    private PatternUtil() {
-    }
-
-    /**
-     * Creates a definition given its representation with wildcards and
-     * attribute values with placeholders, replacing real values into
-     * placeholders.
-     *
-     * @param d The definition to replace.
-     * @param name The name of the definition to be created.
-     * @param vars The variables to be substituted.
-     * @return The definition that can be rendered.
-     * @since 2.2.0
-     */
-    public static Definition replacePlaceholders(Definition d, String name,
-            Object... vars) {
-        Definition nudef = new Definition();
-
-        nudef.setExtends(replace(d.getExtends(), vars));
-        nudef.setName(name);
-        nudef.setPreparer(replace(d.getPreparer(), vars));
-        Attribute templateAttribute = d.getTemplateAttribute();
-        if (templateAttribute != null) {
-            nudef.setTemplateAttribute(replaceVarsInAttribute(
-                    templateAttribute, vars));
-        }
-
-        Set<String> attributeNames = d.getLocalAttributeNames();
-        if (attributeNames != null && !attributeNames.isEmpty()) {
-            for (String attributeName : attributeNames) {
-                Attribute attr = d.getLocalAttribute(attributeName);
-                Attribute nuattr = replaceVarsInAttribute(attr, vars);
-
-                nudef.putAttribute(replace(attributeName, vars), nuattr);
-            }
-        }
-
-        attributeNames = d.getCascadedAttributeNames();
-        if (attributeNames != null && !attributeNames.isEmpty()) {
-            for (String attributeName : attributeNames) {
-                Attribute attr = d.getCascadedAttribute(attributeName);
-                Attribute nuattr = replaceVarsInAttribute(attr, vars);
-
-                nudef.putAttribute(replace(attributeName, vars), nuattr, true);
-            }
-        }
-
-        return nudef;
-    }
-
-    /**
-     * Creates a new map that contains all the entries of the
-     * <code>defsMap</code> whose keys are contained in <code>keys</code>.
-     *
-     * @param map The map to read.
-     * @param keys The keys to extract.
-     * @param <K> The key of the map.
-     * @param <V> The value of the map.
-     * @return The extracted map.
-     * @since 2.2.1
-     */
-    public static <K, V> Map<K, V> createExtractedMap(Map<K, V> map, Set<K> keys) {
-        Map<K, V> retValue = new LinkedHashMap<K, V>();
-        for (K key : keys) {
-            retValue.put(key, map.get(key));
-        }
-        return retValue;
-    }
-
-    /**
-     * Replaces variables into an attribute.
-     *
-     * @param attr The attribute to be used as a basis, containing placeholders
-     * for variables.
-     * @param vars The variables to replace.
-     * @return A new instance of an attribute, whose properties have been
-     * replaced with variables' values.
-     */
-    private static Attribute replaceVarsInAttribute(Attribute attr,
-            Object... vars) {
-        Attribute nuattr;
-        if (attr instanceof ListAttribute) {
-            nuattr = replaceVarsInListAttribute((ListAttribute) attr, vars);
-        } else {
-            nuattr = replaceVarsInSimpleAttribute(attr, vars);
-        }
-        return nuattr;
-    }
-
-    /**
-     * Replaces variables into a simple (not list) attribute.
-     *
-     * @param attr The attribute to be used as a basis, containing placeholders
-     * for variables.
-     * @param vars The variables to replace.
-     * @return A new instance of an attribute, whose properties have been
-     * replaced with variables' values.
-     */
-    private static Attribute replaceVarsInSimpleAttribute(Attribute attr,
-            Object... vars) {
-        Attribute nuattr;
-        nuattr = new Attribute();
-
-        nuattr.setRole(replace(attr.getRole(), vars));
-        nuattr.setRenderer(attr.getRenderer());
-        Expression expressionObject = attr.getExpressionObject();
-        if (expressionObject != null) {
-            Expression newExpressionObject = Expression
-                    .createExpression(replace(expressionObject.getExpression(), vars), expressionObject.getLanguage());
-            nuattr.setExpressionObject(newExpressionObject);
-        }
-
-        Object value = attr.getValue();
-        if (value instanceof String) {
-            value = replace((String) value, vars);
-        }
-        nuattr.setValue(value);
-        return nuattr;
-    }
-
-    /**
-     * Replaces variables into a list attribute.
-     *
-     * @param listAttr The attribute to be used as a basis, containing attributes
-     * that may contain placeholders for variables.
-     * @param vars The variables to replace.
-     * @return A new instance of an attribute, whose properties have been
-     * replaced with variables' values.
-     */
-    private static Attribute replaceVarsInListAttribute(ListAttribute listAttr,
-            Object... vars) {
-        Attribute nuattr;
-        ListAttribute nuListAttr = new ListAttribute();
-        nuListAttr.setInherit(listAttr.isInherit());
-        List<Attribute> nuItems = nuListAttr.getValue();
-        for (Object item : listAttr.getValue()) {
-            Attribute child = (Attribute) item;
-            child = replaceVarsInAttribute(child, vars);
-            nuItems.add(child);
-        }
-        nuattr = nuListAttr;
-        return nuattr;
-    }
-
-    /**
-     * Replaces a string with placeholders using values of a variable map.
-     *
-     * @param st The string to replace.
-     * @param vars The variables.
-     * @return The replaced string.
-     */
-    private static String replace(String st, Object... vars) {
-        if (st != null && st.indexOf('{') >= 0) {
-            // remember the invalid "{...}" occurrences
-            Matcher m = INVALID_FORMAT_ELEMENT.matcher(st);
-            // replace them with markers
-            st = INVALID_FORMAT_ELEMENT.matcher(st).replaceAll("INVALID_FORMAT_ELEMENT");
-            // do the MessageFormat replacement (escaping quote characters)
-            st = new MessageFormat(st.replaceAll("'", "'''"), ROOT_LOCALE)
-                    .format(vars, new StringBuffer(), null).toString();
-            // return the markers to their original invalid occurrences
-            while (m.find()) {
-                st = st.replace("INVALID_FORMAT_ELEMENT", m.group());
-            }
-        }
-        return st;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolver.java
deleted file mode 100644
index e5a3912..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolver.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.Expression;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This resolver allows the use of multiple pattern matching languages. The
- * syntax of definition names must be <code>LANGUAGENAME:expression</code>.<br>
- * The different languages must be registered through the use of
- * {@link #registerDefinitionPatternMatcherFactory(String, DefinitionPatternMatcherFactory)}
- * method before using this resolver.
- *
- * @param <T> The type of the customization key.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class PrefixedPatternDefinitionResolver<T> extends
-        AbstractPatternDefinitionResolver<T> {
-
-    /**
-     * The logging object.
-     */
-    private Logger logger = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Matches languages names to the corresponding
-     * {@link DefinitionPatternMatcherFactory}.
-     */
-    private Map<String, DefinitionPatternMatcherFactory> language2matcherFactory;
-
-    /**
-     * Constructor.
-     *
-     * @since 2.2.0
-     */
-    public PrefixedPatternDefinitionResolver() {
-        language2matcherFactory = new HashMap<String, DefinitionPatternMatcherFactory>();
-    }
-
-    /**
-     * Registers a {@link DefinitionPatternMatcherFactory} connected to a
-     * particular language.
-     *
-     * @param language The name of the language.
-     * @param factory The pattern matcher factory to register.
-     * @since 2.2.0
-     */
-    public void registerDefinitionPatternMatcherFactory(String language,
-            DefinitionPatternMatcherFactory factory) {
-        language2matcherFactory.put(language, factory);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected Map<String, Definition> addDefinitionsAsPatternMatchers(
-            List<DefinitionPatternMatcher> matchers,
-            Map<String, Definition> defsMap) {
-        Set<String> excludedKeys = new LinkedHashSet<String>();
-        for (Map.Entry<String, Definition> entry : defsMap.entrySet()) {
-            String key = entry.getKey();
-            Expression expression = Expression
-                    .createExpressionFromDescribedExpression(key);
-            if (expression.getLanguage() != null) {
-                DefinitionPatternMatcherFactory factory = language2matcherFactory
-                        .get(expression.getLanguage());
-                if (factory != null) {
-                    DefinitionPatternMatcher matcher = factory
-                            .createDefinitionPatternMatcher(expression
-                                    .getExpression(), new Definition(entry
-                                    .getValue()));
-                    matchers.add(matcher);
-                } else {
-                    logger.warn("Cannot find a DefinitionPatternMatcherFactory for expression '{}'",
-                            key);
-                }
-            } else {
-                excludedKeys.add(key);
-            }
-        }
-        return PatternUtil.createExtractedMap(defsMap, excludedKeys);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/package-info.java
deleted file mode 100644
index e41a60d..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes to manage pattern matching in definition names, and substitution in attributes.
- */
-package org.apache.tiles.definition.pattern;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcher.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcher.java
deleted file mode 100644
index 6442d33..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcher.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.regexp;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.apache.tiles.definition.pattern.PatternUtil;
-
-/**
- * Matches regular expression patterns in definitions.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class RegexpDefinitionPatternMatcher implements DefinitionPatternMatcher {
-
-    /**
-     * The pattern to match.
-     */
-    private Pattern pattern;
-
-    /**
-     * The definition to use as a basis.
-     */
-    private Definition definition;
-
-    /**
-     * Constructor.
-     *
-     * @param pattern The pattern to use, in string form.
-     * @param definition The definition to use as a basis.
-     * @since 2.2.0
-     */
-    public RegexpDefinitionPatternMatcher(String pattern, Definition definition) {
-        this.pattern = Pattern.compile(pattern);
-        this.definition = definition;
-    }
-
-    /** {@inheritDoc} */
-    public Definition createDefinition(String definitionName) {
-        Definition retValue = null;
-        Matcher matcher = pattern.matcher(definitionName);
-        if (matcher.matches()) {
-            int groupCount = matcher.groupCount() + 1;
-            Object[] vars = new Object[groupCount];
-            for (int i = 0; i < groupCount; i++) {
-                vars[i] = matcher.group(i);
-            }
-            retValue = PatternUtil.replacePlaceholders(definition,
-                    definitionName, vars);
-        }
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactory.java
deleted file mode 100644
index 2c17006..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.regexp;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcherFactory;
-
-/**
- * Creates instances of {@link RegexpDefinitionPatternMatcher}.
- *
- * @version $Rev$ $Date$
- */
-public class RegexpDefinitionPatternMatcherFactory implements
-        DefinitionPatternMatcherFactory {
-
-    /** {@inheritDoc} */
-    public DefinitionPatternMatcher createDefinitionPatternMatcher(
-            String pattern, Definition definition) {
-        return new RegexpDefinitionPatternMatcher(pattern, definition);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/package-info.java
deleted file mode 100644
index f1fce91..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/regexp/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * In Tiles it is possible to use regular expression patterns thanks to this package.
- */
-package org.apache.tiles.definition.pattern.regexp;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcher.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcher.java
deleted file mode 100644
index 033cd6a..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcher.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.wildcard;
-
-import java.util.List;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.apache.tiles.definition.pattern.PatternUtil;
-import org.apache.tiles.util.WildcardHelper;
-
-/**
- * Matches wildcard patterns in definitions.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class WildcardDefinitionPatternMatcher implements
-        DefinitionPatternMatcher {
-
-    /**
-     * Allows to parse wildcard expressions and to recognize substitution
-     * variables.
-     */
-    private WildcardHelper wildcardHelper;
-
-    /**
-     * The definition to use as a basis.
-     */
-    private Definition definition;
-
-    /**
-     * The pattern to use.
-     */
-    private int[] pattern;
-
-    /**
-     * Constructor.
-     *
-     * @param pattern The pattern to use, in string form.
-     * @param definition The definition to use as a basis.
-     * @param wildcardHelper The object that parses wildcard expressions and
-     * recognized substitution variables.
-     * @since 2.2.0
-     */
-    public WildcardDefinitionPatternMatcher(String pattern,
-            Definition definition, WildcardHelper wildcardHelper) {
-        this.wildcardHelper = wildcardHelper;
-        this.definition = definition;
-        this.pattern = wildcardHelper.compilePattern(pattern);
-    }
-
-    /** {@inheritDoc} */
-    public Definition createDefinition(String definitionName) {
-        List<String> vars = wildcardHelper.match(definitionName, pattern);
-        Definition d = null;
-
-        if (vars != null) {
-            d = PatternUtil.replacePlaceholders(definition, definitionName,
-                    vars.toArray());
-        }
-
-        return d;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactory.java
deleted file mode 100644
index 6cb05b5..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactory.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.wildcard;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcherFactory;
-import org.apache.tiles.definition.pattern.PatternRecognizer;
-import org.apache.tiles.util.WildcardHelper;
-
-/**
- * Creates instances of {@link WildcardDefinitionPatternMatcher}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class WildcardDefinitionPatternMatcherFactory implements
-        DefinitionPatternMatcherFactory, PatternRecognizer {
-
-    /**
-     * Allows to parse wildcard expressions and to recognize substitution
-     * variables.
-     */
-    private WildcardHelper wildcardHelper = new WildcardHelper();
-
-    /** {@inheritDoc} */
-    public DefinitionPatternMatcher createDefinitionPatternMatcher(
-            String pattern, Definition definition) {
-        return new WildcardDefinitionPatternMatcher(pattern, definition, wildcardHelper);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isPatternRecognized(String candidatePattern) {
-        return candidatePattern.indexOf('*') >= 0;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/package-info.java
deleted file mode 100644
index 9de2624..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/definition/pattern/wildcard/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * In Tiles it is possible to use wildcard patterns thanks to this package.
- */
-package org.apache.tiles.definition.pattern.wildcard;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/doc-files/image001.gif b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/doc-files/image001.gif
deleted file mode 100644
index f675c12..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/doc-files/image001.gif
+++ /dev/null
Binary files differ
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AbstractAttributeEvaluator.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AbstractAttributeEvaluator.java
deleted file mode 100644
index 82542a6..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AbstractAttributeEvaluator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.evaluator;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.apache.tiles.request.Request;
-
-/**
- * Abstract class to link a correct evaluation of an attribute, by evaluating
- * {@link Attribute#getValue()} and then {@link Attribute#getExpressionObject()}.
- *
- * @version $Rev$ $Date$
- * @since 2.1.2
- */
-public abstract class AbstractAttributeEvaluator implements AttributeEvaluator {
-
-    /** {@inheritDoc} */
-    public Object evaluate(Attribute attribute, Request request) {
-        if (attribute == null) {
-            throw new IllegalArgumentException("The attribute cannot be null");
-        }
-
-        Object retValue = attribute.getValue();
-
-        if (retValue == null) {
-            Expression expression = attribute.getExpressionObject();
-            if (expression != null) {
-                retValue = evaluate(attribute.getExpressionObject()
-                        .getExpression(), request);
-            }
-        }
-
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluator.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluator.java
deleted file mode 100644
index ae5839a..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.evaluator;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.request.Request;
-
-/**
- * It represents an object that resolves a string to return an object.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public interface AttributeEvaluator {
-
-    /**
-     * Evaluates an expression.
-     *
-     * @param expression The expression to evaluate.
-     * @param request The request object.
-     * @return The evaluated object.
-     * @since 2.1.0
-     */
-    Object evaluate(String expression, Request request);
-
-    /**
-     * Evaluates an attribute value.
-     *
-     * @param attribute The attribute to evaluate.
-     * @param request The request object.
-     * @return The evaluated object.
-     * @since 2.1.0
-     */
-    Object evaluate(Attribute attribute, Request request);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactory.java
deleted file mode 100644
index ae77f08..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-import org.apache.tiles.Attribute;
-
-/**
- * Creates an attribute evaluator using the language or an attribute.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface AttributeEvaluatorFactory {
-
-    /**
-     * Creates and attribute evaluator using an attribute.
-     *
-     * @param attribute The attribute used to obtain the evaluator.
-     * @return The attribute evaluator. It must not be <code>null</code>.
-     * @since 2.2.0
-     */
-    AttributeEvaluator getAttributeEvaluator(Attribute attribute);
-
-    /**
-     * Creates and attribute evaluator for the given expression language.
-     *
-     * @param language The name of the expression language.
-     * @return The attribute evaluator. It must not be <code>null</code>.
-     * @since 2.2.0
-     */
-    AttributeEvaluator getAttributeEvaluator(String language);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactoryAware.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactoryAware.java
deleted file mode 100644
index 9f56716..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/AttributeEvaluatorFactoryAware.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-/**
- * It represents an object that can use an {@link AttributeEvaluatorFactory}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface AttributeEvaluatorFactoryAware {
-
-    /**
-     * Sets the attribute evaluator factory.
-     *
-     * @param attributeEvaluatorFactory The attribute evaluator factory to use.
-     * @since 2.2.0
-     */
-    void setAttributeEvaluatorFactory(AttributeEvaluatorFactory attributeEvaluatorFactory);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactory.java
deleted file mode 100644
index c4c396b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-
-/**
- * Basic implementation of {@link AttributeEvaluatorFactory}. It supports a
- * default attribute evaluator, in case the language is not recognized.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class BasicAttributeEvaluatorFactory implements
-        AttributeEvaluatorFactory {
-
-    /**
-     * The default evaluator to return if it is not found in the map of known
-     * languages.
-     */
-    private AttributeEvaluator defaultEvaluator;
-
-    /**
-     * Maps names of expression languages to their attribute evaluator.
-     *
-     * @since 2.2.0
-     */
-    private Map<String, AttributeEvaluator> language2evaluator;
-
-    /**
-     * Constructor.
-     *
-     * @param defaultEvaluator The default evaluator to return if it is not
-     * found in the map of known languages.
-     * @since 2.2.0
-     */
-    public BasicAttributeEvaluatorFactory(AttributeEvaluator defaultEvaluator) {
-        this.defaultEvaluator = defaultEvaluator;
-        language2evaluator = new HashMap<String, AttributeEvaluator>();
-    }
-
-    /**
-     * Registers a known expression language with its attribute evaluator.
-     *
-     * @param language The name of the expression language.
-     * @param evaluator The associated attribute evaluator.
-     * @since 2.2.0
-     */
-    public void registerAttributeEvaluator(String language, AttributeEvaluator evaluator) {
-        language2evaluator.put(language, evaluator);
-    }
-
-    /** {@inheritDoc} */
-    public AttributeEvaluator getAttributeEvaluator(String language) {
-        AttributeEvaluator retValue = language2evaluator.get(language);
-        if (retValue == null) {
-            retValue = defaultEvaluator;
-        }
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    public AttributeEvaluator getAttributeEvaluator(Attribute attribute) {
-        Expression expression = attribute.getExpressionObject();
-        if (expression != null) {
-            return getAttributeEvaluator(expression.getLanguage());
-        }
-        return defaultEvaluator;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java
deleted file mode 100644
index 2b05ca3..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/EvaluationException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Exception raised when an expression language evaluation fails.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class EvaluationException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.2.0
-     */
-    public EvaluationException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message-
-     * @since 2.2.0
-     */
-    public EvaluationException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The cause.
-     * @since 2.2.0
-     */
-    public EvaluationException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message-
-     * @param e The cause.
-     * @since 2.2.0
-     */
-    public EvaluationException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluator.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluator.java
deleted file mode 100644
index 6a9d0f4..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.evaluator.impl;
-
-import org.apache.tiles.evaluator.AbstractAttributeEvaluator;
-import org.apache.tiles.request.Request;
-
-/**
- * Resolves a string and returns the string itself. It is useful for backward
- * compatibility.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class DirectAttributeEvaluator extends AbstractAttributeEvaluator {
-
-    /** {@inheritDoc} */
-    public Object evaluate(String expression, Request request) {
-        return expression;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/package-info.java
deleted file mode 100644
index de88542..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/impl/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes to manage attribute value evaluation.
- */
-package org.apache.tiles.evaluator.impl;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/package-info.java
deleted file mode 100644
index 6ba1ab1..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/evaluator/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Interfaces to manage attribute value evaluation.
- */
-package org.apache.tiles.evaluator;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/AbstractTilesContainerFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/AbstractTilesContainerFactory.java
deleted file mode 100644
index 9111fc5..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/AbstractTilesContainerFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.factory;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-
-/**
- * Abstract Factory that creates instances of {@link TilesContainerFactory}.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public abstract class AbstractTilesContainerFactory {
-
-    /**
-     * Initialization parameter that represents the container factory class
-     * name.
-     *
-     * @since 2.1.0
-     */
-    public static final String CONTAINER_FACTORY_INIT_PARAM =
-        "org.apache.tiles.factory.AbstractTilesContainerFactory";
-
-    /**
-     * Creates a Tiles container.
-     *
-     * @param applicationContext The Tiles application context object.
-     * @return The created container.
-     * @throws TilesContainerFactoryException If something goes wrong during
-     * instantiation.
-     * @since 2.1.1
-     */
-    public abstract TilesContainer createContainer(ApplicationContext applicationContext);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
deleted file mode 100644
index 2bc10ad..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.factory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.definition.DefinitionsFactory;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory;
-import org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.definition.pattern.BasicPatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolverAware;
-import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
-import org.apache.tiles.impl.BasicTilesContainer;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.locale.impl.DefaultLocaleResolver;
-import org.apache.tiles.preparer.factory.BasicPreparerFactory;
-import org.apache.tiles.preparer.factory.PreparerFactory;
-import org.apache.tiles.renderer.DefinitionRenderer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.render.BasicRendererFactory;
-import org.apache.tiles.request.render.ChainedDelegateRenderer;
-import org.apache.tiles.request.render.DispatchRenderer;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.render.RendererFactory;
-import org.apache.tiles.request.render.StringRenderer;
-
-/**
- * Factory that builds a standard Tiles container using only Java code.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class BasicTilesContainerFactory extends AbstractTilesContainerFactory {
-
-    /**
-     * The string renderer name.
-     */
-    protected static final String STRING_RENDERER_NAME = "string";
-
-    /**
-     * The template renderer name.
-     */
-    protected static final String TEMPLATE_RENDERER_NAME = "template";
-
-    /**
-     * The definition renderer name.
-     */
-    protected static final String DEFINITION_RENDERER_NAME = "definition";
-
-    /** {@inheritDoc} */
-    @Override
-    public TilesContainer createContainer(ApplicationContext applicationContext) {
-        BasicTilesContainer container = instantiateContainer(applicationContext);
-        container.setApplicationContext(applicationContext);
-        LocaleResolver resolver = createLocaleResolver(applicationContext);
-        container.setDefinitionsFactory(createDefinitionsFactory(applicationContext,
-                resolver));
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createAttributeEvaluatorFactory(
-                applicationContext, resolver);
-        container.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        container.setPreparerFactory(createPreparerFactory(applicationContext));
-        TilesContainer injectedContainer = createDecoratedContainer(container, applicationContext);
-        container.setRendererFactory(createRendererFactory(applicationContext,
-                injectedContainer, attributeEvaluatorFactory));
-        return injectedContainer;
-    }
-
-    /**
-     * Instantiate the container, without initialization.
-     *
-     * @param context The Tiles application context object.
-     * @return The instantiated container.
-     * @since 2.1.1
-     */
-    protected BasicTilesContainer instantiateContainer(
-            ApplicationContext context) {
-        return new BasicTilesContainer();
-    }
-
-    /**
-     * Instantiate the container that will be injected to child objects.
-     *
-     * @param originalContainer The original instantiated container.
-     * @param context The Tiles application context object.
-     * @return The instantiated container.
-     * @since 3.0.0
-     */
-    protected TilesContainer createDecoratedContainer(TilesContainer originalContainer,
-            ApplicationContext context) {
-        return originalContainer;
-    }
-
-    /**
-     * Creates the definitions factory. By default it creates a
-     * {@link UnresolvingLocaleDefinitionsFactory} with default dependencies.
-     *
-     * @param applicationContext The Tiles application context.
-     * @param resolver The locale resolver.
-     * @return The definitions factory.
-     * @since 2.1.1
-     */
-    protected DefinitionsFactory createDefinitionsFactory(ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        UnresolvingLocaleDefinitionsFactory factory = instantiateDefinitionsFactory(
-                applicationContext, resolver);
-        factory.setLocaleResolver(resolver);
-        factory.setDefinitionDAO(createLocaleDefinitionDao(applicationContext,
-                resolver));
-        return factory;
-    }
-
-    /**
-     * Instantiate a new definitions factory based on Locale.
-     * @param applicationContext The Tiles application context.
-     * @param resolver The locale resolver.
-     * @return The definitions factory.
-     * @since 2.2.1
-     */
-    protected UnresolvingLocaleDefinitionsFactory instantiateDefinitionsFactory(
-            ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        return new UnresolvingLocaleDefinitionsFactory();
-    }
-
-
-    /**
-     * Instantiate (and does not initialize) a Locale-based definition DAO.
-     * @param applicationContext The Tiles application context.
-     * @param resolver The locale resolver.
-     * @return The definition DAO.
-     * @since 2.1.1
-     */
-    protected BaseLocaleUrlDefinitionDAO instantiateLocaleDefinitionDao(ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        ResolvingLocaleUrlDefinitionDAO dao = new ResolvingLocaleUrlDefinitionDAO(applicationContext);
-        return dao;
-    }
-
-    /**
-     * Creates a Locale-based definition DAO.
-     * @param applicationContext The Tiles application context.
-     * @param resolver The locale resolver.
-     * @return The definition DAO.
-     * @since 2.1.1
-     */
-    @SuppressWarnings("unchecked")
-    protected DefinitionDAO<Locale> createLocaleDefinitionDao(ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        BaseLocaleUrlDefinitionDAO definitionDao = instantiateLocaleDefinitionDao(
-                applicationContext, resolver);
-        definitionDao.setReader(createDefinitionsReader(applicationContext));
-        definitionDao.setSources(getSources(applicationContext));
-        if (definitionDao instanceof PatternDefinitionResolverAware) {
-            ((PatternDefinitionResolverAware<Locale>) definitionDao)
-                    .setPatternDefinitionResolver(createPatternDefinitionResolver(Locale.class));
-        }
-        return definitionDao;
-    }
-
-    /**
-     * Creates the locale resolver. By default it creates a
-     * {@link DefaultLocaleResolver}.
-     * @param applicationContext The Tiles application context.
-     * @return The locale resolver.
-     * @since 2.1.1
-     */
-    protected LocaleResolver createLocaleResolver(ApplicationContext applicationContext) {
-        return new DefaultLocaleResolver();
-    }
-
-    /**
-     * Creates the definitions reader. By default it creates a
-     * {@link DigesterDefinitionsReader}.
-     * @param applicationContext The Tiles application context.
-     * @return The definitions reader.
-     * @since 2.1.1
-     */
-    protected DefinitionsReader createDefinitionsReader(
-            ApplicationContext applicationContext) {
-        return new DigesterDefinitionsReader();
-    }
-
-    /**
-     * Returns a list containing the resources to be parsed. By default, it returns a
-     * list containing the resource at "/WEB-INF/tiles.xml".
-     * @param applicationContext The Tiles application context.
-     * @return The resources.
-     * @since 2.1.1
-     */
-    protected List<ApplicationResource> getSources(ApplicationContext applicationContext) {
-        List<ApplicationResource> retValue = new ArrayList<ApplicationResource>(1);
-        retValue.add(applicationContext.getResource("/WEB-INF/tiles.xml"));
-        return retValue;
-    }
-
-    /**
-     * Creates the attribute evaluator factory to use. By default it returns a
-     * {@link BasicAttributeEvaluatorFactory} containing the
-     * {@link DirectAttributeEvaluator} as the default evaluator.
-     *
-     * @param applicationContext The Tiles application context.
-     * @param resolver The locale resolver.
-     * @return The evaluator factory.
-     * @since 2.2.0
-     */
-    protected AttributeEvaluatorFactory createAttributeEvaluatorFactory(
-            ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        return new BasicAttributeEvaluatorFactory(new DirectAttributeEvaluator());
-    }
-
-    /**
-     * Creates the preparer factory to use. By default it returns a
-     * {@link BasicPreparerFactory}.
-     * @param applicationContext The Tiles application context.
-     * @return The preparer factory.
-     * @since 2.1.1
-     */
-    protected PreparerFactory createPreparerFactory(ApplicationContext applicationContext) {
-        return new BasicPreparerFactory();
-    }
-
-    /**
-     * Creates a renderer factory. By default it returns a
-     * {@link BasicRendererFactory}, composed of an
-     * {@link UntypedAttributeRenderer} as default, and delegates of
-     * {@link StringRenderer}, {@link DispatchRenderer},
-     * {@link DefinitionRenderer}.
-     *
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @return The renderer factory.
-     * @since 2.2.0
-     */
-    protected RendererFactory createRendererFactory(ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        BasicRendererFactory retValue = new BasicRendererFactory();
-        registerAttributeRenderers(retValue, applicationContext, container,
-                attributeEvaluatorFactory);
-        retValue.setDefaultRenderer(createDefaultAttributeRenderer(retValue,
-                applicationContext, container, attributeEvaluatorFactory));
-        return retValue;
-    }
-
-    /**
-     * Creates the default attribute renderer. By default it is an
-     * {@link ChainedDelegateRenderer}.
-     *
-     * @param rendererFactory The renderer factory to configure.
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @return The default attribute renderer.
-     * @since 3.0.0
-     */
-    protected Renderer createDefaultAttributeRenderer(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        ChainedDelegateRenderer retValue = new ChainedDelegateRenderer();
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(DEFINITION_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(TEMPLATE_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(STRING_RENDERER_NAME));
-        return retValue;
-    }
-
-    /**
-     * Creates a new pattern definition resolver. By default, it instantiate a
-     * {@link BasicPatternDefinitionResolver} with
-     * {@link WildcardDefinitionPatternMatcherFactory} to manage wildcard
-     * substitution.
-     *
-     * @param <T> The type of the customization key.
-     * @param customizationKeyClass The customization key class.
-     * @return The pattern definition resolver.
-     * @since 2.2.0
-     */
-    protected <T> PatternDefinitionResolver<T> createPatternDefinitionResolver(
-            Class<T> customizationKeyClass) {
-        WildcardDefinitionPatternMatcherFactory definitionPatternMatcherFactory =
-            new WildcardDefinitionPatternMatcherFactory();
-        return new BasicPatternDefinitionResolver<T>(
-                definitionPatternMatcherFactory,
-                definitionPatternMatcherFactory);
-    }
-
-    /**
-     * Registers attribute renderers in a {@link BasicRendererFactory}. By
-     * default, it registers delegates to {@link StringRenderer},
-     * {@link DispatchRenderer} and {@link DefinitionRenderer}.
-     *
-     * @param rendererFactory The renderer factory to configure.
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @since 2.2.0
-     */
-    protected void registerAttributeRenderers(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        rendererFactory.registerRenderer(STRING_RENDERER_NAME,
-                createStringAttributeRenderer(rendererFactory,
-                        applicationContext, container, attributeEvaluatorFactory));
-        rendererFactory.registerRenderer(TEMPLATE_RENDERER_NAME,
-                createTemplateAttributeRenderer(rendererFactory,
-                        applicationContext, container, attributeEvaluatorFactory));
-        rendererFactory.registerRenderer(DEFINITION_RENDERER_NAME,
-                createDefinitionAttributeRenderer(rendererFactory,
-                        applicationContext, container, attributeEvaluatorFactory));
-    }
-
-    /**
-     * Creates an attribute renderer to render strings.
-     *
-     * @param rendererFactory The renderer factory to configure.
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @return The renderer.
-     * @since 3.0.0
-     */
-    protected Renderer createStringAttributeRenderer(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        return new StringRenderer();
-    }
-
-    /**
-     * Creates a {@link AttributeRenderer} that uses a {@link DispatchRenderer}.
-     *
-     * @param rendererFactory The renderer factory to configure.
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @return The renderer.
-     * @since 2.2.1
-     */
-    protected Renderer createTemplateAttributeRenderer(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        return new DispatchRenderer();
-    }
-
-    /**
-     * Creates a {@link AttributeRenderer} using a {@link DefinitionRenderer}.
-     *
-     * @param rendererFactory The renderer factory to configure.
-     * @param applicationContext The Tiles application context.
-     * @param container The container.
-     * @param attributeEvaluatorFactory The attribute evaluator factory.
-     * @return The renderer.
-     * @since 3.0.0
-     */
-    protected Renderer createDefinitionAttributeRenderer(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        return new DefinitionRenderer(container);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactoryException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactoryException.java
deleted file mode 100644
index 18b8595..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/TilesContainerFactoryException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.factory;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Indicates that something went wrong in {@link TilesContainerFactory} use.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class TilesContainerFactoryException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public TilesContainerFactoryException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @since 2.1.0
-     */
-    public TilesContainerFactoryException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public TilesContainerFactoryException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public TilesContainerFactoryException(String message, Throwable e) {
-        super(message, e);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/package-info.java
deleted file mode 100644
index 9223e13..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/factory/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Factory classes, to allow creation of container instances.
- */
-package org.apache.tiles.factory;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
deleted file mode 100644
index 05ad174..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/BasicTilesContainer.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl;
-
-import java.io.IOException;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.BasicAttributeContext;
-import org.apache.tiles.Definition;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.definition.DefinitionsFactory;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.evaluator.AttributeEvaluator;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactoryAware;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.preparer.factory.NoSuchPreparerException;
-import org.apache.tiles.preparer.factory.PreparerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.CannotRenderException;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.render.RendererFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Basic implementation of the tiles container interface.
- * In most cases, this container will be customized by
- * injecting customized services, not necessarily by
- * override the container
- *
- * @since 2.0
- * @version $Rev$ $Date$
- */
-public class BasicTilesContainer implements TilesContainer,
-        AttributeEvaluatorFactoryAware {
-
-    /**
-     * Name used to store attribute context stack.
-     */
-    private static final String ATTRIBUTE_CONTEXT_STACK =
-        "org.apache.tiles.AttributeContext.STACK";
-
-    /**
-     * Log instance for all BasicTilesContainer
-     * instances.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(BasicTilesContainer.class);
-
-    /**
-     * The Tiles application context object.
-     */
-    private ApplicationContext context;
-
-    /**
-     * The definitions factory.
-     */
-    private DefinitionsFactory definitionsFactory;
-
-    /**
-     * The preparer factory.
-     */
-    private PreparerFactory preparerFactory;
-
-    /**
-     * The renderer factory.
-     */
-    private RendererFactory rendererFactory;
-
-    /**
-     * The attribute evaluator.
-     */
-    private AttributeEvaluatorFactory attributeEvaluatorFactory;
-
-    /** {@inheritDoc} */
-    public AttributeContext startContext(Request request) {
-        AttributeContext context = new BasicAttributeContext();
-        Deque<AttributeContext>  stack = getContextStack(request);
-        if (!stack.isEmpty()) {
-            AttributeContext parent = stack.peek();
-            context.inheritCascadedAttributes(parent);
-        }
-        stack.push(context);
-        return context;
-    }
-
-    /** {@inheritDoc} */
-    public void endContext(Request request) {
-        popContext(request);
-    }
-
-    /** {@inheritDoc} */
-    public void renderContext(Request request) {
-        AttributeContext attributeContext = getAttributeContext(request);
-
-        render(request, attributeContext);
-    }
-
-    /**
-     * Returns the Tiles application context used by this container.
-     *
-     * @return the application context for this container.
-     */
-    public ApplicationContext getApplicationContext() {
-        return context;
-    }
-
-    /**
-     * Sets the Tiles application context to use.
-     *
-     * @param context The Tiles application context.
-     */
-    public void setApplicationContext(ApplicationContext context) {
-        this.context = context;
-    }
-
-    /** {@inheritDoc} */
-    public AttributeContext getAttributeContext(Request request) {
-        AttributeContext context = getContext(request);
-        if (context == null) {
-            context = new BasicAttributeContext();
-            pushContext(context, request);
-        }
-        return context;
-
-    }
-
-    /**
-     * Returns the definitions factory.
-     *
-     * @return The definitions factory used by this container.
-     */
-    public DefinitionsFactory getDefinitionsFactory() {
-        return definitionsFactory;
-    }
-
-    /**
-     * Set the definitions factory. This method first ensures
-     * that the container has not yet been initialized.
-     *
-     * @param definitionsFactory the definitions factory for this instance.
-     */
-    public void setDefinitionsFactory(DefinitionsFactory definitionsFactory) {
-        this.definitionsFactory = definitionsFactory;
-    }
-
-    /**
-     * Returns the preparer factory used by this container.
-     *
-     * @return return the preparerInstance factory used by this container.
-     */
-    public PreparerFactory getPreparerFactory() {
-        return preparerFactory;
-    }
-
-    /**
-     * Set the preparerInstance factory.  This method first ensures
-     * that the container has not yet been initialized.
-     *
-     * @param preparerFactory the preparerInstance factory for this conainer.
-     */
-    public void setPreparerFactory(PreparerFactory preparerFactory) {
-        this.preparerFactory = preparerFactory;
-    }
-
-    /**
-     * Sets the renderer instance factory.
-     *
-     * @param rendererFactory the renderer instance factory for this container.
-     * @since 2.1.0
-     */
-    public void setRendererFactory(RendererFactory rendererFactory) {
-        this.rendererFactory = rendererFactory;
-    }
-
-    /** {@inheritDoc} */
-    public void setAttributeEvaluatorFactory(
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        this.attributeEvaluatorFactory = attributeEvaluatorFactory;
-    }
-
-    /** {@inheritDoc} */
-    public void prepare(String preparer, Request request) {
-        prepare(request, preparer, false);
-    }
-
-    /** {@inheritDoc} */
-    public void render(String definitionName, Request request) {
-        log.debug("Render request received for definition '{}'", definitionName);
-
-        Definition definition = getDefinition(definitionName, request);
-
-        if (definition == null) {
-            throw new NoSuchDefinitionException("Unable to find the definition '" + definitionName + "'");
-        }
-
-        render(definition, request);
-    }
-
-    /**
-     * Renders the specified definition.
-     * @param definition The definition to render.
-     * @param request The request context.
-     * @since 2.1.3
-     */
-    public void render(Definition definition, Request request) {
-        AttributeContext originalContext = getAttributeContext(request);
-        BasicAttributeContext subContext = new BasicAttributeContext(originalContext);
-        subContext.inherit(definition);
-
-        pushContext(subContext, request);
-
-        try {
-            render(request, subContext);
-        } finally {
-            popContext(request);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void render(Attribute attr, Request request)
-        throws IOException {
-        if (attr == null) {
-            throw new CannotRenderException("Cannot render a null attribute");
-        }
-
-        if (attr.isPermitted(request)) {
-            Renderer renderer = rendererFactory.getRenderer(attr.getRenderer());
-            Object value = evaluate(attr, request);
-            if (!(value instanceof String)) {
-                throw new CannotRenderException(
-                        "Cannot render an attribute that is not a string, toString returns: "
-                                + value);
-            }
-            renderer.render((String) value, request);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public Object evaluate(Attribute attribute, Request request) {
-        AttributeEvaluator evaluator = attributeEvaluatorFactory
-                .getAttributeEvaluator(attribute);
-        return evaluator.evaluate(attribute, request);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isValidDefinition(String definitionName, Request request) {
-        try {
-            Definition definition = getDefinition(definitionName, request);
-            return definition != null;
-        } catch (NoSuchDefinitionException nsde) {
-            log.debug("Cannot find definition '{}'", definitionName);
-            log.debug("Exception related to the not found definition", nsde);
-            return false;
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Definition getDefinition(String definitionName,
-            Request request) {
-        Definition definition =
-            definitionsFactory.getDefinition(definitionName, request);
-        return definition;
-    }
-
-    /**
-     * Returns the context stack.
-     *
-     * @param tilesContext The Tiles context object to use.
-     * @return The needed stack of contexts.
-     * @since 2.0.6
-     */
-    @SuppressWarnings("unchecked")
-    protected Deque<AttributeContext> getContextStack(Request tilesContext) {
-        Map<String, Object> requestScope = tilesContext.getContext("request");
-        Deque<AttributeContext> contextStack = (Deque<AttributeContext>) requestScope
-                .get(ATTRIBUTE_CONTEXT_STACK);
-        if (contextStack == null) {
-            contextStack = new LinkedList<AttributeContext>();
-            requestScope.put(ATTRIBUTE_CONTEXT_STACK, contextStack);
-        }
-
-        return contextStack;
-    }
-
-    /**
-     * Pushes a context object in the stack.
-     *
-     * @param context The context to push.
-     * @param tilesContext The Tiles context object to use.
-     * @since 2.0.6
-     */
-    protected void pushContext(AttributeContext context,
-            Request tilesContext) {
-        Deque<AttributeContext> contextStack = getContextStack(tilesContext);
-        contextStack.push(context);
-    }
-
-    /**
-     * Pops a context object out of the stack.
-     *
-     * @param tilesContext The Tiles context object to use.
-     * @return The popped context object.
-     * @since 2.0.6
-     */
-    protected AttributeContext popContext(Request tilesContext) {
-        Deque<AttributeContext> contextStack = getContextStack(tilesContext);
-        return contextStack.pop();
-    }
-
-    /**
-     * Get attribute context from request.
-     *
-     * @param tilesContext current Tiles application context.
-     * @return BasicAttributeContext or null if context is not found.
-     * @since 2.0.6
-     */
-    protected AttributeContext getContext(Request tilesContext) {
-        Deque<AttributeContext> contextStack = getContextStack(tilesContext);
-        if (!contextStack.isEmpty()) {
-            return contextStack.peek();
-        }
-        return null;
-    }
-
-    /**
-     * Execute a preparer.
-     *
-     * @param context The request context.
-     * @param preparerName The name of the preparer.
-     * @param ignoreMissing If <code>true</code> if the preparer is not found,
-     * it ignores the problem.
-     * @throws NoSuchPreparerException If the preparer is not found (and
-     * <code>ignoreMissing</code> is not set) or if the preparer itself threw an
-     * exception.
-     */
-    private void prepare(Request context, String preparerName, boolean ignoreMissing) {
-
-        log.debug("Prepare request received for '{}'", preparerName);
-
-        ViewPreparer preparer = preparerFactory.getPreparer(preparerName, context);
-        if (preparer == null && ignoreMissing) {
-            return;
-        }
-
-        if (preparer == null) {
-            throw new NoSuchPreparerException("Preparer '" + preparerName + " not found");
-        }
-
-        AttributeContext attributeContext = getContext(context);
-
-        preparer.execute(context, attributeContext);
-    }
-
-    /**
-     * Renders the specified attribute context.
-     *
-     * @param request The request context.
-     * @param attributeContext The context to render.
-     * @throws InvalidTemplateException If the template is not valid.
-     * @throws CannotRenderException If something goes wrong during rendering.
-     * @since 2.1.3
-     */
-    protected void render(Request request,
-            AttributeContext attributeContext) {
-
-        try {
-            if (attributeContext.getPreparer() != null) {
-                prepare(request, attributeContext.getPreparer(), true);
-            }
-
-            render(attributeContext.getTemplateAttribute(), request);
-        } catch (IOException e) {
-            throw new CannotRenderException(e.getMessage(), e);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/InvalidTemplateException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/InvalidTemplateException.java
deleted file mode 100644
index 660c2d4..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/InvalidTemplateException.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl;
-
-import org.apache.tiles.TilesException;
-
-/**
- * An invalid template has been identified.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class InvalidTemplateException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.1.0
-     */
-    public InvalidTemplateException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @since 2.1.0
-     */
-    public InvalidTemplateException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public InvalidTemplateException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped.
-     * @since 2.1.0
-     */
-    public InvalidTemplateException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java
deleted file mode 100644
index 608ba47..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/CachingTilesContainer.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl.mgmt;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.TilesContainerWrapper;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.mgmt.MutableTilesContainer;
-import org.apache.tiles.request.Request;
-
-/**
- * Manages custom and configured definitions, so they can be used by the
- * container, instead of using a simple {@link org.apache.tiles.definition.DefinitionsFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class CachingTilesContainer extends TilesContainerWrapper implements MutableTilesContainer {
-
-    /**
-     * The default name of the attribute in which storing custom definitions.
-     */
-    private static final String DEFAULT_DEFINITIONS_ATTRIBUTE_NAME =
-        "org.apache.tiles.impl.mgmt.DefinitionManager.DEFINITIONS";
-
-    /**
-     * The name of the attribute in which storing custom definitions.
-     */
-    private String definitionsAttributeName;
-
-    /**
-     * Constructor.
-     * @param originalContainer The original container to wrap.
-     */
-    public CachingTilesContainer(TilesContainer originalContainer) {
-        super(originalContainer);
-        definitionsAttributeName = DEFAULT_DEFINITIONS_ATTRIBUTE_NAME;
-    }
-
-    /**
-     * Constructor.
-     * @param originalContainer The original container to wrap.
-     * @param definitionsAttributeName The name of the attribute in which
-     * storing custom definitions.
-     */
-    public CachingTilesContainer(TilesContainer originalContainer, String definitionsAttributeName) {
-        super(originalContainer);
-        this.definitionsAttributeName = definitionsAttributeName;
-        if (this.definitionsAttributeName == null) {
-            this.definitionsAttributeName = DEFAULT_DEFINITIONS_ATTRIBUTE_NAME;
-        }
-    }
-
-    /**
-     * Returns a definition by name.
-     *
-     * @param definition The name of the definition.
-     * @param request The current request.
-     * @return The requested definition, either main or custom.
-     * @throws org.apache.tiles.definition.DefinitionsFactoryException If
-     * something goes wrong when obtaining a main definition.
-     */
-    public Definition getDefinition(String definition,
-            Request request) {
-        Definition retValue = null;
-        retValue = getCustomDefinition(definition, request);
-        if (retValue == null) {
-            retValue = super.getDefinition(definition, request);
-        }
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean isValidDefinition(String definition, Request request) {
-        if (getCustomDefinition(definition, request) != null) {
-            return true;
-        }
-        return super.isValidDefinition(definition, request);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void register(Definition definition, Request request) {
-        Map<String, Definition> definitions = getOrCreateDefinitions(request);
-        if (definition.getName() == null) {
-            definition.setName(getNextUniqueDefinitionName(definitions));
-        }
-
-        if (definition.isExtending()) {
-            this.resolveInheritance(definition, request);
-        }
-
-        definitions.put(definition.getName(), definition);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void render(String definition, Request request) {
-        Definition toRender = getDefinition(definition, request);
-        if (toRender == null) {
-            throw new NoSuchDefinitionException(
-                    "Cannot find definition named '" + definition + "'");
-        }
-        super.render(toRender, request);
-    }
-
-    /**
-     * Resolve inheritance.
-     * First, resolve parent's inheritance, then set template to the parent's
-     * template.
-     * Also copy attributes set in parent, and not set in child
-     * If instance doesn't extend anything, do nothing.
-     *
-     * @param definition The definition that needs to have its inheritances
-     * resolved.
-     * @param request The current request.
-     * @throws org.apache.tiles.definition.DefinitionsFactoryException If an
-     * inheritance can not be solved.
-     */
-    private void resolveInheritance(Definition definition,
-            Request request) {
-        // Already done, or not needed ?
-        if (!definition.isExtending()) {
-            return;
-        }
-
-        String parentDefinitionName = definition.getExtends();
-
-        boolean recurse = true;
-        Definition parent = getCustomDefinition(parentDefinitionName, request);
-        if (parent == null) {
-            parent = container.getDefinition(parentDefinitionName, request);
-            recurse = false;
-        }
-
-        if (parent == null) {
-            throw new NoSuchDefinitionException(
-                    "Error while resolving definition inheritance: child '"
-                            + definition.getName()
-                            + "' can't find its ancestor '"
-                            + parentDefinitionName
-                            + "'. Please check your description file.");
-        }
-
-        // Resolve parent before itself.
-        if (recurse) {
-            resolveInheritance(parent, request);
-        }
-        definition.inherit(parent);
-    }
-
-    /**
-     * Returns the map with custom definitions for the current request.
-     *
-     * @param request The current request.
-     * @return A map that connects a definition name to a definition.
-     */
-    @SuppressWarnings("unchecked")
-    private Map<String, Definition> getDefinitions(
-            Request request) {
-        return (Map<String, Definition>) request.getContext("request")
-                .get(definitionsAttributeName);
-    }
-
-    /**
-     * Returns a map of type "definition name -> definition" and, if it has not
-     * been defined before, creates one.
-     *
-     * @param request The current request.
-     * @return A map that connects a definition name to a definition.
-     */
-    @SuppressWarnings("unchecked")
-    private Map<String, Definition> getOrCreateDefinitions(
-            Request request) {
-        Map<String, Definition> definitions =
-            (Map<String, Definition>) request.getContext("request").get(definitionsAttributeName);
-        if (definitions == null) {
-            definitions = new HashMap<String, Definition>();
-            request.getContext("request")
-                    .put(definitionsAttributeName, definitions);
-        }
-
-        return definitions;
-    }
-
-    /**
-     * Create a unique definition name usable to store anonymous definitions.
-     *
-     * @param definitions The already created definitions.
-     * @return The unique definition name to be used to store the definition.
-     * @since 2.1.0
-     */
-    private String getNextUniqueDefinitionName(
-            Map<String, Definition> definitions) {
-        String candidate;
-        int anonymousDefinitionIndex = 1;
-
-        do {
-            candidate = "$anonymousMutableDefinition" + anonymousDefinitionIndex;
-            anonymousDefinitionIndex++;
-        } while (definitions.containsKey(candidate));
-
-        return candidate;
-    }
-
-    /**
-     * Returns a custom definition from the cache.
-     *
-     * @param definition The definition to search.
-     * @param request The request.
-     * @return The requested definition.
-     */
-    private Definition getCustomDefinition(String definition, Request request) {
-        Map<String, Definition> definitions = getDefinitions(request);
-        if (definitions != null) {
-            return definitions.get(definition);
-        }
-        return null;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/package-info.java
deleted file mode 100644
index beb0283..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/mgmt/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * It contains the basic implementations of mutable Tiles containers.
- */
-package org.apache.tiles.impl.mgmt;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/package-info.java
deleted file mode 100644
index 4df849e..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/impl/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * It contains the basic implementations of Tiles container.
- */
-package org.apache.tiles.impl;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/LocaleResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/LocaleResolver.java
deleted file mode 100644
index 4022cc3..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/LocaleResolver.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.locale;
-
-import java.util.Locale;
-
-import org.apache.tiles.request.Request;
-
-/**
- * It represents an object able to resolve the current locale for the current
- * request, where its strategy depends on its implementation.
- *
- * @version $Rev$ $Date$
- */
-public interface LocaleResolver {
-
-    /**
-     * Resolves the locale.
-     *
-     * @param request The Tiles request object.
-     * @return The current locale for the current request.
-     */
-    Locale resolveLocale(Request request);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/DefaultLocaleResolver.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/DefaultLocaleResolver.java
deleted file mode 100644
index 19fd12f..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/DefaultLocaleResolver.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.locale.impl;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.Request;
-
-/**
- * Default implementation of <code>LocaleResolver</code><br>
- * It tries to take the locale from the session-scoped attribute
- * {@link DefaultLocaleResolver#LOCALE_KEY}. If it is not found, it returns the
- * locale included in the request.
- *
- * @version $Rev$ $Date$
- */
-public class DefaultLocaleResolver implements LocaleResolver {
-
-    /**
-     * The attribute name that is used to store the current locale.
-     */
-    public static final String LOCALE_KEY = "org.apache.tiles.LOCALE";
-
-    /** {@inheritDoc} */
-    public Locale resolveLocale(Request request) {
-        Locale retValue = null;
-        Map<String, Object> session = request.getContext("session");
-        if (session != null) {
-            retValue = (Locale) session.get(DefaultLocaleResolver.LOCALE_KEY);
-        }
-        if (retValue == null) {
-            retValue = request.getRequestLocale();
-        }
-
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/package-info.java
deleted file mode 100644
index 8005c7b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/impl/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Basic implementation of the locale resolver.
- */
-package org.apache.tiles.locale.impl;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/package-info.java
deleted file mode 100644
index b9225e7..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/locale/package-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes and interfaces to allow locale resolution in an application, i.e. it
- * allows to specify how to access the locale that the user wants to use.
- */
-package org.apache.tiles.locale;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/BasicPreparerFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/BasicPreparerFactory.java
deleted file mode 100644
index c9d46cd..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/BasicPreparerFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer.factory;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Default implementation of the {@link PreparerFactory}.
- * This factory provides no contextual configuration.  It
- * simply instantiates the named preparerInstance and returns it.
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public class BasicPreparerFactory implements PreparerFactory {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(BasicPreparerFactory.class);
-
-    /**
-     * Maps a preparer name to the instantiated preparer.
-     */
-    protected Map<String, ViewPreparer> preparers;
-
-    /**
-     * Constructor.
-     */
-    public BasicPreparerFactory() {
-        this.preparers = new HashMap<String, ViewPreparer>();
-    }
-
-
-    /**
-     * Create a new instance of the named preparerInstance.  This factory
-     * expects all names to be qualified class names.
-     *
-     * @param name    the named preparerInstance
-     * @param context current context
-     * @return ViewPreparer instance
-     */
-    public ViewPreparer getPreparer(String name, Request context) {
-
-        if (!preparers.containsKey(name)) {
-            preparers.put(name, createPreparer(name));
-        }
-
-        return preparers.get(name);
-    }
-
-    /**
-     * Creates a view preparer for the given name.
-     *
-     * @param name The name of the preparer.
-     * @return The created preparer.
-     */
-    protected ViewPreparer createPreparer(String name) {
-
-        log.debug("Creating ViewPreparer '{}' . . .", name);
-
-        Object instance = ClassUtil.instantiate(name, true);
-        log.debug("ViewPreparer created successfully");
-        return (ViewPreparer) instance;
-
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/NoSuchPreparerException.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/NoSuchPreparerException.java
deleted file mode 100644
index ed57cd3..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/NoSuchPreparerException.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer.factory;
-
-import org.apache.tiles.preparer.PreparerException;
-
-/**
- * Thrown when the named preparerInstance can not be found.
- *
- * @since 2.0
- * @version $Rev$ $Date$
- */
-public class NoSuchPreparerException extends PreparerException {
-
-    /**
-     * Constructor.
-     */
-    public NoSuchPreparerException() {
-        super();
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to include.
-     */
-    public NoSuchPreparerException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The cause exception.
-     */
-    public NoSuchPreparerException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message to include.
-     * @param e The cause exception.
-     */
-    public NoSuchPreparerException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/PreparerFactory.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/PreparerFactory.java
deleted file mode 100644
index 2575d7e..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/PreparerFactory.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer.factory;
-
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * Factory interface used to create/retrieve instances of
- * the {@link ViewPreparer} interface.
- * <p/>
- *
- * <p>
- * This factory provides an extension point into the default
- * tiles implementation. Implementors wishing to provide
- * per request initialization of the ViewPreparer (for instance)
- * may provide a custom prerparer.
- * </p>
- *
- * @since 2.0
- *
- * @version $Rev$ $Date$
- */
-public interface PreparerFactory {
-
-    /**
-     * Create the named {link ViewPreparer} for the specified context.
-     *
-     * @param name    ViewPreparer name, commonly the qualified classname.
-     * @param context the context within which the preparerInstance will be invoked.
-     * @return instance of the ViewPreparer
-     */
-    ViewPreparer getPreparer(String name, Request context);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/package-info.java
deleted file mode 100644
index ea80abe..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/preparer/factory/package-info.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * "View preparers" are objects that allows the "preparation" of a Tiles artifact
- * (definition, template or attribute) before it is rendered.<br>
- * It is useful, for example, when a view item should be built and stored in a
- * particular context (e.g. a menu) and then rendered.
- */
-package org.apache.tiles.preparer.factory;
-
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/DefinitionRenderer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/DefinitionRenderer.java
deleted file mode 100644
index 84a7943..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/DefinitionRenderer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.renderer;
-
-import java.io.IOException;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.CannotRenderException;
-import org.apache.tiles.request.render.Renderer;
-
-/**
- * Renders an attribute that contains a reference to a definition.
- *
- * @version $Rev$ $Date$
- * @since 3.0.0
- */
-public class DefinitionRenderer implements Renderer {
-
-    /**
-     * The Tiles container.
-     */
-    private TilesContainer container;
-
-    /**
-     * Constructor.
-     *
-     * @param container The Tiles container.
-     */
-    public DefinitionRenderer(TilesContainer container) {
-        this.container = container;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void render(String path, Request request) throws IOException {
-        if (path == null) {
-            throw new CannotRenderException("Cannot dispatch a null path");
-        }
-
-        container.render(path, request);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isRenderable(String path, Request request) {
-        return path != null && container.isValidDefinition(path, request);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/package-info.java
deleted file mode 100644
index 8e58cfd..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/renderer/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Interfaces to manage attribute rendering.
- */
-package org.apache.tiles.renderer;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java
deleted file mode 100644
index 5d8fc7a..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/AbstractTilesInitializer.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.startup;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.request.ApplicationContext;
-
-/**
- * Default Tiles initialization delegate implementation under a servlet
- * environment. It uses init parameters to create the
- * {@link ApplicationContext} and the {@link TilesContainer}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public abstract class AbstractTilesInitializer implements TilesInitializer {
-
-    /**
-     * Init parameter to define the key under which the container will be
-     * stored.
-     *
-     * @since 2.1.2
-     */
-    public static final String CONTAINER_KEY_INIT_PARAMETER =
-        "org.apache.tiles.startup.AbstractTilesInitializer.CONTAINER_KEY";
-
-    /**
-     * The initialized application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The initialized container.
-     */
-    private TilesContainer container;
-
-    /** {@inheritDoc} */
-    public void initialize(ApplicationContext applicationContext) {
-        this.applicationContext = createTilesApplicationContext(applicationContext);
-        ApplicationAccess.register(applicationContext);
-        String key = getContainerKey(this.applicationContext);
-        container = createContainer(this.applicationContext);
-        TilesAccess.setContainer(this.applicationContext, container, key);
-    }
-
-    /** {@inheritDoc} */
-    public void destroy() {
-        TilesAccess.setContainer(applicationContext, null,
-                getContainerKey(applicationContext));
-    }
-
-    /**
-     * Creates the Tiles application context, to be used across all the
-     * Tiles-based application. If you override this class, please override this
-     * method or
-     * {@link #createAndInitializeTilesApplicationContextFactory(ApplicationContext)}
-     * .<br>
-     * This implementation returns the preliminary context passed as a parameter
-     *
-     * @param preliminaryContext The preliminary application context to use.
-     * @return The Tiles application context.
-     * @since 2.2.0
-     */
-    protected ApplicationContext createTilesApplicationContext(
-            ApplicationContext preliminaryContext) {
-        return preliminaryContext;
-    }
-
-    /**
-     * Returns the container key under which the container will be stored.
-     * This implementation returns <code>null</code> so that the container will
-     * be the default one.
-     *
-     * @param applicationContext The Tiles application context to use.
-     * @return The container key.
-     * @since 2.2.0
-     */
-    protected String getContainerKey(ApplicationContext applicationContext) {
-        return null;
-    }
-
-    /**
-     * Creates a Tiles container. If you override this class, please override
-     * this method or {@link #createContainerFactory(ApplicationContext)}.
-     *
-     * @param context The servlet context to use.
-     * @return The created container.
-     * @since 2.2.0
-     */
-    protected TilesContainer createContainer(ApplicationContext context) {
-        AbstractTilesContainerFactory factory = createContainerFactory(context);
-        return factory.createContainer(context);
-    }
-
-    /**
-     * Creates a Tiles container factory. If you override this class, please
-     * override this method or {@link #createContainer(ApplicationContext)}.
-     *
-     * @param context The servlet context to use.
-     * @return The created container factory.
-     * @since 2.2.0
-     */
-    protected abstract AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context);
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/DefaultTilesInitializer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/DefaultTilesInitializer.java
deleted file mode 100644
index c0f3796..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/DefaultTilesInitializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.startup;
-
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.factory.BasicTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-
-/**
- * Loads Tiles with the default settings.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class DefaultTilesInitializer extends AbstractTilesInitializer {
-
-    /** {@inheritDoc} */
-    @Override
-    protected AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context) {
-        return new BasicTilesContainerFactory();
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/TilesInitializer.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/TilesInitializer.java
deleted file mode 100644
index 539f9a9..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/TilesInitializer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.startup;
-
-import org.apache.tiles.request.ApplicationContext;
-
-/**
- * Tiles initialization delegate. It initializes Tiles container(s) and the
- * application context to use across all the application.
- *
- * @version $Rev$ $Date$
- */
-public interface TilesInitializer {
-
-    /**
-     * Initializes Tiles.
-     *
-     * @param preliminaryContext The preliminary application context to use. It
-     * will be overwritten with the real instance later. Use a context usable
-     * under your current environment, like ServletTilesApplicationContext or
-     * PortletTilesApplicationContext.
-     */
-    void initialize(ApplicationContext preliminaryContext);
-
-    /**
-     * Destroys the Tiles container.
-     *
-     * @since 2.2.0
-     */
-    void destroy();
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/package-info.java
deleted file mode 100644
index f102e1b..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/startup/package-info.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes to start the Tiles engine up. Use these classes in your environment by
- * using a preliminary TilesApplicationContext that expose at least the needed
- * initialization parameters.
- */
-package org.apache.tiles.startup;
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/CombinedBeanInfo.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/CombinedBeanInfo.java
deleted file mode 100644
index 4a962e4..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/CombinedBeanInfo.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.util;
-
-import java.beans.FeatureDescriptor;
-import java.beans.PropertyDescriptor;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.request.reflect.ClassUtil;
-
-/**
- * Contains the bean infos about one or more classes.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class CombinedBeanInfo {
-    /**
-     * The descriptors of the introspected classes.
-     */
-    private List<FeatureDescriptor> descriptors;
-
-    /**
-     * Maps analyzed classes to the map of introspected properties.
-     */
-    private Map<Class<?>, Map<String, PropertyDescriptor>> class2descriptors;
-
-    /**
-     * Constructor.
-     * @param clazzes The list of classes to analyze and combine.
-     *
-     * @since 2.2.0
-     */
-    public CombinedBeanInfo(Class<?>... clazzes) {
-        descriptors = new ArrayList<FeatureDescriptor>();
-        class2descriptors = new LinkedHashMap<Class<?>, Map<String, PropertyDescriptor>>();
-        for (int i = 0; i < clazzes.length; i++) {
-            Class<?> clazz = clazzes[i];
-            Map<String, PropertyDescriptor> mappedDescriptors = new LinkedHashMap<String, PropertyDescriptor>();
-            ClassUtil.collectBeanInfo(clazz, mappedDescriptors);
-            descriptors.addAll(mappedDescriptors.values());
-            class2descriptors.put(clazz, mappedDescriptors);
-        }
-    }
-
-    /**
-     * Returns the descriptors of all the introspected classes.
-     *
-     * @return The feature descriptors.
-     * @since 2.2.0
-     */
-    public List<FeatureDescriptor> getDescriptors() {
-        return descriptors;
-    }
-
-    /**
-     * Returns a map of the introspected properties for the given class.
-     *
-     * @param clazz The class to get the properties from.
-     * @return The map of property descriptors.
-     * @since 2.2.0
-     */
-    public Map<String, PropertyDescriptor> getMappedDescriptors(Class<?> clazz) {
-        return class2descriptors.get(clazz);
-    }
-
-    /**
-     * Returns the set of properties for the given introspected class.
-     *
-     * @param clazz The class to get the properties from.
-     * @return The set of properties.
-     * @since 2.2.0
-     */
-    public Set<String> getProperties(Class<?> clazz) {
-        return class2descriptors.get(clazz).keySet();
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/WildcardHelper.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/WildcardHelper.java
deleted file mode 100644
index b6359c6..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/WildcardHelper.java
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.util;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class is an utility class that perform wilcard-patterns matching and
- * isolation taken from Apache Struts that is taken, in turn, from Apache
- * Struts.
- *
- * @version $Rev$ $Date$
- * @since 2.1.0
- */
-public class WildcardHelper {
-    /**
-     * The int representing '*' in the pattern <code>int []</code>.
-     *
-     * @since 2.1.0
-     */
-    protected static final int MATCH_FILE = -1;
-
-    /**
-     * The int representing '**' in the pattern <code>int []</code>.
-     *
-     * @since 2.1.0
-     */
-    protected static final int MATCH_PATH = -2;
-
-    /**
-     * The int representing begin in the pattern <code>int []</code>.
-     *
-     * @since 2.1.0
-     */
-    protected static final int MATCH_BEGIN = -4;
-
-    /**
-     * The int representing end in pattern <code>int []</code>.
-     *
-     * @since 2.1.0
-     */
-    protected static final int MATCH_THEEND = -5;
-
-    /**
-     * The int value that terminates the pattern <code>int []</code>.
-     *
-     * @since 2.1.0
-     */
-    protected static final int MATCH_END = -3;
-
-    /**
-     * The length of the placeholder.
-     *
-     * @since 2.1.0
-     */
-    private static final int PLACEHOLDER_LENGTH = 3;
-
-    /**
-     * <p>
-     * Translate the given <code>String</code> into a <code>int []</code>
-     * representing the pattern matchable by this class. <br>
-     * This function translates a <code>String</code> into an int array
-     * converting the special '*' and '\' characters. <br>
-     * Here is how the conversion algorithm works:
-     * </p>
-     *
-     * <ul>
-     *
-     * <li>The '*' character is converted to MATCH_FILE, meaning that zero or
-     * more characters (excluding the path separator '/') are to be matched.</li>
-     *
-     * <li>The '**' sequence is converted to MATCH_PATH, meaning that zero or
-     * more characters (including the path separator '/') are to be matched.</li>
-     *
-     * <li>The '\' character is used as an escape sequence ('\*' is translated
-     * in '*', not in MATCH_FILE). If an exact '\' character is to be matched
-     * the source string must contain a '\\'. sequence.</li>
-     *
-     * </ul>
-     *
-     * <p>
-     * When more than two '*' characters, not separated by another character,
-     * are found their value is considered as '**' (MATCH_PATH). <br>
-     * The array is always terminated by a special value (MATCH_END). <br>
-     * All MATCH* values are less than zero, while normal characters are equal
-     * or greater.
-     * </p>
-     *
-     * @param data The string to translate.
-     * @return The encoded string as an int array, terminated by the MATCH_END
-     * value (don't consider the array length).
-     * @throws NullPointerException If data is null.
-     * @since 2.1.0
-     */
-    public int[] compilePattern(String data) {
-        // Prepare the arrays
-        int[] expr = new int[data.length() + 2];
-        char[] buff = data.toCharArray();
-
-        // Prepare variables for the translation loop
-        int y = 0;
-        boolean slash = false;
-
-        // Must start from beginning
-        expr[y++] = MATCH_BEGIN;
-
-        if (buff.length > 0) {
-            if (buff[0] == '\\') {
-                slash = true;
-            } else if (buff[0] == '*') {
-                expr[y++] = MATCH_FILE;
-            } else {
-                expr[y++] = buff[0];
-            }
-
-            // Main translation loop
-            for (int x = 1; x < buff.length; x++) {
-                // If the previous char was '\' simply copy this char.
-                if (slash) {
-                    expr[y++] = buff[x];
-                    slash = false;
-
-                    // If the previous char was not '\' we have to do a bunch of
-                    // checks
-                } else {
-                    // If this char is '\' declare that and continue
-                    if (buff[x] == '\\') {
-                        slash = true;
-
-                        // If this char is '*' check the previous one
-                    } else if (buff[x] == '*') {
-                        // If the previous character als was '*' match a path
-                        if (expr[y - 1] <= MATCH_FILE) {
-                            expr[y - 1] = MATCH_PATH;
-                        } else {
-                            expr[y++] = MATCH_FILE;
-                        }
-                    } else {
-                        expr[y++] = buff[x];
-                    }
-                }
-            }
-        }
-
-        // Must match end at the end
-        expr[y] = MATCH_THEEND;
-
-        return expr;
-    }
-
-    /**
-     * Match a pattern agains a string and isolates wildcard replacement into a
-     * <code>Stack</code>.
-     *
-     * @param data The string to match
-     * @param expr The compiled wildcard expression
-     * @return The list of matched variables, or <code>null</code> if it does not match.
-     * @throws NullPointerException If any parameters are null
-     * @since 2.2.0
-     */
-    public List<String> match(String data, int[] expr) {
-        List<String> varsValues = null;
-
-        if (data == null) {
-            throw new NullPointerException("No data provided");
-        }
-
-        if (expr == null) {
-            throw new NullPointerException("No pattern expression provided");
-        }
-
-        char[] buff = data.toCharArray();
-
-        // Allocate the result buffer
-        char[] rslt = new char[expr.length + buff.length];
-
-        // The previous and current position of the expression character
-        // (MATCH_*)
-        int charpos = 0;
-
-        // The position in the expression, input, translation and result arrays
-        int exprpos = 0;
-        int buffpos = 0;
-        int rsltpos = 0;
-        int offset = -1;
-
-        // First check for MATCH_BEGIN
-        boolean matchBegin = false;
-
-        if (expr[charpos] == MATCH_BEGIN) {
-            matchBegin = true;
-            exprpos = ++charpos;
-        }
-
-        // Search the fist expression character (except MATCH_BEGIN - already
-        // skipped)
-        while (expr[charpos] >= 0) {
-            charpos++;
-        }
-
-        // The expression charater (MATCH_*)
-        int exprchr = expr[charpos];
-
-        while (true) {
-            // Check if the data in the expression array before the current
-            // expression character matches the data in the input buffer
-            if (matchBegin) {
-                if (!matchArray(expr, exprpos, charpos, buff, buffpos)) {
-                    return null;
-                }
-
-                matchBegin = false;
-            } else {
-                offset = indexOfArray(expr, exprpos, charpos, buff, buffpos);
-
-                if (offset < 0) {
-                    return null;
-                }
-            }
-
-            // Check for MATCH_BEGIN
-            if (matchBegin) {
-                if (offset != 0) {
-                    return null;
-                }
-
-                matchBegin = false;
-            }
-
-            // Advance buffpos
-            buffpos += (charpos - exprpos);
-
-            // Check for END's
-            if (exprchr == MATCH_END) {
-                if (rsltpos > 0) {
-                    varsValues = addAndCreateList(varsValues, new String(rslt,
-                            0, rsltpos));
-                }
-
-                // Don't care about rest of input buffer
-                varsValues = addElementOnTop(varsValues, data);
-                return varsValues;
-            } else if (exprchr == MATCH_THEEND) {
-                if (rsltpos > 0) {
-                    varsValues = addAndCreateList(varsValues, new String(rslt,
-                            0, rsltpos));
-                }
-
-                // Check that we reach buffer's end
-                if (buffpos == buff.length) {
-                    addElementOnTop(varsValues, data);
-                    return varsValues;
-                }
-                return null;
-            }
-
-            // Search the next expression character
-            exprpos = ++charpos;
-
-            while (expr[charpos] >= 0) {
-                charpos++;
-            }
-
-            int prevchr = exprchr;
-
-            exprchr = expr[charpos];
-
-            // We have here prevchr == * or **.
-            offset = (prevchr == MATCH_FILE) ? indexOfArray(expr, exprpos,
-                    charpos, buff, buffpos) : lastIndexOfArray(expr, exprpos,
-                    charpos, buff, buffpos);
-
-            if (offset < 0) {
-                return null;
-            }
-
-            // Copy the data from the source buffer into the result buffer
-            // to substitute the expression character
-            if (prevchr == MATCH_PATH) {
-                while (buffpos < offset) {
-                    rslt[rsltpos++] = buff[buffpos++];
-                }
-            } else {
-                // Matching file, don't copy '/'
-                while (buffpos < offset) {
-                    if (buff[buffpos] == '/') {
-                        return null;
-                    }
-
-                    rslt[rsltpos++] = buff[buffpos++];
-                }
-            }
-
-            varsValues = addAndCreateList(varsValues, new String(rslt, 0,
-                    rsltpos));
-            rsltpos = 0;
-        }
-    }
-
-    /**
-     * Get the offset of a part of an int array within a char array. <br>
-     * This method return the index in d of the first occurrence after dpos of
-     * that part of array specified by r, starting at rpos and terminating at
-     * rend.
-     *
-     * @param r The array containing the data that need to be matched in d.
-     * @param rpos The index of the first character in r to look for.
-     * @param rend The index of the last character in r to look for plus 1.
-     * @param d The array of char that should contain a part of r.
-     * @param dpos The starting offset in d for the matching.
-     * @return The offset in d of the part of r matched in d or -1 if that was
-     * not found.
-     * @since 2.1.0
-     */
-    protected int indexOfArray(int[] r, int rpos, int rend, char[] d, int dpos) {
-        // Check if pos and len are legal
-        if (rend < rpos) {
-            throw new IllegalArgumentException("rend < rpos");
-        }
-
-        // If we need to match a zero length string return current dpos
-        if (rend == rpos) {
-            return (d.length); // ?? dpos?
-        }
-
-        // If we need to match a 1 char length string do it simply
-        if ((rend - rpos) == 1) {
-            // Search for the specified character
-            for (int x = dpos; x < d.length; x++) {
-                if (r[rpos] == d[x]) {
-                    return (x);
-                }
-            }
-        }
-
-        // Main string matching loop. It gets executed if the characters to
-        // match are less then the characters left in the d buffer
-        while (((dpos + rend) - rpos) <= d.length) {
-            // Set current startpoint in d
-            int y = dpos;
-
-            // Check every character in d for equity. If the string is matched
-            // return dpos
-            for (int x = rpos; x <= rend; x++) {
-                if (x == rend) {
-                    return (dpos);
-                }
-
-                if (r[x] != d[y++]) {
-                    break;
-                }
-            }
-
-            // Increase dpos to search for the same string at next offset
-            dpos++;
-        }
-
-        // The remaining chars in d buffer were not enough or the string
-        // wasn't matched
-        return (-1);
-    }
-
-    /**
-     * Get the offset of a last occurance of an int array within a char array.
-     * <br>
-     * This method return the index in d of the last occurrence after dpos of
-     * that part of array specified by r, starting at rpos and terminating at
-     * rend.
-     *
-     * @param r The array containing the data that need to be matched in d.
-     * @param rpos The index of the first character in r to look for.
-     * @param rend The index of the last character in r to look for plus 1.
-     * @param d The array of char that should contain a part of r.
-     * @param dpos The starting offset in d for the matching.
-     * @return The offset in d of the last part of r matched in d or -1 if that
-     * was not found.
-     * @since 2.1.0
-     */
-    protected int lastIndexOfArray(int[] r, int rpos, int rend, char[] d,
-            int dpos) {
-        // Check if pos and len are legal
-        if (rend < rpos) {
-            throw new IllegalArgumentException("rend < rpos");
-        }
-
-        // If we need to match a zero length string return current dpos
-        if (rend == rpos) {
-            return (d.length); // ?? dpos?
-        }
-
-        // If we need to match a 1 char length string do it simply
-        if ((rend - rpos) == 1) {
-            // Search for the specified character
-            for (int x = d.length - 1; x > dpos; x--) {
-                if (r[rpos] == d[x]) {
-                    return (x);
-                }
-            }
-        }
-
-        // Main string matching loop. It gets executed if the characters to
-        // match are less then the characters left in the d buffer
-        int l = d.length - (rend - rpos);
-
-        while (l >= dpos) {
-            // Set current startpoint in d
-            int y = l;
-
-            // Check every character in d for equity. If the string is matched
-            // return dpos
-            for (int x = rpos; x <= rend; x++) {
-                if (x == rend) {
-                    return (l);
-                }
-
-                if (r[x] != d[y++]) {
-                    break;
-                }
-            }
-
-            // Decrease l to search for the same string at next offset
-            l--;
-        }
-
-        // The remaining chars in d buffer were not enough or the string
-        // wasn't matched
-        return (-1);
-    }
-
-    /**
-     * Matches elements of array r from rpos to rend with array d, starting from
-     * dpos. <br>
-     * This method return true if elements of array r from rpos to rend equals
-     * elements of array d starting from dpos to dpos+(rend-rpos).
-     *
-     * @param r The array containing the data that need to be matched in d.
-     * @param rpos The index of the first character in r to look for.
-     * @param rend The index of the last character in r to look for.
-     * @param d The array of char that should start from a part of r.
-     * @param dpos The starting offset in d for the matching.
-     * @return true if array d starts from portion of array r.
-     * @since 2.1.0
-     */
-    protected boolean matchArray(int[] r, int rpos, int rend, char[] d, int dpos) {
-        if ((d.length - dpos) < (rend - rpos)) {
-            return (false);
-        }
-
-        for (int i = rpos; i < rend; i++) {
-            if (r[i] != d[dpos++]) {
-                return (false);
-            }
-        }
-
-        return (true);
-    }
-
-    /**
-     * <p>
-     * Inserts into a value wildcard-matched strings where specified.
-     * </p>
-     *
-     * @param val The value to convert
-     * @param vars A Map of wildcard-matched strings
-     * @return The new value
-     * @since 2.1.0
-     */
-    public static String convertParam(String val, Map<Integer, String> vars) {
-        if (val == null) {
-            return null;
-        } else if (val.indexOf("{") == -1) {
-            return val;
-        }
-
-        Map.Entry<Integer, String> entry;
-        StringBuffer key = new StringBuffer("{0}");
-        StringBuffer ret = new StringBuffer(val);
-        String keyTmp;
-        int x;
-
-        for (Iterator<Map.Entry<Integer, String>> i = vars.entrySet()
-                .iterator(); i.hasNext();) {
-            entry = i.next();
-            key.setCharAt(1, entry.getKey().toString().charAt(0));
-            keyTmp = key.toString();
-
-            // Replace all instances of the placeholder
-            while ((x = ret.toString().indexOf(keyTmp)) > -1) {
-                ret.replace(x, x + PLACEHOLDER_LENGTH, entry.getValue());
-            }
-        }
-
-        return ret.toString();
-    }
-
-    /**
-     * Adds and object to a list. If the list is null, it creates it.
-     *
-     * @param <T> The type of the element.
-     * @param list The list.
-     * @param data The data to add.
-     * @return The list itself, or a new one if it is <code>null</code>.
-     */
-    private <T> List<T> addAndCreateList(List<T> list, T data) {
-        if (list == null) {
-            list = new ArrayList<T>();
-        }
-        list.add(data);
-        return list;
-    }
-
-    /**
-     * Adds and object on top of a list. If the list is null, it creates it.
-     *
-     * @param <T> The type of the element.
-     * @param list The list.
-     * @param data The data to add.
-     * @return The list itself, or a new one if it is <code>null</code>.
-     */
-    private <T> List<T> addElementOnTop(List<T> list, T data) {
-        if (list == null) {
-            list = new ArrayList<T>();
-        }
-        list.add(0, data);
-        return list;
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/package-info.java b/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/package-info.java
deleted file mode 100644
index 2854d44..0000000
--- a/TILES_3_0_X/tiles-core/src/main/java/org/apache/tiles/util/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Static utility classes used throughout the implementation.
- */
-package org.apache.tiles.util;
diff --git a/TILES_3_0_X/tiles-core/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-core/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-core/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-core/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-core/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-core/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_3_0.dtd b/TILES_3_0_X/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_3_0.dtd
deleted file mode 100644
index b8d3dd8..0000000
--- a/TILES_3_0_X/tiles-core/src/main/resources/org/apache/tiles/resources/tiles-config_3_0.dtd
+++ /dev/null
@@ -1,246 +0,0 @@
-<!--
-%
-   $Id$
-
-   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.
-
-%
-
-@hidden $Id$
-@title DTD for the Tiles Definition File, Version 3.0
-@doctype tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"
-@root tiles-definitions
--->
-
-
-<!-- ========== Defined Types ============================================= -->
-
-
-<!-- A "Boolean" is the string representation of a boolean (true or false)
-     variable.
--->
-<!ENTITY % Boolean "(true|false)">
-
-
-<!-- A "ContentType" is the content type of an attribute passed to a template.
--->
-<!ENTITY % ContentType "CDATA">
-
-<!-- A "ClassName" is the fully qualified name of a Java class that is
-     instantiated to provide the functionality of the enclosing element.
--->
-<!ENTITY % ClassName "CDATA">
-
-<!-- A "RequestPath" is an module-relative URI path, beginning with a
-     slash, that identifies a mapped resource (such as a JSP page or a servlet)
-     within this web application.
--->
-<!ENTITY % RequestPath "CDATA">
-
-<!-- A "DefinitionName" is the unique identifier of a definition. This identifier
-     is a logical name used to reference the definition.
--->
-<!ENTITY % DefinitionName "CDATA">
-
-<!-- A "Location" is a relative path, delimited by "/" characters, that
-     defines the location of a resource relative to the location of the
-     configuration file itself.
--->
-<!ENTITY % Location "#PCDATA">
-
-
-
-<!-- ========== Top Level Elements ======================================== -->
-
-
-<!-- The "tiles-definitions" element is the root of the configuration file
-     hierarchy, and contains nested elements for all of the other
-     configuration settings.
--->
-<!ELEMENT tiles-definitions (definition+)>
-
-<!-- The "definition" element describes a definition that can be inserted in a jsp
-     page. This definition is identified by its logical name. A definition allows
-     to define all the attributes that can be set in <insert> tag from a jsp page.
--->
-<!ELEMENT definition (put-attribute*, put-list-attribute*)>
-<!ATTLIST definition       id               ID               #IMPLIED>
-<!--
-@attr preparer       The fully qualified Java class name of the preparer
-                     subclass to call immediately before the tiles is inserted.
-                     Only one of preparerClass or preparerUrl should be
-                     specified.
--->
-<!ATTLIST definition       preparer         %ClassName;      #IMPLIED>
-<!--
-@attr extends        Name of a definition that is used as ancestor of this definition.
-                     All attributes from the ancestor are available to the new
-                     definition. Any attribute inherited from the ancestor can
-                     be overloaded by providing a new value.
--->
-<!ATTLIST definition       extends          %DefinitionName; #IMPLIED>
-<!--
-@attr name           The unique identifier for this definition. Required when
-                     it is a root definition, while it is implied in nested
-                     definitions.
--->
-<!ATTLIST definition       name             %DefinitionName; #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this definition
-                     object. The definition is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST definition       role             CDATA            #IMPLIED>
-<!--
-@attr template       The context-relative path to the resource used as tiles to
-                     insert. This tiles will be inserted and a tiles context
-                     containing appropriate attributes will be available.
--->
-<!ATTLIST definition       template         %RequestPath;    #IMPLIED>
-<!--
-@attr templateExpression The expression that will evaluate to a template for this definition.
-               This attribute will be ignored if template is specified.
-
--->
-<!ATTLIST definition       templateExpression       CDATA    #IMPLIED>
-<!--
-@attr templateType   The type of the template attribute. Can be: string,
-           template or definition.
-                     By default, the type is "template". If a type is
-                     associated, the desidered renderer will be invoked.
--->
-<!ATTLIST definition       templateType             %ContentType;   #IMPLIED>
-
-<!-- The "put-attribute" element describes an attribute of a definition. It allows to
-     specify the tiles attribute name and its value. The tiles value can be
-     specified as an xml attribute, or in the body of the <put-attribute> tag.
--->
-<!ELEMENT put-attribute ( (definition*) )>
-<!ATTLIST put-attribute     id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put-attribute.
--->
-<!ATTLIST put-attribute     name             CDATA           #REQUIRED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST put-attribute     type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST put-attribute     value            CDATA           #IMPLIED>
-<!--
-@attr expression     The expression associated to this tiles attribute. This
-           attribute will be ignored if value is specified.
-
--->
-<!ATTLIST put-attribute     expression       CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-attribute     role             CDATA            #IMPLIED>
-<!--
-@attr cascade        If true, the attribute will be cascaded to all inner
-                     definitions. By default, cascade is false.
--->
-<!ATTLIST put-attribute     cascade          %Boolean;    #IMPLIED>
-
-
-<!-- The "put-list-attribute" element describes a list attribute of a definition. It allows to
-     specify an attribute that is a java List containing any kind of values. In
-     the config file, the list elements are specified by nested <add-attribute> or
-     <add-list-attribute>.
--->
-<!ELEMENT put-list-attribute ( (add-attribute* | add-list-attribute*)+) >
-<!ATTLIST put-list-attribute id               ID              #IMPLIED>
-<!--
-@attr name           The unique identifier for this put attribute list.
--->
-<!ATTLIST put-list-attribute name             CDATA           #REQUIRED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute is inserted only if the role name is
-                     allowed.
--->
-<!ATTLIST put-list-attribute role             CDATA            #IMPLIED>
-<!--
-@attr inherit        If true, the attribute will put the elements of the attribute
-                     with the same name of the parent definition before the ones
-                     specified here. By default, it is 'false'.
--->
-<!ATTLIST put-list-attribute inherit          %Boolean;        #IMPLIED>
-<!--
-@attr cascade        If true, the attribute will be cascaded to all inner
-                     definitions. By default, cascade is false.
--->
-<!ATTLIST put-list-attribute cascade          %Boolean;        #IMPLIED>
-
-<!-- ========== Subordinate Elements ====================================== -->
-
-
-<!-- The "add-attribute" element describes an element of a list. It is similar to the
-     <put> element.
--->
-<!ELEMENT add-attribute ( (definition*) )>
-<!ATTLIST add-attribute              id               ID              #IMPLIED>
-<!--
-@attr type           The type of the value. Can be: string, template or definition.
-                     By default, no type is associated to a value. If a type is
-                     associated, it will be used as a hint to process the value
-                     when the attribute will be used in the inserted tiles.
--->
-<!ATTLIST add-attribute              type             %ContentType;   #IMPLIED>
-<!--
-@attr value          The value associated to this tiles attribute. The value should
-                     be specified with this tag attribute, or in the body of the tag.
--->
-<!ATTLIST add-attribute              value            CDATA           #IMPLIED>
-<!--
-@attr expression     The expression associated to this tiles attribute. This
-           attribute will be ignored if value is specified.
-
--->
-<!ATTLIST add-attribute              expression       CDATA           #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-attribute              role             CDATA            #IMPLIED>
-
-<!-- The "add-list-attribute" element describes a list attribute subordinate to another
-     list attribute. It allows to specify an attribute value that is a java List
-     containing any kind of values. In the config file, the list elements are specified
-     by nested <add-attribute> or <add-list-attribute>.
--->
-<!ELEMENT add-list-attribute ( (add-attribute* | add-list-attribute*)+) >
-<!ATTLIST add-list-attribute id               ID              #IMPLIED>
-<!--
-@attr role           Security role name that is allowed access to this attribute
-                     object. The attribute will be added to the parent list
-                     anyway. It is delegated to the user of this attribute to
-                     use it or not depending on the role of the user.
--->
-<!ATTLIST add-list-attribute role             CDATA            #IMPLIED>
diff --git a/TILES_3_0_X/tiles-core/src/site/site.xml b/TILES_3_0_X/tiles-core/src/site/site.xml
deleted file mode 100644
index 7f5d6c6..0000000
--- a/TILES_3_0_X/tiles-core/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Core Library">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/context/TilesRequestContextHolderTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/context/TilesRequestContextHolderTest.java
deleted file mode 100644
index 7547f0d..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/context/TilesRequestContextHolderTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.context;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesRequestContextHolderTest}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesRequestContextHolderTest {
-
-    /**
-     * Test method for {@link TilesRequestContextHolder#setTilesRequestContext(Request)}.
-     */
-    @Test
-    public void testSetTilesRequestContext() {
-        Request request = createMock(Request.class);
-
-        replay(request);
-        TilesRequestContextHolder holder = new TilesRequestContextHolder();
-        holder.setTilesRequestContext(request);
-        assertSame(request, holder.getTilesRequestContext());
-        verify(request);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/DefinitionsFactoryExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/DefinitionsFactoryExceptionTest.java
deleted file mode 100644
index fbd48c2..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/DefinitionsFactoryExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link DefinitionsFactoryException}.
- *
- * @version $Rev$ $Date$
- */
-public class DefinitionsFactoryExceptionTest {
-
-    /**
-     * Test method for {@link DefinitionsFactoryException#DefinitionsFactoryException()}.
-     */
-    @Test
-    public void testDefinitionsFactoryException() {
-        DefinitionsFactoryException exception = new DefinitionsFactoryException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DefinitionsFactoryException#DefinitionsFactoryException(java.lang.String)}.
-     */
-    @Test
-    public void testDefinitionsFactoryExceptionString() {
-        DefinitionsFactoryException exception = new DefinitionsFactoryException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DefinitionsFactoryException#DefinitionsFactoryException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testDefinitionsFactoryExceptionThrowable() {
-        Throwable cause = new Throwable();
-        DefinitionsFactoryException exception = new DefinitionsFactoryException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DefinitionsFactoryException#DefinitionsFactoryException(String, Throwable)}.
-     */
-    @Test
-    public void testDefinitionsFactoryExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        DefinitionsFactoryException exception = new DefinitionsFactoryException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/FactoryNotFoundExceptitonTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/FactoryNotFoundExceptitonTest.java
deleted file mode 100644
index e774288..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/FactoryNotFoundExceptitonTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link FactoryNotFoundException}.
- *
- * @version $Rev$ $Date$
- */
-public class FactoryNotFoundExceptitonTest {
-
-    /**
-     * Test method for {@link FactoryNotFoundException#FactoryNotFoundException()}.
-     */
-    @Test
-    public void testFactoryNotFoundException() {
-        FactoryNotFoundException exception = new FactoryNotFoundException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link FactoryNotFoundException#FactoryNotFoundException(java.lang.String)}.
-     */
-    @Test
-    public void testFactoryNotFoundExceptionString() {
-        FactoryNotFoundException exception = new FactoryNotFoundException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link FactoryNotFoundException#FactoryNotFoundException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testFactoryNotFoundExceptionThrowable() {
-        Throwable cause = new Throwable();
-        FactoryNotFoundException exception = new FactoryNotFoundException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link FactoryNotFoundException#FactoryNotFoundException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testFactoryNotFoundExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        FactoryNotFoundException exception = new FactoryNotFoundException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/LocaleDefinitionsFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/LocaleDefinitionsFactoryTest.java
deleted file mode 100644
index f2bc63d..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/LocaleDefinitionsFactoryTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link LocaleDefinitionsFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class LocaleDefinitionsFactoryTest {
-
-    /**
-     * Test method for {@link LocaleDefinitionsFactory#getDefinition(String, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetDefinition() {
-        DefinitionDAO<Locale> dao = createMock(DefinitionDAO.class);
-        LocaleResolver localeResolver = createMock(LocaleResolver.class);
-        Request request = createMock(Request.class);
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/mytemplate.jsp");
-        Definition definition = new Definition("myDefinition", null, null);
-        definition.setExtends("anotherDefinition");
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("first", new Attribute("myValue"));
-        Definition anotherDefinition = new Definition("anotherDefinition", templateAttribute, attributes);
-        Locale locale = Locale.ITALY;
-
-        expect(localeResolver.resolveLocale(request)).andReturn(locale);
-        expect(dao.getDefinition("myDefinition", locale)).andReturn(definition);
-        expect(dao.getDefinition("anotherDefinition", locale)).andReturn(anotherDefinition);
-
-        LocaleDefinitionsFactory factory = new LocaleDefinitionsFactory();
-
-        replay(dao, localeResolver, request);
-        factory.setDefinitionDAO(dao);
-        factory.setLocaleResolver(localeResolver);
-        Definition realDefinition = new Definition(definition);
-        realDefinition.inherit(anotherDefinition);
-        assertEquals(realDefinition, factory.getDefinition("myDefinition", request));
-        verify(dao, localeResolver, request);
-    }
-
-    /**
-     * Test method for {@link LocaleDefinitionsFactory#getDefinition(String, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = NoSuchDefinitionException.class)
-    public void testGetDefinitionNoParent() {
-        DefinitionDAO<Locale> dao = createMock(DefinitionDAO.class);
-        LocaleResolver localeResolver = createMock(LocaleResolver.class);
-        Request request = createMock(Request.class);
-        Definition definition = new Definition("myDefinition", null, null);
-        definition.setExtends("anotherDefinition");
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("first", new Attribute("myValue"));
-        Locale locale = Locale.ITALY;
-
-        expect(localeResolver.resolveLocale(request)).andReturn(locale);
-        expect(dao.getDefinition("myDefinition", locale)).andReturn(definition);
-        expect(dao.getDefinition("anotherDefinition", locale)).andReturn(null);
-
-        LocaleDefinitionsFactory factory = new LocaleDefinitionsFactory();
-
-        replay(dao, localeResolver, request);
-        try {
-            factory.setDefinitionDAO(dao);
-            factory.setLocaleResolver(localeResolver);
-            factory.getDefinition("myDefinition", request);
-        } finally {
-            verify(dao, localeResolver, request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/MockDefinitionsReader.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/MockDefinitionsReader.java
deleted file mode 100644
index 6c91d7d..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/MockDefinitionsReader.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-
-/**
- * Mock Defintions Reader implementation.  Stubs out all functionality.
- *
- * @version $Rev$ $Date$
- */
-public class MockDefinitionsReader implements DefinitionsReader {
-
-    /**
-     * Hokey way to verify that this was created.
-     */
-    private static int instanceCount = 0;
-
-    /**
-     * Hokey way to verify that this class was created.
-     *
-     * @return The number of created instances.
-     */
-    public static int getInstanceCount() {
-        return instanceCount;
-    }
-
-    /** Creates a new instance of MockDefinitionsReader. */
-    public MockDefinitionsReader() {
-        instanceCount++;
-    }
-
-    /**
-     * Reads <code>{@link Definition}</code> objects from a source.
-     *
-     * Implementations should publish what type of source object is expected.
-     *
-     * @param source The source from which definitions will be read.
-     * @return a Map of <code>Definition</code> objects read from
-     *  the source.
-     * @throws org.apache.tiles.definition.DefinitionsFactoryException if the source is invalid or
-     *  an error occurs when reading definitions.
-     */
-    public Map<String, Definition> read(Object source) {
-        return new LinkedHashMap<String, Definition>();
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/NoSuchDefinitionExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/NoSuchDefinitionExceptionTest.java
deleted file mode 100644
index e2130d2..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/NoSuchDefinitionExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link NoSuchDefinitionException}.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchDefinitionExceptionTest {
-
-    /**
-     * Test method for {@link NoSuchDefinitionException#NoSuchDefinitionException()}.
-     */
-    @Test
-    public void testNoSuchDefinitionException() {
-        NoSuchDefinitionException exception = new NoSuchDefinitionException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchDefinitionException#NoSuchDefinitionException(java.lang.String)}.
-     */
-    @Test
-    public void testNoSuchDefinitionExceptionString() {
-        NoSuchDefinitionException exception = new NoSuchDefinitionException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchDefinitionException#NoSuchDefinitionException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testNoSuchDefinitionExceptionThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchDefinitionException exception = new NoSuchDefinitionException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchDefinitionException#NoSuchDefinitionException(String, Throwable)}.
-     */
-    @Test
-    public void testNoSuchDefinitionExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchDefinitionException exception = new NoSuchDefinitionException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactoryTest.java
deleted file mode 100644
index 918ac09..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/UnresolvingLocaleDefinitionsFactoryTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.Locale;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link UnresolvingLocaleDefinitionsFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class UnresolvingLocaleDefinitionsFactoryTest {
-
-    /**
-     * Test method for {@link UnresolvingLocaleDefinitionsFactory#getDefinition(String, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetDefinition() {
-        DefinitionDAO<Locale> dao = createMock(DefinitionDAO.class);
-        LocaleResolver localeResolver = createMock(LocaleResolver.class);
-        UnresolvingLocaleDefinitionsFactory factory = new UnresolvingLocaleDefinitionsFactory();
-        Request request = createMock(Request.class);
-        Definition definition = createMock(Definition.class);
-        Locale locale = Locale.ITALY;
-
-        expect(localeResolver.resolveLocale(request)).andReturn(locale);
-        expect(dao.getDefinition("myDefinition", locale)).andReturn(definition);
-
-        replay(dao, localeResolver, request, definition);
-        factory.setDefinitionDAO(dao);
-        factory.setLocaleResolver(localeResolver);
-        assertEquals(definition, factory.getDefinition("myDefinition", request));
-        verify(dao, localeResolver, request, definition);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAOTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAOTest.java
deleted file mode 100644
index 1c1d050..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/BaseLocaleUrlDefinitionDAOTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.definition.dao;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.RefreshMonitor;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.locale.PostfixedApplicationResource;
-import org.apache.tiles.request.locale.URLApplicationResource;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link BaseLocaleUrlDefinitionDAO}.
- *
- * @version $Rev$ $Date$
- */
-public class BaseLocaleUrlDefinitionDAOTest {
-
-    private static final class MutableApplicationResource extends PostfixedApplicationResource {
-        private long lastModified = System.currentTimeMillis();
-        private String xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n"
-                + "<!DOCTYPE tiles-definitions PUBLIC "
-                + "\"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN\" "
-                + "\"http://tiles.apache.org/dtds/tiles-config_3_0.dtd\">\n\n" + "<tiles-definitions>"
-                + "<definition name=\"rewrite.test\" template=\"/test.jsp\">"
-                + "<put-attribute name=\"testparm\" value=\"testval\"/>" + "</definition>" //
-                + "</tiles-definitions>";
-
-        private MutableApplicationResource(String localePath) {
-            super(localePath);
-        }
-
-        public void modify(String xml) {
-            lastModified = System.currentTimeMillis();
-            this.xml = xml;
-        }
-
-        @Override
-        public long getLastModified() {
-            return lastModified;
-        }
-
-        @Override
-        public InputStream getInputStream() throws IOException {
-
-            return new ByteArrayInputStream(xml.getBytes("ISO-8859-1"));
-        }
-    }
-
-    /**
-     * The time (in milliseconds) to wait to be sure that the system updates the
-     * modify date of a file.
-     */
-    private static final int SLEEP_MILLIS = 2000;
-
-    /**
-     * The dao to test.
-     */
-    private ApplicationContext applicationContext;
-
-    private BaseLocaleUrlDefinitionDAO dao;
-    private MutableApplicationResource resource;
-
-    /**
-     * Sets up the test.
-     * @throws IOException 
-     */
-    @Before
-    public void setUp() throws IOException {
-        resource = new MutableApplicationResource("org/apache/tiles/config/temp-defs.xml");
-        applicationContext = createMock(ApplicationContext.class);
-        expect(applicationContext.getResource("org/apache/tiles/config/temp-defs.xml")).andReturn(resource).anyTimes();
-        replay(applicationContext);
-        dao = createMockBuilder(BaseLocaleUrlDefinitionDAO.class).withConstructor(applicationContext).createMock();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO#refreshRequired()}.
-     * @throws URISyntaxException If something goes wrong.
-     * @throws IOException If something goes wrong.
-     * @throws InterruptedException If something goes wrong.
-     */
-    @Test
-    public void testRefreshRequired() throws URISyntaxException, IOException, InterruptedException {
-        // Set up multiple data sources.
-        Map<String, Attribute> attribs = new HashMap<String, Attribute>();
-        attribs.put("testparm", new Attribute("testval"));
-        Definition rewriteTest = new Definition("rewrite.test", Attribute.createTemplateAttribute("/test.jsp"), attribs);
-        expect(dao.getDefinition("rewrite.test", null)).andReturn(rewriteTest);
-
-        replay(dao);
-
-        List<ApplicationResource> sources = new ArrayList<ApplicationResource>();
-        sources.add(resource);
-        dao.setSources(sources);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        dao.setReader(reader);
-
-        Request context = createMock(Request.class);
-        expect(context.getContext("session")).andReturn(new HashMap<String, Object>()).anyTimes();
-        expect(context.getRequestLocale()).andReturn(null).anyTimes();
-        replay(context);
-
-        Definition definition = dao.getDefinition("rewrite.test", null);
-        assertNotNull("rewrite.test definition not found.", definition);
-        assertEquals("Incorrect initial template value", "/test.jsp", definition.getTemplateAttribute().getValue());
-
-        RefreshMonitor reloadable = dao;
-        dao.loadDefinitionsFromResource(resource);
-        assertEquals("Factory should be fresh.", false, reloadable.refreshRequired());
-
-        // Make sure the system actually updates the timestamp.
-        Thread.sleep(SLEEP_MILLIS);
-
-        // Set up multiple data sources.
-        resource.modify("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n" + "<!DOCTYPE tiles-definitions PUBLIC "
-                + "\"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN\" "
-                + "\"http://tiles.apache.org/dtds/tiles-config_3_0.dtd\">\n\n" + "<tiles-definitions>"
-                + "<definition name=\"rewrite.test\" template=\"/newtest.jsp\">"
-                + "<put-attribute name=\"testparm\" value=\"testval\"/>" + "</definition>" //
-                + "</tiles-definitions>");
-
-        assertEquals("Factory should be stale.", true, reloadable.refreshRequired());
-
-        verify(context, dao);
-    }
-
-    /**
-     * Test method for {@link BaseLocaleUrlDefinitionDAO#loadDefinitionsFromURL(URL)}.
-     * @throws MalformedURLException If something goes wrong.
-     */
-    @Test
-    public void testLoadDefinitionsFromURLFileNotFound() throws MalformedURLException {
-        URLApplicationResource resource = new URLApplicationResource("/hello/there.txt", new URL(
-                "file:///hello/there.txt"));
-        replay(dao);
-        DefinitionsReader reader = createMock(DefinitionsReader.class);
-        replay(reader);
-
-        dao.setReader(reader);
-        assertNull(dao.loadDefinitionsFromResource(resource));
-        verify(dao, reader);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAOTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAOTest.java
deleted file mode 100644
index c7eb12f..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/CachingLocaleUrlDefinitionDAOTest.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import static org.easymock.EasyMock.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.MockDefinitionsReader;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.definition.pattern.BasicPatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.URLApplicationResource;
-
-/**
- * Tests {@link CachingLocaleUrlDefinitionDAO}.
- *
- * @version $Rev$ $Date$
- */
-public class CachingLocaleUrlDefinitionDAOTest extends TestCase {
-
-    /**
-     * The object to test.
-     */
-    private CachingLocaleUrlDefinitionDAO definitionDao;
-
-    private ApplicationContext applicationContext;
-
-    private ApplicationResource url1;
-
-    private ApplicationResource url2;
-
-    private ApplicationResource url3;
-
-    private ApplicationResource urlWildcard;
-
-    private ApplicationResource url21;
-
-    private ApplicationResource setupUrl(String filename, Locale... locales) throws IOException {
-        ApplicationResource url = new URLApplicationResource("org/apache/tiles/config/" + filename + ".xml", this
-                .getClass().getClassLoader().getResource("org/apache/tiles/config/" + filename + ".xml"));
-        assertNotNull("Could not load " + filename + " file.", url);
-        expect(applicationContext.getResource(url.getLocalePath())).andReturn(url).anyTimes();
-        expect(applicationContext.getResource(url, Locale.ROOT)).andReturn(url).anyTimes();
-        Map<Locale, ApplicationResource> localeResources = new HashMap<Locale, ApplicationResource>();
-        for (Locale locale : locales) {
-            ApplicationResource urlLocale = new URLApplicationResource("org/apache/tiles/config/" + filename + "_"
-                    + locale.toString() + ".xml", this.getClass().getClassLoader()
-                    .getResource("org/apache/tiles/config/" + filename + "_" + locale.toString() + ".xml"));
-            assertNotNull("Could not load " + filename + "_" + locale.toString() + " file.", urlLocale);
-            localeResources.put(locale, urlLocale);
-        }
-        for (Locale locale : new Locale[] { Locale.CANADA_FRENCH, Locale.FRENCH, Locale.US, Locale.ENGLISH,
-                Locale.CHINA, Locale.CHINESE, Locale.ITALY, Locale.ITALIAN }) {
-            ApplicationResource urlLocale = localeResources.get(locale);
-            expect(applicationContext.getResource(url, locale)).andReturn(urlLocale).anyTimes();
-        }
-        return url;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        applicationContext = createMock(ApplicationContext.class);
-        url1 = setupUrl("defs1", Locale.FRENCH, Locale.CANADA_FRENCH, Locale.US);
-        url2 = setupUrl("defs2");
-        url3 = setupUrl("defs3");
-        urlWildcard = setupUrl("defs-wildcard");
-        url21 = setupUrl("tiles-defs-2.1", Locale.ITALIAN);
-        replay(applicationContext);
-        definitionDao = new CachingLocaleUrlDefinitionDAO(applicationContext);
-        WildcardDefinitionPatternMatcherFactory definitionPatternMatcherFactory =
-            new WildcardDefinitionPatternMatcherFactory();
-        PatternDefinitionResolver<Locale> definitionResolver = new BasicPatternDefinitionResolver<Locale>(
-                definitionPatternMatcherFactory,
-                definitionPatternMatcherFactory);
-        definitionDao.setPatternDefinitionResolver(definitionResolver);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinition(String, Locale)}.
-     */
-    public void testGetDefinition() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-
-        assertNotNull("test.def1 definition not found.", definitionDao
-                .getDefinition("test.def1", null));
-        assertNotNull("test.def2 definition not found.", definitionDao
-                .getDefinition("test.def2", null));
-        assertNotNull("test.def3 definition not found.", definitionDao
-                .getDefinition("test.def3", null));
-        assertNotNull("test.common definition not found.", definitionDao
-                .getDefinition("test.common", null));
-        assertNotNull("test.common definition in US locale not found.",
-                definitionDao.getDefinition("test.common", Locale.US));
-        assertNotNull("test.common definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common", Locale.FRENCH));
-        assertNotNull("test.common definition in CHINA locale not found.",
-                definitionDao.getDefinition("test.common", Locale.CHINA));
-        assertNotNull(
-                "test.common.french definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french",
-                        Locale.FRENCH));
-        assertNotNull(
-                "test.common.french definition in CANADA_FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french",
-                        Locale.CANADA_FRENCH));
-        assertNotNull("test.def.toextend definition not found.", definitionDao
-                .getDefinition("test.def.toextend", null));
-        assertNotNull("test.def.overridden definition not found.",
-                definitionDao.getDefinition("test.def.overridden", null));
-        assertNotNull(
-                "test.def.overridden definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.def.overridden",
-                        Locale.FRENCH));
-
-        assertEquals("Incorrect default country value", "default",
-                definitionDao.getDefinition("test.def1", null).getAttribute(
-                        "country").getValue());
-        assertEquals("Incorrect US country value", "US", definitionDao
-                .getDefinition("test.def1", Locale.US).getAttribute("country")
-                .getValue());
-        assertEquals("Incorrect France country value", "France", definitionDao
-                .getDefinition("test.def1", Locale.FRENCH).getAttribute(
-                        "country").getValue());
-        assertEquals("Incorrect Chinese country value (should be default)",
-                "default", definitionDao.getDefinition("test.def1",
-                        Locale.CHINA).getAttribute("country").getValue());
-        assertEquals("Incorrect default country value", "default",
-                definitionDao.getDefinition("test.def.overridden", null)
-                        .getAttribute("country").getValue());
-        assertEquals("Incorrect default title value",
-                "Definition to be overridden", definitionDao.getDefinition(
-                        "test.def.overridden", null).getAttribute("title")
-                        .getValue());
-        assertEquals("Incorrect France country value", "France", definitionDao
-                .getDefinition("test.def.overridden", Locale.FRENCH)
-                .getAttribute("country").getValue());
-        assertNull("Definition in French not found", definitionDao
-                .getDefinition("test.def.overridden", Locale.FRENCH)
-                .getAttribute("title"));
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinitions(Locale)}.
-     */
-    public void testGetDefinitions() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-
-        Map<String, Definition> defaultDefinitions = definitionDao
-                .getDefinitions(null);
-        Map<String, Definition> usDefinitions = definitionDao
-                .getDefinitions(Locale.US);
-        Map<String, Definition> frenchDefinitions = definitionDao
-                .getDefinitions(Locale.FRENCH);
-        Map<String, Definition> chinaDefinitions = definitionDao
-                .getDefinitions(Locale.CHINA);
-        Map<String, Definition> canadaFrenchDefinitions = definitionDao
-                .getDefinitions(Locale.CANADA_FRENCH);
-
-        assertNotNull("test.def1 definition not found.", defaultDefinitions
-                .get("test.def1"));
-        assertNotNull("test.def2 definition not found.", defaultDefinitions
-                .get("test.def2"));
-        assertNotNull("test.def3 definition not found.", defaultDefinitions
-                .get("test.def3"));
-        assertNotNull("test.common definition not found.", defaultDefinitions
-                .get("test.common"));
-        assertNotNull("test.common definition in US locale not found.",
-                usDefinitions.get("test.common"));
-        assertNotNull("test.common definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.common"));
-        assertNotNull("test.common definition in CHINA locale not found.",
-                chinaDefinitions.get("test.common"));
-        assertNotNull(
-                "test.common.french definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.common.french"));
-        assertNotNull(
-                "test.common.french definition in CANADA_FRENCH locale not found.",
-                canadaFrenchDefinitions.get("test.common.french"));
-        assertNotNull("test.def.toextend definition not found.",
-                defaultDefinitions.get("test.def.toextend"));
-        assertNotNull("test.def.overridden definition not found.",
-                defaultDefinitions.get("test.def.overridden"));
-        assertNotNull(
-                "test.def.overridden definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.def.overridden"));
-
-        assertEquals("Incorrect default country value", "default",
-                defaultDefinitions.get("test.def1").getAttribute("country")
-                        .getValue());
-        assertEquals("Incorrect US country value", "US", usDefinitions.get(
-                "test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect France country value", "France",
-                frenchDefinitions.get("test.def1").getAttribute("country")
-                        .getValue());
-        assertEquals("Incorrect Chinese country value (should be default)",
-                "default", chinaDefinitions.get("test.def1").getAttribute(
-                        "country").getValue());
-        assertEquals("Incorrect default country value", "default",
-                defaultDefinitions.get("test.def.overridden").getAttribute(
-                        "country").getValue());
-        assertEquals("Incorrect default title value",
-                "Definition to be overridden", defaultDefinitions.get(
-                        "test.def.overridden").getAttribute("title").getValue());
-        assertEquals("Incorrect France country value", "France",
-                frenchDefinitions.get("test.def.overridden").getAttribute(
-                        "country").getValue());
-        assertNull("Definition in French not found", frenchDefinitions.get(
-                "test.def.overridden").getAttribute("title"));
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setSources(List)}.
-     */
-    public void testSetSourceURLs() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not set correctly", sourceURLs,
-                definitionDao.sources);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setReader(DefinitionsReader)}.
-     */
-    public void testSetReader() {
-        DefinitionsReader reader = createMock(DefinitionsReader.class);
-        definitionDao.setReader(reader);
-        assertEquals("There reader has not been set correctly", reader,
-                definitionDao.reader);
-    }
-
-    /**
-     * Tests execution.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    public void testInit() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Set<ApplicationResource> urlSet = new HashSet<ApplicationResource>();
-        urlSet.add(url1);
-        expect(applicationContext.getResources("/WEB-INF/tiles.xml"))
-                .andReturn(urlSet);
-        replay(applicationContext);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The reader is not of the correct class",
-                DigesterDefinitionsReader.class, definitionDao.reader
-                        .getClass());
-        assertEquals("The source URLs are not correct", sourceURLs,
-                definitionDao.sources);
-        reset(applicationContext);
-
-        definitionDao.setReader(new MockDefinitionsReader());
-        assertEquals("The reader is not of the correct class",
-                MockDefinitionsReader.class, definitionDao.reader.getClass());
-        sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not correct", sourceURLs,
-                definitionDao.sources);
-    }
-
-    /**
-     * Tests wildcard mappings.
-     */
-    public void testWildcardMapping() {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(urlWildcard);
-        definitionDao.setSources(urls);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-
-        Definition definition = definitionDao.getDefinition("test.defName.subLayered", Locale.ITALY);
-        assertEquals("The template is not correct", "/testName.jsp", definition
-                .getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct",
-                "/common/headerLayered.jsp", definition.getAttribute("header")
-                        .getValue());
-        definition = definitionDao.getDefinition("test.defName.subLayered", Locale.ITALIAN);
-        assertEquals("The template is not correct", "/testName.jsp", definition
-                .getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct",
-                "/common/headerLayered.jsp", definition.getAttribute("header")
-                        .getValue());
-        definition = definitionDao.getDefinition("test.defName.subLayered", null);
-        assertEquals("The template is not correct", "/testName.jsp", definition
-                .getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct",
-                "/common/headerLayered.jsp", definition.getAttribute("header")
-                        .getValue());
-        definition = definitionDao.getDefinition("test.defName.noAttribute", null);
-        assertEquals("/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals(null, definition.getLocalAttributeNames());
-        definition = definitionDao.getDefinition("test.def3", null);
-        assertNotNull("The simple definition is null", definition);
-
-        definition = definitionDao.getDefinition("test.extended.defName.subLayered", null);
-        assertEquals("test.defName.subLayered", definition.getExtends());
-        assertNull(definition.getTemplateAttribute().getValue());
-        assertEquals(1, definition.getLocalAttributeNames().size());
-        assertEquals("Overridden Title", definition.getAttribute("title").getValue());
-    }
-
-    /**
-     * Tests
-     * {@link ResolvingLocaleUrlDefinitionDAO#getDefinition(String, Locale)}
-     * when loading multiple files for a locale.
-     */
-    public void testListAttributeLocaleInheritance() {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(url21);
-        definitionDao.setSources(urls);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-        replay(applicationContext);
-
-        Definition definition = definitionDao.getDefinition(
-                "test.inherit.list", Locale.ITALIAN);
-        ListAttribute listAttribute = (ListAttribute) definition
-                .getAttribute("list");
-        List<Attribute> attributes = listAttribute.getValue();
-        // It is right not to resolve inheritance in this DAO.
-        assertEquals(1, attributes.size());
-        verify(applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAOTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAOTest.java
deleted file mode 100644
index 57bb86a..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/LocaleUrlDefinitionDAOTest.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import static org.easymock.EasyMock.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.MockDefinitionsReader;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.URLApplicationResource;
-
-/**
- * Tests {@link LocaleUrlDefinitionDAO}.
- *
- * @version $Rev$ $Date$
- */
-public class LocaleUrlDefinitionDAOTest extends TestCase {
-
-    /**
-     * The object to test.
-     */
-    private LocaleUrlDefinitionDAO definitionDao;
-
-    private ApplicationContext applicationContext;
-
-    private ApplicationResource url1;
-
-    private ApplicationResource url2;
-
-    private ApplicationResource url3;
-
-    private ApplicationResource setupUrl(String filename, Locale... locales) throws IOException {
-        ApplicationResource url = new URLApplicationResource("org/apache/tiles/config/" + filename + ".xml", this
-                .getClass().getClassLoader().getResource("org/apache/tiles/config/" + filename + ".xml"));
-        assertNotNull("Could not load " + filename + " file.", url);
-        expect(applicationContext.getResource(url.getLocalePath())).andReturn(url).anyTimes();
-        expect(applicationContext.getResource(url, Locale.ROOT)).andReturn(url).anyTimes();
-        Map<Locale, ApplicationResource> localeResources = new HashMap<Locale, ApplicationResource>();
-        for (Locale locale : locales) {
-            ApplicationResource urlLocale = new URLApplicationResource("org/apache/tiles/config/" + filename + "_"
-                    + locale.toString() + ".xml", this.getClass().getClassLoader()
-                    .getResource("org/apache/tiles/config/" + filename + "_" + locale.toString() + ".xml"));
-            assertNotNull("Could not load " + filename + "_" + locale.toString() + " file.", urlLocale);
-            localeResources.put(locale, urlLocale);
-        }
-        for (Locale locale : new Locale[] { Locale.CANADA_FRENCH, Locale.FRENCH, Locale.US, Locale.ENGLISH,
-                Locale.CHINA, Locale.CHINESE }) {
-            ApplicationResource urlLocale = localeResources.get(locale);
-            expect(applicationContext.getResource(url, locale)).andReturn(urlLocale).anyTimes();
-        }
-        return url;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        applicationContext = createMock(ApplicationContext.class);
-        url1 = setupUrl("defs1", Locale.FRENCH, Locale.CANADA_FRENCH, Locale.US);
-        url2 = setupUrl("defs2");
-        url3 = setupUrl("defs3");
-        replay(applicationContext);
-        definitionDao = new LocaleUrlDefinitionDAO(applicationContext);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinition(String, Locale)}.
-     */
-    public void testGetDefinition() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-        assertNotNull("test.def1 definition not found.", definitionDao.getDefinition("test.def1", null));
-        assertNotNull("test.def2 definition not found.", definitionDao.getDefinition("test.def2", null));
-        assertNotNull("test.def3 definition not found.", definitionDao.getDefinition("test.def3", null));
-        assertNotNull("test.common definition not found.", definitionDao.getDefinition("test.common", null));
-        assertNotNull("test.common definition in US locale not found.",
-                definitionDao.getDefinition("test.common", Locale.US));
-        assertNotNull("test.common definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common", Locale.FRENCH));
-        assertNotNull("test.common definition in CHINA locale not found.",
-                definitionDao.getDefinition("test.common", Locale.CHINA));
-        assertNotNull("test.common.french definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french", Locale.FRENCH));
-        assertNotNull("test.common.french definition in CANADA_FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french", Locale.CANADA_FRENCH));
-        assertNotNull("test.def.toextend definition not found.", definitionDao.getDefinition("test.def.toextend", null));
-        assertNotNull("test.def.overridden definition not found.",
-                definitionDao.getDefinition("test.def.overridden", null));
-        assertNotNull("test.def.overridden definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.def.overridden", Locale.FRENCH));
-
-        assertEquals("Incorrect default country value", "default", definitionDao.getDefinition("test.def1", null)
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect US country value", "US", definitionDao.getDefinition("test.def1", Locale.US)
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect France country value", "France", definitionDao
-                .getDefinition("test.def1", Locale.FRENCH).getAttribute("country").getValue());
-        assertEquals("Incorrect Chinese country value (should be default)", "default",
-                definitionDao.getDefinition("test.def1", Locale.CHINA).getAttribute("country").getValue());
-        assertEquals("Incorrect default country value", "default",
-                definitionDao.getDefinition("test.def.overridden", null).getAttribute("country").getValue());
-        assertEquals("Incorrect default title value", "Definition to be overridden",
-                definitionDao.getDefinition("test.def.overridden", null).getAttribute("title").getValue());
-        assertEquals("Incorrect France country value", "France",
-                definitionDao.getDefinition("test.def.overridden", Locale.FRENCH).getAttribute("country").getValue());
-        assertNull("Definition in French not found", definitionDao.getDefinition("test.def.overridden", Locale.FRENCH)
-                .getAttribute("title"));
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinitions(Locale)}.
-     */
-    public void testGetDefinitions() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-
-        Map<String, Definition> defaultDefinitions = definitionDao.getDefinitions(null);
-        Map<String, Definition> usDefinitions = definitionDao.getDefinitions(Locale.US);
-        Map<String, Definition> frenchDefinitions = definitionDao.getDefinitions(Locale.FRENCH);
-        Map<String, Definition> chinaDefinitions = definitionDao.getDefinitions(Locale.CHINA);
-        Map<String, Definition> canadaFrenchDefinitions = definitionDao.getDefinitions(Locale.CANADA_FRENCH);
-
-        assertNotNull("test.def1 definition not found.", defaultDefinitions.get("test.def1"));
-        assertNotNull("test.def2 definition not found.", defaultDefinitions.get("test.def2"));
-        assertNotNull("test.def3 definition not found.", defaultDefinitions.get("test.def3"));
-        assertNotNull("test.common definition not found.", defaultDefinitions.get("test.common"));
-        assertNotNull("test.common definition in US locale not found.", usDefinitions.get("test.common"));
-        assertNotNull("test.common definition in FRENCH locale not found.", frenchDefinitions.get("test.common"));
-        assertNotNull("test.common definition in CHINA locale not found.", chinaDefinitions.get("test.common"));
-        assertNotNull("test.common.french definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.common.french"));
-        assertNotNull("test.common.french definition in CANADA_FRENCH locale not found.",
-                canadaFrenchDefinitions.get("test.common.french"));
-        assertNotNull("test.def.toextend definition not found.", defaultDefinitions.get("test.def.toextend"));
-        assertNotNull("test.def.overridden definition not found.", defaultDefinitions.get("test.def.overridden"));
-        assertNotNull("test.def.overridden definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.def.overridden"));
-
-        assertEquals("Incorrect default country value", "default",
-                defaultDefinitions.get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect US country value", "US", usDefinitions.get("test.def1").getAttribute("country")
-                .getValue());
-        assertEquals("Incorrect France country value", "France",
-                frenchDefinitions.get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect Chinese country value (should be default)", "default", chinaDefinitions
-                .get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect default country value", "default", defaultDefinitions.get("test.def.overridden")
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect default title value", "Definition to be overridden",
-                defaultDefinitions.get("test.def.overridden").getAttribute("title").getValue());
-        assertEquals("Incorrect France country value", "France", frenchDefinitions.get("test.def.overridden")
-                .getAttribute("country").getValue());
-        assertNull("Definition in French not found", frenchDefinitions.get("test.def.overridden").getAttribute("title"));
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setSources(List)}.
-     */
-    public void testSetSourceURLs() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not set correctly", sourceURLs, definitionDao.sources);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setReader(DefinitionsReader)}.
-     */
-    public void testSetReader() {
-        DefinitionsReader reader = createMock(DefinitionsReader.class);
-        replay(reader);
-        definitionDao.setReader(reader);
-        assertEquals("There reader has not been set correctly", reader, definitionDao.reader);
-        verify(reader);
-    }
-
-    /**
-     * Tests execution.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    public void testInit() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        List<ApplicationResource> urlSet = new ArrayList<ApplicationResource>();
-        urlSet.add(url1);
-        expect(applicationContext.getResources("/WEB-INF/tiles.xml")).andReturn(urlSet);
-        replay(applicationContext);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The reader is not of the correct class", DigesterDefinitionsReader.class,
-                definitionDao.reader.getClass());
-        assertEquals("The source URLs are not correct", sourceURLs, definitionDao.sources);
-        reset(applicationContext);
-
-        definitionDao.setReader(new MockDefinitionsReader());
-        assertEquals("The reader is not of the correct class", MockDefinitionsReader.class,
-                definitionDao.reader.getClass());
-        sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not correct", sourceURLs, definitionDao.sources);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAOTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAOTest.java
deleted file mode 100644
index 27642b3..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/dao/ResolvingLocaleUrlDefinitionDAOTest.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.dao;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.MockDefinitionsReader;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.definition.pattern.BasicPatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.URLApplicationResource;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ResolvingLocaleUrlDefinitionDAO}.
- *
- * @version $Rev$ $Date$
- */
-public class ResolvingLocaleUrlDefinitionDAOTest {
-
-    /**
-     * The number of attribute names.
-     */
-    private static final int ATTRIBUTE_NAMES_COUNT = 6;
-
-    /**
-     * The object to test.
-     */
-    private ResolvingLocaleUrlDefinitionDAO definitionDao;
-
-    private ApplicationContext applicationContext;
-
-    private ApplicationResource url1;
-    private ApplicationResource url2;
-    private ApplicationResource url3;
-    private ApplicationResource urlWildcard;
-    private ApplicationResource url21;
-    private ApplicationResource url513;
-
-    private ApplicationResource setupUrl(String filename, Locale... locales) throws IOException {
-        ApplicationResource url = new URLApplicationResource("org/apache/tiles/config/" + filename + ".xml", this
-                .getClass().getClassLoader().getResource("org/apache/tiles/config/" + filename + ".xml"));
-        assertNotNull("Could not load " + filename + " file.", url);
-        expect(applicationContext.getResource(url.getLocalePath())).andReturn(url).anyTimes();
-        expect(applicationContext.getResource(url, Locale.ROOT)).andReturn(url).anyTimes();
-        Map<Locale, ApplicationResource> localeResources = new HashMap<Locale, ApplicationResource>();
-        for (Locale locale : locales) {
-            ApplicationResource urlLocale = new URLApplicationResource("org/apache/tiles/config/" + filename + "_"
-                    + locale.toString() + ".xml", this.getClass().getClassLoader()
-                    .getResource("org/apache/tiles/config/" + filename + "_" + locale.toString() + ".xml"));
-            assertNotNull("Could not load " + filename + "_" + locale.toString() + " file.", urlLocale);
-            localeResources.put(locale, urlLocale);
-        }
-        for (Locale locale : new Locale[] { Locale.CANADA_FRENCH, Locale.FRENCH, Locale.US, Locale.ENGLISH,
-                Locale.CHINA, Locale.CHINESE, Locale.ITALY, Locale.ITALIAN, new Locale("es", "CO"), new Locale("es", "CA") }) {
-            ApplicationResource urlLocale = localeResources.get(locale);
-            expect(applicationContext.getResource(url, locale)).andReturn(urlLocale).anyTimes();
-        }
-        return url;
-    }
-
-    /** {@inheritDoc} */
-    @Before
-    public void setUp() throws IOException {
-        // Set up multiple data sources.
-        applicationContext = createMock(ApplicationContext.class);
-        url1 = setupUrl("defs1", Locale.FRENCH, Locale.CANADA_FRENCH, Locale.US);
-        url2 = setupUrl("defs2");
-        url3 = setupUrl("defs3");
-        urlWildcard = setupUrl("defs-wildcard");
-        url21 = setupUrl("tiles-defs-2.1", Locale.ITALIAN);
-        url513 = setupUrl("defs-tiles-513");
-        replay(applicationContext);
-
-        definitionDao = new ResolvingLocaleUrlDefinitionDAO(applicationContext);
-        WildcardDefinitionPatternMatcherFactory definitionPatternMatcherFactory = new WildcardDefinitionPatternMatcherFactory();
-        PatternDefinitionResolver<Locale> definitionResolver = new BasicPatternDefinitionResolver<Locale>(
-                definitionPatternMatcherFactory, definitionPatternMatcherFactory);
-        definitionDao.setPatternDefinitionResolver(definitionResolver);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinition(String, Locale)}.
-     */
-    @Test
-    public void testGetDefinition() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-
-        assertNotNull("test.def1 definition not found.", definitionDao.getDefinition("test.def1", null));
-        assertNotNull("test.def2 definition not found.", definitionDao.getDefinition("test.def2", null));
-        assertNotNull("test.def3 definition not found.", definitionDao.getDefinition("test.def3", null));
-        assertNotNull("test.common definition not found.", definitionDao.getDefinition("test.common", null));
-        assertNotNull("test.common definition in US locale not found.",
-                definitionDao.getDefinition("test.common", Locale.US));
-        assertNotNull("test.common definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common", Locale.FRENCH));
-        assertNotNull("test.common definition in CHINA locale not found.",
-                definitionDao.getDefinition("test.common", Locale.CHINA));
-        assertNotNull("test.common.french definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french", Locale.FRENCH));
-        assertNotNull("test.common.french definition in CANADA_FRENCH locale not found.",
-                definitionDao.getDefinition("test.common.french", Locale.CANADA_FRENCH));
-        assertNotNull("test.def.toextend definition not found.", definitionDao.getDefinition("test.def.toextend", null));
-        assertNotNull("test.def.overridden definition not found.",
-                definitionDao.getDefinition("test.def.overridden", null));
-        assertNotNull("test.def.overridden definition in FRENCH locale not found.",
-                definitionDao.getDefinition("test.def.overridden", Locale.FRENCH));
-
-        assertEquals("Incorrect default country value", "default", definitionDao.getDefinition("test.def1", null)
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect US country value", "US", definitionDao.getDefinition("test.def1", Locale.US)
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect France country value", "France", definitionDao
-                .getDefinition("test.def1", Locale.FRENCH).getAttribute("country").getValue());
-        assertEquals("Incorrect Chinese country value (should be default)", "default",
-                definitionDao.getDefinition("test.def1", Locale.CHINA).getAttribute("country").getValue());
-        assertEquals("Incorrect default country value", "default",
-                definitionDao.getDefinition("test.def.overridden", null).getAttribute("country").getValue());
-        assertEquals("Incorrect default title value", "Definition to be overridden",
-                definitionDao.getDefinition("test.def.overridden", null).getAttribute("title").getValue());
-        assertEquals("Incorrect France country value", "France",
-                definitionDao.getDefinition("test.def.overridden", Locale.FRENCH).getAttribute("country").getValue());
-        assertEquals("Incorrect France title value", "Definition to be extended",
-                definitionDao.getDefinition("test.def.overridden", Locale.FRENCH).getAttribute("title").getValue());
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#getDefinitions(Locale)}.
-     */
-    @Test
-    public void testGetDefinitions() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-
-        Map<String, Definition> defaultDefinitions = definitionDao.getDefinitions(null);
-        Map<String, Definition> usDefinitions = definitionDao.getDefinitions(Locale.US);
-        Map<String, Definition> frenchDefinitions = definitionDao.getDefinitions(Locale.FRENCH);
-        Map<String, Definition> chinaDefinitions = definitionDao.getDefinitions(Locale.CHINA);
-        Map<String, Definition> canadaFrendDefinitions = definitionDao.getDefinitions(Locale.CANADA_FRENCH);
-
-        assertNotNull("test.def1 definition not found.", defaultDefinitions.get("test.def1"));
-        assertNotNull("test.def2 definition not found.", defaultDefinitions.get("test.def2"));
-        assertNotNull("test.def3 definition not found.", defaultDefinitions.get("test.def3"));
-        assertNotNull("test.common definition not found.", defaultDefinitions.get("test.common"));
-        assertNotNull("test.common definition in US locale not found.", usDefinitions.get("test.common"));
-        assertNotNull("test.common definition in FRENCH locale not found.", frenchDefinitions.get("test.common"));
-        assertNotNull("test.common definition in CHINA locale not found.", chinaDefinitions.get("test.common"));
-        assertNotNull("test.common.french definition in FRENCH locale not found.",
-                canadaFrendDefinitions.get("test.common.french"));
-        assertNotNull("test.common.french definition in CANADA_FRENCH locale not found.",
-                canadaFrendDefinitions.get("test.common.french"));
-        assertNotNull("test.def.toextend definition not found.", defaultDefinitions.get("test.def.toextend"));
-        assertNotNull("test.def.overridden definition not found.", defaultDefinitions.get("test.def.overridden"));
-        assertNotNull("test.def.overridden definition in FRENCH locale not found.",
-                frenchDefinitions.get("test.def.overridden"));
-
-        assertEquals("Incorrect default country value", "default",
-                defaultDefinitions.get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect US country value", "US", usDefinitions.get("test.def1").getAttribute("country")
-                .getValue());
-        assertEquals("Incorrect France country value", "France",
-                frenchDefinitions.get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect Chinese country value (should be default)", "default", chinaDefinitions
-                .get("test.def1").getAttribute("country").getValue());
-        assertEquals("Incorrect default country value", "default", defaultDefinitions.get("test.def.overridden")
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect default title value", "Definition to be overridden",
-                defaultDefinitions.get("test.def.overridden").getAttribute("title").getValue());
-        assertEquals("Incorrect France country value", "France", frenchDefinitions.get("test.def.overridden")
-                .getAttribute("country").getValue());
-        assertEquals("Incorrect France title value", "Definition to be extended",
-                frenchDefinitions.get("test.def.overridden").getAttribute("title").getValue());
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setSources(List)}.
-     */
-    @Test
-    public void testSetSourceURLs() {
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not set correctly", sourceURLs, definitionDao.sources);
-    }
-
-    /**
-     * Tests {@link LocaleUrlDefinitionDAO#setReader(DefinitionsReader)}.
-     */
-    @Test
-    public void testSetReader() {
-        DefinitionsReader reader = createMock(DefinitionsReader.class);
-        definitionDao.setReader(reader);
-        assertEquals("There reader has not been set correctly", reader, definitionDao.reader);
-    }
-
-    /**
-     * Tests {@link ResolvingLocaleUrlDefinitionDAO#resolveInheritance(Definition, Map, Locale, Set)}.
-     */
-    @Test(expected = NoSuchDefinitionException.class)
-    public void testResolveInheritanceNoParent() {
-        Definition definition = new Definition("mydef", null, null);
-        definition.setExtends("otherDef");
-        definitionDao.resolveInheritance(definition, new HashMap<String, Definition>(), Locale.ITALY,
-                new HashSet<String>());
-    }
-
-    /**
-     * Tests execution.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testInit() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Set<ApplicationResource> urlSet = new HashSet<ApplicationResource>();
-        urlSet.add(url1);
-        expect(applicationContext.getResources("/WEB-INF/tiles.xml")).andReturn(urlSet);
-        replay(applicationContext);
-        DefinitionsReader reader = new DigesterDefinitionsReader();
-        definitionDao.setReader(reader);
-        List<ApplicationResource> sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The reader is not of the correct class", DigesterDefinitionsReader.class,
-                definitionDao.reader.getClass());
-        assertEquals("The source URLs are not correct", sourceURLs, definitionDao.sources);
-        reset(applicationContext);
-
-        applicationContext = createMock(ApplicationContext.class);
-        replay(applicationContext);
-        definitionDao.setReader(new MockDefinitionsReader());
-        assertEquals("The reader is not of the correct class", MockDefinitionsReader.class,
-                definitionDao.reader.getClass());
-        sourceURLs = new ArrayList<ApplicationResource>();
-        sourceURLs.add(url1);
-        sourceURLs.add(url2);
-        sourceURLs.add(url3);
-        definitionDao.setSources(sourceURLs);
-        assertEquals("The source URLs are not correct", sourceURLs, definitionDao.sources);
-        verify(applicationContext);
-    }
-
-    /**
-     * Tests wildcard mappings.
-     */
-    @Test
-    public void testWildcardMapping() {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(urlWildcard);
-        definitionDao.setSources(urls);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-
-        Definition definition = definitionDao.getDefinition("test.defName.subLayered", Locale.ITALY);
-        assertEquals("The template is not correct", "/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct", "/common/headerLayered.jsp",
-                definition.getAttribute("header").getValue());
-        definition = definitionDao.getDefinition("test.defName.subLayered", Locale.ITALIAN);
-        assertEquals("The template is not correct", "/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct", "/common/headerLayered.jsp",
-                definition.getAttribute("header").getValue());
-        definition = definitionDao.getDefinition("test.defName.subLayered", null);
-        assertEquals("The template is not correct", "/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals("The header attribute is not correct", "/common/headerLayered.jsp",
-                definition.getAttribute("header").getValue());
-        definition = definitionDao.getDefinition("test.defName.noAttribute", null);
-        assertEquals("/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals(null, definition.getLocalAttributeNames());
-        definition = definitionDao.getDefinition("test.def3", null);
-        assertNotNull("The simple definition is null", definition);
-
-        definition = definitionDao.getDefinition("test.extended.defName.subLayered", null);
-        assertEquals("test.defName.subLayered", definition.getExtends());
-        assertEquals(ATTRIBUTE_NAMES_COUNT, definition.getLocalAttributeNames().size());
-        assertEquals("The template is not correct", "/testName.jsp", definition.getTemplateAttribute().getValue());
-        assertEquals("Overridden Title", definition.getAttribute("title").getValue());
-        assertEquals("The header attribute is not correct", "/common/headerLayered.jsp",
-                definition.getAttribute("header").getValue());
-    }
-
-    /**
-     * Tests
-     * {@link ResolvingLocaleUrlDefinitionDAO#getDefinition(String, Locale)}
-     * when loading multiple files for a locale.
-     */
-    @Test
-    public void testListAttributeLocaleInheritance() {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(url21);
-        definitionDao.setSources(urls);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-        replay(applicationContext);
-
-        Definition definition = definitionDao.getDefinition("test.inherit.list", Locale.ITALIAN);
-        ListAttribute listAttribute = (ListAttribute) definition.getAttribute("list");
-        List<Attribute> attributes = listAttribute.getValue();
-        assertEquals(2, attributes.size());
-        verify(applicationContext);
-    }
-
-    /**
-     * Tests
-     * {@link ResolvingLocaleUrlDefinitionDAO#getDefinition(String, Locale)}
-     * to solve the TILES-512 issue.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    public void testTiles512() throws IOException {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(url21);
-        definitionDao.setSources(urls);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-        replay(applicationContext);
-
-        Definition definition = definitionDao.getDefinition("test.inherit.othertype", Locale.ITALIAN);
-        assertEquals("/layout.ftl", definition.getTemplateAttribute().getValue());
-        assertEquals("freemarker", definition.getTemplateAttribute().getRenderer());
-    }
-
-    /**
-     * Tests
-     * {@link ResolvingLocaleUrlDefinitionDAO#getDefinition(String, Locale)}
-     * to solve the TILES-513 issue.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    public void testTiles513() throws IOException {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.add(url513);
-        definitionDao.setSources(urls);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        definitionDao.setReader(new DigesterDefinitionsReader());
-        replay(applicationContext);
-
-        Definition definition = definitionDao.getDefinition("test.anonymous", null);
-        definitionDao.getDefinition("test.anonymous", new Locale("es", "CO"));
-        definitionDao.getDefinition("test.anonymous", new Locale("en", "CA"));
-        Attribute attribute = definition.getAttribute("header");
-        Definition child = definitionDao.getDefinition((String) attribute.getValue(), null);
-        assertNotNull(child);
-        attribute = definition.getAttribute("menu");
-        child = definitionDao.getDefinition((String) attribute.getValue(), null);
-        assertNotNull(child);
-        attribute = definition.getAttribute("footer");
-        child = definitionDao.getDefinition((String) attribute.getValue(), null);
-        assertNotNull(child);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderExceptionTest.java
deleted file mode 100644
index cd73885..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/DigesterDefinitionsReaderExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.digester;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link DigesterDefinitionsReaderException}.
- *
- * @version $Rev$ $Date$
- */
-public class DigesterDefinitionsReaderExceptionTest {
-
-    /**
-     * Test method for {@link DigesterDefinitionsReaderException#DigesterDefinitionsReaderException()}.
-     */
-    @Test
-    public void testDigesterDefinitionsReaderException() {
-        DigesterDefinitionsReaderException exception = new DigesterDefinitionsReaderException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DigesterDefinitionsReaderException#DigesterDefinitionsReaderException(java.lang.String)}.
-     */
-    @Test
-    public void testDigesterDefinitionsReaderExceptionString() {
-        DigesterDefinitionsReaderException exception = new DigesterDefinitionsReaderException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DigesterDefinitionsReaderException#DigesterDefinitionsReaderException(Throwable)}.
-     */
-    @Test
-    public void testDigesterDefinitionsReaderExceptionThrowable() {
-        Throwable cause = new Throwable();
-        DigesterDefinitionsReaderException exception = new DigesterDefinitionsReaderException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link DigesterDefinitionsReaderException#DigesterDefinitionsReaderException(String, Throwable)}.
-     */
-    @Test
-    public void testDigesterDefinitionsReaderExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        DigesterDefinitionsReaderException exception = new DigesterDefinitionsReaderException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
deleted file mode 100644
index 44742fe..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/digester/TestDigesterDefinitionsReader.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.digester;
-
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.definition.DefinitionsFactoryException;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Tests the <code>org.apache.tiles.definition.digester.DigesterDefinitionsReader</code> class.
- *
- * @version $Rev$ $Date$
- */
-public class TestDigesterDefinitionsReader {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(TestDigesterDefinitionsReader.class);
-
-    /**
-     * The definitions reader.
-     */
-    private DigesterDefinitionsReader reader;
-
-    /**
-     * Sets up the test.
-     *
-     * @throws Exception
-     */
-    @Before
-    public void setUp() {
-        reader = new DigesterDefinitionsReader();
-    }
-
-    /**
-     * Tests the read method under normal conditions.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRead() throws IOException {
-        URL configFile = this.getClass().getClassLoader().getResource(
-                "org/apache/tiles/config/tiles-defs.xml");
-        assertNotNull("Config file not found", configFile);
-
-        InputStream source = configFile.openStream();
-        Map<String, Definition> definitions = reader.read(source);
-
-        assertNotNull("Definitions not returned.", definitions);
-        assertNotNull("Couldn't find doc.mainLayout tile.",
-                definitions.get("doc.mainLayout"));
-        assertNotNull("Couldn't Find title attribute.", definitions.get(
-                "doc.mainLayout").getAttribute("title").getValue());
-        assertEquals("Incorrect Find title attribute.",
-                "Tiles Library Documentation", definitions.get(
-                        "doc.mainLayout").getAttribute("title").getValue());
-
-        Definition def = definitions.get("doc.role.test");
-        assertNotNull("Couldn't find doc.role.test tile.", def);
-        Attribute attribute = def.getAttribute("title");
-        assertNotNull("Couldn't Find title attribute.", attribute
-                .getValue());
-        assertEquals("Role 'myrole' expected", attribute.getRole(),
-                "myrole");
-
-        def = definitions.get("doc.listattribute.test");
-        assertNotNull("Couldn't find doc.listattribute.test tile.", def);
-        attribute = def.getAttribute("items");
-        assertNotNull("Couldn't Find items attribute.", attribute);
-        assertTrue("The class of the attribute is not right",
-                attribute instanceof ListAttribute);
-        assertTrue("The class of value of the attribute is not right",
-                attribute.getValue() instanceof List);
-    }
-
-
-    /**
-     * Tests the read method under normal conditions for the new features in 2.1
-     * version of the DTD.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRead21Version() throws IOException {
-        URL configFile = this.getClass().getClassLoader().getResource(
-                "org/apache/tiles/config/tiles-defs-2.1.xml");
-        assertNotNull("Config file not found", configFile);
-
-        InputStream source = configFile.openStream();
-        Map<String, Definition> definitions = reader.read(source);
-
-        assertNotNull("Definitions not returned.", definitions);
-        Definition def = definitions.get("doc.cascaded.test");
-
-        assertNotNull("Couldn't find doc.role.test tile.", def);
-        Attribute attribute = def.getLocalAttribute("title");
-        assertNotNull("Couldn't Find title local attribute.", attribute);
-        attribute = def.getCascadedAttribute("title2");
-        assertNotNull("Couldn't Find title2 cascaded attribute.", attribute);
-        attribute = def.getLocalAttribute("items1");
-        assertNotNull("Couldn't Find items1 local attribute.", attribute);
-        attribute = def.getCascadedAttribute("items2");
-        assertNotNull("Couldn't Find items2 cascaded attribute.", attribute);
-
-        def = definitions.get("test.nesting.definitions");
-        assertNotNull("Couldn't find test.nesting.definitions tile.", def);
-        assertEquals("/layout.jsp", def.getTemplateAttribute().getValue());
-        assertEquals("template", def.getTemplateAttribute().getRenderer());
-        attribute = def.getAttribute("body");
-        assertNotNull("Couldn't Find body attribute.", attribute);
-        assertEquals("Attribute not of 'definition' type", "definition",
-                attribute.getRenderer());
-        assertNotNull("Attribute value null", attribute.getValue());
-        String defName = attribute.getValue().toString();
-        def = definitions.get(defName);
-        assertNotNull("Couldn't find " + defName + " tile.", def);
-
-        def = definitions.get("test.nesting.list.definitions");
-        assertNotNull("Couldn't find test.nesting.list.definitions tile.",
-                def);
-        attribute = def.getAttribute("list");
-        assertNotNull("Couldn't Find list attribute.", attribute);
-        assertTrue("Attribute not of valid type",
-                attribute instanceof ListAttribute);
-        ListAttribute listAttribute = (ListAttribute) attribute;
-        List<Attribute> list = listAttribute.getValue();
-        assertEquals("The list is not of correct size", 1, list.size());
-        attribute = list.get(0);
-        assertNotNull("Couldn't Find element attribute.", attribute);
-        assertEquals("Attribute not of 'definition' type", "definition",
-                attribute.getRenderer());
-        assertNotNull("Attribute value null", attribute.getValue());
-        defName = attribute.getValue().toString();
-        def = definitions.get(defName);
-        assertNotNull("Couldn't find " + defName + " tile.", def);
-
-        defName = "test.inherit.list.base";
-        def = definitions.get(defName);
-        assertNotNull("Couldn't find " + defName + " tile.", def);
-        defName = "test.inherit.list";
-        def = definitions.get(defName);
-        assertNotNull("Couldn't find " + defName + " tile.", def);
-        listAttribute = (ListAttribute) def.getAttribute("list");
-        assertEquals("This definition does not inherit its list attribute",
-                true, listAttribute.isInherit());
-        defName = "test.noinherit.list";
-        def = definitions.get(defName);
-        listAttribute = (ListAttribute) def.getAttribute("list");
-        assertEquals("This definition inherits its list attribute",
-                false, listAttribute.isInherit());
-
-        defName = "test.new.attributes";
-        def = definitions.get(defName);
-        assertNotNull("Couldn't find " + defName + " tile.", def);
-        Attribute templateAttribute = def.getTemplateAttribute();
-        assertEquals(templateAttribute.getExpressionObject().getExpression(),
-                "${my.expression}");
-        assertEquals("mytype", templateAttribute.getRenderer());
-        attribute = def.getAttribute("body");
-        assertNotNull("Couldn't Find body attribute.", attribute);
-        assertEquals("${my.attribute.expression}", attribute
-                .getExpressionObject().getExpression());
-    }
-
-    /**
-     * Tests read with bad input source.
-     */
-    @Test
-    public void testBadSource() {
-        try {
-            // Read definitions.
-            reader.read(new String("Bad Input"));
-            fail("Should've thrown an exception.");
-        } catch (DefinitionsFactoryException e) {
-            // correct.
-            if (log.isDebugEnabled()) {
-                log.debug("Exception caught, it is OK", e);
-            }
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-    }
-
-    /**
-     * Tests read with bad XML source.
-     */
-    @Test
-    public void testBadXml() {
-        try {
-            URL configFile = this.getClass().getClassLoader().getResource(
-                    "org/apache/tiles/config/malformed-defs.xml");
-            assertNotNull("Config file not found", configFile);
-
-            InputStream source = configFile.openStream();
-            reader.read(source);
-            fail("Should've thrown an exception.");
-        } catch (DefinitionsFactoryException e) {
-            // correct.
-            if (log.isDebugEnabled()) {
-                log.debug("Exception caught, it is OK", e);
-            }
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-    }
-
-    /**
-     * Tests the validating input parameter.
-     *
-     * This test case enables Digester's validating property then passes in a
-     * configuration file with invalid XML.
-     */
-    @Test
-    public void testValidatingParameter() {
-        // Testing with default (validation ON).
-        try {
-            URL configFile = this.getClass().getClassLoader().getResource(
-                    "org/apache/tiles/config/invalid-defs.xml");
-            assertNotNull("Config file not found", configFile);
-
-            InputStream source = configFile.openStream();
-            reader.setValidating(true);
-            reader.read(source);
-            fail("Should've thrown an exception.");
-        } catch (DefinitionsFactoryException e) {
-            // correct.
-            if (log.isDebugEnabled()) {
-                log.debug("Exception caught, it is OK", e);
-            }
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-
-        // Testing with validation OFF.
-        try {
-            setUp();
-            URL configFile = this.getClass().getClassLoader().getResource(
-                    "org/apache/tiles/config/invalid-defs.xml");
-            assertNotNull("Config file not found", configFile);
-
-            InputStream source = configFile.openStream();
-            reader.read(source);
-        } catch (DefinitionsFactoryException e) {
-            fail("Should not have thrown an exception." + e);
-        } catch (Exception e) {
-            fail("Exception reading configuration." + e);
-        }
-    }
-
-    /**
-     * Regression test for bug TILES-352.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRegressionTiles352() throws IOException {
-        URL configFile = this.getClass().getClassLoader().getResource(
-                "org/apache/tiles/config/defs_regression_TILES-352.xml");
-        assertNotNull("Config file not found", configFile);
-
-        InputStream source = configFile.openStream();
-        Map<String, Definition> name2defs = reader.read(source);
-        source.close();
-        Definition root = name2defs.get("root");
-        Attribute attribute = root.getAttribute("body");
-        Definition child = name2defs.get(attribute.getValue());
-        ListAttribute listAttribute = (ListAttribute) child.getAttribute("list");
-        List<Attribute> list = listAttribute.getValue();
-        assertEquals((list.get(0)).getValue(), "This is a value");
-    }
-
-    /**
-     * Tests {@link DigesterDefinitionsReader#read(Object)}.
-     */
-    @Test
-    public void testReadNoSource() {
-        assertNull(reader.read(null));
-    }
-
-    /**
-     * Tests {@link DigesterDefinitionsReader#addDefinition(Definition)}.
-     */
-    @Test(expected = DigesterDefinitionsReaderException.class)
-    public void testAddDefinitionNoName() {
-        Definition def = new Definition();
-        reader.addDefinition(def);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java
deleted file mode 100644
index 10a39a8..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/AbstractPatternDefinitionResolverTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.junit.Test;
-
-/**
- * Tests {@link AbstractPatternDefinitionResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class AbstractPatternDefinitionResolverTest {
-
-    /**
-     * Test method for
-     * {@link BasicPatternDefinitionResolver#resolveDefinition(String, Object)}.
-     */
-    @Test
-    public void testResolveDefinition() {
-        final DefinitionPatternMatcher firstMatcher = createMock(DefinitionPatternMatcher.class);
-        final DefinitionPatternMatcher thirdMatcher = createMock(DefinitionPatternMatcher.class);
-
-        Definition firstDefinition = new Definition("first", (Attribute) null,
-                null);
-        Definition secondDefinition = new Definition("second",
-                (Attribute) null, null);
-        Definition thirdDefinition = new Definition("third", (Attribute) null,
-                null);
-
-        Definition firstTransformedDefinition = new Definition(
-                "firstTransformed", (Attribute) null, null);
-        Definition thirdTransformedDefinition = new Definition(
-                "thirdTransformed", (Attribute) null, null);
-
-        expect(firstMatcher.createDefinition("firstTransformed")).andReturn(
-                firstTransformedDefinition);
-        expect(firstMatcher.createDefinition("secondTransformed")).andReturn(
-                null);
-        expect(firstMatcher.createDefinition("thirdTransformed")).andReturn(
-                null);
-        expect(thirdMatcher.createDefinition("thirdTransformed")).andReturn(
-                thirdTransformedDefinition).times(2);
-        expect(thirdMatcher.createDefinition("firstTransformed")).andReturn(
-                null);
-        expect(thirdMatcher.createDefinition("secondTransformed")).andReturn(
-                null).times(2);
-
-        replay(firstMatcher, thirdMatcher);
-        PatternDefinitionResolver<Integer> resolver = new AbstractPatternDefinitionResolver<Integer>() {
-
-            @Override
-            protected Map<String, Definition> addDefinitionsAsPatternMatchers(
-                    List<DefinitionPatternMatcher> matchers,
-                    Map<String, Definition> defsMap) {
-                if (defsMap.containsKey("first")) {
-                    matchers.add(firstMatcher);
-                }
-                if (defsMap.containsKey("third")) {
-                    matchers.add(thirdMatcher);
-                }
-                Map<String, Definition> retValue = new HashMap<String, Definition>(defsMap);
-                retValue.remove("first");
-                retValue.remove("third");
-                return retValue;
-            }
-
-        };
-        Map<String, Definition> localeDefsMap = new LinkedHashMap<String, Definition>();
-        localeDefsMap.put("first", firstDefinition);
-        localeDefsMap.put("second", secondDefinition);
-        localeDefsMap.put("third", thirdDefinition);
-        resolver.storeDefinitionPatterns(localeDefsMap, 1);
-        localeDefsMap = new LinkedHashMap<String, Definition>();
-        localeDefsMap.put("third", thirdDefinition);
-        resolver.storeDefinitionPatterns(localeDefsMap, 2);
-        assertEquals(firstTransformedDefinition, resolver.resolveDefinition(
-                "firstTransformed", 1));
-        assertNull(resolver.resolveDefinition("secondTransformed", 1));
-        assertEquals(thirdTransformedDefinition, resolver.resolveDefinition(
-                "thirdTransformed", 1));
-        assertNull(resolver.resolveDefinition("firstTransformed", 2));
-        assertNull(resolver.resolveDefinition("secondTransformed", 2));
-        assertEquals(thirdTransformedDefinition, resolver.resolveDefinition(
-                "thirdTransformed", 2));
-        verify(firstMatcher, thirdMatcher);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolverTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolverTest.java
deleted file mode 100644
index 31627ec..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/BasicPatternDefinitionResolverTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.junit.Test;
-
-/**
- * Tests {@link BasicPatternDefinitionResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class BasicPatternDefinitionResolverTest {
-
-    /**
-     * Test method for
-     * {@link BasicPatternDefinitionResolver#addDefinitionsAsPatternMatchers(java.util.List, Map)}.
-     */
-    @Test
-    public void testAddDefinitionsAsPatternMatchers() {
-        DefinitionPatternMatcherFactory factory = createMock(DefinitionPatternMatcherFactory.class);
-        PatternRecognizer recognizer = createMock(PatternRecognizer.class);
-        DefinitionPatternMatcher firstMatcher = createMock(DefinitionPatternMatcher.class);
-        DefinitionPatternMatcher thirdMatcher = createMock(DefinitionPatternMatcher.class);
-
-        expect(recognizer.isPatternRecognized("first")).andReturn(true);
-        expect(recognizer.isPatternRecognized("second")).andReturn(false);
-        expect(recognizer.isPatternRecognized("third")).andReturn(true);
-
-        Definition firstDefinition = new Definition("first", (Attribute) null,
-                null);
-        Definition secondDefinition = new Definition("second",
-                (Attribute) null, null);
-        Definition thirdDefinition = new Definition("third", (Attribute) null,
-                null);
-
-        expect(factory.createDefinitionPatternMatcher("first", firstDefinition))
-                .andReturn(firstMatcher);
-        expect(factory.createDefinitionPatternMatcher("third", thirdDefinition))
-                .andReturn(thirdMatcher);
-
-        replay(factory, recognizer, firstMatcher, thirdMatcher);
-        BasicPatternDefinitionResolver<Integer> resolver = new BasicPatternDefinitionResolver<Integer>(
-                factory, recognizer);
-        Map<String, Definition> localeDefsMap = new LinkedHashMap<String, Definition>();
-        localeDefsMap.put("first", firstDefinition);
-        localeDefsMap.put("second", secondDefinition);
-        localeDefsMap.put("third", thirdDefinition);
-        List<DefinitionPatternMatcher> matchers = new ArrayList<DefinitionPatternMatcher>();
-        resolver.addDefinitionsAsPatternMatchers(matchers, localeDefsMap);
-        assertEquals(2, matchers.size());
-        assertEquals(firstMatcher, matchers.get(0));
-        assertEquals(thirdMatcher, matchers.get(1));
-        verify(factory, recognizer, firstMatcher, thirdMatcher);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
deleted file mode 100644
index 66218db..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PatternUtilTest.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.Expression;
-import org.apache.tiles.ListAttribute;
-import org.junit.Test;
-
-/**
- * Tests {@link PatternUtil}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class PatternUtilTest {
-
-    /**
-     * The size of the list in the main list attribute.
-     */
-    private static final int LIST_ATTRIBUTE_SIZE = 3;
-
-    /**
-     * Test method for
-     * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
-     */
-    @Test
-    public void testReplacePlaceholders() {
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("attrib1", new Attribute("value{2}"));
-        attributes.put("attrib2", new Attribute("value{2}{3}"));
-        attributes.put("attrib3", new Attribute(null, Expression
-                .createExpression("expr{1}", "EL"), null, null));
-        Definition definition = new Definition("definitionName", new Attribute(
-                "template{1}"), attributes);
-        definition.setExtends("{2}ext");
-        definition.setPreparer("{3}prep");
-        Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
-                "value0", "value1", "value2", "value3");
-        assertEquals("nudef", nudef.getName());
-        assertEquals("value2ext", nudef.getExtends());
-        assertEquals("value3prep", nudef.getPreparer());
-        Attribute attribute = nudef.getTemplateAttribute();
-        assertEquals("templatevalue1", attribute.getValue());
-        attribute = nudef.getAttribute("attrib1");
-        assertEquals("valuevalue2", attribute.getValue());
-        attribute = nudef.getAttribute("attrib2");
-        assertEquals("valuevalue2value3", attribute.getValue());
-        attribute = nudef.getAttribute("attrib3");
-        assertEquals("exprvalue1", attribute.getExpressionObject().getExpression());
-    }
-
-    /**
-     * Test method for
-     * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
-     */
-    @Test
-    public void testReplacePlaceholdersNullTemplate() {
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("attrib1", new Attribute("value{2}"));
-        attributes.put("attrib2", new Attribute("value{2}{3}"));
-        Definition definition = new Definition("definitionName", (Attribute) null, attributes);
-        Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
-                "value0", "value1", "value2", "value3");
-        assertEquals("nudef", nudef.getName());
-        assertNull(nudef.getTemplateAttribute());
-        Attribute attribute = nudef.getAttribute("attrib1");
-        assertEquals("valuevalue2", attribute.getValue());
-        attribute = nudef.getAttribute("attrib2");
-        assertEquals("valuevalue2value3", attribute.getValue());
-    }
-
-    /**
-     * Test method for
-     * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
-     */
-    @Test
-    public void testReplacePlaceholdersCascadedAttributes() {
-        Definition definition = new Definition("definitionName", new Attribute(
-                "template{1}"), null);
-        definition.putAttribute("attrib1", new Attribute("value{2}"), true);
-        definition.putAttribute("attrib2", new Attribute("value{2}{3}"), true);
-        Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
-                "value0", "value1", "value2", "value3");
-        assertEquals("nudef", nudef.getName());
-        Attribute attribute = nudef.getTemplateAttribute();
-        assertEquals("templatevalue1", attribute.getValue());
-        attribute = nudef.getAttribute("attrib1");
-        assertEquals("valuevalue2", attribute.getValue());
-        attribute = nudef.getAttribute("attrib2");
-        assertEquals("valuevalue2value3", attribute.getValue());
-    }
-
-    /**
-     * Test method for
-     * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
-     */
-    @Test
-    public void testReplacePlaceholdersListAttribute() {
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        ListAttribute listAttribute = new ListAttribute();
-        ListAttribute internalListAttribute = new ListAttribute();
-        listAttribute.setInherit(true);
-        attributes.put("myList", listAttribute);
-        listAttribute.add(new Attribute("value{2}"));
-        listAttribute.add(new Attribute("value{2}{3}"));
-        listAttribute.add(internalListAttribute);
-        internalListAttribute.add(new Attribute("secondvalue{2}"));
-        internalListAttribute.add(new Attribute("secondvalue{2}{3}"));
-        Definition definition = new Definition("definitionName", new Attribute(
-                "template{1}"), attributes);
-        Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
-                "value0", "value1", "value2", "value3");
-        assertEquals("nudef", nudef.getName());
-        Attribute attribute = nudef.getTemplateAttribute();
-        assertEquals("templatevalue1", attribute.getValue());
-        ListAttribute nuListAttribute = (ListAttribute) nudef.getAttribute("myList");
-        assertTrue(nuListAttribute.isInherit());
-        List<Attribute> list = nuListAttribute.getValue();
-        assertEquals(LIST_ATTRIBUTE_SIZE, list.size());
-        attribute = list.get(0);
-        assertEquals("valuevalue2", attribute.getValue());
-        attribute = list.get(1);
-        assertEquals("valuevalue2value3", attribute.getValue());
-        ListAttribute evaluatedListAttribute = (ListAttribute) list.get(2);
-        assertFalse(evaluatedListAttribute.isInherit());
-        list = evaluatedListAttribute.getValue();
-        assertEquals(2, list.size());
-        attribute = list.get(0);
-        assertEquals("secondvaluevalue2", attribute.getValue());
-        attribute = list.get(1);
-        assertEquals("secondvaluevalue2value3", attribute.getValue());
-    }
-
-
-    /**
-     * Tests {@link PatternUtil#createExtractedMap(Map, java.util.Set)}.
-     */
-    @Test
-    public void testCreateExtractedMap() {
-        Map<Integer, String> map = new HashMap<Integer, String>();
-        map.put(0, "value0");
-        map.put(1, "value1");
-        map.put(2, "value2");
-        Set<Integer> set = new HashSet<Integer>();
-        set.add(1);
-        set.add(2);
-        Map<Integer, String> extractedMap = PatternUtil.createExtractedMap(map, set);
-        assertEquals(2, extractedMap.size());
-        assertEquals("value1", extractedMap.get(1));
-        assertEquals("value2", extractedMap.get(2));
-    }
-
-    /**
-     * Test method for
-     * {@link PatternUtil#replacePlaceholders(Definition, String, Object[])}.
-     * See TILES-502
-     */
-    @Test
-    public void testReplacePlaceholdersEL() {
-        Map<String, Attribute> attributes = new HashMap<String, Attribute>();
-        attributes.put("something", new Attribute("some-{1}-${requestScope.someVariable}.jsp"));
-        Definition definition = new Definition("definitionName", new Attribute(
-                "template"), attributes);
-        Definition nudef = PatternUtil.replacePlaceholders(definition, "nudef",
-                "value0", "value1", "value2", "value3");
-        assertEquals("nudef", nudef.getName());
-        Attribute attribute = nudef.getAttribute("something");
-        assertEquals("some-value1-${requestScope.someVariable}.jsp", attribute.getValue());
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolverTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolverTest.java
deleted file mode 100644
index aa5f525..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/PrefixedPatternDefinitionResolverTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.junit.Test;
-
-/**
- * Tests {@link PrefixedPatternDefinitionResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class PrefixedPatternDefinitionResolverTest {
-
-    /**
-     * Test method for {@link PrefixedPatternDefinitionResolver#addDefinitionsAsPatternMatchers(List, Map)}.
-     */
-    @Test
-    public void testAddDefinitionsAsPatternMatchers() {
-        DefinitionPatternMatcherFactory factory1 = createMock(DefinitionPatternMatcherFactory.class);
-        DefinitionPatternMatcherFactory factory2 = createMock(DefinitionPatternMatcherFactory.class);
-        DefinitionPatternMatcher matcher1 = createMock(DefinitionPatternMatcher.class);
-        DefinitionPatternMatcher matcher2 = createMock(DefinitionPatternMatcher.class);
-        Definition definition1 = new Definition("DF1:definition1", (Attribute) null, null);
-        Definition definition2 = new Definition("DF2:definition2", (Attribute) null, null);
-        Definition definition3 = new Definition("noLanguageHere", (Attribute) null, null);
-
-        expect(factory1.createDefinitionPatternMatcher("definition1", definition1)).andReturn(matcher1);
-        expect(factory2.createDefinitionPatternMatcher("definition2", definition2)).andReturn(matcher2);
-
-        replay(factory1, factory2, matcher1, matcher2);
-
-        PrefixedPatternDefinitionResolver<Integer> resolver = new PrefixedPatternDefinitionResolver<Integer>();
-        resolver.registerDefinitionPatternMatcherFactory("DF1", factory1);
-        resolver.registerDefinitionPatternMatcherFactory("DF2", factory2);
-        List<DefinitionPatternMatcher> matchers = new ArrayList<DefinitionPatternMatcher>();
-        Map<String, Definition> definitions = new LinkedHashMap<String, Definition>();
-        definitions.put("DF1:definition1", definition1);
-        definitions.put("DF2:definition2", definition2);
-        definitions.put("noLanguageHere", definition3);
-
-        resolver.addDefinitionsAsPatternMatchers(matchers, definitions);
-
-        assertEquals(2, matchers.size());
-        assertEquals(matcher1, matchers.get(0));
-        assertEquals(matcher2, matchers.get(1));
-
-        verify(factory1, factory2, matcher1, matcher2);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactoryTest.java
deleted file mode 100644
index bc21eb4..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherFactoryTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.regexp;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.Definition;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link RegexpDefinitionPatternMatcherFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class RegexpDefinitionPatternMatcherFactoryTest {
-
-    /**
-     * The object to test.
-     */
-    private RegexpDefinitionPatternMatcherFactory factory;
-
-    /**
-     * Sets up the object to test.
-     */
-    @Before
-    public void setUp() {
-        factory = new RegexpDefinitionPatternMatcherFactory();
-    }
-
-    /**
-     * Test method for
-     * {@link RegexpDefinitionPatternMatcherFactory#createDefinitionPatternMatcher(String, Definition)}
-     * .
-     */
-    @Test
-    public void testCreateDefinitionPatternMatcher() {
-        assertTrue(factory.createDefinitionPatternMatcher("myPattern",
-                new Definition()) instanceof RegexpDefinitionPatternMatcher);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherTest.java
deleted file mode 100644
index 9bf0c14..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/regexp/RegexpDefinitionPatternMatcherTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.regexp;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.junit.Test;
-
-/**
- * Tests {@link RegexpDefinitionPatternMatcher}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class RegexpDefinitionPatternMatcherTest {
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.definition.pattern.RegexpPatternDefinitionResolver
-     * #resolveDefinition(java.lang.String, java.lang.Object)}.
-     */
-    @Test
-    public void testResolveDefinition() {
-        Definition def = new Definition();
-        def.setName("testDef(.*)\\.message(.*)");
-        def.setTemplateAttribute(Attribute.createTemplateAttribute("/test{1}.jsp"));
-        def.putAttribute("body", new Attribute("message{2}"));
-        DefinitionPatternMatcher patternMatcher = new RegexpDefinitionPatternMatcher("testDef(.*)\\.message(.*)", def);
-        Definition result = patternMatcher.createDefinition("testDefOne.messageTwo");
-        assertNotNull(result);
-        assertEquals("testDefOne.messageTwo", result.getName());
-        assertEquals("/testOne.jsp", result.getTemplateAttribute().getValue());
-        assertEquals("messageTwo", result.getAttribute("body").getValue());
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactoryTest.java
deleted file mode 100644
index a8508f0..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherFactoryTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.wildcard;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.Definition;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link WildcardDefinitionPatternMatcherFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class WildcardDefinitionPatternMatcherFactoryTest {
-
-    /**
-     * The object to test.
-     */
-    private WildcardDefinitionPatternMatcherFactory factory;
-
-    /**
-     * Sets up the object to test.
-     */
-    @Before
-    public void setUp() {
-        factory = new WildcardDefinitionPatternMatcherFactory();
-    }
-
-    /**
-     * Test method for
-     * {@link WildcardDefinitionPatternMatcherFactory#createDefinitionPatternMatcher(String, Definition)}
-     * .
-     */
-    @Test
-    public void testCreateDefinitionPatternMatcher() {
-        assertTrue(factory.createDefinitionPatternMatcher("myPattern",
-                new Definition()) instanceof WildcardDefinitionPatternMatcher);
-    }
-
-    /**
-     * Test method for {@link WildcardDefinitionPatternMatcherFactory#isPatternRecognized(String)}.
-     */
-    @Test
-    public void testIsPatternRecognized() {
-        assertTrue(factory.isPatternRecognized("my*pattern"));
-        assertFalse(factory.isPatternRecognized("mypattern"));
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherTest.java
deleted file mode 100644
index 380f2ef..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/definition/pattern/wildcard/WildcardDefinitionPatternMatcherTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.definition.pattern.wildcard;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcher;
-import org.apache.tiles.util.WildcardHelper;
-import org.junit.Test;
-
-/**
- * Tests {@link WildcardDefinitionPatternMatcher}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class WildcardDefinitionPatternMatcherTest {
-
-    /**
-     * Test method for {@link WildcardDefinitionPatternMatcher#createDefinition(String)}.
-     */
-    @Test
-    public void testResolveDefinition() {
-        Definition def = new Definition();
-        def.setName("testDef*.message*");
-        def.setTemplateAttribute(Attribute.createTemplateAttribute("/test{1}.jsp"));
-        def.putAttribute("body", new Attribute("message{2}"));
-        DefinitionPatternMatcher patternMatcher = new WildcardDefinitionPatternMatcher(
-                "testDef*.message*", def, new WildcardHelper());
-        Definition result = patternMatcher.createDefinition("testDefOne.messageTwo");
-        assertNotNull(result);
-        assertEquals("testDefOne.messageTwo", result.getName());
-        assertEquals("/testOne.jsp", result.getTemplateAttribute().getValue());
-        assertEquals("messageTwo", result.getAttribute("body").getValue());
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactoryTest.java
deleted file mode 100644
index 4733fd3..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/BasicAttributeEvaluatorFactoryTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.junit.Test;
-
-/**
- * Tests {@link BasicAttributeEvaluatorFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class BasicAttributeEvaluatorFactoryTest {
-
-    /**
-     * Test method for {@link BasicAttributeEvaluatorFactory#getAttributeEvaluator(String)}.
-     */
-    @Test
-    public void testGetAttributeEvaluatorString() {
-        AttributeEvaluator defaultEvaluator = createMock(AttributeEvaluator.class);
-        AttributeEvaluator evaluator1 = createMock(AttributeEvaluator.class);
-        AttributeEvaluator evaluator2 = createMock(AttributeEvaluator.class);
-        replay(defaultEvaluator, evaluator1, evaluator2);
-        BasicAttributeEvaluatorFactory factory = new BasicAttributeEvaluatorFactory(defaultEvaluator);
-        factory.registerAttributeEvaluator("LANG1", evaluator1);
-        factory.registerAttributeEvaluator("LANG2", evaluator2);
-        assertSame(evaluator1, factory.getAttributeEvaluator("LANG1"));
-        assertSame(evaluator2, factory.getAttributeEvaluator("LANG2"));
-        assertSame(defaultEvaluator, factory.getAttributeEvaluator("LANG3"));
-        verify(defaultEvaluator, evaluator1, evaluator2);
-    }
-
-    /**
-     * Test method for {@link BasicAttributeEvaluatorFactory#getAttributeEvaluator(Attribute)}.
-     */
-    @Test
-    public void testGetAttributeEvaluatorAttribute() {
-        AttributeEvaluator defaultEvaluator = createMock(AttributeEvaluator.class);
-        AttributeEvaluator evaluator1 = createMock(AttributeEvaluator.class);
-        AttributeEvaluator evaluator2 = createMock(AttributeEvaluator.class);
-        replay(defaultEvaluator, evaluator1, evaluator2);
-        BasicAttributeEvaluatorFactory factory = new BasicAttributeEvaluatorFactory(defaultEvaluator);
-        factory.registerAttributeEvaluator("LANG1", evaluator1);
-        factory.registerAttributeEvaluator("LANG2", evaluator2);
-        assertSame(evaluator1, factory
-                .getAttributeEvaluator(createExpressionAttribute("LANG1")));
-        assertSame(evaluator2, factory
-                .getAttributeEvaluator(createExpressionAttribute("LANG2")));
-        assertSame(defaultEvaluator, factory
-                .getAttributeEvaluator(createExpressionAttribute("LANG3")));
-        verify(defaultEvaluator, evaluator1, evaluator2);
-    }
-
-    /**
-     * Creates a sample attribute with an expression.
-     *
-     * @param language The expression language.
-     * @return The attribute.
-     */
-    private Attribute createExpressionAttribute(String language) {
-        return new Attribute(null, Expression.createExpression(
-                "myExpression", language), null, "string");
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/EvaluatorExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/EvaluatorExceptionTest.java
deleted file mode 100644
index 96cf391..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/EvaluatorExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.evaluator;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link EvaluationException}.
- *
- * @version $Rev$ $Date$
- */
-public class EvaluatorExceptionTest {
-
-    /**
-     * Test method for {@link EvaluationException#EvaluationException()}.
-     */
-    @Test
-    public void testEvaluationException() {
-        EvaluationException exception = new EvaluationException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link EvaluationException#EvaluationException(java.lang.String)}.
-     */
-    @Test
-    public void testEvaluationExceptionString() {
-        EvaluationException exception = new EvaluationException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link EvaluationException#EvaluationException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testEvaluationExceptionThrowable() {
-        Throwable cause = new Throwable();
-        EvaluationException exception = new EvaluationException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link EvaluationException#EvaluationException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testEvaluationExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        EvaluationException exception = new EvaluationException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluatorTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluatorTest.java
deleted file mode 100644
index 4b4e830..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/evaluator/impl/DirectAttributeEvaluatorTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.evaluator.impl;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link DirectAttributeEvaluator}.
- *
- * @version $Rev$ $Date$
- */
-public class DirectAttributeEvaluatorTest {
-
-    /**
-     * The evaluator to test.
-     */
-    private DirectAttributeEvaluator evaluator;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        evaluator = new DirectAttributeEvaluator();
-    }
-
-    /**
-     * Tests
-     * {@link DirectAttributeEvaluator#evaluate(Attribute, org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testEvaluate() {
-        String expression = "This is an expression";
-        Attribute attribute = new Attribute(null, Expression.createExpression(
-                expression, null), null, (String) null);
-        Object result = evaluator.evaluate(attribute, null);
-        assertEquals("The expression has not been evaluated correctly", result,
-                expression);
-        expression = "${attributeName}";
-        attribute.setExpressionObject(new Expression(expression));
-        result = evaluator.evaluate(attribute, null);
-        assertEquals("The expression has not been evaluated correctly", result,
-                expression);
-    }
-
-    /**
-     * Tests
-     * {@link DirectAttributeEvaluator#evaluate(Attribute, org.apache.tiles.request.Request)}.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testEvaluateNullAttribute() {
-        evaluator.evaluate((Attribute) null, null);
-    }
-
-    /**
-     * Tests
-     * {@link DirectAttributeEvaluator#evaluate(String, org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testEvaluateString() {
-        String expression = "This is an expression";
-        Object result = evaluator.evaluate(expression, null);
-        assertEquals("The expression has not been evaluated correctly", result,
-                expression);
-        expression = "${attributeName}";
-        result = evaluator.evaluate(expression, null);
-        assertEquals("The expression has not been evaluated correctly", result,
-                expression);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java
deleted file mode 100644
index 9e4cac4..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/BasicTilesContainerFactoryTest.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.factory;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.definition.DefinitionsFactory;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory;
-import org.apache.tiles.definition.digester.DigesterDefinitionsReader;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
-import org.apache.tiles.impl.BasicTilesContainer;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.locale.impl.DefaultLocaleResolver;
-import org.apache.tiles.preparer.factory.BasicPreparerFactory;
-import org.apache.tiles.preparer.factory.PreparerFactory;
-import org.apache.tiles.renderer.DefinitionRenderer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.locale.URLApplicationResource;
-import org.apache.tiles.request.render.BasicRendererFactory;
-import org.apache.tiles.request.render.ChainedDelegateRenderer;
-import org.apache.tiles.request.render.DispatchRenderer;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.render.RendererFactory;
-import org.apache.tiles.request.render.StringRenderer;
-import org.easymock.EasyMock;
-
-/**
- * Tests {@link BasicTilesContainerFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class BasicTilesContainerFactoryTest extends TestCase {
-
-    /**
-     * The factory to test.
-     */
-    private BasicTilesContainerFactory factory;
-
-    /**
-     * The context object.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The resource to load.
-     */
-    private ApplicationResource resource;
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        applicationContext = EasyMock.createMock(ApplicationContext.class);
-        resource = new URLApplicationResource("/org/apache/tiles/config/tiles-defs.xml", getClass().getResource(
-                "/org/apache/tiles/config/tiles-defs.xml"));
-        EasyMock.expect(applicationContext.getResource("/WEB-INF/tiles.xml")).andReturn(resource);
-        EasyMock.replay(applicationContext);
-        factory = new BasicTilesContainerFactory();
-    }
-
-    /**
-     * Tests {@link BasicTilesContainerFactory#createContainer(ApplicationContext)}.
-     */
-    public void testCreateContainer() {
-        TilesContainer container = factory.createContainer(applicationContext);
-        assertTrue("The class of the container is not correct", container instanceof BasicTilesContainer);
-    }
-
-    /**
-     * Tests {@link BasicTilesContainerFactory#createDefinitionsFactory(
-     * ApplicationContext, LocaleResolver)}.
-     */
-    public void testCreateDefinitionsFactory() {
-        LocaleResolver resolver = factory.createLocaleResolver(applicationContext);
-        DefinitionsFactory defsFactory = factory.createDefinitionsFactory(applicationContext, resolver);
-        assertTrue("The class of the definitions factory is not correct",
-                defsFactory instanceof UnresolvingLocaleDefinitionsFactory);
-    }
-
-    /**
-     * Tests {@link BasicTilesContainerFactory#createLocaleResolver(
-     * ApplicationContext)}.
-     */
-    public void testCreateLocaleResolver() {
-        LocaleResolver localeResolver = factory.createLocaleResolver(applicationContext);
-        assertTrue("The class of the locale resolver is not correct", localeResolver instanceof DefaultLocaleResolver);
-    }
-
-    /**
-     * Tests {@link BasicTilesContainerFactory#createDefinitionsReader(
-     * ApplicationContext)}.
-     */
-    public void testCreateDefinitionsReader() {
-        DefinitionsReader reader = factory.createDefinitionsReader(applicationContext);
-        assertTrue("The class of the reader is not correct", reader instanceof DigesterDefinitionsReader);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#getSources(ApplicationContext)}.
-     */
-    public void testGetSources() {
-        List<ApplicationResource> resources = factory.getSources(applicationContext);
-        assertEquals("The urls list is not one-sized", 1, resources.size());
-        assertEquals("The URL is not correct", resource, resources.get(0));
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createAttributeEvaluatorFactory(
-     * ApplicationContext, LocaleResolver)}.
-     */
-    public void testCreateAttributeEvaluatorFactory() {
-        LocaleResolver resolver = factory.createLocaleResolver(applicationContext);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = factory.createAttributeEvaluatorFactory(
-                applicationContext, resolver);
-        assertTrue("The class of the evaluator is not correct",
-                attributeEvaluatorFactory.getAttributeEvaluator((String) null) instanceof DirectAttributeEvaluator);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createPreparerFactory(ApplicationContext)}.
-     */
-    public void testCreatePreparerFactory() {
-        PreparerFactory preparerFactory = factory.createPreparerFactory(applicationContext);
-        assertTrue("The class of the preparer factory is not correct", preparerFactory instanceof BasicPreparerFactory);
-    }
-
-    /**
-     * Tests {@link BasicTilesContainerFactory#createRendererFactory(
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    public void testCreateRendererFactory() {
-        TilesContainer container = factory.createContainer(applicationContext);
-        LocaleResolver resolver = factory.createLocaleResolver(applicationContext);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = factory.createAttributeEvaluatorFactory(
-                applicationContext, resolver);
-        RendererFactory rendererFactory = factory.createRendererFactory(applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The class of the renderer factory is not correct", rendererFactory instanceof BasicRendererFactory);
-        Renderer renderer = rendererFactory.getRenderer("string");
-        assertNotNull("The string renderer is null", renderer);
-        assertTrue("The string renderer class is not correct", renderer instanceof StringRenderer);
-        renderer = rendererFactory.getRenderer("template");
-        assertNotNull("The template renderer is null", renderer);
-        assertTrue("The template renderer class is not correct", renderer instanceof DispatchRenderer);
-        renderer = rendererFactory.getRenderer("definition");
-        assertNotNull("The definition renderer is null", renderer);
-        assertTrue("The definition renderer class is not correct", renderer instanceof DefinitionRenderer);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createDefaultAttributeRenderer(BasicRendererFactory,
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    public void testCreateDefaultAttributeRenderer() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-        Renderer stringRenderer = createMock(Renderer.class);
-        Renderer templateRenderer = createMock(Renderer.class);
-        Renderer definitionRenderer = createMock(Renderer.class);
-
-        expect(rendererFactory.getRenderer("string")).andReturn(stringRenderer);
-        expect(rendererFactory.getRenderer("template")).andReturn(templateRenderer);
-        expect(rendererFactory.getRenderer("definition")).andReturn(definitionRenderer);
-
-        replay(container, attributeEvaluatorFactory, rendererFactory);
-        Renderer renderer = factory.createDefaultAttributeRenderer(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The default renderer class is not correct", renderer instanceof ChainedDelegateRenderer);
-        verify(container, attributeEvaluatorFactory, rendererFactory);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createStringAttributeRenderer(BasicRendererFactory,
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    public void testCreateStringAttributeRenderer() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-
-        replay(container, attributeEvaluatorFactory, rendererFactory);
-        Renderer renderer = factory.createStringAttributeRenderer(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The renderer class is not correct", renderer instanceof StringRenderer);
-        verify(container, attributeEvaluatorFactory, rendererFactory);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createTemplateAttributeRenderer(BasicRendererFactory,
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    public void testCreateTemplateAttributeRenderer() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-
-        replay(container, attributeEvaluatorFactory, rendererFactory);
-        Renderer renderer = factory.createTemplateAttributeRenderer(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The renderer class is not correct", renderer instanceof DispatchRenderer);
-        verify(container, attributeEvaluatorFactory, rendererFactory);
-    }
-
-    /**
-     * Tests
-     * {@link BasicTilesContainerFactory#createDefinitionAttributeRenderer(BasicRendererFactory,
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    public void testCreateDefinitionAttributeRenderer() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-
-        replay(container, attributeEvaluatorFactory, rendererFactory);
-        Renderer renderer = factory.createDefinitionAttributeRenderer(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The renderer class is not correct", renderer instanceof DefinitionRenderer);
-        verify(container, attributeEvaluatorFactory, rendererFactory);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/TilesContainerFactoryExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/TilesContainerFactoryExceptionTest.java
deleted file mode 100644
index 751ffea..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/factory/TilesContainerFactoryExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.factory;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link TilesContainerFactoryException}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContainerFactoryExceptionTest {
-
-    /**
-     * Test method for {@link TilesContainerFactoryException#TilesContainerFactoryException()}.
-     */
-    @Test
-    public void testTilesContainerFactoryException() {
-        TilesContainerFactoryException exception = new TilesContainerFactoryException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesContainerFactoryException#TilesContainerFactoryException(java.lang.String)}.
-     */
-    @Test
-    public void testTilesContainerFactoryExceptionString() {
-        TilesContainerFactoryException exception = new TilesContainerFactoryException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesContainerFactoryException#TilesContainerFactoryException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testTilesContainerFactoryExceptionThrowable() {
-        Throwable cause = new Throwable();
-        TilesContainerFactoryException exception = new TilesContainerFactoryException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesContainerFactoryException#TilesContainerFactoryException(String, Throwable)}.
-     */
-    @Test
-    public void testTilesContainerFactoryExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        TilesContainerFactoryException exception = new TilesContainerFactoryException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerTest.java
deleted file mode 100644
index 8c9f476..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URL;
-
-import junit.framework.TestCase;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.factory.BasicTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.locale.URLApplicationResource;
-import org.apache.tiles.request.render.CannotRenderException;
-import org.easymock.EasyMock;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-/**
- * @version $Rev$ $Date$
- */
-public class BasicTilesContainerTest extends TestCase {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(BasicTilesContainerTest.class);
-
-    /**
-     * A sample integer value to check object rendering.
-     */
-    private static final int SAMPLE_INT = 15;
-
-    /**
-     * The container.
-     */
-    private BasicTilesContainer container;
-
-    /** {@inheritDoc} */
-    @Override
-    public void setUp() {
-        ApplicationContext context = EasyMock
-                .createMock(ApplicationContext.class);
-        URL url = getClass().getResource("/org/apache/tiles/factory/test-defs.xml");
-        URLApplicationResource resource = new URLApplicationResource("/WEB-INF/tiles.xml", url);
-
-        EasyMock.expect(context.getResource("/WEB-INF/tiles.xml"))
-                .andReturn(resource);
-        EasyMock.replay(context);
-        AbstractTilesContainerFactory factory = new BasicTilesContainerFactory();
-        container = (BasicTilesContainer) factory.createContainer(context);
-    }
-
-    /**
-     * Tests basic Tiles container initialization.
-     */
-    public void testInitialization() {
-        assertNotNull(container);
-        assertNotNull(container.getPreparerFactory());
-        assertNotNull(container.getDefinitionsFactory());
-    }
-
-    /**
-     * Tests that attributes of type "object" won't be rendered.
-     *
-     * @throws IOException If something goes wrong, but it's not a Tiles
-     * exception.
-     */
-    public void testObjectAttribute() throws IOException {
-        Attribute attribute = new Attribute();
-        Request request = EasyMock.createMock(Request.class);
-        EasyMock.replay(request);
-        boolean exceptionFound = false;
-
-        attribute.setValue(new Integer(SAMPLE_INT)); // A simple object
-        try {
-            container.render(attribute, request);
-        } catch (CannotRenderException e) {
-            log.debug("Intercepted a TilesException, it is correct", e);
-            exceptionFound = true;
-        }
-
-        assertTrue("An attribute of 'object' type cannot be rendered",
-                exceptionFound);
-    }
-
-    /**
-     * Tests is attributes are rendered correctly according to users roles.
-     *
-     * @throws IOException If a problem arises during rendering or writing in the writer.
-     */
-    public void testAttributeCredentials() throws IOException {
-        Request request = EasyMock.createMock(Request.class);
-        EasyMock.expect(request.isUserInRole("myrole")).andReturn(Boolean.TRUE);
-        StringWriter writer = new StringWriter();
-        EasyMock.expect(request.getWriter()).andReturn(writer);
-        EasyMock.replay(request);
-        Attribute attribute = new Attribute("This is the value", "myrole");
-        attribute.setRenderer("string");
-        container.render(attribute, request);
-        writer.close();
-        assertEquals("The attribute should have been rendered",
-                "This is the value", writer.toString());
-        EasyMock.reset(request);
-        request = EasyMock.createMock(Request.class);
-        EasyMock.expect(request.isUserInRole("myrole")).andReturn(Boolean.FALSE);
-        EasyMock.replay(request);
-        writer = new StringWriter();
-        container.render(attribute, request);
-        writer.close();
-        assertNotSame("The attribute should have not been rendered",
-                "This is the value", writer);
-    }
-
-    /**
-     * Tests {@link BasicTilesContainer#evaluate(Attribute, Request)}.
-     */
-    public void testEvaluate() {
-        Request request = EasyMock.createMock(Request.class);
-        EasyMock.replay(request);
-        Attribute attribute = new Attribute("This is the value");
-        Object value = container.evaluate(attribute, request);
-        assertEquals("The attribute has not been evaluated correctly",
-                "This is the value", value);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java
deleted file mode 100644
index 941aeab..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/BasicTilesContainerUnitTest.java
+++ /dev/null
@@ -1,922 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.BasicAttributeContext;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.DefinitionsFactory;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.evaluator.AttributeEvaluator;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.preparer.factory.NoSuchPreparerException;
-import org.apache.tiles.preparer.factory.PreparerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.CannotRenderException;
-import org.apache.tiles.request.render.NoSuchRendererException;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.render.RendererFactory;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link BasicTilesContainer}.
- *
- * @version $Rev$ $Date$
- */
-public class BasicTilesContainerUnitTest {
-
-    /**
-     * Name used to store attribute context stack.
-     */
-    private static final String ATTRIBUTE_CONTEXT_STACK =
-        "org.apache.tiles.AttributeContext.STACK";
-
-    /**
-     * The application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The definitions factory.
-     */
-    private DefinitionsFactory definitionsFactory;
-
-    /**
-     * The preparer factory.
-     */
-    private PreparerFactory preparerFactory;
-
-    /**
-     * The renderer factory.
-     */
-    private RendererFactory rendererFactory;
-
-    /**
-     * The evaluator factory.
-     */
-    private AttributeEvaluatorFactory attributeEvaluatorFactory;
-
-    /**
-     * The container to test.
-     */
-    private BasicTilesContainer container;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        applicationContext = createMock(ApplicationContext.class);
-        definitionsFactory = createMock(DefinitionsFactory.class);
-        preparerFactory = createMock(PreparerFactory.class);
-        rendererFactory = createMock(RendererFactory.class);
-        attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        container = new BasicTilesContainer();
-        container.setApplicationContext(applicationContext);
-        container.setAttributeEvaluatorFactory(attributeEvaluatorFactory);
-        container.setDefinitionsFactory(definitionsFactory);
-        container.setPreparerFactory(preparerFactory);
-        container.setRendererFactory(rendererFactory);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#startContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testStartContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        expect(attributeContext.getCascadedAttributeNames()).andReturn(null);
-        deque.push(isA(BasicAttributeContext.class));
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        assertTrue(container.startContext(request) instanceof BasicAttributeContext);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#endContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testEndContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.pop()).andReturn(attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        container.endContext(request);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#renderContext(Request)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRenderContext() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        Renderer renderer = createMock(Renderer.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        expect(attributeContext.getPreparer()).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(rendererFactory.getRenderer("renderer")).andReturn(renderer);
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/mytemplate.jsp");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        renderer.render("/mytemplate.jsp", request);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, templateAttribute, renderer);
-        container.renderContext(request);
-        verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, templateAttribute, renderer);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getApplicationContext()}.
-     */
-    @Test
-    public void testGetApplicationContext() {
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-        assertEquals(applicationContext, container.getApplicationContext());
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getAttributeContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetAttributeContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        assertEquals(attributeContext, container.getAttributeContext(request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getAttributeContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetAttributeContextNew() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope).times(2);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque).times(2);
-        expect(deque.isEmpty()).andReturn(true);
-        deque.push(isA(BasicAttributeContext.class));
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        assertTrue(container.getAttributeContext(request) instanceof BasicAttributeContext);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getDefinitionsFactory()}.
-     */
-    @Test
-    public void testGetDefinitionsFactory() {
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-        assertEquals(definitionsFactory, container.getDefinitionsFactory());
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getPreparerFactory()}.
-     */
-    @Test
-    public void testGetPreparerFactory() {
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-        assertEquals(preparerFactory, container.getPreparerFactory());
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#prepare(java.lang.String, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testPrepare() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-
-        expect(preparerFactory.getPreparer("preparer", request)).andReturn(preparer);
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        preparer.execute(request, attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer);
-        container.prepare("preparer", request);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#prepare(java.lang.String, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = NoSuchPreparerException.class)
-    public void testPrepareException() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(preparerFactory.getPreparer("preparer", request)).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        try {
-            container.prepare("preparer", request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, requestScope, deque, attributeContext);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, java.lang.String)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRenderStringRequest() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-        Renderer renderer = createMock(Renderer.class);
-        Definition definition = createMock(Definition.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-
-        expect(definitionsFactory.getDefinition("definition", request)).andReturn(definition);
-        expect(request.getContext("request")).andReturn(requestScope).times(3);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque).times(3);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        expect(attributeContext.getPreparer()).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(attributeContext.getLocalAttributeNames()).andReturn(null);
-        expect(attributeContext.getCascadedAttributeNames()).andReturn(null);
-        expect(definition.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(rendererFactory.getRenderer("template")).andReturn(renderer);
-        deque.push(isA(BasicAttributeContext.class));
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/my/template.jsp");
-        renderer.render("/my/template.jsp", request);
-        expect(deque.pop()).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, renderer, definition);
-        container.render("definition", request);
-        verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, renderer, definition);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, java.lang.String)}.
-     */
-    @Test(expected = NoSuchDefinitionException.class)
-    public void testRenderStringRequestException() {
-        Request request = createMock(Request.class);
-
-        expect(definitionsFactory.getDefinition("definition", request)).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-        try {
-            container.render("definition", request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory,
-                    definitionsFactory, preparerFactory, rendererFactory);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRenderAttributeRequest() throws IOException {
-        Request request = createMock(Request.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        Renderer renderer = createMock(Renderer.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(rendererFactory.getRenderer("renderer")).andReturn(renderer);
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/mytemplate.jsp");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        renderer.render("/mytemplate.jsp", request);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute, renderer);
-        container.render(templateAttribute, request);
-        verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute, renderer);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test(expected = CannotRenderException.class)
-    public void testRenderAttributeRequestException1() throws IOException {
-        Request request = createMock(Request.class);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-        try {
-            container.render((Attribute) null, request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test(expected = NoSuchRendererException.class)
-    public void testRenderAttributeRequestException2() throws IOException {
-        Request request = createMock(Request.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        expect(rendererFactory.getRenderer("renderer")).andThrow(new NoSuchRendererException());
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute);
-        try {
-            container.render(templateAttribute, request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, templateAttribute);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test(expected = CannotRenderException.class)
-    public void testRenderAttributeRequestException3() throws IOException {
-        Request request = createMock(Request.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-        Renderer renderer = createMock(Renderer.class);
-
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        expect(rendererFactory.getRenderer("renderer")).andReturn(renderer);
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn(new Integer(1));
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute);
-        try {
-            container.render(templateAttribute, request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, templateAttribute);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test(expected = NoSuchRendererException.class)
-    public void testRenderAttributeRequestException() throws IOException {
-        Request request = createMock(Request.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        expect(rendererFactory.getRenderer("renderer")).andThrow(new NoSuchRendererException());
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute);
-        try {
-            container.render(templateAttribute, request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, templateAttribute);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#evaluate(org.apache.tiles.Attribute, Request)}.
-     */
-    @Test
-    public void testEvaluate() {
-        Request request = createMock(Request.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn(new Integer(1));
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute, evaluator);
-        assertEquals(new Integer(1), container.evaluate(templateAttribute, request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                templateAttribute, evaluator);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#isValidDefinition(java.lang.String, Request)}.
-     */
-    @Test
-    public void testIsValidDefinition() {
-        Request request = createMock(Request.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(definitionsFactory.getDefinition("definition", request)).andReturn(definition);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request, definition);
-        assertTrue(container.isValidDefinition("definition", request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request, definition);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#isValidDefinition(java.lang.String, Request)}.
-     */
-    @Test
-    public void testIsValidDefinitionNull() {
-        Request request = createMock(Request.class);
-
-        expect(definitionsFactory.getDefinition("definition", request)).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-        assertFalse(container.isValidDefinition("definition", request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#isValidDefinition(java.lang.String, Request)}.
-     */
-    @Test
-    public void testIsValidDefinitionException() {
-        Request request = createMock(Request.class);
-
-        expect(definitionsFactory.getDefinition("definition", request))
-                .andThrow(new NoSuchDefinitionException());
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-        assertFalse(container.isValidDefinition("definition", request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getDefinition(java.lang.String, Request)}.
-     */
-    @Test
-    public void testGetDefinition() {
-        Request request = createMock(Request.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(definitionsFactory.getDefinition("definition", request)).andReturn(definition);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request, definition);
-        assertEquals(definition, container.getDefinition("definition", request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request, definition);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getContextStack(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetContextStack() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque);
-        assertEquals(deque, container.getContextStack(request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getContextStack(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetContextStackNew() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(null);
-        expect(requestScope.put(eq(ATTRIBUTE_CONTEXT_STACK), isA(LinkedList.class))).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope);
-        assertTrue(container.getContextStack(request) instanceof LinkedList);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#pushContext(org.apache.tiles.AttributeContext, Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testPushContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        deque.push(attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        container.pushContext(attributeContext, request);
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#popContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testPopContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.pop()).andReturn(attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        assertEquals(attributeContext, container.popContext(request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetContext() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-        assertEquals(attributeContext, container.getContext(request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#getContext(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetContextNull() {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque);
-        expect(deque.isEmpty()).andReturn(true);
-
-        replay(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque);
-        assertNull(container.getContext(request));
-        verify(applicationContext, attributeEvaluatorFactory,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(org.apache.tiles.Definition, Request)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRenderRequestDefinition() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-        Renderer renderer = createMock(Renderer.class);
-        Definition definition = createMock(Definition.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-
-        expect(request.getContext("request")).andReturn(requestScope).times(3);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque).times(3);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        expect(attributeContext.getPreparer()).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(attributeContext.getLocalAttributeNames()).andReturn(null);
-        expect(attributeContext.getCascadedAttributeNames()).andReturn(null);
-        expect(definition.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(rendererFactory.getRenderer("template")).andReturn(renderer);
-        deque.push(isA(BasicAttributeContext.class));
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/my/template.jsp");
-        renderer.render("/my/template.jsp", request);
-        expect(deque.pop()).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, renderer, definition);
-        container.render(definition, request);
-        verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, renderer, definition);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(org.apache.tiles.Definition, Request)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = CannotRenderException.class)
-    public void testRenderRequestDefinitionException() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-        Renderer renderer = createMock(Renderer.class);
-        Definition definition = createMock(Definition.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        Attribute templateAttribute = Attribute.createTemplateAttribute("/my/template.jsp");
-
-        expect(request.getContext("request")).andReturn(requestScope).times(3);
-        expect(requestScope.get(ATTRIBUTE_CONTEXT_STACK)).andReturn(deque).times(3);
-        expect(deque.isEmpty()).andReturn(false);
-        expect(deque.peek()).andReturn(attributeContext);
-        expect(attributeContext.getPreparer()).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(attributeContext.getLocalAttributeNames()).andReturn(null);
-        expect(attributeContext.getCascadedAttributeNames()).andReturn(null);
-        expect(definition.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(rendererFactory.getRenderer("template")).andReturn(renderer);
-        deque.push(isA(BasicAttributeContext.class));
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/mytemplate.jsp");
-        renderer.render("/mytemplate.jsp", request);
-        expectLastCall().andThrow(new IOException());
-        expect(deque.pop()).andReturn(null);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, renderer, definition);
-        try {
-            container.render(definition, request);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, requestScope, deque, attributeContext, preparer,
-                    renderer, definition);
-        }
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.AttributeContext)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRenderRequestAttributeContext() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ViewPreparer preparer = createMock(ViewPreparer.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        Renderer renderer = createMock(Renderer.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(attributeContext.getPreparer()).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(rendererFactory.getRenderer("renderer")).andReturn(renderer);
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/mytemplate.jsp");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        renderer.render("/mytemplate.jsp", request);
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, templateAttribute, renderer);
-        container.render(request, attributeContext);
-        verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, preparer, templateAttribute, renderer);
-    }
-
-    /**
-     * Test method for {@link BasicTilesContainer#render(Request, org.apache.tiles.AttributeContext)}.
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = CannotRenderException.class)
-    public void testRenderRequestAttributeContextException() throws IOException {
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = createMock(Map.class);
-        Deque<AttributeContext> deque = createMock(Deque.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute templateAttribute = createMock(Attribute.class);
-        Renderer renderer = createMock(Renderer.class);
-        AttributeEvaluator evaluator = createMock(AttributeEvaluator.class);
-
-        expect(attributeContext.getPreparer()).andReturn("preparer").times(2);
-        expect(preparerFactory.getPreparer("preparer", request)).andReturn(null);
-        expect(attributeContext.getTemplateAttribute()).andReturn(templateAttribute);
-        expect(templateAttribute.getRenderer()).andReturn("renderer");
-        expect(rendererFactory.getRenderer("renderer")).andReturn(renderer);
-        expect(attributeEvaluatorFactory.getAttributeEvaluator(templateAttribute)).andReturn(evaluator);
-        expect(evaluator.evaluate(templateAttribute, request)).andReturn("/mytemplate.jsp");
-        expect(templateAttribute.isPermitted(request)).andReturn(true);
-        renderer.render("/mytemplate.jsp", request);
-        expectLastCall().andThrow(new IOException());
-
-        replay(applicationContext, attributeEvaluatorFactory, evaluator,
-                definitionsFactory, preparerFactory, rendererFactory, request,
-                requestScope, deque, attributeContext, templateAttribute, renderer);
-        try {
-            container.render(request, attributeContext);
-        } finally {
-            verify(applicationContext, attributeEvaluatorFactory, evaluator,
-                    definitionsFactory, preparerFactory, rendererFactory,
-                    request, requestScope, deque, attributeContext,
-                    templateAttribute, renderer);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/CannotRenderExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/CannotRenderExceptionTest.java
deleted file mode 100644
index 6e7c768..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/CannotRenderExceptionTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.impl;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.request.render.CannotRenderException;
-import org.junit.Test;
-
-/**
- * Tests {@link CannotRenderException}.
- *
- * @version $Rev$ $Date$
- */
-public class CannotRenderExceptionTest {
-
-    /**
-     * Test method for {@link CannotRenderException#CannotRenderException()}.
-     */
-    @Test
-    public void testCannotRenderException() {
-        CannotRenderException exception = new CannotRenderException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link CannotRenderException#CannotRenderException(java.lang.String)}.
-     */
-    @Test
-    public void testCannotRenderExceptionString() {
-        CannotRenderException exception = new CannotRenderException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link CannotRenderException#CannotRenderException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testCannotRenderExceptionThrowable() {
-        Throwable cause = new Throwable();
-        CannotRenderException exception = new CannotRenderException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link CannotRenderException#CannotRenderException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testCannotRenderExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        CannotRenderException exception = new CannotRenderException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/InvalidTemplateExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/InvalidTemplateExceptionTest.java
deleted file mode 100644
index 0910d12..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/InvalidTemplateExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.impl;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link InvalidTemplateException}.
- *
- * @version $Rev$ $Date$
- */
-public class InvalidTemplateExceptionTest {
-
-    /**
-     * Test method for {@link InvalidTemplateException#InvalidTemplateException()}.
-     */
-    @Test
-    public void testInvalidTemplateException() {
-        InvalidTemplateException exception = new InvalidTemplateException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link InvalidTemplateException#InvalidTemplateException(java.lang.String)}.
-     */
-    @Test
-    public void testInvalidTemplateExceptionString() {
-        InvalidTemplateException exception = new InvalidTemplateException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link InvalidTemplateException#InvalidTemplateException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testInvalidTemplateExceptionThrowable() {
-        Throwable cause = new Throwable();
-        InvalidTemplateException exception = new InvalidTemplateException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link InvalidTemplateException#InvalidTemplateException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testInvalidTemplateExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        InvalidTemplateException exception = new InvalidTemplateException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java
deleted file mode 100644
index befcfdb..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/impl/mgmt/CachingTilesContainerTest.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.impl.mgmt;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Definition;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.definition.NoSuchDefinitionException;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link CachingTilesContainer}.
- *
- * @version $Rev$ $Date$
- */
-public class CachingTilesContainerTest {
-
-    /**
-     * The default name of the attribute in which storing custom definitions.
-     */
-    private static final String DEFAULT_DEFINITIONS_ATTRIBUTE_NAME =
-        "org.apache.tiles.impl.mgmt.DefinitionManager.DEFINITIONS";
-
-    /**
-     * The wrapped Tiles container.
-     */
-    private TilesContainer wrapped;
-
-    /**
-     * The Tiles container to test.
-     */
-    private CachingTilesContainer container;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        wrapped = createMock(TilesContainer.class);
-        container = new CachingTilesContainer(wrapped);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#CachingTilesContainer(TilesContainer, String)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testCachingTilesContainerTilesContainerString() {
-        TilesContainer wrapped = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get("myattribute")).andReturn(definitions);
-        expect(definitions.get("definition")).andReturn(definition);
-
-        replay(wrapped, request, definitions, scope, definition);
-        CachingTilesContainer container = new CachingTilesContainer(wrapped,
-                "myattribute");
-        assertSame(definition, container.getDefinition("definition", request));
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#CachingTilesContainer(TilesContainer, String)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testCachingTilesContainer() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-        TilesContainer wrapped = createMock(TilesContainer.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(definition);
-
-        replay(wrapped, request, definitions, scope, definition);
-        CachingTilesContainer container = new CachingTilesContainer(wrapped,
-                null);
-        assertSame(definition, container.getDefinition("definition", request));
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#getDefinition(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetDefinition() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(definition);
-
-        replay(wrapped, request, definitions, scope, definition);
-        assertSame(definition, container.getDefinition("definition", request));
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#getDefinition(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetDefinitionContainer() {
-        Request request = createMock(Request.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                null);
-        expect(wrapped.getDefinition("definition", request)).andReturn(
-                definition);
-
-        replay(wrapped, request, scope, definition);
-        assertSame(definition, container.getDefinition("definition", request));
-        verify(wrapped, request, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#isValidDefinition(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testIsValidDefinition() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(definition);
-
-        replay(wrapped, request, definitions, scope, definition);
-        assertTrue(container.isValidDefinition("definition", request));
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#isValidDefinition(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testIsValidDefinitionContainer() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(null);
-        expect(wrapped.isValidDefinition("definition", request)).andReturn(true);
-
-        replay(wrapped, request, definitions, scope);
-        assertTrue(container.isValidDefinition("definition", request));
-        verify(wrapped, request, definitions, scope);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#register(Definition, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRegister() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definition.getName()).andReturn(null);
-        expect(definitions.containsKey("$anonymousMutableDefinition1"))
-                .andReturn(false);
-        definition.setName("$anonymousMutableDefinition1");
-        expect(definition.isExtending()).andReturn(true);
-        // trick to test resolve definition separately.
-        expect(definition.isExtending()).andReturn(false);
-        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
-        expect(definitions.put("$anonymousMutableDefinition1", definition))
-                .andReturn(null);
-
-        replay(wrapped, request, definitions, scope, definition);
-        container.register(definition, request);
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#register(Definition, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRegisterInheritance() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-        Definition parent = createMock(Definition.class);
-        Definition grandparent = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope).anyTimes();
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions).anyTimes();
-        expect(definition.getName()).andReturn(null);
-        expect(definitions.containsKey("$anonymousMutableDefinition1"))
-                .andReturn(false);
-        definition.setName("$anonymousMutableDefinition1");
-        expect(definition.isExtending()).andReturn(true);
-        // trick to test resolve definition separately.
-        expect(definition.isExtending()).andReturn(true);
-        expect(definition.getExtends()).andReturn("parent");
-        expect(definitions.get("parent")).andReturn(parent);
-        expect(parent.isExtending()).andReturn(true);
-        expect(parent.getExtends()).andReturn("grandparent");
-        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
-        expect(definitions.get("grandparent")).andReturn(null);
-        expect(wrapped.getDefinition("grandparent", request)).andReturn(
-                grandparent);
-        parent.inherit(grandparent);
-        definition.inherit(parent);
-        expect(definitions.put("$anonymousMutableDefinition1", definition))
-                .andReturn(null);
-
-        replay(wrapped, request, definitions, scope, definition, parent,
-                grandparent);
-        container.register(definition, request);
-        verify(wrapped, request, definitions, scope, definition, parent,
-                grandparent);
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#register(Definition, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = NoSuchDefinitionException.class)
-    public void testRegisterInheritanceFail() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope).anyTimes();
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions).anyTimes();
-        expect(definition.getName()).andReturn(null);
-        expect(definitions.containsKey("$anonymousMutableDefinition1"))
-                .andReturn(false);
-        definition.setName("$anonymousMutableDefinition1");
-        expect(definition.isExtending()).andReturn(true);
-        // trick to test resolve definition separately.
-        expect(definition.isExtending()).andReturn(true);
-        expect(definition.getExtends()).andReturn("parent");
-        expect(definitions.get("parent")).andReturn(null);
-        expect(wrapped.getDefinition("parent", request)).andReturn(null);
-        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
-
-        replay(wrapped, request, definitions, scope, definition);
-        try {
-            container.register(definition, request);
-        } finally {
-            verify(wrapped, request, definitions, scope, definition);
-        }
-    }
-
-    /**
-     * Test method for
-     * {@link CachingTilesContainer#register(Definition, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRegisterCreateDefinitions() {
-        Request request = createMock(Request.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope).anyTimes();
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                null);
-        expect(scope.put(eq(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME), isA(HashMap.class))).andReturn(null);
-        expect(definition.getName()).andReturn(null);
-        definition.setName("$anonymousMutableDefinition1");
-        expect(definition.isExtending()).andReturn(true);
-        // trick to test resolve definition separately.
-        expect(definition.isExtending()).andReturn(false);
-        expect(definition.getName()).andReturn("$anonymousMutableDefinition1");
-
-        replay(wrapped, request, scope, definition);
-        container.register(definition, request);
-        verify(wrapped, request, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#render(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testRender() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-        Definition definition = createMock(Definition.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(definition);
-        container.render(definition, request);
-
-        replay(wrapped, request, definitions, scope, definition);
-        container.render("definition", request);
-        verify(wrapped, request, definitions, scope, definition);
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.impl.mgmt.CachingTilesContainer#render(String, Request)}
-     * .
-     */
-    @SuppressWarnings("unchecked")
-    @Test(expected = NoSuchDefinitionException.class)
-    public void testRenderFail() {
-        Request request = createMock(Request.class);
-        Map<String, Definition> definitions = createMock(Map.class);
-        Map<String, Object> scope = createMock(Map.class);
-
-        expect(request.getContext("request")).andReturn(scope);
-        expect(scope.get(DEFAULT_DEFINITIONS_ATTRIBUTE_NAME)).andReturn(
-                definitions);
-        expect(definitions.get("definition")).andReturn(null);
-        expect(wrapped.getDefinition("definition", request)).andReturn(null);
-
-        replay(wrapped, request, definitions, scope);
-        try {
-            container.render("definition", request);
-        } finally {
-            verify(wrapped, request, definitions, scope);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/locale/impl/DefaultLocaleResolverTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/locale/impl/DefaultLocaleResolverTest.java
deleted file mode 100644
index d7933ee..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/locale/impl/DefaultLocaleResolverTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.locale.impl;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link DefaultLocaleResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class DefaultLocaleResolverTest {
-
-    /**
-     * Test method for {@link DefaultLocaleResolver#resolveLocale(Request)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testResolveLocale() {
-        Request request = createMock(Request.class);
-        Map<String, Object> sessionScope = createMock(Map.class);
-        Locale locale = Locale.ITALY;
-
-        expect(request.getContext("session")).andReturn(sessionScope);
-        expect(sessionScope.get(DefaultLocaleResolver.LOCALE_KEY)).andReturn(null);
-        expect(request.getRequestLocale()).andReturn(locale);
-
-        replay(request, sessionScope);
-        DefaultLocaleResolver resolver = new DefaultLocaleResolver();
-        assertSame(locale, resolver.resolveLocale(request));
-        verify(request, sessionScope);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/BasicPreparerFactoryTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/BasicPreparerFactoryTest.java
deleted file mode 100644
index e03cd85..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/BasicPreparerFactoryTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.preparer.factory;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-import junit.framework.TestCase;
-
-/**
- * Tests the basic preparer factory.
- *
- * @version $Rev$ $Date$
- */
-public class BasicPreparerFactoryTest extends TestCase {
-
-    /**
-     * The preparer factory.
-     */
-    private BasicPreparerFactory factory;
-
-    /** {@inheritDoc} */
-    @Override
-    public void setUp() {
-        factory = new BasicPreparerFactory();
-    }
-
-    /**
-     * Tests getting a preparer.
-     */
-    public void testGetPreparer() {
-        String name = MockViewPreparer.class.getName();
-        ViewPreparer p = factory.getPreparer(name, null);
-        assertNotNull(p);
-        assertTrue(p instanceof MockViewPreparer);
-
-        name = "org.doesnotexist.Class";
-        p = factory.getPreparer(name, null);
-        assertNull(p);
-    }
-
-    /**
-     * Mock view preparer.
-     *
-     * @version $Rev$ $Date$
-     */
-    public static class MockViewPreparer implements ViewPreparer {
-
-        /** {@inheritDoc} */
-        public void execute(Request tilesContext,
-                            AttributeContext attributeContext) {
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/NoSuchPreparerExceptionTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/NoSuchPreparerExceptionTest.java
deleted file mode 100644
index 44825b9..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/preparer/factory/NoSuchPreparerExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.preparer.factory;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link NoSuchPreparerException}.
- *
- * @version $Rev$ $Date$
- */
-public class NoSuchPreparerExceptionTest {
-
-    /**
-     * Test method for {@link NoSuchPreparerException#NoSuchPreparerException()}.
-     */
-    @Test
-    public void testNoSuchPreparerException() {
-        NoSuchPreparerException exception = new NoSuchPreparerException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchPreparerException#NoSuchPreparerException(java.lang.String)}.
-     */
-    @Test
-    public void testNoSuchPreparerExceptionString() {
-        NoSuchPreparerException exception = new NoSuchPreparerException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchPreparerException#NoSuchPreparerException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testNoSuchPreparerExceptionThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchPreparerException exception = new NoSuchPreparerException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link NoSuchPreparerException#NoSuchPreparerException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testNoSuchPreparerExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        NoSuchPreparerException exception = new NoSuchPreparerException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/renderer/DefinitionRendererTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/renderer/DefinitionRendererTest.java
deleted file mode 100644
index 6bc1134..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/renderer/DefinitionRendererTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.renderer;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.CannotRenderException;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link DefinitionRenderer}.
- *
- * @version $Rev$ $Date$
- */
-public class DefinitionRendererTest {
-
-    /**
-     * The renderer.
-     */
-    private DefinitionRenderer renderer;
-
-    /**
-     * The container.
-     */
-    private TilesContainer container;
-
-    /** {@inheritDoc} */
-    @Before
-    public void setUp() {
-        container = createMock(TilesContainer.class);
-        renderer = new DefinitionRenderer(container);
-    }
-
-    /**
-     * Tests
-     * {@link DefinitionRenderer#render(String, Request)}.
-     *
-     * @throws IOException If something goes wrong during rendition.
-     */
-    @Test
-    public void testWrite() throws IOException {
-        Request requestContext = createMock(Request.class);
-        container.render("my.definition", requestContext);
-        replay(requestContext, container);
-        renderer.render("my.definition", requestContext);
-        verify(requestContext, container);
-    }
-
-    /**
-     * Tests
-     * {@link DefinitionRenderer#render(String, Request)}.
-     *
-     * @throws IOException If something goes wrong during rendition.
-     */
-    @Test(expected = CannotRenderException.class)
-    public void testRenderException() throws IOException {
-        Request requestContext = createMock(Request.class);
-        replay(requestContext, container);
-        try {
-            renderer.render(null, requestContext);
-        } finally {
-            verify(requestContext, container);
-        }
-    }
-
-    /**
-     * Tests
-     * {@link DefinitionRenderer#isRenderable(String, Request)}
-     * .
-     */
-    @Test
-    public void testIsRenderable() {
-        Request requestContext = createMock(Request.class);
-        expect(container.isValidDefinition("my.definition", requestContext)).andReturn(Boolean.TRUE);
-        replay(requestContext, container);
-        assertTrue(renderer.isRenderable("my.definition", requestContext));
-        assertFalse(renderer.isRenderable(null, requestContext));
-        verify(requestContext, container);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java
deleted file mode 100644
index 361ff45..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/AbstractTilesInitializerTest.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.startup;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.Map;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link AbstractTilesInitializer}.
- *
- * @version $Rev$ $Date$
- */
-public class AbstractTilesInitializerTest {
-
-    /**
-     * A mock Tiles container factory.
-     */
-    private AbstractTilesContainerFactory containerFactory;
-
-    /**
-     * The object to test.
-     */
-    private AbstractTilesInitializer initializer;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        containerFactory = createMock(AbstractTilesContainerFactory.class);
-        initializer = new AbstractTilesInitializer() {
-
-            @Override
-            protected AbstractTilesContainerFactory createContainerFactory(
-                    ApplicationContext context) {
-                return containerFactory;
-            }
-        };
-    }
-
-    /**
-     * Test method for {@link AbstractTilesInitializer#initialize(ApplicationContext)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testInitialize() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> scope = createMock(Map.class);
-
-        expect(containerFactory.createContainer(context)).andReturn(container);
-        expect(context.getApplicationScope()).andReturn(scope).anyTimes();
-        expect(scope.put(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE,
-                context)).andReturn(null);
-        expect(scope.put(TilesAccess.CONTAINER_ATTRIBUTE, container)).andReturn(null);
-        expect(scope.remove(TilesAccess.CONTAINER_ATTRIBUTE)).andReturn(container);
-
-        replay(containerFactory, context, container, scope);
-        initializer.initialize(context);
-        initializer.destroy();
-        verify(containerFactory, context, container, scope);
-    }
-
-    /**
-     * Test method for {@link AbstractTilesInitializer#createTilesApplicationContext(ApplicationContext)}.
-     */
-    @Test
-    public void testCreateTilesApplicationContext() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        replay(containerFactory, context);
-        assertEquals(context, initializer.createTilesApplicationContext(context));
-        verify(containerFactory, context);
-    }
-
-    /**
-     * Test method for {@link AbstractTilesInitializer#getContainerKey(ApplicationContext)}.
-     */
-    @Test
-    public void testGetContainerKey() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        replay(containerFactory, context);
-        assertNull(initializer.getContainerKey(context));
-        verify(containerFactory, context);
-    }
-
-    /**
-     * Test method for {@link AbstractTilesInitializer#createContainer(ApplicationContext)}.
-     */
-    @Test
-    public void testCreateContainer() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-
-        expect(containerFactory.createContainer(context)).andReturn(container);
-
-        replay(containerFactory, context, container);
-        assertEquals(container, initializer.createContainer(context));
-        verify(containerFactory, context, container);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/DefaultTilesInitializerTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/DefaultTilesInitializerTest.java
deleted file mode 100644
index 73ea134..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/startup/DefaultTilesInitializerTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.startup;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import org.apache.tiles.factory.BasicTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.junit.Test;
-
-/**
- * Tests {@link DefaultTilesInitializer}.
- *
- * @version $Rev$ $Date$
- */
-public class DefaultTilesInitializerTest {
-
-    /**
-     * Test method for {@link DefaultTilesInitializer#createContainerFactory(ApplicationContext)}.
-     */
-    @Test
-    public void testCreateContainerFactory() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-
-        replay(context);
-        DefaultTilesInitializer initializer = new DefaultTilesInitializer();
-        assertTrue(initializer.createContainerFactory(context) instanceof BasicTilesContainerFactory);
-        verify(context);
-    }
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/CombinedBeanInfoTest.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/CombinedBeanInfoTest.java
deleted file mode 100644
index 59ea879..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/CombinedBeanInfoTest.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.util;
-
-import static org.junit.Assert.*;
-
-import java.beans.FeatureDescriptor;
-import java.beans.PropertyDescriptor;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link CombinedBeanInfo}.
- *
- * @version $Rev$ $Date$
- */
-public class CombinedBeanInfoTest {
-
-    /**
-     * The bean info to test.
-     */
-    private CombinedBeanInfo beanInfo;
-
-    /**
-     * The property descriptors.
-     */
-    private List<FeatureDescriptor> descriptors;
-
-    /**
-     * The map of property descriptors for request.
-     */
-    private Map<String, PropertyDescriptor> requestMap;
-
-    /**
-     * The map of property descriptors for application.
-     */
-    private Map<String, PropertyDescriptor> applicationMap;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        beanInfo = new CombinedBeanInfo(Request.class, ApplicationContext.class);
-        requestMap = new LinkedHashMap<String, PropertyDescriptor>();
-        ClassUtil.collectBeanInfo(Request.class, requestMap);
-        applicationMap = new LinkedHashMap<String, PropertyDescriptor>();
-        ClassUtil.collectBeanInfo(ApplicationContext.class, applicationMap);
-        descriptors = new ArrayList<FeatureDescriptor>();
-        descriptors.addAll(requestMap.values());
-        descriptors.addAll(applicationMap.values());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.util.CombinedBeanInfo#getDescriptors()}.
-     */
-    @Test
-    public void testGetDescriptors() {
-        assertEquals(descriptors, beanInfo.getDescriptors());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.util.CombinedBeanInfo#getMappedDescriptors(java.lang.Class)}.
-     */
-    @Test
-    public void testGetMappedDescriptors() {
-        assertEquals(requestMap, beanInfo.getMappedDescriptors(Request.class));
-        assertEquals(applicationMap, beanInfo.getMappedDescriptors(ApplicationContext.class));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.util.CombinedBeanInfo#getProperties(java.lang.Class)}.
-     */
-    @Test
-    public void testGetProperties() {
-        assertEquals(requestMap.keySet(), beanInfo.getProperties(Request.class));
-        assertEquals(applicationMap.keySet(), beanInfo.getProperties(ApplicationContext.class));
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java b/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
deleted file mode 100644
index e06b33b..0000000
--- a/TILES_3_0_X/tiles-core/src/test/java/org/apache/tiles/util/RollingVectorEnumeration.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.util;
-
-import java.util.Enumeration;
-import java.util.Vector;
-
-/**
- * It represents an vector-based enumeration when, when it has finished
- * enumerating items, it starts from the beginning.
- *
- * @param <E> The type of the element of this enumeration.
- * @version $Rev$ $Date$
- */
-public class RollingVectorEnumeration<E> implements Enumeration<E> {
-
-    /**
-     * The vector.
-     */
-    private Vector<E> vector;
-
-    /**
-     * The elements.
-     */
-    private Enumeration<E> elements;
-
-    /**
-     * Constructor.
-     *
-     * @param vector The vector.
-     */
-    public RollingVectorEnumeration(Vector<E> vector) {
-        this.vector = vector;
-        elements = vector.elements();
-    }
-
-    /** {@inheritDoc} */
-    public boolean hasMoreElements() {
-        if (elements == null) {
-            elements = vector.elements();
-            return false;
-        }
-        return elements.hasMoreElements();
-    }
-
-    /** {@inheritDoc} */
-    public E nextElement() {
-        E retValue = elements.nextElement();
-
-        if (!elements.hasMoreElements()) {
-            elements = null;
-        }
-
-        return retValue;
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-tiles-513.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-tiles-513.xml
deleted file mode 100644
index 698d5d1..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-tiles-513.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
- -->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<!-- Definitions for Tiles documentation -->
-
-<tiles-definitions>
-  <!-- Authentication Layout -->
-  <definition name="test.anonymous.base" template="/layout.jsp">
-    <put-attribute name="header">
-      <definition template="/header.jsp" />
-    </put-attribute>
-    <put-attribute name="menu">
-      <definition template="/localnav.jsp" />
-    </put-attribute>
-    <put-attribute name="footer">
-      <definition template="/footer.jsp" />
-    </put-attribute>
-  </definition>
-
-  <!-- index page -->
-  <definition name="test.anonymous" extends="test.anonymous.base">
-    <put-attribute name="title" value="page.title.security.login" />
-    <put-attribute name="body" value="/body.jsp" />
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-wildcard.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-wildcard.xml
deleted file mode 100644
index 6590b7e..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs-wildcard.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.def3" template="/test.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-  <definition name="test.def*.sub*" template="/test{1}.jsp">
-      <put-attribute name="country" value="default"/>
-      <put-attribute name="title"  value="Tiles Library Documentation" />
-      <put-attribute name="header" value="/common/header{2}.jsp" />
-      <put-attribute name="menu"   value="doc.menu.main" />
-      <put-attribute name="footer" value="/common/footer.jsp" />
-      <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <definition name="test.def*.noAttribute" template="/test{1}.jsp" />
-
-  <!-- Never used on purpose, if there is the TILES-416 the test will fail -->
-  <definition name="test.def*" template="/test{1}.jsp">
-      <put-attribute name="country" value="default"/>
-      <put-attribute name="title"  value="Tiles Library Documentation" />
-      <put-attribute name="header" value="/common/header-sub.jsp" />
-      <put-attribute name="menu"   value="doc.menu.main" />
-      <put-attribute name="footer" value="/common/footer.jsp" />
-      <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <definition name="test.extended.def*.sub*" extends="test.def{1}.sub{2}">
-      <put-attribute name="title"  value="Overridden Title" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1.xml
deleted file mode 100644
index 6cde50d..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- This definition will remain the same for all locales -->
-  <definition name="test.common" template="/test.jsp">
-      <put-attribute name="country" value="none"/>
-    <put-attribute name="title"  value="Common Definition" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <!-- Doc index page description  -->
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <!-- This definition will be extended -->
-  <definition name="test.def.toextend" template="/test.jsp">
-    <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Definition to be extended" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <!-- This definition will be overridden -->
-  <definition name="test.def.overridden" template="/test.jsp">
-    <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Definition to be overridden" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_en_US.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_en_US.xml
deleted file mode 100644
index 9bb423d..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_en_US.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="US"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr.xml
deleted file mode 100644
index 798a76e..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="France"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <definition name="test.common.french" template="/test.jsp">
-          <put-attribute name="country" value="France"/>
-    <put-attribute name="title"  value="Common Definition for French" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-  <definition name="test.def.overridden" extends="test.def.toextend">
-    <put-attribute name="country" value="France"/>
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr_CA.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr_CA.xml
deleted file mode 100644
index 1a74e50..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs1_fr_CA.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="Canada"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs2.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs2.xml
deleted file mode 100644
index b16912b..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs2.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def2" template="/test.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs3.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs3.xml
deleted file mode 100644
index 9a964a5..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs3.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def3" template="/test.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs_regression_TILES-352.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs_regression_TILES-352.xml
deleted file mode 100644
index 2f17015..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/defs_regression_TILES-352.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--
-/*
- * $Id$
- *
- * 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.
- */
- -->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
- <!-- Definitions to check regression from TILES-252    -->
-
-<tiles-definitions>
- <definition name="root">
-  <put-attribute name="body">
-   <definition template="/my/template.jsp">
-    <put-list-attribute name="list">
-     <add-attribute value="This is a value" type="string" />
-    </put-list-attribute>
-   </definition>
-  </put-attribute>
- </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/invalid-defs.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/invalid-defs.xml
deleted file mode 100644
index 28d05b0..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/invalid-defs.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Dorked up XML tag.  -->
-  <definitionasdfad name="doc.mainLayout" template="/layout/classicLayout.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definitionasdfad>
-
-</tiles-definitions>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/malformed-defs.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/malformed-defs.xml
deleted file mode 100644
index 9175bd9..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/malformed-defs.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="doc.mainLayout" template="/layout/classicLayout.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/temp-defs.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/temp-defs.xml
deleted file mode 100644
index 5d5e6d4..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/temp-defs.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml
deleted file mode 100644
index 3a602e3..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="doc.cascaded.test" template="/layout/classicLayout.jsp">
-    <put-attribute name="title" value="Test title" cascade="false" />
-    <put-attribute name="title2" value="Test title two" cascade="true" />
-    <put-list-attribute name="items1" cascade="false">
-        <add-attribute value="value1" type="string" />
-    </put-list-attribute>
-    <put-list-attribute name="items2" cascade="true">
-        <add-attribute value="value2" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="test.nesting.definitions" template="/layout.jsp">
-      <put-attribute name="body">
-          <definition template="/layout.jsp">
-              <put-attribute name="title"  value="This is a nested definition."/>
-          </definition>
-      </put-attribute>
-  </definition>
-
-  <definition name="test.nesting.list.definitions" template="/layout.jsp">
-      <put-list-attribute name="list">
-          <add-attribute>
-              <definition template="/layout.jsp">
-                  <put-attribute name="title"  value="This is a nested definition."/>
-              </definition>
-          </add-attribute>
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.inherit.list.base" template="/layout.jsp">
-      <put-list-attribute name="list">
-          <add-attribute value="first" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.inherit.list" extends="test.inherit.list.base">
-      <put-list-attribute name="list" inherit="true">
-          <add-attribute value="second" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.noinherit.list" extends="test.inherit.list.base">
-      <put-list-attribute name="list">
-          <add-attribute value="second" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.new.attributes" templateExpression="${my.expression}"
-          templateType="mytype" >
-      <put-attribute name="body" expression="${my.attribute.expression}" />
-  </definition>
-
-  <definition name="test.inherit.othertype.base" template="/layout.ftl" templateType="freemarker">
-      <put-attribute name="body" value="/jsp/body.jsp" />
-  </definition>
-
-  <definition name="test.inherit.othertype" extends="test.inherit.othertype.base">
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1_it.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1_it.xml
deleted file mode 100644
index af9a227..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs-2.1_it.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.dummy" template="/dummy_layout.jsp">
-      <put-attribute name="body" expression="/dummy_body.jsp" />
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs.xml
deleted file mode 100644
index daa42a5..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/config/tiles-defs.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="doc.mainLayout" template="/layout/classicLayout.jsp">
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-      <put-attribute name="bean"   value="This is an object" type="object" />
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Main page body definitions  									-->
-  <!-- =======================================================  -->
-
-  <definition name="doc.portal.body" template="/layout/columnsLayout.jsp">
-    <put-attribute name="numCols" value="2" />
-    <put-list-attribute name="list0" >
-      <add-attribute value="/doc/portal/welcome.jsp" />
-      <add-attribute value="/doc/portal/features.jsp" />
-      <!--<add-attribute value="/doc/portal/todo.jsp" /> -->
-      <add-attribute value="/doc/portal/documentation.jsp" />
-    </put-list-attribute>
-    <put-list-attribute name="list1" >
-      <add-attribute value="/doc/portal/news.jsp" />
-      <add-attribute value="/doc/portal/download.jsp" />
-      <add-attribute value="/doc/portal/tilesCompsTemplates.jsp" />
-      <add-attribute value="/doc/portal/strutsIntegration.jsp" />
-      <add-attribute value="/doc/portal/comments.jsp" />
-      <add-attribute value="/doc/portal/revisions.jsp" />
-    </put-list-attribute>
-  </definition>
-
-  <!-- =======================================================  -->
-  <!-- Menus definitions  									-->
-  <!-- =======================================================  -->
-
-  <!-- Menu bar definition -->
-<definition name="doc.menu.main" template="/layout/vboxLayout.jsp" >
-  <put-list-attribute name="componentsList" >
-    <add-attribute value="doc.menu.links" />
-    <add-attribute value="doc.menu.taglib.references" />
-    <add-attribute value="doc.menu.printer.friendly" />
-    <add-attribute value="doc.menu.old.documents" />
-  </put-list-attribute>
-</definition>
-
-  <!-- Documentation menu definition v1.1-->
-<definition name="doc.menu.links" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Documentation" />
-    <put-list-attribute name="items" >
-      <item value="Home"           link="/index.jsp"  />
-      <item value="Live Examples (new)" link="/examples/index.jsp"  />
-      <!--
-    <item> <value>Commented Examples</value>
-        <link>/examples/index.jsp</link>
-      <classtype>org.apache.tiles.beans.SimpleMenuItem</classtype>
-    </item>
-    -->
-      <item value="Quick overview" link="/doc/quickOverview.jsp"  />
-      <!--
-      <item value="Tutorial"       link="/doc/tutorial.jsp"  />
-      -->
-      <item value="Tutorial Live Examples" link="/tutorial/index.jsp" />
-      <item value="Download"       link="/doc/download.jsp" />
-      <item value="Installation"   link="/doc/installation.jsp" />
-      <item value="User Guide"	   link="/doc/userGuide.jsp" />
-      <item value="Javadoc"        link="/api/index.html" />
-      <item value="Struts Home"    link="http://www.apache.org"   icon="/images/struts-power.gif"
-      classtype="org.apache.tiles.beans.SimpleMenuItem" />
-    </put-list-attribute>
-</definition>
-
-  <!-- Printer friendly menu definition -->
-<definition name="doc.menu.printer.friendly" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Printer Versions" />
-  <put-list-attribute name="items" >
-    <item value="Quick Overview"     link="/test/testAll.jsp" />
-    <item value="Tutorial"           link="/doc/tutorialBody.html" />
-    <item value="User Guide"         link="/doc/userGuideBody.html" />
-    <item value="Overview (old)"  	 link="/doc/overviewBody.html" />
-  </put-list-attribute>
-</definition>
-
-  <!-- Taglib menu definition -->
-<definition name="doc.menu.taglib.references" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Tag Library Reference" />
-    <put-list-attribute name="items" >
-      <item value="Tiles Tags"     link="/doc/tilesTags.jsp" />
-      <!-- <item value="Extension Tags (old)"   link="/doc/extensionsTags.jsp" /> -->
-    </put-list-attribute>
-</definition>
-
-  <!-- Oldies menu definition -->
-<definition name="doc.menu.old.documents" template="/layouts/menu.jsp" >
-  <put-attribute name="title" value="Old Documents" />
-  <put-list-attribute name="items" >
-    <item value="Overview (old)"     link="/doc/overview.jsp" />
-  </put-list-attribute>
-</definition>
-
-<definition name="doc.role.test" template="/layout/classicLayout.jsp">
-  <put-attribute name="title" value="Test title" role="myrole" />
-</definition>
-
-<definition name="doc.listattribute.test" template="/layout/classicLayout.jsp">
-  <put-list-attribute name="items" />
-</definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-one.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-one.xml
deleted file mode 100644
index 1eff6b4..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-one.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<tiles-definitions>
-  <definition name="test.def.one" template="/test.jsp">
-          <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-two.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-two.xml
deleted file mode 100644
index 7c20675..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs-key-two.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<tiles-definitions>
-  <definition name="test.def.two" template="/test.jsp">
-          <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs.xml b/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs.xml
deleted file mode 100644
index 5e7cd10..0000000
--- a/TILES_3_0_X/tiles-core/src/test/resources/org/apache/tiles/factory/test-defs.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<tiles-definitions>
-  <definition name="test.def1" template="/test.jsp">
-          <put-attribute name="country" value="default"/>
-    <put-attribute name="title"  value="Tiles Library Documentation" />
-    <put-attribute name="header" value="/common/header.jsp" />
-    <put-attribute name="menu"   value="doc.menu.main" />
-    <put-attribute name="footer" value="/common/footer.jsp" />
-    <put-attribute name="body"   value="doc.portal.body" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-el/pom.xml b/TILES_3_0_X/tiles-el/pom.xml
deleted file mode 100644
index 3b86c1d..0000000
--- a/TILES_3_0_X/tiles-el/pom.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0"?>
-  <!--
-    /* * $Id$ * *
-    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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-el</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - EL support</name>
-  <description>Tiles EL (Expression Language) support: Classes and tag libraries to use EL as an expression language in attribute expressions.	</description>
-
-  <properties>
-    <tiles.osgi.symbolicName>org.apache.tiles.el</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifest>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin> 
-        <groupId>org.apache.felix</groupId> 
-        <artifactId>maven-bundle-plugin</artifactId> 
-        <configuration> 
-          <instructions> 
-            <Import-Package> 
-              org.apache.el; resolution:=optional, 
-              * 
-            </Import-Package> 
-          </instructions> 
-        </configuration> 
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.el</groupId>
-      <artifactId>el-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>jsp-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tomcat</groupId>
-      <artifactId>jasper-el</artifactId>
-      <version>6.0.20</version>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.tomcat</groupId>
-          <artifactId>el-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELAttributeEvaluator.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELAttributeEvaluator.java
deleted file mode 100644
index 0e6b068..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELAttributeEvaluator.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import javax.el.ELResolver;
-import javax.el.ExpressionFactory;
-import javax.el.ValueExpression;
-
-import org.apache.tiles.evaluator.AbstractAttributeEvaluator;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-
-/**
- * Evaluates string expression with typical EL syntax.<br>
- * You can use normal EL syntax, knowing that the root objects are
- * {@link Request}, {@link ApplicationContext} and beans
- * contained in request, session and application scope.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class ELAttributeEvaluator extends AbstractAttributeEvaluator {
-
-    /**
-     * Initialization parameter to decide the implementation of
-     * {@link ExpressionFactoryFactory}.
-     *
-     * @since 2.2.1
-     */
-    public static final String EXPRESSION_FACTORY_FACTORY_INIT_PARAM =
-        "org.apache.tiles.evaluator.el.ExpressionFactoryFactory";
-
-    /**
-     * The EL expression factory.
-     *
-     * @since 2.2.1
-     */
-    protected ExpressionFactory expressionFactory;
-
-    /**
-     * The EL resolver to use.
-     *
-     * @since 2.2.1
-     */
-    protected ELResolver resolver;
-
-    /**
-     * Constructor.
-     *
-     * @since 2.2.1
-     */
-    public ELAttributeEvaluator() {
-    }
-
-    /**
-     * Sets the expression factory to use.
-     *
-     * @param expressionFactory The expression factory.
-     * @since 2.2.1
-     */
-    public void setExpressionFactory(ExpressionFactory expressionFactory) {
-        this.expressionFactory = expressionFactory;
-    }
-
-    /**
-     * Sets the EL resolver to use.
-     *
-     * @param resolver The EL resolver.
-     * @since 2.2.1
-     */
-    public void setResolver(ELResolver resolver) {
-        this.resolver = resolver;
-    }
-
-    /** {@inheritDoc} */
-    public Object evaluate(String expression, Request request) {
-        ELContextImpl context = new ELContextImpl(resolver);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class,
-                request.getApplicationContext());
-        ValueExpression valueExpression = expressionFactory
-                .createValueExpression(context, expression, Object.class);
-
-        return valueExpression.getValue(context);
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELContextImpl.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELContextImpl.java
deleted file mode 100644
index 2c51569..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ELContextImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.el;
-
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-import javax.el.FunctionMapper;
-import javax.el.ValueExpression;
-import javax.el.VariableMapper;
-
-/**
- * Implementation of ELContext.<br>
- * Copied from Apache Tomcat 6.0.16 source code.
- *
- * @since 2.2.1
- */
-public class ELContextImpl extends ELContext {
-
-    /**
-     * A null function mapper.
-     */
-    private static final FunctionMapper NULL_FUNCTION_MAPPER = new FunctionMapper() {
-        @Override
-        public Method resolveFunction(String prefix, String localName) {
-            return null;
-        }
-    };
-
-    /**
-     * Default implementation for the variable mapper.
-     */
-    private static final class VariableMapperImpl extends VariableMapper {
-
-        /**
-         * The mapped variables.
-         */
-        private Map<String, ValueExpression> vars;
-
-        /** {@inheritDoc} */
-        @Override
-        public ValueExpression resolveVariable(String variable) {
-            if (vars == null) {
-                return null;
-            }
-            return vars.get(variable);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public ValueExpression setVariable(String variable,
-                ValueExpression expression) {
-            if (vars == null) {
-                vars = new HashMap<String, ValueExpression>();
-            }
-            return vars.put(variable, expression);
-        }
-
-    }
-
-    /**
-     * The EL resolver to use.
-     */
-    private final ELResolver resolver;
-
-    /**
-     * The function mapper to use.
-     */
-    private FunctionMapper functionMapper = NULL_FUNCTION_MAPPER;
-
-    /**
-     * The variable mapper to use.
-     */
-    private VariableMapper variableMapper;
-
-    /**
-     * Constructor.
-     *
-     * @param resolver The resolver to use.
-     */
-    public ELContextImpl(ELResolver resolver) {
-        this.resolver = resolver;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public ELResolver getELResolver() {
-        return this.resolver;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public FunctionMapper getFunctionMapper() {
-        return this.functionMapper;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public VariableMapper getVariableMapper() {
-        if (this.variableMapper == null) {
-            this.variableMapper = new VariableMapperImpl();
-        }
-        return this.variableMapper;
-    }
-
-    /**
-     * Sets the function mapper to use.
-     *
-     * @param functionMapper The function mapper.
-     * @since 2.2.1
-     */
-    public void setFunctionMapper(FunctionMapper functionMapper) {
-        this.functionMapper = functionMapper;
-    }
-
-    /**
-     * Sets the variable mapper to use.
-     *
-     * @param variableMapper The variable mapper.
-     * @since 2.2.1
-     */
-    public void setVariableMapper(VariableMapper variableMapper) {
-        this.variableMapper = variableMapper;
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ExpressionFactoryFactory.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ExpressionFactoryFactory.java
deleted file mode 100644
index ce600ad..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ExpressionFactoryFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.el;
-
-import javax.el.ExpressionFactory;
-
-/**
- * Interface to define a factory of {@link ExpressionFactory}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public interface ExpressionFactoryFactory {
-
-    /**
-     * Returns the expression factory to use.
-     *
-     * @return The expression factory.
-     * @since 2.2.1
-     */
-    ExpressionFactory getExpressionFactory();
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/JspExpressionFactoryFactory.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/JspExpressionFactoryFactory.java
deleted file mode 100644
index b663a3c..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/JspExpressionFactoryFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.el;
-
-import javax.el.ExpressionFactory;
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspFactory;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationContextAware;
-
-/**
- * Uses the JSP 2.1 {@link ExpressionFactory} to be used in Tiles.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class JspExpressionFactoryFactory implements ExpressionFactoryFactory,
-        ApplicationContextAware {
-
-    /**
-     * The servlet context.
-     *
-     * @since 2.2.1
-     */
-    protected ServletContext servletContext;
-
-    /** {@inheritDoc} */
-    public void setApplicationContext(ApplicationContext applicationContext) {
-        Object context = applicationContext.getContext();
-        if (context instanceof ServletContext) {
-            this.servletContext = (ServletContext) context;
-        } else {
-            throw new IllegalArgumentException(
-                    "The application context does not hold an instance of "
-                    + "ServletContext, consider using JuelExpressionFactoryFactory");
-        }
-    }
-
-    /** {@inheritDoc} */
-    public ExpressionFactory getExpressionFactory() {
-        return JspFactory.getDefaultFactory().getJspApplicationContext(
-                servletContext).getExpressionFactory();
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java
deleted file mode 100644
index 578cd97..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/ScopeELResolver.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import java.beans.FeatureDescriptor;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Resolves beans in request, session and application scope.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class ScopeELResolver extends ELResolver {
-
-    /**
-     * The length of the suffix: "Scope".
-     */
-    private static final int SUFFIX_LENGTH = 5;
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getCommonPropertyType(ELContext context, Object base) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        return Map.class;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
-            Object base) {
-        if (base != null) {
-            List<FeatureDescriptor> retValue = Collections.emptyList();
-            return retValue.iterator();
-        }
-
-        List<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>();
-
-        Request request = (Request) context
-                .getContext(Request.class);
-        for (String scope : request.getAvailableScopes()) {
-            FeatureDescriptor descriptor = new FeatureDescriptor();
-            descriptor.setDisplayName(scope + "Scope");
-            descriptor.setExpert(false);
-            descriptor.setHidden(false);
-            descriptor.setName(scope + "Scope");
-            descriptor.setPreferred(true);
-            descriptor.setShortDescription("");
-            descriptor.setValue("type", Map.class);
-            descriptor.setValue("resolvableAtDesignTime", Boolean.FALSE);
-            list.add(descriptor);
-        }
-
-        return list.iterator();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getType(ELContext context, Object base, Object property) {
-        if (base != null || property == null || !(property instanceof String)
-                || !((String) property).endsWith("Scope")) {
-            return null;
-        }
-
-        return Map.class;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Object getValue(ELContext context, Object base, Object property) {
-        if (base != null) {
-            return null;
-        }
-
-        Object retValue = null;
-        String propertyString = (String) property;
-        if (property instanceof String && propertyString.endsWith("Scope")) {
-            Request request = (Request) context
-                    .getContext(Request.class);
-            retValue = request.getContext(propertyString.substring(0,
-                    propertyString.length() - SUFFIX_LENGTH));
-        }
-
-        if (retValue != null) {
-            context.setPropertyResolved(true);
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean isReadOnly(ELContext context, Object base, Object property) {
-        if (context == null) {
-            throw new NullPointerException();
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setValue(ELContext context, Object base, Object property,
-            Object value) {
-        // Does nothing for the moment.
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
deleted file mode 100644
index 1cd3e1b..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextBeanELResolver.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import java.beans.FeatureDescriptor;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Resolves beans in request, session and application scope.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class TilesContextBeanELResolver extends ELResolver {
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getCommonPropertyType(ELContext context, Object base) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        return String.class;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
-            Object base) {
-        List<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>();
-
-        Request request = (Request) context
-                .getContext(Request.class);
-        for (String scope : request.getAvailableScopes()) {
-            collectBeanInfo(request.getContext(scope), list);
-        }
-        return list.iterator();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getType(ELContext context, Object base, Object property) {
-        if (base != null) {
-            return null;
-        }
-
-        Object obj = findObjectByProperty(context, property);
-        if (obj != null) {
-            context.setPropertyResolved(true);
-            return obj.getClass();
-        }
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Object getValue(ELContext context, Object base, Object property) {
-        if (base != null) {
-            return null;
-        }
-
-        Object retValue = findObjectByProperty(context, property);
-
-        if (retValue != null) {
-            context.setPropertyResolved(true);
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean isReadOnly(ELContext context, Object base, Object property) {
-        if (context == null) {
-            throw new NullPointerException();
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setValue(ELContext context, Object base, Object property,
-            Object value) {
-        // Does nothing for the moment.
-    }
-
-    /**
-     * Collects bean infos from a map's values and filling a list.
-     *
-     * @param map The map containing the bean to be inspected.
-     * @param list The list to fill.
-     * @since 2.2.1
-     */
-    protected void collectBeanInfo(Map<String, ? extends Object> map,
-            List<FeatureDescriptor> list) {
-        if (map == null || map.isEmpty()) {
-            return;
-        }
-
-        for (Map.Entry<String, ? extends Object> entry : map.entrySet()) {
-            FeatureDescriptor descriptor = new FeatureDescriptor();
-            descriptor.setDisplayName(entry.getKey());
-            descriptor.setExpert(false);
-            descriptor.setHidden(false);
-            descriptor.setName(entry.getKey());
-            descriptor.setPreferred(true);
-            descriptor.setShortDescription("");
-            descriptor.setValue("type", String.class);
-            descriptor.setValue("resolvableAtDesignTime", Boolean.FALSE);
-            list.add(descriptor);
-        }
-    }
-
-    /**
-     * Finds an object in request, session or application scope, in this order.
-     *
-     * @param context The context to use.
-     * @param property The property used as an attribute name.
-     * @return The found bean, if it exists, or <code>null</code> otherwise.
-     * @since 2.2.1
-     */
-    protected Object findObjectByProperty(ELContext context, Object property) {
-        Object retValue = null;
-
-        Request request = (Request) context
-                .getContext(Request.class);
-
-        String prop = property.toString();
-
-        String[] scopes = request.getAvailableScopes().toArray(new String[0]);
-        int i = 0;
-        do {
-            retValue = getObject(request.getContext(scopes[i]), prop);
-            i++;
-        } while (retValue == null && i < scopes.length);
-
-        return retValue;
-    }
-
-    /**
-     * Returns an object from a map in a null-safe manner.
-     *
-     * @param map The map to use.
-     * @param property The property to use as a key.
-     * @return The object, if present, or <code>null</code> otherwise.
-     * @since 2.2.1
-     */
-    protected Object getObject(Map<String, ? extends Object> map,
-            String property) {
-        Object retValue = null;
-        if (map != null) {
-            retValue = map.get(property);
-        }
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextELResolver.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextELResolver.java
deleted file mode 100644
index d3b59ca..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/TilesContextELResolver.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import java.beans.FeatureDescriptor;
-import java.util.Iterator;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.util.CombinedBeanInfo;
-
-/**
- * Resolves properties of {@link Request} and
- * {@link ApplicationContext}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class TilesContextELResolver extends ELResolver {
-
-    /**
-     * Internal bean resolver to resolve beans in any context.
-     */
-    private ELResolver beanElResolver;
-
-    /**
-     * Constructor.
-     *
-     * @param beanElResolver The used bean resolver.
-     */
-    public TilesContextELResolver(ELResolver beanElResolver) {
-        this.beanElResolver = beanElResolver;
-    }
-
-    /**
-     * The beaninfos about {@link Request} and {@link ApplicationContext}.
-     */
-    private CombinedBeanInfo requestBeanInfo = new CombinedBeanInfo(
-            Request.class, ApplicationContext.class);
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getCommonPropertyType(ELContext context, Object base) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        return String.class;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context,
-            Object base) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        return requestBeanInfo.getDescriptors().iterator();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Class<?> getType(ELContext context, Object base, Object property) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        Class<?> retValue = null;
-        if (requestBeanInfo.getProperties(Request.class).contains(property)) {
-            Request request = (Request) context
-                    .getContext(Request.class);
-            retValue = beanElResolver.getType(context, request, property);
-        } else if (requestBeanInfo.getProperties(ApplicationContext.class).contains(property)) {
-            ApplicationContext applicationContext = (ApplicationContext) context
-                    .getContext(ApplicationContext.class);
-            retValue = beanElResolver.getType(context, applicationContext, property);
-        }
-
-        if (retValue != null) {
-            context.setPropertyResolved(true);
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Object getValue(ELContext context, Object base, Object property) {
-        // only resolve at the root of the context
-        if (base != null) {
-            return null;
-        }
-
-        Object retValue = null;
-
-        if (requestBeanInfo.getProperties(Request.class).contains(property)) {
-            Request request = (Request) context
-                    .getContext(Request.class);
-            retValue = beanElResolver.getValue(context, request, property);
-        } else if (requestBeanInfo.getProperties(ApplicationContext.class)
-                .contains(property)) {
-            ApplicationContext applicationContext = (ApplicationContext) context
-                    .getContext(ApplicationContext.class);
-            retValue = beanElResolver.getValue(context, applicationContext, property);
-        }
-
-        if (retValue != null) {
-            context.setPropertyResolved(true);
-        }
-
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean isReadOnly(ELContext context, Object base, Object property) {
-        if (context == null) {
-            throw new NullPointerException();
-        }
-
-        return true;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setValue(ELContext context, Object base, Object property,
-            Object value) {
-        // Does nothing for the moment.
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/package-info.java b/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/package-info.java
deleted file mode 100644
index 01731df..0000000
--- a/TILES_3_0_X/tiles-el/src/main/java/org/apache/tiles/el/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Attribute evaluator classes that can perform EL evaluation for attributes.
- */
-package org.apache.tiles.el;
diff --git a/TILES_3_0_X/tiles-el/src/site/site.xml b/TILES_3_0_X/tiles-el/src/site/site.xml
deleted file mode 100644
index 6a9ce8c..0000000
--- a/TILES_3_0_X/tiles-el/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - EL Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
deleted file mode 100644
index 82a4745..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELAttributeEvaluatorTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.el.ArrayELResolver;
-import javax.el.BeanELResolver;
-import javax.el.CompositeELResolver;
-import javax.el.ELResolver;
-import javax.el.ListELResolver;
-import javax.el.MapELResolver;
-import javax.el.ResourceBundleELResolver;
-
-import junit.framework.TestCase;
-
-import org.apache.el.ExpressionFactoryImpl;
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.easymock.EasyMock;
-
-/**
- * Tests {@link ELAttributeEvaluator}.
- *
- * @version $Rev$ $Date$
- */
-public class ELAttributeEvaluatorTest extends TestCase {
-
-    /**
-     * The evaluator to test.
-     */
-    private ELAttributeEvaluator evaluator;
-
-    /**
-     * The request object to use.
-     */
-    private Request request;
-
-    /** {@inheritDoc} */
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        evaluator = new ELAttributeEvaluator();
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        requestScope.put("paulaBean", new PaulaBean());
-        request = EasyMock.createMock(Request.class);
-        EasyMock.expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        EasyMock.expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        EasyMock.expect(request.getContext("application")).andReturn(
-                applicationScope).anyTimes();
-        EasyMock.expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
-        ApplicationContext applicationContext = EasyMock
-                .createMock(ApplicationContext.class);
-        EasyMock.expect(request.getApplicationContext()).andReturn(
-                applicationContext).anyTimes();
-        EasyMock.replay(request, applicationContext);
-
-        evaluator.setExpressionFactory(new ExpressionFactoryImpl());
-        ELResolver elResolver = new CompositeELResolver() {
-            {
-                BeanELResolver beanElResolver = new BeanELResolver(false);
-                add(new ScopeELResolver());
-                add(new TilesContextELResolver(beanElResolver));
-                add(new TilesContextBeanELResolver());
-                add(new ArrayELResolver(false));
-                add(new ListELResolver(false));
-                add(new MapELResolver(false));
-                add(new ResourceBundleELResolver());
-                add(beanElResolver);
-            }
-        };
-        evaluator.setResolver(elResolver);
-    }
-
-    /**
-     * Tests
-     * {@link ELAttributeEvaluator#evaluate(Attribute, Request)}.
-     */
-    public void testEvaluate() {
-        Attribute attribute = new Attribute();
-        attribute.setExpressionObject(new Expression("${requestScope.object1}"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("${sessionScope.object2}"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("${applicationScope.object3}"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("${object1}"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("${object2}"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("${object3}"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("${paulaBean.paula}"));
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("String literal"));
-        assertEquals("The value is not correct", "String literal", evaluator
-                .evaluate(attribute, request));
-        attribute.setValue(new Integer(2));
-        assertEquals("The value is not correct", new Integer(2), evaluator
-                .evaluate(attribute, request));
-        attribute.setValue("${object1}");
-        assertEquals("The value has been evaluated", "${object1}", evaluator
-                .evaluate(attribute, request));
-    }
-
-    /**
-     * Tests
-     * {@link ELAttributeEvaluator#evaluate(String, Request)}.
-     */
-    public void testEvaluateString() {
-        String expression = "${requestScope.object1}";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "${sessionScope.object2}";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "${applicationScope.object3}";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "${object1}";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "${object2}";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "${object3}";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "${paulaBean.paula}";
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(expression, request));
-        expression = "String literal";
-        assertEquals("The value is not correct", expression, evaluator
-                .evaluate(expression, request));
-    }
-
-    /**
-     * This is The Brillant Paula Bean (sic) just like it was posted to:
-     * http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx
-     * I hope that there is no copyright on it.
-     */
-    public static class PaulaBean {
-
-        /**
-         * Paula is brillant, really.
-         */
-        private String paula = "Brillant";
-
-        /**
-         * Returns brillant.
-         *
-         * @return "Brillant".
-         */
-        public String getPaula() {
-            return paula;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELContextImplTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELContextImplTest.java
deleted file mode 100644
index 520398b..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ELContextImplTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import javax.el.ELResolver;
-import javax.el.FunctionMapper;
-import javax.el.ValueExpression;
-import javax.el.VariableMapper;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ELContextImpl}.
- *
- * @version $Rev$ $Date$
- */
-public class ELContextImplTest {
-
-    /**
-     * The EL context to test.
-     */
-    private ELContextImpl context;
-
-    /**
-     * The EL resolver.
-     */
-    private ELResolver resolver;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = createMock(ELResolver.class);
-        context = new ELContextImpl(resolver);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.el.ELContextImpl#getELResolver()}.
-     */
-    @Test
-    public void testGetELResolver() {
-        replay(resolver);
-        assertEquals(resolver, context.getELResolver());
-        verify(resolver);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.el.ELContextImpl#setFunctionMapper(javax.el.FunctionMapper)}.
-     */
-    @Test
-    public void testSetFunctionMapper() {
-        FunctionMapper functionMapper = createMock(FunctionMapper.class);
-
-        replay(resolver, functionMapper);
-        context.setFunctionMapper(functionMapper);
-        assertEquals(functionMapper, context.getFunctionMapper());
-        verify(resolver, functionMapper);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.el.ELContextImpl#setVariableMapper(javax.el.VariableMapper)}.
-     */
-    @Test
-    public void testSetVariableMapper() {
-        VariableMapper variableMapper = createMock(VariableMapper.class);
-
-        replay(resolver, variableMapper);
-        context.setVariableMapper(variableMapper);
-        assertEquals(variableMapper, context.getVariableMapper());
-        verify(resolver, variableMapper);
-    }
-
-    /**
-     * Tests {@link ELContextImpl#getFunctionMapper()}.
-     */
-    @Test
-    public void testNullFunctionMapper() {
-        replay(resolver);
-        FunctionMapper functionMapper = context.getFunctionMapper();
-        assertNull(functionMapper.resolveFunction("whatever", "it_IT"));
-        verify(resolver);
-    }
-
-    /**
-     * Tests {@link ELContextImpl#getVariableMapper()}.
-     */
-    @Test
-    public void testVariableMapperImpl() {
-        ValueExpression expression = createMock(ValueExpression.class);
-
-        replay(resolver, expression);
-        VariableMapper variableMapper = context.getVariableMapper();
-        assertNull(variableMapper.resolveVariable("whatever"));
-        variableMapper.setVariable("var", expression);
-        assertEquals(expression, variableMapper.resolveVariable("var"));
-        verify(resolver, expression);
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java
deleted file mode 100644
index 65acdd2..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/JspExpressionFactoryFactoryTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import javax.el.ExpressionFactory;
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspApplicationContext;
-import javax.servlet.jsp.JspFactory;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.junit.Test;
-
-/**
- * Tests {@link JspExpressionFactoryFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class JspExpressionFactoryFactoryTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.el.JspExpressionFactoryFactory#getExpressionFactory()}.
-     */
-    @Test
-    public void testGetExpressionFactory() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        JspFactory jspFactory = createMock(JspFactory.class);
-        JspApplicationContext jspApplicationContext = createMock(JspApplicationContext.class);
-        ExpressionFactory expressionFactory = createMock(ExpressionFactory.class);
-
-        expect(applicationContext.getContext()).andReturn(servletContext);
-        expect(jspFactory.getJspApplicationContext(servletContext)).andReturn(jspApplicationContext);
-        expect(jspApplicationContext.getExpressionFactory()).andReturn(expressionFactory);
-
-        replay(applicationContext, servletContext, jspFactory,
-                jspApplicationContext, expressionFactory);
-        JspFactory.setDefaultFactory(jspFactory);
-        JspExpressionFactoryFactory factory = new JspExpressionFactoryFactory();
-        factory.setApplicationContext(applicationContext);
-        assertEquals(expressionFactory, factory.getExpressionFactory());
-        verify(applicationContext, servletContext, jspFactory,
-                jspApplicationContext, expressionFactory);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.el.JspExpressionFactoryFactory#getExpressionFactory()}.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testSetApplicationContextIllegal() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Integer servletContext = new Integer(1);
-
-        expect(applicationContext.getContext()).andReturn(servletContext);
-
-        replay(applicationContext);
-        try {
-            JspExpressionFactoryFactory factory = new JspExpressionFactoryFactory();
-            factory.setApplicationContext(applicationContext);
-        } finally {
-            verify(applicationContext);
-        }
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
deleted file mode 100644
index 4a3ca12..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/ScopeELResolverTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.beans.FeatureDescriptor;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.el.ELContext;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-
-/**
- * Tests {@link ScopeELResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class ScopeELResolverTest {
-
-    /**
-     * The resolver to test.
-     */
-    private ScopeELResolver resolver;
-
-    /** {@inheritDoc} */
-    @Before
-    public void setUp() {
-        resolver = new ScopeELResolver();
-    }
-
-    /**
-     * Tests {@link ScopeELResolver#getCommonPropertyType(ELContext, Object)}.
-     */
-    @Test
-    public void testGetCommonPropertyType() {
-        ELContext elContext = createMock(ELContext.class);
-
-        replay(elContext);
-        assertNull(resolver.getCommonPropertyType(elContext, new Integer(1)));
-        assertEquals(Map.class, resolver.getCommonPropertyType(elContext, null));
-        verify(elContext);
-    }
-
-    /**
-     * Tests {@link ScopeELResolver#getFeatureDescriptors(ELContext, Object)}.
-     */
-    @Test
-    public void testGetFeatureDescriptors() {
-        ELContext elContext = createMock(ELContext.class);
-        Request request = createMock(Request.class);
-
-        expect(elContext.getContext(Request.class)).andReturn(request);
-        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"}));
-
-        replay(elContext, request);
-        assertFalse(resolver.getFeatureDescriptors(elContext, new Integer(1)).hasNext());
-        Iterator<FeatureDescriptor> descriptors = resolver.getFeatureDescriptors(elContext, null);
-        FeatureDescriptor descriptor = descriptors.next();
-        assertEquals("oneScope", descriptor.getName());
-        descriptor = descriptors.next();
-        assertEquals("twoScope", descriptor.getName());
-        assertFalse(descriptors.hasNext());
-        verify(elContext, request);
-    }
-
-    /**
-     * Test method for
-     * {@link ScopeELResolver#getType(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testGetType() {
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ELContext context = new ELContextImpl(resolver);
-        replay(request, applicationContext);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-        assertNull(resolver.getType(context, new Integer(1), "whatever"));
-        assertEquals("The requestScope object is not a map.", Map.class,
-                resolver.getType(context, null, "requestScope"));
-        assertEquals("The sessionScope object is not a map.", Map.class,
-                resolver.getType(context, null, "sessionScope"));
-        assertEquals("The applicationScope object is not a map.", Map.class,
-                resolver.getType(context, null, "applicationScope"));
-    }
-
-    /**
-     * Test method for
-     * {@link ScopeELResolver#getValue(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testGetValue() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put("objectKey", "objectValue");
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        sessionScope.put("sessionObjectKey", "sessionObjectValue");
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("applicationObjectKey", "applicationObjectValue");
-        Request request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(request.getContext("session")).andReturn(sessionScope);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getContext("application")).andReturn(applicationScope);
-        ELContext context = new ELContextImpl(resolver);
-        replay(request, applicationContext);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-        assertNull(resolver.getValue(context, new Integer(1), "whatever"));
-        assertEquals("The requestScope map does not correspond", requestScope,
-                resolver.getValue(context, null, "requestScope"));
-        assertEquals("The sessionScope map does not correspond", sessionScope,
-                resolver.getValue(context, null, "sessionScope"));
-        assertEquals("The applicationScope map does not correspond",
-                applicationScope, resolver.getValue(context, null,
-                        "applicationScope"));
-    }
-
-    /**
-     * Tests {@link ScopeELResolver#isReadOnly(ELContext, Object, Object)}.
-     */
-    @Test
-    public void testIsReadOnly() {
-        ELContext elContext = createMock(ELContext.class);
-
-        replay(elContext);
-        assertTrue(resolver.isReadOnly(elContext, null, "whatever"));
-        verify(elContext);
-    }
-
-    /**
-     * Tests {@link ScopeELResolver#isReadOnly(ELContext, Object, Object)}.
-     */
-    @Test(expected=NullPointerException.class)
-    public void testIsReadOnlyNPE() {
-        resolver.isReadOnly(null, null, "whatever");
-    }
-
-    /**
-     * Tests {@link ScopeELResolver#setValue(ELContext, Object, Object, Object)}.
-     */
-    @Test
-    public void testSetValue() {
-        // Just to complete code coverage!
-        resolver.setValue(null, null, null, null);
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
deleted file mode 100644
index b282528..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextBeanELResolverTest.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.beans.FeatureDescriptor;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import javax.el.ELContext;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesContextBeanELResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContextBeanELResolverTest {
-
-    /**
-     * The resolver to test.
-     */
-    private TilesContextBeanELResolver resolver;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = new TilesContextBeanELResolver();
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#getCommonPropertyType(javax.el.ELContext, java.lang.Object)}.
-     */
-    @Test
-    public void testGetCommonPropertyType() {
-        Class<?> clazz = resolver.getCommonPropertyType(null, null);
-        assertEquals("The class is not correct", String.class, clazz);
-        clazz = resolver.getCommonPropertyType(null, "Base object");
-        assertNull("The class for non root objects must be null", clazz);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#getFeatureDescriptors(javax.el.ELContext, java.lang.Object)}.
-     */
-    @Test
-    public void testGetFeatureDescriptors() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        Request request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getContext("application")).andReturn(
-                applicationScope).anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        replay(request, applicationContext);
-
-        ELContext context = new ELContextImpl(resolver);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-
-        List<FeatureDescriptor> expected = new ArrayList<FeatureDescriptor>();
-        resolver.collectBeanInfo(requestScope, expected);
-        resolver.collectBeanInfo(sessionScope, expected);
-        resolver.collectBeanInfo(applicationScope, expected);
-        Iterator<FeatureDescriptor> featureIt = resolver.getFeatureDescriptors(
-                context, null);
-        Iterator<FeatureDescriptor> expectedIt = expected.iterator();
-        while (featureIt.hasNext() && expectedIt.hasNext()) {
-            FeatureDescriptor expectedDescriptor = expectedIt.next();
-            FeatureDescriptor descriptor = featureIt.next();
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .getDisplayName(), descriptor.getDisplayName());
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .getName(), descriptor.getName());
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .getShortDescription(), descriptor.getShortDescription());
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .getValue("type"), descriptor.getValue("type"));
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .getValue("resolvableAtDesignTime"), descriptor
-                    .getValue("resolvableAtDesignTime"));
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .isExpert(), descriptor.isExpert());
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .isHidden(), descriptor.isHidden());
-            assertEquals("The feature is not the same", expectedDescriptor
-                    .isPreferred(), descriptor.isPreferred());
-        }
-        assertTrue("The feature descriptors are not of the same size",
-                !featureIt.hasNext() && !expectedIt.hasNext());
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#getType(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testGetType() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        Request request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getContext("application")).andReturn(
-                applicationScope).anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        replay(request, applicationContext);
-
-        ELContext context = new ELContextImpl(resolver);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-
-        assertEquals("The type is not correct", String.class, resolver.getType(
-                context, null, "object1"));
-        assertEquals("The type is not correct", Integer.class, resolver.getType(
-                context, null, "object2"));
-        assertEquals("The type is not correct", Float.class, resolver.getType(
-                context, null, "object3"));
-        assertNull(resolver.getType(context, new Integer(1), "whatever"));
-        assertNull(resolver.getType(context, null, "object4"));
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#getValue(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testGetValue() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        Request request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getContext("application")).andReturn(
-                applicationScope).anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        replay(request, applicationContext);
-
-        ELContext context = new ELContextImpl(resolver);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-
-        assertEquals("The value is not correct", "value", resolver.getValue(
-                context, null, "object1"));
-        assertEquals("The value is not correct", new Integer(1), resolver
-                .getValue(context, null, "object2"));
-        assertEquals("The value is not correct", new Float(2.0), resolver
-                .getValue(context, null, "object3"));
-        assertNull(resolver.getValue(context, new Integer(1), "whatever"));
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#isReadOnly(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testIsReadOnlyELContextObjectObject() {
-        ELContext context = new ELContextImpl(resolver);
-        assertTrue("The value is not read only", resolver.isReadOnly(context,
-                null, null));
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#isReadOnly(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testIsReadOnlyNPE() {
-        resolver.isReadOnly(null, null, null);
-    }
-
-    /**
-     * Tests {@link TilesContextBeanELResolver#setValue(ELContext, Object, Object, Object)}.
-     */
-    @Test
-    public void testSetValue() {
-        // Just to complete code coverage!
-        resolver.setValue(null, null, null, null);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextBeanELResolver#findObjectByProperty(javax.el.ELContext, java.lang.Object)}.
-     */
-    @Test
-    public void testFindObjectByProperty() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        Request request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getContext("application")).andReturn(
-                applicationScope).anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        replay(request, applicationContext);
-
-        ELContext context = new ELContextImpl(resolver);
-        context.putContext(Request.class, request);
-        context.putContext(ApplicationContext.class, applicationContext);
-
-        assertEquals("The value is not correct", "value", resolver
-                .findObjectByProperty(context, "object1"));
-        assertEquals("The value is not correct", new Integer(1), resolver
-                .findObjectByProperty(context, "object2"));
-        assertEquals("The value is not correct", new Float(2.0), resolver
-                .findObjectByProperty(context, "object3"));
-    }
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.el.TilesContextBeanELResolver#getObject(java.util.Map, java.lang.String)}.
-     */
-    @Test
-    public void testGetObject() {
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("object1", "value");
-        assertEquals("The value is not correct", "value", resolver.getObject(
-                map, "object1"));
-        assertNull("The value is not null", resolver.getObject(map, "object2"));
-        assertNull("The value is not null", resolver.getObject(null, "object1"));
-    }
-
-    /**
-     * Tests {@link TilesContextBeanELResolver#collectBeanInfo(Map, List)}.
-     */
-    @Test
-    public void testCollectBeanInfoEmpty() {
-        resolver.collectBeanInfo(null, null);
-    }
-}
diff --git a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java b/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java
deleted file mode 100644
index e781b97..0000000
--- a/TILES_3_0_X/tiles-el/src/test/java/org/apache/tiles/el/TilesContextELResolverTest.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.el;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.beans.FeatureDescriptor;
-import java.beans.PropertyDescriptor;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.el.ELContext;
-import javax.el.ELResolver;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesContextELResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContextELResolverTest {
-
-    /**
-     * The bean resolver.
-     */
-    private ELResolver beanElResolver;
-
-    /**
-     * The resolver to test.
-     */
-    private TilesContextELResolver resolver;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        beanElResolver = createMock(ELResolver.class);
-        resolver = new TilesContextELResolver(beanElResolver);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextELResolver#getCommonPropertyType(javax.el.ELContext, java.lang.Object)}.
-     */
-    @Test
-    public void testGetCommonPropertyTypeELContextObject() {
-        replay(beanElResolver);
-        Class<?> clazz = resolver.getCommonPropertyType(null, null);
-        assertEquals("The class is not correct", String.class, clazz);
-        clazz = resolver.getCommonPropertyType(null, "Base object");
-        assertNull("The class for non root objects must be null", clazz);
-        verify(beanElResolver);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextELResolver#getFeatureDescriptors(javax.el.ELContext, java.lang.Object)}.
-     */
-    @Test
-    public void testGetFeatureDescriptorsELContextObject() {
-        replay(beanElResolver);
-        assertNull(resolver.getFeatureDescriptors(null, new Integer(1)));
-        Map<String, PropertyDescriptor> expected = new LinkedHashMap<String, PropertyDescriptor>();
-        ClassUtil.collectBeanInfo(Request.class, expected);
-        ClassUtil.collectBeanInfo(ApplicationContext.class, expected);
-        Iterator<FeatureDescriptor> featureIt = resolver.getFeatureDescriptors(
-                null, null);
-        Iterator<? extends FeatureDescriptor> expectedIt = expected.values().iterator();
-        while (featureIt.hasNext() && expectedIt.hasNext()) {
-            assertEquals("The feature is not the same", expectedIt.next(),
-                    featureIt.next());
-        }
-        assertTrue("The feature descriptors are not of the same size",
-                !featureIt.hasNext() && !expectedIt.hasNext());
-        verify(beanElResolver);
-    }
-
-    /**
-     * Tests {@link TilesContextBeanELResolver#getType(ELContext, Object, Object)}.
-     */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    @Test
-    public void testGetType() {
-        ELContext elContext = createMock(ELContext.class);
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(elContext.getContext(Request.class)).andReturn(request);
-        expect(elContext.getContext(ApplicationContext.class)).andReturn(applicationContext);
-        expect(beanElResolver.getType(elContext, request, "responseCommitted")).andReturn((Class) Boolean.class);
-        expect(beanElResolver.getType(elContext, applicationContext, "initParams")).andReturn((Class) Map.class);
-        elContext.setPropertyResolved(true);
-        expectLastCall().times(2);
-
-        replay(beanElResolver, elContext, request, applicationContext);
-        assertNull(resolver.getType(elContext, new Integer(1), "whatever"));
-        assertEquals(Boolean.class, resolver.getType(elContext, null, "responseCommitted"));
-        assertEquals(Map.class, resolver.getType(elContext, null, "initParams"));
-        verify(beanElResolver, elContext, request, applicationContext);
-    }
-
-    /**
-     * Tests {@link TilesContextBeanELResolver#getValue(ELContext, Object, Object)}.
-     */
-    @Test
-    public void testGetValue() {
-        ELContext elContext = createMock(ELContext.class);
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        @SuppressWarnings("rawtypes")
-        Map map = createMock(Map.class);
-
-        expect(elContext.getContext(Request.class)).andReturn(request);
-        expect(elContext.getContext(ApplicationContext.class)).andReturn(applicationContext);
-        expect(beanElResolver.getValue(elContext, request, "responseCommitted")).andReturn(true);
-        expect(beanElResolver.getValue(elContext, applicationContext, "initParams")).andReturn(map);
-        elContext.setPropertyResolved(true);
-        expectLastCall().times(2);
-
-        replay(beanElResolver, elContext, request, applicationContext, map);
-        assertNull(resolver.getValue(elContext, new Integer(1), "whatever"));
-        assertEquals(true, resolver.getValue(elContext, null, "responseCommitted"));
-        assertEquals(map, resolver.getValue(elContext, null, "initParams"));
-        verify(beanElResolver, elContext, request, applicationContext, map);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextELResolver#isReadOnly(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test
-    public void testIsReadOnly() {
-        replay(beanElResolver);
-        ELContext context = new ELContextImpl(resolver);
-        assertTrue("The value is not read only", resolver.isReadOnly(context,
-                null, null));
-        verify(beanElResolver);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextELResolver#isReadOnly(javax.el.ELContext, java.lang.Object, java.lang.Object)}.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testIsReadOnlyNPE() {
-        replay(beanElResolver);
-        try {
-            resolver.isReadOnly(null, null, null);
-        } finally {
-            verify(beanElResolver);
-        }
-    }
-
-    /**
-     * Tests {@link TilesContextELResolver#setValue(ELContext, Object, Object, Object)}.
-     */
-    @Test
-    public void testSetValue() {
-        // Just to complete code coverage!
-        resolver.setValue(null, null, null, null);
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/pom.xml b/TILES_3_0_X/tiles-extras/pom.xml
deleted file mode 100644
index c99e4d4..0000000
--- a/TILES_3_0_X/tiles-extras/pom.xml
+++ /dev/null
@@ -1,156 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-extras</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - Extras</name>
-  <description>Extras for Tiles, including non-standard, non-generic, non-identifiable components that may be useful for Tiles users.
-  </description>
-
-  <properties>
-  	<tiles.osgi.symbolicName>org.apache.tiles.extras</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-request-servlet-wildcard</artifactId>
-      <version>${tiles.request.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-request-mustache</artifactId>
-      <version>${tiles.request.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-jsp</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-freemarker</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-velocity</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-el</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-mvel</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-ognl</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-compat</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>jsp-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
deleted file mode 100644
index 6831ce2..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactory.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-import java.util.regex.Pattern;
-
-import javax.el.ArrayELResolver;
-import javax.el.BeanELResolver;
-import javax.el.CompositeELResolver;
-import javax.el.ELResolver;
-import javax.el.ListELResolver;
-import javax.el.MapELResolver;
-import javax.el.ResourceBundleELResolver;
-
-import ognl.OgnlException;
-import ognl.OgnlRuntime;
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.compat.definition.digester.CompatibilityDigesterDefinitionsReader;
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.definition.DefinitionsReader;
-import org.apache.tiles.definition.pattern.DefinitionPatternMatcherFactory;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PrefixedPatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.regexp.RegexpDefinitionPatternMatcherFactory;
-import org.apache.tiles.definition.pattern.wildcard.WildcardDefinitionPatternMatcherFactory;
-import org.apache.tiles.el.ELAttributeEvaluator;
-import org.apache.tiles.el.JspExpressionFactoryFactory;
-import org.apache.tiles.el.ScopeELResolver;
-import org.apache.tiles.el.TilesContextBeanELResolver;
-import org.apache.tiles.el.TilesContextELResolver;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
-import org.apache.tiles.factory.BasicTilesContainerFactory;
-import org.apache.tiles.factory.TilesContainerFactoryException;
-import org.apache.tiles.freemarker.TilesSharedVariableFactory;
-import org.apache.tiles.impl.mgmt.CachingTilesContainer;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.mvel.MVELAttributeEvaluator;
-import org.apache.tiles.mvel.ScopeVariableResolverFactory;
-import org.apache.tiles.mvel.TilesContextBeanVariableResolverFactory;
-import org.apache.tiles.mvel.TilesContextVariableResolverFactory;
-import org.apache.tiles.ognl.AnyScopePropertyAccessor;
-import org.apache.tiles.ognl.DelegatePropertyAccessor;
-import org.apache.tiles.ognl.NestedObjectDelegatePropertyAccessor;
-import org.apache.tiles.ognl.OGNLAttributeEvaluator;
-import org.apache.tiles.ognl.PropertyAccessorDelegateFactory;
-import org.apache.tiles.ognl.ScopePropertyAccessor;
-import org.apache.tiles.ognl.TilesApplicationContextNestedObjectExtractor;
-import org.apache.tiles.ognl.TilesContextPropertyAccessorDelegateFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.freemarker.render.FreemarkerRenderer;
-import org.apache.tiles.request.freemarker.render.FreemarkerRendererBuilder;
-import org.apache.tiles.request.freemarker.servlet.SharedVariableLoaderFreemarkerServlet;
-import org.apache.tiles.request.mustache.MustacheRenderer;
-import org.apache.tiles.request.render.BasicRendererFactory;
-import org.apache.tiles.request.render.ChainedDelegateRenderer;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.servlet.ServletUtil;
-import org.apache.tiles.request.velocity.render.VelocityRenderer;
-import org.apache.tiles.request.velocity.render.VelocityRendererBuilder;
-import org.mvel2.integration.VariableResolverFactory;
-
-/**
- * Tiles container factory that:
- * <ul>
- * <li>create supporting objects for Velocity and FreeMarker;</li>
- * <li>create renderers for Velocity, FreeMarker, and Mustache templates;</li>
- * <li>allows using EL, MVEL and OGNL as attribute expressions;</li>
- * <li>allows using Wildcards and Regular Expressions in definition names;</li>
- * <li>loads Tiles 1.x definition files;</li>
- * <li>loads all the definition files that have the "tiles*.xml" pattern under
- * <code>/WEB-INF</code> directory (and subdirectories) and under
- * <code>META-INF</code> directories (and subdirectories) in every jar.</li>
- * </ul>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class CompleteAutoloadTilesContainerFactory extends BasicTilesContainerFactory {
-
-    /**
-     * The freemarker renderer name.
-     */
-    private static final String FREEMARKER_RENDERER_NAME = "freemarker";
-
-    /**
-     * The velocity renderer name.
-     */
-    private static final String VELOCITY_RENDERER_NAME = "velocity";
-
-    /**
-     * The mustache renderer name.
-     */
-    private static final String MUSTACHE_RENDERER_NAME = "mustache";
-
-    /** {@inheritDoc} */
-    @Override
-    public TilesContainer createDecoratedContainer(TilesContainer originalContainer,
-            ApplicationContext applicationContext) {
-        return new CachingTilesContainer(originalContainer);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void registerAttributeRenderers(
-            final BasicRendererFactory rendererFactory,
-            final ApplicationContext applicationContext,
-            final TilesContainer container,
-            final AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        super.registerAttributeRenderers(rendererFactory, applicationContext, container, attributeEvaluatorFactory);
-
-        FreemarkerRenderer freemarkerRenderer = FreemarkerRendererBuilder
-                .createInstance()
-                .setApplicationContext(applicationContext)
-                .setParameter("TemplatePath", "/")
-                .setParameter("NoCache", "true")
-                .setParameter("ContentType", "text/html")
-                .setParameter("template_update_delay", "0")
-                .setParameter("default_encoding", "ISO-8859-1")
-                .setParameter("number_format", "0.##########")
-                .setParameter(SharedVariableLoaderFreemarkerServlet.CUSTOM_SHARED_VARIABLE_FACTORIES_INIT_PARAM,
-                        "tiles," + TilesSharedVariableFactory.class.getName()).build();
-        rendererFactory.registerRenderer(FREEMARKER_RENDERER_NAME, freemarkerRenderer);
-
-        VelocityRenderer velocityRenderer = VelocityRendererBuilder.createInstance()
-                .setApplicationContext(applicationContext).build();
-        rendererFactory.registerRenderer(VELOCITY_RENDERER_NAME, velocityRenderer);
-
-        MustacheRenderer mustacheRenderer = new MustacheRenderer();
-        mustacheRenderer.setAcceptPattern(Pattern.compile(".+\\.mustache"));
-        rendererFactory.registerRenderer(MUSTACHE_RENDERER_NAME, mustacheRenderer);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected Renderer createDefaultAttributeRenderer(BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext, TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-
-        ChainedDelegateRenderer retValue = new ChainedDelegateRenderer();
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(DEFINITION_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(VELOCITY_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(FREEMARKER_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(MUSTACHE_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(TEMPLATE_RENDERER_NAME));
-        retValue.addAttributeRenderer(rendererFactory.getRenderer(STRING_RENDERER_NAME));
-        return retValue;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected AttributeEvaluatorFactory createAttributeEvaluatorFactory(ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        BasicAttributeEvaluatorFactory attributeEvaluatorFactory = new BasicAttributeEvaluatorFactory(
-                createELEvaluator(applicationContext));
-        attributeEvaluatorFactory.registerAttributeEvaluator("MVEL", createMVELEvaluator());
-        attributeEvaluatorFactory.registerAttributeEvaluator("OGNL", createOGNLEvaluator());
-
-        return attributeEvaluatorFactory;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected <T> PatternDefinitionResolver<T> createPatternDefinitionResolver(Class<T> customizationKeyClass) {
-        DefinitionPatternMatcherFactory wildcardFactory = new WildcardDefinitionPatternMatcherFactory();
-        DefinitionPatternMatcherFactory regexpFactory = new RegexpDefinitionPatternMatcherFactory();
-        PrefixedPatternDefinitionResolver<T> resolver = new PrefixedPatternDefinitionResolver<T>();
-        resolver.registerDefinitionPatternMatcherFactory("WILDCARD", wildcardFactory);
-        resolver.registerDefinitionPatternMatcherFactory("REGEXP", regexpFactory);
-        return resolver;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected List<ApplicationResource> getSources(ApplicationContext applicationContext) {
-        Collection<ApplicationResource> webINFSet = applicationContext.getResources("/WEB-INF/**/tiles*.xml");
-        Collection<ApplicationResource> metaINFSet = applicationContext
-                .getResources("classpath*:META-INF/**/tiles*.xml");
-
-        List<ApplicationResource> filteredResources = new ArrayList<ApplicationResource>();
-        if (webINFSet != null) {
-            for (ApplicationResource resource : webINFSet) {
-                if (Locale.ROOT.equals(resource.getLocale())) {
-                    filteredResources.add(resource);
-                }
-            }
-        }
-        if (metaINFSet != null) {
-            for (ApplicationResource resource : metaINFSet) {
-                if (Locale.ROOT.equals(resource.getLocale())) {
-                    filteredResources.add(resource);
-                }
-            }
-        }
-        return filteredResources;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected DefinitionsReader createDefinitionsReader(ApplicationContext applicationContext) {
-        return new CompatibilityDigesterDefinitionsReader();
-    }
-
-    /**
-     * Creates the EL evaluator.
-     *
-     * @param applicationContext The Tiles application context.
-     * @return The EL evaluator.
-     */
-    private ELAttributeEvaluator createELEvaluator(ApplicationContext applicationContext) {
-        ELAttributeEvaluator evaluator = new ELAttributeEvaluator();
-        JspExpressionFactoryFactory efFactory = new JspExpressionFactoryFactory();
-        efFactory.setApplicationContext(applicationContext);
-        evaluator.setExpressionFactory(efFactory.getExpressionFactory());
-        ELResolver elResolver = new CompositeELResolver() {
-            {
-                BeanELResolver beanElResolver = new BeanELResolver(false);
-                add(new ScopeELResolver());
-                add(new TilesContextELResolver(beanElResolver));
-                add(new TilesContextBeanELResolver());
-                add(new ArrayELResolver(false));
-                add(new ListELResolver(false));
-                add(new MapELResolver(false));
-                add(new ResourceBundleELResolver());
-                add(beanElResolver);
-            }
-        };
-        evaluator.setResolver(elResolver);
-        return evaluator;
-    }
-
-    /**
-     * Creates the MVEL evaluator.
-     *
-     * @return The MVEL evaluator.
-     */
-    private MVELAttributeEvaluator createMVELEvaluator() {
-        TilesRequestContextHolder requestHolder = new TilesRequestContextHolder();
-        VariableResolverFactory variableResolverFactory = new ScopeVariableResolverFactory(requestHolder);
-        variableResolverFactory.setNextFactory(new TilesContextVariableResolverFactory(requestHolder));
-        variableResolverFactory.setNextFactory(new TilesContextBeanVariableResolverFactory(requestHolder));
-        MVELAttributeEvaluator mvelEvaluator = new MVELAttributeEvaluator(requestHolder, variableResolverFactory);
-        return mvelEvaluator;
-    }
-
-    /**
-     * Creates the OGNL evaluator.
-     *
-     * @return The OGNL evaluator.
-     */
-    private OGNLAttributeEvaluator createOGNLEvaluator() {
-        try {
-            PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);
-            PropertyAccessor applicationContextPropertyAccessor = new NestedObjectDelegatePropertyAccessor<Request>(
-                    new TilesApplicationContextNestedObjectExtractor(), objectPropertyAccessor);
-            PropertyAccessor anyScopePropertyAccessor = new AnyScopePropertyAccessor();
-            PropertyAccessor scopePropertyAccessor = new ScopePropertyAccessor();
-            PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                    objectPropertyAccessor, applicationContextPropertyAccessor, anyScopePropertyAccessor,
-                    scopePropertyAccessor);
-            PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor<Request>(factory);
-            OgnlRuntime.setPropertyAccessor(Request.class, tilesRequestAccessor);
-            return new OGNLAttributeEvaluator();
-        } catch (OgnlException e) {
-            throw new TilesContainerFactoryException("Cannot initialize OGNL evaluator", e);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializer.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializer.java
deleted file mode 100644
index 8cb4328..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializer.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.servlet.wildcard.WildcardServletApplicationContext;
-import org.apache.tiles.startup.AbstractTilesInitializer;
-
-/**
- * This initializer uses {@link WildcardServletApplicationContext} to
- * retrieve resources using Ant-style patterns and creates a
- * {@link CompleteAutoloadTilesContainerFactory} to load all new features of
- * Tiles at once.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class CompleteAutoloadTilesInitializer extends AbstractTilesInitializer {
-
-    /** {@inheritDoc} */
-    @Override
-    protected ApplicationContext createTilesApplicationContext(
-            ApplicationContext preliminaryContext) {
-        return new WildcardServletApplicationContext(
-                (ServletContext) preliminaryContext.getContext());
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context) {
-        return new CompleteAutoloadTilesContainerFactory();
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListener.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListener.java
deleted file mode 100644
index 8d500ef..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import org.apache.tiles.startup.TilesInitializer;
-import org.apache.tiles.web.startup.AbstractTilesListener;
-
-/**
- * Tiles listener that executes {@link CompleteAutoloadTilesInitializer}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class CompleteAutoloadTilesListener extends AbstractTilesListener {
-
-    /** {@inheritDoc} */
-    @Override
-    protected TilesInitializer createTilesInitializer() {
-        return new CompleteAutoloadTilesInitializer();
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/package-info.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/package-info.java
deleted file mode 100644
index ee7db14..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/complete/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * These classes allow to start up Tiles with all features on.
- */
-package org.apache.tiles.extras.complete;
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesInitializer.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesInitializer.java
deleted file mode 100644
index adf4f18..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesInitializer.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.module;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.definition.DefinitionsFactoryException;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.apache.tiles.request.servlet.wildcard.WildcardServletApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-
-/**
- * Loads Tiles modules, initializes them and destroy them at the end.<br>
- * It loads all META-INF/MANIFEST.MF files, checks for the "Tiles-Initializer"
- * property that must contain a valid class name of a {@link TilesInitializer}.
- * After that, initializes all found initializers, one by one. When the
- * {@link #destroy()} method is called, all the initializers are then destroyed.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class ModularTilesInitializer implements TilesInitializer {
-
-    /**
-     * The initializers to use.
-     */
-    private List<TilesInitializer> initializers;
-
-    /** {@inheritDoc} */
-    public void initialize(ApplicationContext preliminaryContext) {
-        ApplicationContext applicationContext = new WildcardServletApplicationContext(
-                (ServletContext) preliminaryContext.getContext());
-        loadInitializers(applicationContext);
-
-        for (TilesInitializer initializer : initializers) {
-            initializer.initialize(preliminaryContext);
-        }
-    }
-
-    /** {@inheritDoc} */
-    public void destroy() {
-        for (TilesInitializer initializer : initializers) {
-            initializer.destroy();
-        }
-    }
-
-    /**
-     * Load all the initializers from manifest files.
-     *
-     * @param applicationContext The application context.
-     */
-    private void loadInitializers(ApplicationContext applicationContext) {
-        initializers = new ArrayList<TilesInitializer>();
-        try {
-            Collection<ApplicationResource> resources = applicationContext
-                    .getResources("classpath*:META-INF/MANIFEST.MF");
-            ApplicationResource mainResource = applicationContext.getResource("/META-INF/MANIFEST.MF");
-            if (mainResource != null) {
-                resources.add(mainResource);
-            }
-            for (ApplicationResource resource : resources) {
-                InputStream stream = resource.getInputStream();
-                try {
-                    Manifest manifest = new Manifest(stream);
-                    Attributes attributes = manifest.getMainAttributes();
-                    if (attributes != null) {
-                        String initializerName = attributes.getValue("Tiles-Initializer");
-                        if (initializerName != null) {
-                            TilesInitializer initializer = (TilesInitializer) ClassUtil
-                                    .instantiate(initializerName);
-                            initializers.add(initializer);
-                        }
-                    }
-                } finally {
-                    stream.close();
-                }
-            }
-        } catch (IOException e) {
-            throw new DefinitionsFactoryException("Error getting manifest files", e);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesListener.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesListener.java
deleted file mode 100644
index 9881e9c..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/ModularTilesListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.module;
-
-import org.apache.tiles.startup.TilesInitializer;
-import org.apache.tiles.web.startup.AbstractTilesListener;
-
-/**
- * Tiles listener that executes {@link ModularTilesInitializer}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.1
- */
-public class ModularTilesListener extends AbstractTilesListener {
-
-    /** {@inheritDoc} */
-    @Override
-    protected TilesInitializer createTilesInitializer() {
-        return new ModularTilesInitializer();
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/package-info.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/package-info.java
deleted file mode 100644
index fc44b2b..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/module/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * These classes allow to initialize independent module of Tiles.
- */
-package org.apache.tiles.extras.module;
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/OptionsRenderer.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/OptionsRenderer.java
deleted file mode 100644
index 77aac7a..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/OptionsRenderer.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.extras.renderer;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.Renderer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Provides a custom "options" syntax for attributes.
- * The first option that can be rendered is.
- * Comes from <a href="http://tech.finn.no/the-ultimate-view/">The Ultimate View</a> article.<p/>
- *
- * Actual rendering is delegated to the TypeDetectingRenderer that's supplied in the constructor.<p/>
- *
- * For example:
- * "/WEB-INF/tiles/fragments/${options[myoptions]}/content.jsp"
- * given the myptions list-attribute is defined like:
- * <pre>
-        &lt;put-list-attribute name="myoptions">
-            &lt;add-list-attribute>
-                &lt;add-attribute value="car"/>
-                &lt;add-attribute value="vechile"/>
-                &lt;add-attribute value="advert"/>
-            &lt;/add-list-attribute>
-        &lt;/put-list-attribute>
-   </pre>
- * will look for content.jsp <br/>
- * first in "/WEB-INF/tiles/fragments/car/" then <br/>
- * second in "/WEB-INF/tiles/fragments/vechile/" and <br/>
- * last in "/WEB-INF/tiles/fragments/advert".
- * <p/>
- * <p/>
- * Currently only supports one occurrance of such an "option" pattern in the attribute's value.
- *
- * Limitation: "looking" for templates is implemented using applicationContext.getResource(..)
- * therefore the option values in the options list need to be visible as applicationResources.
- *
- */
-public final class OptionsRenderer implements Renderer {
-
-    private static final Pattern OPTIONS_PATTERN
-            = Pattern.compile(Pattern.quote("{options[") + "(.+)" + Pattern.quote("]}"));
-
-    private static final Logger LOG = LoggerFactory.getLogger(OptionsRenderer.class);
-
-    private final ApplicationContext applicationContext;
-    private final Renderer renderer;
-
-    public OptionsRenderer(final ApplicationContext applicationContext, final Renderer renderer) {
-        this.applicationContext = applicationContext;
-        this.renderer = renderer;
-    }
-
-    @Override
-    public boolean isRenderable(final String path, final Request request) {
-        return renderer.isRenderable(path, request);
-    }
-
-    @Override
-    public void render(final String path, final Request request) throws IOException {
-
-        Matcher matcher =  OPTIONS_PATTERN.matcher((String) path);
-
-        if (null != matcher && matcher.find()) {
-            boolean done = false;
-            String match = matcher.group(1);
-            ListAttribute fallbacks = (ListAttribute) TilesAccess
-                    .getCurrentContainer(request)
-                    .getAttributeContext(request)
-                    .getAttribute(match);
-
-            if (null == fallbacks) {
-                throw new IllegalStateException("A matching list-attribute name=\"" + match + "\" must be defined.");
-            } else if (fallbacks.getValue().isEmpty()) {
-                throw new IllegalStateException(
-                        "list-attribute name=\"" + match + "\" must have minimum one attribute");
-            }
-
-            for (Attribute option : (List<Attribute>) fallbacks.getValue()) {
-                String template = path.replaceFirst(Pattern.quote(matcher.group()), (String) option.getValue());
-                done = renderAttempt(template, request);
-                if (done) { break; }
-            }
-            if (!done) {
-              throw new IOException("None of the options existed for " + path);
-            }
-        } else {
-            renderer.render(path, request);
-        }
-    }
-
-    private boolean renderAttempt(final String template, final Request request) throws IOException {
-        boolean result = false;
-        if (!Cache.isTemplateMissing(template)) {
-            try {
-                if (null != applicationContext.getResource(template)) { // can throw FileNotFoundException !
-                    renderer.render(template, request); // can throw FileNotFoundException !
-                    result = true;
-                    Cache.setIfAbsentTemplateFound(template, true);
-                }
-            } catch (FileNotFoundException ex) {
-                if (ex.getMessage().contains(template)) {
-                    // expected outcome. continue loop.
-                    LOG.trace(ex.getMessage());
-                } else {
-                    // comes from an inner templateAttribute.render(..) so throw on
-                    throw ex;
-                }
-            } catch (IOException ex) { //xxx ???
-                throw ex;
-            }
-            Cache.setIfAbsentTemplateFound(template, false);
-        }
-        return result;
-    }
-
-    private static final class Cache {
-
-        /** It takes CACHE_LIFE milliseconds for any hot deployments to register.
-         */
-        private static final ConcurrentMap<String,Boolean> TEMPLATE_EXISTS
-                = new ConcurrentHashMap<String,Boolean>();
-
-        private static volatile long cacheLastCleaned = System.currentTimeMillis();
-
-        private static final String CACHE_LIFE_PROPERTY = Cache.class.getName() + ".ttl_ms";
-
-        /** Cache TTL be customised by a system property like
-         *  -Dorg.apache.tiles.extras.renderer.OptionsRenderer.Cache.ttl_ms=0
-         *
-         * The default is 5 minutes.
-         * Setting it to zero disables all caching.
-         */
-        private static final long CACHE_LIFE = null != Long.getLong(CACHE_LIFE_PROPERTY)
-                ? Long.getLong(CACHE_LIFE_PROPERTY)
-                : 1000 * 60 * 5;
-
-        static boolean isTemplateMissing(final String template) {
-            if (0 < CACHE_LIFE && System.currentTimeMillis() > cacheLastCleaned + CACHE_LIFE) {
-                cacheLastCleaned = System.currentTimeMillis();
-                TEMPLATE_EXISTS.clear();
-                return false;
-            } else {
-                return TEMPLATE_EXISTS.containsKey(template) && !TEMPLATE_EXISTS.get(template);
-            }
-        }
-
-        static void setIfAbsentTemplateFound(final String template, final boolean found) {
-            if (0 < CACHE_LIFE && !TEMPLATE_EXISTS.containsKey(template)) {
-                TEMPLATE_EXISTS.putIfAbsent(template, found);
-            }
-        }
-
-        private Cache() {}
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/package-info.java b/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/package-info.java
deleted file mode 100644
index f41d8f6..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/java/org/apache/tiles/extras/renderer/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Provides a custom "options" syntax for attributes.
- * The first option from a list that can be rendered is.
- *
- * Comes from <a href="http://tech.finn.no/the-ultimate-view/">The Ultimate View</a> article.
- */
-package org.apache.tiles.extras.renderer;
diff --git a/TILES_3_0_X/tiles-extras/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-extras/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-extras/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-extras/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-extras/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-extras/src/site/site.xml b/TILES_3_0_X/tiles-extras/src/site/site.xml
deleted file mode 100644
index 6b8e578..0000000
--- a/TILES_3_0_X/tiles-extras/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Extras">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java
deleted file mode 100644
index b03a517..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesContainerFactoryTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.el.ExpressionFactory;
-import javax.servlet.ServletContext;
-import javax.servlet.jsp.JspApplicationContext;
-import javax.servlet.jsp.JspFactory;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.compat.definition.digester.CompatibilityDigesterDefinitionsReader;
-import org.apache.tiles.definition.pattern.PatternDefinitionResolver;
-import org.apache.tiles.definition.pattern.PrefixedPatternDefinitionResolver;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.evaluator.BasicAttributeEvaluatorFactory;
-import org.apache.tiles.impl.mgmt.CachingTilesContainer;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.renderer.DefinitionRenderer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.freemarker.render.FreemarkerRenderer;
-import org.apache.tiles.request.mustache.MustacheRenderer;
-import org.apache.tiles.request.render.BasicRendererFactory;
-import org.apache.tiles.request.render.ChainedDelegateRenderer;
-import org.apache.tiles.request.render.DispatchRenderer;
-import org.apache.tiles.request.render.Renderer;
-import org.apache.tiles.request.render.StringRenderer;
-import org.apache.tiles.request.servlet.ServletApplicationContext;
-import org.apache.tiles.request.velocity.render.VelocityRenderer;
-import org.apache.velocity.tools.view.VelocityView;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link CompleteAutoloadTilesContainerFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class CompleteAutoloadTilesContainerFactoryTest {
-
-    /**
-     * The object to test.
-     */
-    private CompleteAutoloadTilesContainerFactory factory;
-
-    /**
-     * Initializes the object.
-     */
-    @Before
-    public void setUp() {
-        factory = new CompleteAutoloadTilesContainerFactory();
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory#createDecoratedContainer(TilesContainer, ApplicationContext)
-     * .
-     */
-    @Test
-    public void testCreateDecoratedContainer() {
-        ApplicationContext applicationContext = createMock(ServletApplicationContext.class);
-        TilesContainer wrapped = createMock(TilesContainer.class);
-
-        replay(applicationContext, wrapped);
-        assertSame(wrapped,
-                ((CachingTilesContainer) factory.createDecoratedContainer(wrapped, applicationContext))
-                        .getWrappedContainer());
-        verify(applicationContext, wrapped);
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory
-     * #registerAttributeRenderers(BasicRendererFactory, ApplicationContext,
-     * TilesContainer, evaluator.AttributeEvaluatorFactory)}
-     * .
-     */
-    @SuppressWarnings("deprecation")
-    @Test
-    public void testRegisterAttributeRenderers() {
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-        ServletApplicationContext applicationContext = createMock(ServletApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-
-        rendererFactory.registerRenderer(eq("string"), isA(StringRenderer.class));
-        rendererFactory.registerRenderer(eq("template"), isA(DispatchRenderer.class));
-        rendererFactory.registerRenderer(eq("definition"), isA(DefinitionRenderer.class));
-        rendererFactory.registerRenderer(eq("freemarker"), isA(FreemarkerRenderer.class));
-        rendererFactory.registerRenderer(eq("velocity"), isA(VelocityRenderer.class));
-        rendererFactory.registerRenderer(eq("mustache"), isA(MustacheRenderer.class));
-
-        expect(applicationContext.getContext()).andReturn(servletContext).anyTimes();
-        expect(servletContext.getInitParameter(VelocityView.PROPERTIES_KEY)).andReturn(null);
-        expect(servletContext.getInitParameter(VelocityView.TOOLS_KEY)).andReturn(null);
-        expect(servletContext.getAttribute(VelocityView.TOOLS_KEY)).andReturn(null);
-        expect(servletContext.getResourceAsStream("/WEB-INF/velocity.properties")).andReturn(
-                getClass().getResourceAsStream("/velocity.properties"));
-        expect(servletContext.getResourceAsStream("/WEB-INF/VM_global_library.vm")).andReturn(
-                getClass().getResourceAsStream("/VM_global_library.vm"));
-        expect(servletContext.getResourceAsStream("/WEB-INF/tools.xml")).andReturn(
-                getClass().getResourceAsStream("/tools.xml"));
-        expect(servletContext.getResourceAsStream(VelocityView.DEPRECATED_USER_TOOLS_PATH)).andReturn(null);
-        servletContext.log((String) anyObject());
-        expectLastCall().anyTimes();
-        expect(servletContext.getRealPath("/")).andReturn(null);
-
-        replay(rendererFactory, applicationContext, container, attributeEvaluatorFactory, servletContext);
-        factory.registerAttributeRenderers(rendererFactory, applicationContext, container, attributeEvaluatorFactory);
-        verify(rendererFactory, applicationContext, container, attributeEvaluatorFactory, servletContext);
-    }
-
-    /**
-     * Tests
-     * {@link CompleteAutoloadTilesContainerFactory#createDefaultAttributeRenderer(BasicRendererFactory,
-     * ApplicationContext, TilesContainer, AttributeEvaluatorFactory)}.
-     */
-    @Test
-    public void testCreateDefaultAttributeRenderer() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = createMock(AttributeEvaluatorFactory.class);
-        BasicRendererFactory rendererFactory = createMock(BasicRendererFactory.class);
-        Renderer stringRenderer = createMock(Renderer.class);
-        Renderer templateRenderer = createMock(Renderer.class);
-        Renderer definitionRenderer = createMock(Renderer.class);
-        Renderer velocityRenderer = createMock(Renderer.class);
-        Renderer freemarkerRenderer = createMock(Renderer.class);
-        Renderer mustacheRenderer = createMock(Renderer.class);
-
-        expect(rendererFactory.getRenderer("string")).andReturn(stringRenderer);
-        expect(rendererFactory.getRenderer("template")).andReturn(templateRenderer);
-        expect(rendererFactory.getRenderer("definition")).andReturn(definitionRenderer);
-        expect(rendererFactory.getRenderer("velocity")).andReturn(velocityRenderer);
-        expect(rendererFactory.getRenderer("freemarker")).andReturn(freemarkerRenderer);
-        expect(rendererFactory.getRenderer("mustache")).andReturn(mustacheRenderer);
-
-        replay(container, attributeEvaluatorFactory, rendererFactory, applicationContext);
-        Renderer renderer = factory.createDefaultAttributeRenderer(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        assertTrue("The default renderer class is not correct", renderer instanceof ChainedDelegateRenderer);
-        verify(container, attributeEvaluatorFactory, rendererFactory, applicationContext);
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory
-     * #createAttributeEvaluatorFactory(ApplicationContext, locale.LocaleResolver)}
-     * .
-     */
-    @Test
-    public void testCreateAttributeEvaluatorFactory() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        LocaleResolver resolver = createMock(LocaleResolver.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        JspFactory jspFactory = createMock(JspFactory.class);
-        JspApplicationContext jspApplicationContext = createMock(JspApplicationContext.class);
-        ExpressionFactory expressionFactory = createMock(ExpressionFactory.class);
-
-        expect(applicationContext.getContext()).andReturn(servletContext);
-        expect(jspFactory.getJspApplicationContext(servletContext)).andReturn(jspApplicationContext);
-        expect(jspApplicationContext.getExpressionFactory()).andReturn(expressionFactory);
-
-        replay(applicationContext, resolver, servletContext, jspFactory, jspApplicationContext, expressionFactory);
-        JspFactory.setDefaultFactory(jspFactory);
-        AttributeEvaluatorFactory attributeEvaluatorFactory = factory.createAttributeEvaluatorFactory(
-                applicationContext, resolver);
-        assertTrue(attributeEvaluatorFactory instanceof BasicAttributeEvaluatorFactory);
-        assertNotNull(attributeEvaluatorFactory.getAttributeEvaluator("EL"));
-        assertNotNull(attributeEvaluatorFactory.getAttributeEvaluator("MVEL"));
-        assertNotNull(attributeEvaluatorFactory.getAttributeEvaluator("OGNL"));
-        verify(applicationContext, resolver, servletContext, jspFactory, jspApplicationContext, expressionFactory);
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory#createPatternDefinitionResolver(Class)}
-     * .
-     */
-    @Test
-    public void testCreatePatternDefinitionResolver() {
-        PatternDefinitionResolver<Integer> resolver = factory.createPatternDefinitionResolver(Integer.class);
-        assertTrue(resolver instanceof PrefixedPatternDefinitionResolver);
-        Definition definitionWildcard = new Definition("WILDCARD:blah*", (Attribute) null, null);
-        Definition definitionRegexp = new Definition("REGEXP:what(.*)", (Attribute) null, null);
-        Map<String, Definition> definitionMap = new HashMap<String, Definition>();
-        definitionMap.put("WILDCARD:blah*", definitionWildcard);
-        definitionMap.put("REGEXP:what(.*)", definitionRegexp);
-        resolver.storeDefinitionPatterns(definitionMap, 1);
-        Definition result = resolver.resolveDefinition("blahX", 1);
-        assertEquals("blahX", result.getName());
-        result = resolver.resolveDefinition("whatX", 1);
-        assertEquals("whatX", result.getName());
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory#getSources(ApplicationContext)}
-     * .
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testGetSources() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        ApplicationResource resource1 = createMock(ApplicationResource.class);
-        expect(resource1.getLocale()).andReturn(Locale.ROOT);
-        ApplicationResource resource2 = createMock(ApplicationResource.class);
-        expect(resource2.getLocale()).andReturn(Locale.ITALY);
-        ApplicationResource resource3 = createMock(ApplicationResource.class);
-        expect(resource3.getLocale()).andReturn(Locale.ROOT);
-
-        Collection<ApplicationResource> resourceSet1 = new HashSet<ApplicationResource>();
-        resourceSet1.add(resource1);
-        resourceSet1.add(resource2);
-
-        Collection<ApplicationResource> resourceSet2 = new HashSet<ApplicationResource>();
-        resourceSet2.add(resource3);
-
-        expect(applicationContext.getResources("/WEB-INF/**/tiles*.xml")).andReturn(resourceSet1);
-        expect(applicationContext.getResources("classpath*:META-INF/**/tiles*.xml")).andReturn(resourceSet2);
-
-        replay(applicationContext, resource1, resource2, resource3);
-        List<ApplicationResource> urls = factory.getSources(applicationContext);
-        assertEquals(2, urls.size());
-        assertTrue(urls.contains(resource1));
-        assertTrue(urls.contains(resource3));
-        verify(applicationContext, resource1, resource2, resource3);
-    }
-
-    /**
-     * Regression test for TILES-484 issue.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testTILES484first() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        ApplicationResource resource = createMock(ApplicationResource.class);
-        expect(resource.getLocale()).andReturn(Locale.ROOT);
-
-        Collection<ApplicationResource> resourceSet = new HashSet<ApplicationResource>();
-        resourceSet.add(resource);
-
-        expect(applicationContext.getResources("/WEB-INF/**/tiles*.xml")).andReturn(null);
-        expect(applicationContext.getResources("classpath*:META-INF/**/tiles*.xml")).andReturn(resourceSet);
-
-        replay(applicationContext, resource);
-        List<ApplicationResource> resources = factory.getSources(applicationContext);
-        assertEquals(1, resources.size());
-        assertTrue(resources.contains(resource));
-        verify(applicationContext, resource);
-    }
-
-    /**
-     * Regression test for TILES-484 issue.
-     *
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testTILES484second() throws IOException {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        ApplicationResource resource1 = createMock(ApplicationResource.class);
-        expect(resource1.getLocale()).andReturn(Locale.ROOT);
-        ApplicationResource resource2 = createMock(ApplicationResource.class);
-        expect(resource2.getLocale()).andReturn(Locale.ITALY);
-
-        Collection<ApplicationResource> resourceSet = new HashSet<ApplicationResource>();
-        resourceSet.add(resource1);
-        resourceSet.add(resource2);
-
-        expect(applicationContext.getResources("/WEB-INF/**/tiles*.xml")).andReturn(resourceSet);
-        expect(applicationContext.getResources("classpath*:META-INF/**/tiles*.xml")).andReturn(null);
-
-        replay(applicationContext, resource1, resource2);
-        List<ApplicationResource> resources = factory.getSources(applicationContext);
-        assertEquals(1, resources.size());
-        assertTrue(resources.contains(resource1));
-        verify(applicationContext, resource1, resource2);
-    }
-
-    /**
-     * Test method for
-     * {@link CompleteAutoloadTilesContainerFactory
-     * #createDefinitionsReader(ApplicationContext)}
-     * .
-     */
-    @Test
-    public void testCreateDefinitionsReader() {
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        replay(applicationContext);
-        assertTrue(factory.createDefinitionsReader(applicationContext) instanceof CompatibilityDigesterDefinitionsReader);
-        verify(applicationContext);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializerTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializerTest.java
deleted file mode 100644
index a09566a..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesInitializerTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.servlet.wildcard.WildcardServletApplicationContext;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author antonio
- *
- * @version $Rev$ $Date$
- */
-public class CompleteAutoloadTilesInitializerTest {
-
-    /**
-     * The object to test.
-     */
-    private CompleteAutoloadTilesInitializer initializer;
-
-    /**
-     * Sets up the object to test.
-     */
-    @Before
-    public void setUp() {
-        initializer = new CompleteAutoloadTilesInitializer();
-    }
-
-    /**
-     * Test method for {@link CompleteAutoloadTilesInitializer#createTilesApplicationContext(ApplicationContext)}.
-     */
-    @Test
-    public void testCreateTilesApplicationContext() {
-        ApplicationContext preliminaryContext = createMock(ApplicationContext.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-
-        expect(preliminaryContext.getContext()).andReturn(servletContext);
-
-        replay(preliminaryContext, servletContext);
-        assertTrue(initializer
-                .createTilesApplicationContext(preliminaryContext) instanceof WildcardServletApplicationContext);
-        verify(preliminaryContext, servletContext);
-    }
-
-    /**
-     * Test method for {@link CompleteAutoloadTilesInitializer#createContainerFactory(ApplicationContext)}.
-     */
-    @Test
-    public void testCreateContainerFactory() {
-        ApplicationContext context = createMock(ApplicationContext.class);
-
-        replay(context);
-        assertTrue(initializer.createContainerFactory(context) instanceof CompleteAutoloadTilesContainerFactory);
-        verify(context);
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListenerTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListenerTest.java
deleted file mode 100644
index 83f77e7..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/complete/CompleteAutoloadTilesListenerTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.complete;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link CompleteAutoloadTilesListener}.
- *
- * @version $Rev$ $Date$
- */
-public class CompleteAutoloadTilesListenerTest {
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.extras.complete.CompleteAutoloadTilesListener#createTilesInitializer()}
-     * .
-     */
-    @Test
-    public void testCreateTilesInitializer() {
-        CompleteAutoloadTilesListener listener = new CompleteAutoloadTilesListener();
-        assertTrue(listener.createTilesInitializer() instanceof CompleteAutoloadTilesInitializer);
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesInitializerTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesInitializerTest.java
deleted file mode 100644
index a03b531..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesInitializerTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.module;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-import org.junit.Test;
-
-/**
- * Tests {@link ModularTilesInitializer}.
- *
- * @version $Rev$ $Date$
- */
-public class ModularTilesInitializerTest {
-
-    /**
-     * Tests {@link ModularTilesInitializer#initialize(ApplicationContext)}
-     * and {@link ModularTilesInitializer#destroy()}.
-     *
-     * @throws MalformedURLException Never thrown.
-     */
-    @Test
-    public void testInitialize() throws MalformedURLException {
-        ApplicationContext preliminaryContext = createMock(ApplicationContext.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        URL manifestUrl = getClass().getResource("/FAKE-MANIFEST.MF");
-
-        expect(preliminaryContext.getContext()).andReturn(servletContext);
-        expect(servletContext.getResource("/META-INF/MANIFEST.MF")).andReturn(manifestUrl);
-
-        replay(preliminaryContext, servletContext);
-        ModularTilesInitializer initializer = new ModularTilesInitializer();
-        initializer.initialize(preliminaryContext);
-        assertTrue(TilesInitializer1.initialized);
-        assertTrue(TilesInitializer2.initialized);
-        initializer.destroy();
-        assertTrue(TilesInitializer1.destroyed);
-        assertTrue(TilesInitializer2.destroyed);
-        verify(preliminaryContext, servletContext);
-    }
-
-    /**
-     * A mock {@link TilesInitializer} with probes.
-     *
-     * @version $Rev$ $Date$
-     */
-    public static class TilesInitializer1 implements TilesInitializer {
-
-        /**
-         * A probe to see if the initializer has been initialized.
-         */
-        private static boolean initialized = false;
-
-        /**
-         * A probe to see if the initializer has been destroyed.
-         */
-        private static boolean destroyed = false;
-
-        /** {@inheritDoc} */
-        public void initialize(ApplicationContext preliminaryContext) {
-            initialized = true;
-        }
-
-        /** {@inheritDoc} */
-        public void destroy() {
-            destroyed = true;
-        }
-    }
-
-    /**
-     * A second mock {@link TilesInitializer} with probes.
-     *
-     * @version $Rev$ $Date$
-     */
-    public static class TilesInitializer2 implements TilesInitializer {
-
-        /**
-         * A probe to see if the initializer has been initialized.
-         */
-        private static boolean initialized = false;
-
-        /**
-         * A probe to see if the initializer has been destroyed.
-         */
-        private static boolean destroyed = false;
-
-        /** {@inheritDoc} */
-        public void initialize(ApplicationContext preliminaryContext) {
-            initialized = true;
-        }
-
-        /** {@inheritDoc} */
-        public void destroy() {
-            destroyed = true;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesListenerTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesListenerTest.java
deleted file mode 100644
index b02a9d6..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/module/ModularTilesListenerTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.extras.module;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link ModularTilesListener}.
- *
- * @version $Rev$ $Date$
- */
-public class ModularTilesListenerTest {
-
-    /**
-     * Test method for
-     * {@link org.apache.tiles.extras.complete.ModularTilesListener#createTilesInitializer()}
-     * .
-     */
-    @Test
-    public void testCreateTilesInitializer() {
-        ModularTilesListener listener = new ModularTilesListener();
-        assertTrue(listener.createTilesInitializer() instanceof ModularTilesInitializer);
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/renderer/OptionsRendererTest.java b/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/renderer/OptionsRendererTest.java
deleted file mode 100644
index 765aa71..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/java/org/apache/tiles/extras/renderer/OptionsRendererTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.extras.renderer;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import org.apache.tiles.Attribute;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.impl.BasicTilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.locale.PostfixedApplicationResource;
-import org.apache.tiles.request.render.StringRenderer;
-import org.junit.Test;
-
-/**
- * Tests {@link OptionsRenderer}.
- *
- * @version $Rev$ $Date$
- */
-public final class OptionsRendererTest {
-
-    private final BasicTilesContainer container = new BasicTilesContainer();
-
-    private final Map<String, Object> appScope = new HashMap<String, Object>(){{
-        put(TilesAccess.CONTAINER_ATTRIBUTE, container);
-    }};
-
-    private final Map<String, Object> requestScope = new HashMap<String, Object>();
-
-    private final ApplicationResource template = new PostfixedApplicationResource("Result"){
-        @Override
-        public InputStream getInputStream() throws IOException {
-            throw new AssertionError("Shouldn't be called.");
-        }
-        @Override
-        public long getLastModified() throws IOException {
-            return 0;
-        }
-    };
-
-    private final ApplicationContext context = new ApplicationContext(){
-        @Override
-        public Object getContext() {
-            throw new AssertionError("Shouldn't be called.");
-        }
-        @Override
-        public Map<String, Object> getApplicationScope() {
-            return appScope;
-        }
-        @Override
-        public Map<String, String> getInitParams() {
-            throw new AssertionError("Shouldn't be called.");
-        }
-        @Override
-        public ApplicationResource getResource(String string) {
-            return template;
-        }
-        @Override
-        public ApplicationResource getResource(ApplicationResource ar, Locale locale) {
-            throw new AssertionError("Shouldn't be called.");
-        }
-        @Override
-        public Collection<ApplicationResource> getResources(String string) {
-            throw new AssertionError("Shouldn't be called.");
-        }
-    };
-
-    /**
-     * Tests
-     * {@link OptionsRenderer#render(String, Request)}.
-     *
-     * @throws IOException If something goes wrong during rendition.
-     */
-    @Test
-    public void testWrite() throws IOException {
-        StringWriter writer = new StringWriter();
-        Request request = createMock(Request.class);
-
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getContext(matches("request"))).andReturn(requestScope).anyTimes();
-        expect(request.getApplicationContext()).andReturn(context);
-        expect(request.getWriter()).andReturn(writer);
-        replay(request);
-
-        container
-                .getAttributeContext(request)
-                .putAttribute("test-fallback", new ListAttribute(){{
-                    add(new Attribute("Result"));
-                }});
-
-        OptionsRenderer renderer = new OptionsRenderer(context, new StringRenderer());
-        renderer.render("{options[test-fallback]}", request);
-        writer.close();
-        assertEquals("Not written 'Result'", "Result", writer.toString());
-        verify(request);
-    }
-
-    /**
-     * Tests
-     * {@link OptionsRenderer#isRenderable(String, Request)}.
-     */
-    @Test
-    public void testIsRenderable() {
-        Request requestContext = createMock(Request.class);
-        OptionsRenderer renderer = new OptionsRenderer(context, new StringRenderer());
-        assertTrue(renderer.isRenderable("any-string", requestContext));
-    }
-}
diff --git a/TILES_3_0_X/tiles-extras/src/test/resources/FAKE-MANIFEST.MF b/TILES_3_0_X/tiles-extras/src/test/resources/FAKE-MANIFEST.MF
deleted file mode 100644
index 352b0db..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/resources/FAKE-MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Tiles-Initializer: org.apache.tiles.extras.module.ModularTilesInitializerTest$TilesInitializer2
-
diff --git a/TILES_3_0_X/tiles-extras/src/test/resources/META-INF/MANIFEST.MF b/TILES_3_0_X/tiles-extras/src/test/resources/META-INF/MANIFEST.MF
deleted file mode 100644
index 540b988..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/resources/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Tiles-Initializer: org.apache.tiles.extras.module.ModularTilesInitializerTest$TilesInitializer1
-
diff --git a/TILES_3_0_X/tiles-extras/src/test/resources/VM_global_library.vm b/TILES_3_0_X/tiles-extras/src/test/resources/VM_global_library.vm
deleted file mode 100644
index 7e8277d..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/resources/VM_global_library.vm
+++ /dev/null
@@ -1,60 +0,0 @@
-## 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.
-
-## Display all queued Struts errors
-#macro (errorMarkup)
-    #if ($errors.exist() )
-        <ul>
-        #foreach ($e in $errors.all )
-            $e
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts errors for a particular property
-#macro (errorMarkupForProperty $property)
-    #if ($errors.exist($property) )
-        <ul>
-        #foreach ($er in $errors.get($property))
-            $er
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts errors
-#macro (messageMarkup)
-    #if ($messages.exist() )
-        <ul>
-        #foreach ($m in $messages.all )
-            $m
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts action messages for a particular property
-#macro (messageMarkupForProperty $property)
-    #if ($messages.exist($property) )
-        <ul>
-        #foreach ($m in $messages.get($property))
-            $m
-        #end
-        </ul>
-    #end
-#end
diff --git a/TILES_3_0_X/tiles-extras/src/test/resources/tools.xml b/TILES_3_0_X/tiles-extras/src/test/resources/tools.xml
deleted file mode 100644
index ae29eb6..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/resources/tools.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0"?>
-<!--
- 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.
--->
-<tools>
-  <toolbox scope="request">
-    <tool class="org.apache.velocity.tools.generic.ContextTool"/>
-  </toolbox>
-  <toolbox scope="application">
-     <tool class="org.apache.velocity.tools.generic.EscapeTool"/>
-   </toolbox>
-</tools>
diff --git a/TILES_3_0_X/tiles-extras/src/test/resources/velocity.properties b/TILES_3_0_X/tiles-extras/src/test/resources/velocity.properties
deleted file mode 100644
index 4dbb194..0000000
--- a/TILES_3_0_X/tiles-extras/src/test/resources/velocity.properties
+++ /dev/null
@@ -1,114 +0,0 @@
-# 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.
-
-# ----------------------------------------------------------------------------
-# These are the default properties for the
-# Velocity Runtime. These values are used when
-# Runtime.init() is called, and when Runtime.init(properties)
-# fails to find the specificed properties file.
-# ----------------------------------------------------------------------------
-
-
-# ----------------------------------------------------------------------------
-# R U N T I M E  L O G
-# ----------------------------------------------------------------------------
-# Velocity uses the Servlet APIs logging facilites.
-
-# ----------------------------------------------------------------------------
-# This controls if Runtime.error(), info() and warn() messages include the
-# whole stack trace. The last property controls whether invalid references
-# are logged.
-# ----------------------------------------------------------------------------
-
-runtime.log.invalid.reference = true
-
-
-# ----------------------------------------------------------------------------
-# T E M P L A T E  E N C O D I N G
-# ----------------------------------------------------------------------------
-
-input.encoding=ISO-8859-1
-output.encoding=ISO-8859-1
-
-
-# ----------------------------------------------------------------------------
-# F O R E A C H  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-# These properties control how the counter is accessed in the #foreach
-# directive. By default the reference $velocityCount will be available
-# in the body of the #foreach directive. The default starting value
-# for this reference is 1.
-# ----------------------------------------------------------------------------
-
-directive.foreach.counter.name = velocityCount
-directive.foreach.counter.initial.value = 1
-
-
-# ----------------------------------------------------------------------------
-# I N C L U D E  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-# These are the properties that governed the way #include'd content
-# is governed.
-# ----------------------------------------------------------------------------
-
-directive.include.output.errormsg.start = <!-- include error :
-directive.include.output.errormsg.end   =  see error log -->
-
-
-# ----------------------------------------------------------------------------
-# P A R S E  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-
-directive.parse.max.depth = 10
-
-
-# ----------------------------------------------------------------------------
-# VELOCIMACRO PROPERTIES
-# ----------------------------------------------------------------------------
-# global : name of default global library.  It is expected to be in the regular
-# template path.  You may remove it (either the file or this property) if
-# you wish with no harm.
-# ----------------------------------------------------------------------------
-# dev-changes by Marino
-webapp.resource.loader.cache = true
-webapp.resource.loader.modificationCheckInterval = 5
-velocimacro.library.autoreload = false
-velocimacro.library = /WEB-INF/VM_global_library.vm
-
-velocimacro.permissions.allow.inline = true
-velocimacro.permissions.allow.inline.to.replace.global = false
-velocimacro.permissions.allow.inline.local.scope = false
-
-velocimacro.context.localscope = false
-
-# ----------------------------------------------------------------------------
-# INTERPOLATION
-# ----------------------------------------------------------------------------
-# turn off and on interpolation of references and directives in string
-# literals.  ON by default :)
-# ----------------------------------------------------------------------------
-runtime.interpolate.string.literals = true
-
-
-# ----------------------------------------------------------------------------
-# RESOURCE MANAGEMENT
-# ----------------------------------------------------------------------------
-# Allows alternative ResourceManager and ResourceCache implementations
-# to be plugged in.
-# ----------------------------------------------------------------------------
-resource.manager.class = org.apache.velocity.runtime.resource.ResourceManagerImpl
-resource.manager.cache.class = org.apache.velocity.runtime.resource.ResourceCacheImpl
diff --git a/TILES_3_0_X/tiles-freemarker/pom.xml b/TILES_3_0_X/tiles-freemarker/pom.xml
deleted file mode 100644
index a463425..0000000
--- a/TILES_3_0_X/tiles-freemarker/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.tiles</groupId>
-  <artifactId>tiles-freemarker</artifactId>
-  <name>Tiles - FreeMarker Support</name>
-  <description>Support for FreeMarker in Apache Tiles. For more read http://tiles.apache.org/framework/tutorial/integration/freemarker.html</description>
-  <parent>
-      <artifactId>tiles-parent</artifactId>
-      <groupId>org.apache.tiles</groupId>
-      <version>3.0.1</version>
-  </parent>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.tiles.autotag.plugin</groupId>
-        <artifactId>maven-autotag-plugin</artifactId>
-        <version>${tiles.autotag.version}</version>
-        <executions>
-            <execution>
-                <goals>
-                    <goal>generate-freemarker</goal>
-                </goals>
-                <configuration>
-                    <packageName>org.apache.tiles.freemarker.template</packageName>
-                    <requestClass>org.apache.tiles.request.Request</requestClass>
-                    <freemarkerRuntime>org.apache.tiles.request.freemarker.autotag.FreemarkerAutotagRuntime</freemarkerRuntime>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-      <dependency>
-          <groupId>org.apache.tiles</groupId>
-          <artifactId>tiles-servlet</artifactId>
-      </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-template</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-        <groupId>javax.servlet</groupId>
-        <artifactId>servlet-api</artifactId>
-        <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-        <groupId>org.easymock</groupId>
-        <artifactId>easymockclassextension</artifactId>
-        <scope>test</scope>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-request-freemarker</artifactId>
-        <version>${tiles.request.version}</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/TilesSharedVariableFactory.java b/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/TilesSharedVariableFactory.java
deleted file mode 100644
index a80b9a5..0000000
--- a/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/TilesSharedVariableFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.freemarker;
-
-import org.apache.tiles.freemarker.template.TilesFMModelRepository;
-import org.apache.tiles.request.freemarker.servlet.SharedVariableFactory;
-
-import freemarker.ext.beans.BeanModel;
-import freemarker.ext.beans.BeansWrapper;
-import freemarker.template.TemplateModel;
-
-/**
- * Creates a shared variable that contains the Tiles Freemarker model repository.
- *
- * @version $Rev$ $Date$
- */
-public class TilesSharedVariableFactory implements SharedVariableFactory {
-
-    @Override
-    public TemplateModel create() {
-        return new BeanModel(new TilesFMModelRepository(),
-                BeansWrapper.getDefaultInstance());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/package-info.java b/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/package-info.java
deleted file mode 100644
index c64cec9..0000000
--- a/TILES_3_0_X/tiles-freemarker/src/main/java/org/apache/tiles/freemarker/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Classes for supporting FreeMarker in Tiles.
- */
-package org.apache.tiles.freemarker;
diff --git a/TILES_3_0_X/tiles-freemarker/src/site/site.xml b/TILES_3_0_X/tiles-freemarker/src/site/site.xml
deleted file mode 100644
index ba0172f..0000000
--- a/TILES_3_0_X/tiles-freemarker/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Freemarker Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/TilesSharedVariableFactoryTest.java b/TILES_3_0_X/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/TilesSharedVariableFactoryTest.java
deleted file mode 100644
index 2690e20..0000000
--- a/TILES_3_0_X/tiles-freemarker/src/test/java/org/apache/tiles/freemarker/TilesSharedVariableFactoryTest.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.freemarker;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-import freemarker.ext.beans.BeanModel;
-
-/**
- * Tests {@link SharedVariableFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesSharedVariableFactoryTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.freemarker.TilesSharedVariableFactory#create()}.
-     */
-    @Test
-    public void testCreate() {
-        TilesSharedVariableFactory factory = new TilesSharedVariableFactory();
-        assertTrue(factory.create() instanceof BeanModel);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-jsp/pom.xml b/TILES_3_0_X/tiles-jsp/pom.xml
deleted file mode 100644
index 877443d..0000000
--- a/TILES_3_0_X/tiles-jsp/pom.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-jsp</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - JSP support</name>
-  <description>Tiles JSP support: Classes and tag libraries to use Tiles in a
-  JSP environment.</description>
-
-  <properties>
-      <tiles.osgi.symbolicName>org.apache.tiles.jsp</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifest>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.tiles.autotag.plugin</groupId>
-        <artifactId>maven-autotag-plugin</artifactId>
-        <version>${tiles.autotag.version}</version>
-        <executions>
-            <execution>
-                <goals>
-                    <goal>generate-jsp</goal>
-                </goals>
-                <configuration>
-                    <taglibURI>http://tiles.apache.org/tags-tiles</taglibURI>
-                    <packageName>org.apache.tiles.jsp.taglib</packageName>
-                    <requestClass>org.apache.tiles.request.Request</requestClass>
-                    <jspRuntime>org.apache.tiles.request.jsp.autotag.JspAutotagRuntime</jspRuntime>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>net.sourceforge.maven-taglib</groupId>
-        <artifactId>maven-taglib-plugin</artifactId>
-        <version>2.4</version>
-        <configuration>
-          <parseHtml>true</parseHtml>
-          <srcDir>${project.build.outputDirectory}/META-INF/tld</srcDir>
-        </configuration>
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>net.sourceforge.maven-taglib</groupId>
-        <artifactId>maven-taglib-plugin</artifactId>
-        <version>2.4</version>
-        <configuration>
-          <parseHtml>true</parseHtml>
-          <srcDir>${project.build.outputDirectory}/META-INF/tld</srcDir>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-servlet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-template</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>jsp-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.shale</groupId>
-      <artifactId>shale-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-request-jsp</artifactId>
-        <version>${tiles.request.version}</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/UseAttributeTag.java b/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/UseAttributeTag.java
deleted file mode 100644
index 1d61fa7..0000000
--- a/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/UseAttributeTag.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.jsp.taglib;
-
-import java.io.IOException;
-
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.SimpleTagSupport;
-import javax.servlet.jsp.tagext.TagData;
-import javax.servlet.jsp.tagext.TagExtraInfo;
-import javax.servlet.jsp.tagext.VariableInfo;
-
-import org.apache.tiles.autotag.core.runtime.AutotagRuntime;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.template.ImportAttributeModel;
-
-/**
- * Exposes am attribute as a scripting variable within the page.
- *
- * @since Tiles 1.0
- * @version $Rev$ $Date$
- */
-public class UseAttributeTag extends SimpleTagSupport {
-
-    /**
-     * The template model.
-     */
-    private ImportAttributeModel model = new ImportAttributeModel();
-
-    /**
-     * The id of the imported scripting variable.
-     */
-    private String id;
-
-    /**
-     * The scope name.
-     */
-    private String scopeName = null;
-
-    /**
-     * The name of the attribute.
-     */
-    private String name = null;
-
-    /**
-     * Flag that, if <code>true</code>, ignores exceptions.
-     */
-    private boolean ignore = false;
-
-    /**
-     * Class name of object.
-     */
-    private String classname = null;
-
-    /**
-     * Returns the id of the imported scripting variable.
-     *
-     * @return The id of the imported scripting variable.
-     * @since 2.2.0
-     */
-    public String getId() {
-        return id;
-    }
-
-    /**
-     * Sets the id of the imported scripting variable.
-     *
-     * @param id
-     *            The id of the imported scripting variable.
-     * @since 2.2.0
-     */
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    /**
-     * Set the scope.
-     *
-     * @param scope
-     *            Scope.
-     */
-    public void setScope(String scope) {
-        this.scopeName = scope;
-    }
-
-    /**
-     * Get scope.
-     *
-     * @return Scope.
-     */
-    public String getScope() {
-        return scopeName;
-    }
-
-    /**
-     * Get the name.
-     *
-     * @return Name.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Set the name.
-     *
-     * @param name
-     *            The new name
-     */
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    /**
-     * Set ignore flag.
-     *
-     * @param ignore
-     *            default: <code>false</code>: Exception is thrown when
-     *            attribute is not found, set to <code>
-     *               true</code> to
-     *            ignore missing attributes silently
-     */
-    public void setIgnore(boolean ignore) {
-        this.ignore = ignore;
-    }
-
-    /**
-     * Get ignore flag.
-     *
-     * @return default: <code>false</code>: Exception is thrown when attribute
-     *         is not found, set to <code>
-     *         true</code> to ignore missing
-     *         attributes silently
-     */
-    public boolean isIgnore() {
-        return ignore;
-    }
-
-    /**
-     * Get class name.
-     *
-     * @return class name
-     */
-    public String getClassname() {
-        return classname;
-
-    }
-
-    /**
-     * Set the class name.
-     *
-     * @param name
-     *            The new class name.
-     */
-    public void setClassname(String name) {
-        this.classname = name;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void doTag() throws JspException, IOException {
-        AutotagRuntime<Request> runtime = new org.apache.tiles.request.jsp.autotag.JspAutotagRuntime();
-        if (runtime instanceof SimpleTagSupport) {
-            SimpleTagSupport tag = (SimpleTagSupport) runtime;
-            tag.setJspContext(getJspContext());
-            tag.setJspBody(getJspBody());
-            tag.setParent(getParent());
-            tag.doTag();
-        }
-        Request request = runtime.createRequest();        
-        model.execute(name, scopeName, id, ignore, request);
-    }
-
-    /**
-     * Returns the scripting variable to use.
-     *
-     * @return The scripting variable.
-     */
-    public String getScriptingVariable() {
-        return id == null ? getName() : id;
-    }
-
-    /**
-     * Implementation of <code>TagExtraInfo</code> which identifies the
-     * scripting object(s) to be made visible.
-     */
-    public static class Tei extends TagExtraInfo {
-
-        /** {@inheritDoc} */
-        @Override
-        public VariableInfo[] getVariableInfo(TagData data) {
-            String classname = data.getAttributeString("classname");
-            if (classname == null) {
-                classname = "java.lang.Object";
-            }
-
-            String id = data.getAttributeString("id");
-            if (id == null) {
-                id = data.getAttributeString("name");
-            }
-
-            return new VariableInfo[] { new VariableInfo(id, classname, true,
-                    VariableInfo.AT_END) };
-
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/package-info.java b/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/package-info.java
deleted file mode 100644
index c57c451..0000000
--- a/TILES_3_0_X/tiles-jsp/src/main/java/org/apache/tiles/jsp/taglib/package-info.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * The "tiles-jsp" tag library contains tags that are useful to create
- * templates, subpages other reusable view parts using the "tiles-core"
- * package.
- */
-package org.apache.tiles.jsp.taglib;
-
diff --git a/TILES_3_0_X/tiles-jsp/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-jsp/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-jsp/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-jsp/src/main/resources/META-INF/tld/tiles-extras-jsp.tld b/TILES_3_0_X/tiles-jsp/src/main/resources/META-INF/tld/tiles-extras-jsp.tld
deleted file mode 100644
index 60cad30..0000000
--- a/TILES_3_0_X/tiles-jsp/src/main/resources/META-INF/tld/tiles-extras-jsp.tld
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<taglib
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
-  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  version="2.1">
-   <description>
-   <![CDATA[
-   <p>This tag library provides Tiles tags.</p>
-   ]]>
-   </description>
-   <tlib-version>1.2</tlib-version>
-   <short-name>tilesx</short-name>
-   <uri>http://tiles.apache.org/tags-tiles-extras</uri>
-   <tag>
-      <description>
-      <![CDATA[
-      <p><strong>Use attribute value inside page.</strong></p>
-      <p>Declare a Java variable, and an attribute in the specified scope,
-      using its attribute value.</p>
-      <p>Java variable and attribute will have the name specified by 'id',
-      or the original name if not specified.</p>
-      ]]>
-      </description>
-      <name>useAttribute</name>
-      <tag-class>org.apache.tiles.jsp.taglib.UseAttributeTag</tag-class>
-      <tei-class>org.apache.tiles.jsp.taglib.UseAttributeTag$Tei</tei-class>
-      <body-content>empty</body-content>
-      <attribute>
-         <description>
-         <![CDATA[
-         <p>Declared attribute and variable name.</p>
-         ]]>
-         </description>
-         <name>id</name>
-         <required>false</required>
-         <rtexprvalue>true</rtexprvalue>
-      </attribute>
-      <attribute>
-         <description>
-         <![CDATA[
-         <p>Class of the declared variable.</p>
-         ]]>
-         </description>
-         <name>classname</name>
-         <required>false</required>
-         <rtexprvalue>true</rtexprvalue>
-      </attribute>
-      <attribute>
-         <description>
-         <![CDATA[
-         <p>Scope of the declared attribute. Default to 'page'.</p>
-         ]]>
-         </description>
-         <name>scope</name>
-         <required>false</required>
-         <rtexprvalue>false</rtexprvalue>
-      </attribute>
-      <attribute>
-         <description>
-         <![CDATA[
-         <p>Attribute name.</p>
-         ]]>
-         </description>
-         <name>name</name>
-         <required>true</required>
-         <rtexprvalue>true</rtexprvalue>
-      </attribute>
-      <attribute>
-         <description>
-         <![CDATA[
-         <p>
-         If this attribute is set to true, and the attribute specified by the name
-         does not exist, simply return without error. The default value is false, which will
-         cause a runtime exception to be thrown.
-         </p>
-         ]]>
-         </description>
-         <name>ignore</name>
-         <required>false</required>
-         <rtexprvalue>true</rtexprvalue>
-         <type>boolean</type>
-      </attribute>
-   </tag>
-</taglib>
-
diff --git a/TILES_3_0_X/tiles-jsp/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-jsp/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-jsp/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-jsp/src/site/site.xml b/TILES_3_0_X/tiles-jsp/src/site/site.xml
deleted file mode 100644
index e824154..0000000
--- a/TILES_3_0_X/tiles-jsp/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - JSP support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java b/TILES_3_0_X/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java
deleted file mode 100644
index 4c59ea0..0000000
--- a/TILES_3_0_X/tiles-jsp/src/test/java/org/apache/tiles/jsp/taglib/UseAttributeTagTest.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.jsp.taglib;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.tagext.JspFragment;
-import javax.servlet.jsp.tagext.JspTag;
-import javax.servlet.jsp.tagext.TagData;
-import javax.servlet.jsp.tagext.VariableInfo;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.jsp.JspRequest;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link UseAttributeTag}.
- *
- * @version $Rev$ $Date$
- */
-public class UseAttributeTagTest {
-
-    /**
-     * The tag to test.
-     */
-    private UseAttributeTag tag;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        tag = new UseAttributeTag();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#execute(org.apache.tiles.request.Request)}.
-     * @throws IOException
-     * @throws JspException
-     */
-    @Test
-    public void testExecute() throws JspException, IOException {
-        JspFragment jspBody = createMock(JspFragment.class);
-        PageContext pageContext = createMock(PageContext.class);
-        JspTag parent = createMock(JspTag.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        HttpServletRequest httpServletRequest = createMock(HttpServletRequest.class);
-        HttpServletResponse httpServletResponse = createMock(HttpServletResponse.class);
-        @SuppressWarnings("unchecked")
-        Map<String, Object> applicationScope = createMock(Map.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = createMock(Attribute.class);
-        expect(pageContext.getAttribute(
-                ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE,
-                PageContext.APPLICATION_SCOPE)).andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(pageContext.getRequest()).andReturn(httpServletRequest);
-        expect(pageContext.getResponse()).andReturn(httpServletResponse);
-        expect(pageContext.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, PageContext.REQUEST_SCOPE)).andReturn(container);
-        expect(container.getAttributeContext(isA(JspRequest.class))).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("name")).andReturn(attribute);
-        expect(container.evaluate(isA(Attribute.class), isA(JspRequest.class))).andReturn(new Integer(1));
-        pageContext.setAttribute("id", new Integer(1), PageContext.PAGE_SCOPE);
-        replay(jspBody, pageContext, parent,
-               applicationContext, httpServletRequest, httpServletResponse,
-               applicationScope, container, attributeContext, attribute);
-        tag.setName("name");
-        tag.setScope("page");
-        tag.setId("id");
-        tag.setIgnore(false);
-        tag.setJspContext(pageContext);
-        tag.setJspBody(jspBody);
-        tag.setParent(parent);
-        tag.doTag();
-        verify(jspBody, pageContext, parent,
-               applicationContext, httpServletRequest, httpServletResponse,
-               container, attributeContext, attribute);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setId(java.lang.String)}.
-     */
-    @Test
-    public void testSetId() {
-        tag.setId("id");
-        assertEquals("id", tag.getId());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#getScope()}.
-     */
-    @Test
-    public void testGetScope() {
-        tag.setScope("scope");
-        assertEquals("scope", tag.getScope());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setName(java.lang.String)}.
-     */
-    @Test
-    public void testSetName() {
-        tag.setName("name");
-        assertEquals("name", tag.getName());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setIgnore(boolean)}.
-     */
-    @Test
-    public void testSetIgnore() {
-        tag.setIgnore(true);
-        assertTrue(tag.isIgnore());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#setClassname(java.lang.String)}.
-     */
-    @Test
-    public void testSetClassname() {
-        tag.setClassname("classname");
-        assertEquals("classname", tag.getClassname());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.jsp.taglib.UseAttributeTag#getScriptingVariable()}.
-     */
-    @Test
-    public void testGetScriptingVariable() {
-        tag.setName("name");
-        assertEquals("name", tag.getScriptingVariable());
-        tag.setId("id");
-        assertEquals("id", tag.getScriptingVariable());
-    }
-
-    /**
-     * Tests {@link UseAttributeTag.Tei}.
-     */
-    @Test
-    public void testTei() {
-        TagData tagData = createMock(TagData.class);
-
-        expect(tagData.getAttributeString("classname")).andReturn("my.Clazz");
-        expect(tagData.getAttributeString("id")).andReturn("id");
-
-        replay(tagData);
-        UseAttributeTag.Tei tei = new UseAttributeTag.Tei();
-        VariableInfo[] infos = tei.getVariableInfo(tagData);
-        assertEquals(1, infos.length);
-        VariableInfo info = infos[0];
-        assertEquals("id", info.getVarName());
-        assertEquals("my.Clazz", info.getClassName());
-        assertTrue(info.getDeclare());
-        assertEquals(VariableInfo.AT_END, info.getScope());
-        verify(tagData);
-    }
-
-    /**
-     * Tests {@link UseAttributeTag.Tei}.
-     */
-    @Test
-    public void testTeiDefaults() {
-        TagData tagData = createMock(TagData.class);
-
-        expect(tagData.getAttributeString("classname")).andReturn(null);
-        expect(tagData.getAttributeString("id")).andReturn(null);
-        expect(tagData.getAttributeString("name")).andReturn("name");
-
-        replay(tagData);
-        UseAttributeTag.Tei tei = new UseAttributeTag.Tei();
-        VariableInfo[] infos = tei.getVariableInfo(tagData);
-        assertEquals(1, infos.length);
-        VariableInfo info = infos[0];
-        assertEquals("name", info.getVarName());
-        assertEquals("java.lang.Object", info.getClassName());
-        assertTrue(info.getDeclare());
-        assertEquals(VariableInfo.AT_END, info.getScope());
-        verify(tagData);
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/pom.xml b/TILES_3_0_X/tiles-mvel/pom.xml
deleted file mode 100644
index a91727d..0000000
--- a/TILES_3_0_X/tiles-mvel/pom.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-mvel</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - MVEL support</name>
-  <description>Tiles MVEL support: Classes and tag libraries to use MVEL as an expression language in attribute expressions.</description>
-
-  <properties>
-      <tiles.osgi.symbolicName>org.apache.tiles.mvel</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifest>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mvel</groupId>
-      <artifactId>mvel2</artifactId>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/MVELAttributeEvaluator.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/MVELAttributeEvaluator.java
deleted file mode 100644
index 13f21c7..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/MVELAttributeEvaluator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.evaluator.AbstractAttributeEvaluator;
-import org.apache.tiles.request.Request;
-import org.mvel2.MVEL;
-import org.mvel2.integration.VariableResolverFactory;
-
-/**
- * Allows to use MVEL as the language to evaluate attribute values.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class MVELAttributeEvaluator extends AbstractAttributeEvaluator {
-
-    /**
-     * Holds the Tiles request context of the current thread.
-     */
-    private TilesRequestContextHolder requestHolder;
-
-    /**
-     * Resolves variables when starting from the root.
-     *
-     * @since 2.2.0
-     */
-    private VariableResolverFactory variableResolverFactory;
-
-    /**
-     * Constructor.
-     *
-     * @param requestHolder The object that holds the Tiles request context of
-     * the current thread.
-     * @param variableResolverFactory The resolver factory to use.
-     * @since 2.2.0
-     */
-    public MVELAttributeEvaluator(TilesRequestContextHolder requestHolder,
-            VariableResolverFactory variableResolverFactory) {
-        this.requestHolder = requestHolder;
-        this.variableResolverFactory = variableResolverFactory;
-    }
-
-    /** {@inheritDoc} */
-    public Object evaluate(String expression, Request request) {
-        if (expression == null) {
-            throw new IllegalArgumentException("The expression parameter cannot be null");
-        }
-        requestHolder.setTilesRequestContext(request);
-        return MVEL.eval(expression, variableResolverFactory);
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactory.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactory.java
deleted file mode 100644
index aa3b2e3..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactory.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mvel;
-
-import java.util.HashMap;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.mvel2.UnresolveablePropertyException;
-import org.mvel2.integration.VariableResolver;
-import org.mvel2.integration.impl.BaseVariableResolverFactory;
-
-/**
- * A base variable resolver factory that is read-only.
- *
- * @version $Rev$ $Date$
- */
-public abstract class ReadOnlyVariableResolverFactory extends
-        BaseVariableResolverFactory {
-
-    /**
-     * The Tiles request holder.
-     */
-    protected TilesRequestContextHolder requestHolder;
-
-    /**
-     * Constructor.
-     *
-     * @param requestHolder The Tiles request holder.
-     * @since 3..0
-     */
-    public ReadOnlyVariableResolverFactory(TilesRequestContextHolder requestHolder) {
-        this.requestHolder = requestHolder;
-        variableResolvers = new HashMap<String, VariableResolver>();
-    }
-
-    /** {@inheritDoc} */
-    public VariableResolver createVariable(String name, Object value) {
-        if (nextFactory != null) {
-            return nextFactory.createVariable(name, value);
-        }
-        throw new UnsupportedOperationException("This variable resolver factory is read only");
-    }
-
-    /** {@inheritDoc} */
-    public VariableResolver createVariable(String name, Object value,
-            Class<?> type) {
-        variableResolvers = new HashMap<String, VariableResolver>();
-        if (nextFactory != null) {
-            return nextFactory.createVariable(name, value, type);
-        }
-        throw new UnsupportedOperationException("This variable resolver factory is read only");
-    }
-
-    /** {@inheritDoc} */
-    public boolean isResolveable(String name) {
-        return isTarget(name) || isNextResolveable(name);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public VariableResolver getVariableResolver(String name) {
-        if (isResolveable(name)) {
-            if (variableResolvers != null && variableResolvers.containsKey(name)) {
-                return variableResolvers.get(name);
-            } else if (isTarget(name)) {
-                VariableResolver variableResolver = createVariableResolver(name);
-                variableResolvers.put(name, variableResolver);
-                return variableResolver;
-            } else if (nextFactory != null) {
-                return nextFactory.getVariableResolver(name);
-            }
-        }
-
-        throw new UnresolveablePropertyException("unable to resolve variable '" + name + "'");
-    }
-
-    /**
-     * Creates a variable resolver.
-     *
-     * @param name The name of the property.
-     * @return The variable resolver.
-     * @since 3.0.0
-     */
-    public abstract VariableResolver createVariableResolver(String name);
-
-    /**
-     * Base variable resolver.
-     *
-     * @version $Rev$ $Date$
-     * @since 3.0.0
-     */
-    public abstract static class ReadOnlyVariableResolver implements VariableResolver {
-
-        /**
-         * The name of the property.
-         */
-        protected String name;
-
-        /**
-         * Constructor.
-         *
-         * @param name The name of the property.
-         * @since 2.2.0
-         */
-        public ReadOnlyVariableResolver(String name) {
-            this.name = name;
-        }
-
-        /** {@inheritDoc} */
-        public int getFlags() {
-            return 0;
-        }
-
-        /** {@inheritDoc} */
-        public String getName() {
-            return name;
-        }
-
-        /** {@inheritDoc} */
-        public void setStaticType(@SuppressWarnings("rawtypes") Class type) {
-            // Does nothing for the moment.
-        }
-
-        /** {@inheritDoc} */
-        public void setValue(Object value) {
-            throw new UnsupportedOperationException("This resolver is read-only");
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java
deleted file mode 100644
index 7cb21da..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/ScopeVariableResolverFactory.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import java.util.Map;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.Request;
-import org.mvel2.integration.VariableResolver;
-
-/**
- * Resolves beans stored in request, session and application scopes.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class ScopeVariableResolverFactory extends
-        ReadOnlyVariableResolverFactory {
-
-    /**
-     * The length of the scope suffix: "Scope".
-     */
-    private static final int SCOPE_SUFFIX_LENGTH = 5;
-
-    /**
-     * Constructor.
-     *
-     * @param requestHolder The Tiles request holder.
-     * @since 2.2.0
-     */
-    public ScopeVariableResolverFactory(TilesRequestContextHolder requestHolder) {
-        super(requestHolder);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public VariableResolver createVariableResolver(String name) {
-        return new ScopeVariableResolver(name);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isTarget(String name) {
-        Request request = requestHolder.getTilesRequestContext();
-        if (name.endsWith("Scope")) {
-            String scopeName = name.substring(0, name.length() - SCOPE_SUFFIX_LENGTH);
-            for (String availableScope : request.getAvailableScopes()) {
-                if (scopeName.equals(availableScope)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Resolves a single attribute stored in request, session or application scope.
-     *
-     * @version $Rev$ $Date$
-     * @since 2.2.0
-     */
-    private class ScopeVariableResolver extends ReadOnlyVariableResolver {
-
-        /**
-         * Constructor.
-         *
-         * @param name The name of the attribute.
-         * @since 2.2.0
-         */
-        public ScopeVariableResolver(String name) {
-            super(name);
-        }
-
-        /** {@inheritDoc} */
-        @SuppressWarnings("rawtypes")
-        public Class getType() {
-            return Map.class;
-        }
-
-        /** {@inheritDoc} */
-        public Object getValue() {
-            Request request = requestHolder.getTilesRequestContext();
-            return request.getContext(name.substring(0, name.length() - SCOPE_SUFFIX_LENGTH));
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java
deleted file mode 100644
index 2d54ad8..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactory.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.Request;
-import org.mvel2.integration.VariableResolver;
-
-/**
- * Resolves beans stored in request, session and application scopes.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesContextBeanVariableResolverFactory extends
-        ReadOnlyVariableResolverFactory {
-
-    /**
-     * Constructor.
-     *
-     * @param requestHolder The Tiles request holder.
-     * @since 2.2.0
-     */
-    public TilesContextBeanVariableResolverFactory(TilesRequestContextHolder requestHolder) {
-        super(requestHolder);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public VariableResolver createVariableResolver(String name) {
-        return new TilesContextBeanVariableResolver(name);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isTarget(String name) {
-        Request request = requestHolder.getTilesRequestContext();
-        for (String scope : request.getAvailableScopes()) {
-            if (request.getContext(scope).containsKey(name)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Resolves a single attribute stored in request, session or application scope.
-     *
-     * @version $Rev$ $Date$
-     * @since 2.2.0
-     */
-    private class TilesContextBeanVariableResolver extends ReadOnlyVariableResolver {
-
-        /**
-         * Constructor.
-         *
-         * @param name The name of the attribute.
-         * @since 2.2.0
-         */
-        public TilesContextBeanVariableResolver(String name) {
-            super(name);
-        }
-
-        /** {@inheritDoc} */
-        @SuppressWarnings("rawtypes")
-        public Class getType() {
-            Object value = getValue();
-            if (value != null) {
-                return value.getClass();
-            }
-            return Object.class;
-        }
-
-        /** {@inheritDoc} */
-        public Object getValue() {
-            Request request = requestHolder.getTilesRequestContext();
-            for (String scope : request.getAvailableScopes()) {
-                Object value = request.getContext(scope).get(name);
-                if (value != null) {
-                    return value;
-                }
-            }
-            return null;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextVariableResolverFactory.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextVariableResolverFactory.java
deleted file mode 100644
index 0336e75..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/TilesContextVariableResolverFactory.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.CannotAccessMethodException;
-import org.apache.tiles.util.CombinedBeanInfo;
-import org.mvel2.integration.VariableResolver;
-
-/**
- * Resolves {@link org.apache.tiles.request.Request} and
- * {@link org.apache.tiles.request.ApplicationContext} properties as variables.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesContextVariableResolverFactory extends
-        ReadOnlyVariableResolverFactory {
-
-    /**
-     * Beaninfo about {@link org.apache.tiles.request.Request} and
-     * {@link org.apache.tiles.request.ApplicationContext}.
-     */
-    private CombinedBeanInfo requestBeanInfo = new CombinedBeanInfo(
-            Request.class, ApplicationContext.class);
-
-    /**
-     * Constructor.
-     *
-     * @param requestHolder The Tiles request holder.
-     * @since 2.2.0
-     */
-    public TilesContextVariableResolverFactory(TilesRequestContextHolder requestHolder) {
-        super(requestHolder);
-    }
-
-    /** {@inheritDoc} */
-    public boolean isTarget(String name) {
-        return requestBeanInfo.getMappedDescriptors(Request.class).containsKey(
-                name)
-                || requestBeanInfo.getMappedDescriptors(
-                        ApplicationContext.class).containsKey(name);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public VariableResolver createVariableResolver(String name) {
-        VariableResolver resolver = null;
-        PropertyDescriptor descriptor = requestBeanInfo.getMappedDescriptors(Request.class).get(name);
-        if (descriptor != null) {
-            resolver = new RequestVariableResolver(name, descriptor);
-        } else {
-            descriptor = requestBeanInfo.getMappedDescriptors(ApplicationContext.class).get(name);
-            if (descriptor != null) {
-                resolver = new ApplicationVariableResolver(name, descriptor);
-            }
-        }
-        return resolver;
-    }
-
-    /**
-     * Resolves a {@link org.apache.tiles.request.Request} property as a variable.
-     *
-     * @version $Rev$ $Date$
-     * @since 2.2.0
-     */
-    private class RequestVariableResolver extends ReadOnlyVariableResolver {
-
-        /**
-         * The property descriptor.
-         */
-        private PropertyDescriptor descriptor;
-
-        /**
-         * Constructor.
-         *
-         * @param name The name of the property.
-         * @param descriptor The property descriptor.
-         * @since 2.2.0
-         */
-        public RequestVariableResolver(String name, PropertyDescriptor descriptor) {
-            super(name);
-            this.descriptor = descriptor;
-        }
-
-        /** {@inheritDoc} */
-        @SuppressWarnings("rawtypes")
-        public Class getType() {
-            return descriptor.getPropertyType();
-        }
-
-        /** {@inheritDoc} */
-        public Object getValue() {
-            Method method = descriptor.getReadMethod();
-            try {
-                return method.invoke(requestHolder.getTilesRequestContext());
-            } catch (IllegalArgumentException e) {
-                throw new CannotAccessMethodException(
-                        "Arguments are wrong for property '"
-                                + descriptor.getName() + "'", e);
-            } catch (IllegalAccessException e) {
-                throw new CannotAccessMethodException(
-                        "Cannot access getter method for property '"
-                                + descriptor.getName() + "'", e);
-            } catch (InvocationTargetException e) {
-                throw new CannotAccessMethodException(
-                        "The getter method for property '"
-                                + descriptor.getName() + "' threw an exception",
-                        e);
-            }
-        }
-    }
-
-    /**
-     * Resolves a {@link org.apache.tiles.request.ApplicationContext} property as a
-     * variable.
-     *
-     * @version $Rev$ $Date$
-     * @since 2.2.0
-     */
-    private class ApplicationVariableResolver extends ReadOnlyVariableResolver {
-
-        /**
-         * The property descriptor.
-         *
-         * @since 2.2.0
-         */
-        private PropertyDescriptor descriptor;
-
-        /**
-         * Constructor.
-         *
-         * @param name The name of the property.
-         * @param descriptor The property descriptor.
-         * @since 2.2.0
-         */
-        public ApplicationVariableResolver(String name, PropertyDescriptor descriptor) {
-            super(name);
-            this.descriptor = descriptor;
-        }
-
-        /** {@inheritDoc} */
-        @SuppressWarnings("rawtypes")
-        public Class getType() {
-            return descriptor.getPropertyType();
-        }
-
-        /** {@inheritDoc} */
-        public Object getValue() {
-            Method method = descriptor.getReadMethod();
-            try {
-                return method.invoke(requestHolder.getTilesRequestContext()
-                        .getApplicationContext());
-            } catch (IllegalArgumentException e) {
-                throw new CannotAccessMethodException(
-                        "Arguments are wrong for property '"
-                                + descriptor.getName() + "'", e);
-            } catch (IllegalAccessException e) {
-                throw new CannotAccessMethodException(
-                        "Cannot access getter method for property '"
-                                + descriptor.getName() + "'", e);
-            } catch (InvocationTargetException e) {
-                throw new CannotAccessMethodException(
-                        "The getter method for property '"
-                                + descriptor.getName() + "' threw an exception",
-                        e);
-            }
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/package-info.java b/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/package-info.java
deleted file mode 100644
index b37f16f..0000000
--- a/TILES_3_0_X/tiles-mvel/src/main/java/org/apache/tiles/mvel/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Attribute evaluator classes that can perform MVEL evaluation for attributes.
- */
-package org.apache.tiles.mvel;
diff --git a/TILES_3_0_X/tiles-mvel/src/site/site.xml b/TILES_3_0_X/tiles-mvel/src/site/site.xml
deleted file mode 100644
index df9627d..0000000
--- a/TILES_3_0_X/tiles-mvel/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - MVEL Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
deleted file mode 100644
index 96a3370..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/MVELAttributeEvaluatorTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mvel;
-
-import java.util.Arrays;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-import org.mvel2.integration.VariableResolverFactory;
-
-/**
- * Tests {@link MVELAttributeEvaluator}.
- *
- * @version $Rev$ $Date$$
- */
-public class MVELAttributeEvaluatorTest {
-
-    /**
-     * The evaluator to test.
-     */
-    private MVELAttributeEvaluator evaluator;
-
-    /**
-     * The request object to use.
-     */
-    private Request request;
-
-    /**
-     * The application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        TilesRequestContextHolder requestHolder = new TilesRequestContextHolder();
-        VariableResolverFactory variableResolverFactory = new ScopeVariableResolverFactory(
-                requestHolder);
-        variableResolverFactory
-                .setNextFactory(new TilesContextVariableResolverFactory(
-                        requestHolder));
-        variableResolverFactory
-                .setNextFactory(new TilesContextBeanVariableResolverFactory(
-                        requestHolder));
-        evaluator = new MVELAttributeEvaluator(requestHolder,
-                variableResolverFactory);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        requestScope.put("paulaBean", new PaulaBean());
-        request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        expect(request.getContext("application")).andReturn(applicationScope)
-                .anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
-        applicationContext = createMock(ApplicationContext.class);
-        expect(request.getApplicationContext()).andReturn(
-                applicationContext).anyTimes();
-        replay(request, applicationContext);
-    }
-
-    /**
-     * Tests {@link MVELAttributeEvaluator#evaluate(String, Request)}.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testEvaluateNull() {
-        evaluator.evaluate((String) null, request);
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Tests
-     * {@link MVELAttributeEvaluator#evaluate(Attribute, Request)}.
-     */
-    @Test
-    public void testEvaluate() {
-        Attribute attribute = new Attribute();
-        attribute.setExpressionObject(new Expression("requestScope.object1"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("sessionScope.object2"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("applicationScope.object3"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("object1"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("object2"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("object3"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("paulaBean.paula"));
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("'String literal'"));
-        assertEquals("The value is not correct", "String literal", evaluator
-                .evaluate(attribute, request));
-        attribute.setValue(new Integer(2));
-        assertEquals("The value is not correct", new Integer(2), evaluator
-                .evaluate(attribute, request));
-        attribute.setValue("object1");
-        assertEquals("The value has been evaluated", "object1", evaluator
-                .evaluate(attribute, request));
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Tests {@link MVELAttributeEvaluator#evaluate(String, Request)}.
-     */
-    @Test
-    public void testEvaluateString() {
-        String expression = "requestScope.object1";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "sessionScope.object2";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "applicationScope.object3";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "object1";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "object2";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "object3";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "paulaBean.paula";
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(expression, request));
-        expression = "'String literal'";
-        assertEquals("The value is not correct", "String literal", evaluator
-                .evaluate(expression, request));
-        verify(request, applicationContext);
-    }
-
-    /**
-     * This is The Brillant Paula Bean (sic) just like it was posted to:
-     * http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx I hope that
-     * there is no copyright on it.
-     */
-    public static class PaulaBean {
-
-        /**
-         * Paula is brillant, really.
-         */
-        private String paula = "Brillant";
-
-        /**
-         * Returns brillant.
-         *
-         * @return "Brillant".
-         */
-        public String getPaula() {
-            return paula;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java
deleted file mode 100644
index a1a7e79..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverFactoryTest.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mvel;
-
-import java.util.Arrays;
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-import org.mvel2.UnresolveablePropertyException;
-import org.mvel2.integration.VariableResolver;
-import org.mvel2.integration.VariableResolverFactory;
-
-
-/**
- * Tests {@link ReadOnlyVariableResolverFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class ReadOnlyVariableResolverFactoryTest {
-
-    /**
-     * The Tiles request.
-     */
-    private Request request;
-
-    /**
-     * The Tiles application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The object to test.
-     */
-    private ReadOnlyVariableResolverFactory factory;
-
-    /**
-     * Sets up the object.
-     */
-    @Before
-    public void setUp() {
-        request = createMock(Request.class);
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[]{"request", "session", "application"})).anyTimes();
-        TilesRequestContextHolder holder = new TilesRequestContextHolder();
-        holder.setTilesRequestContext(request);
-        applicationContext = createMock(ApplicationContext.class);
-        factory = createMockBuilder(ReadOnlyVariableResolverFactory.class).withConstructor(holder).createMock();
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#createVariable(String, Object)}.
-     */
-    @Test(expected = UnsupportedOperationException.class)
-    public void testCreateVariableStringObject() {
-        replay(factory, request, applicationContext);
-        try {
-            factory.createVariable("myName", "myValue");
-        } finally {
-            verify(factory, request, applicationContext);
-        }
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#createVariable(String, Object)}.
-     */
-    @Test
-    public void testCreateVariableStringObjectNextFactory() {
-        VariableResolverFactory nextFactory = createMock(VariableResolverFactory.class);
-        VariableResolver resolver = createMock(VariableResolver.class);
-
-        expect(nextFactory.createVariable("myName", "myValue")).andReturn(resolver);
-
-        replay(factory, request, applicationContext, nextFactory, resolver);
-        factory.setNextFactory(nextFactory);
-        assertEquals(resolver, factory.createVariable("myName", "myValue"));
-        verify(factory, request, applicationContext, nextFactory, resolver);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#createVariable(String, Object, Class)}.
-     */
-    @Test(expected = UnsupportedOperationException.class)
-    public void testCreateVariableStringObjectClassOfQ() {
-        replay(factory, request, applicationContext);
-        try {
-            factory.createVariable("myName", "myValue", String.class);
-        } finally {
-            verify(factory, request, applicationContext);
-        }
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#createVariable(String, Object, Class)}.
-     */
-    @Test
-    public void testCreateVariableStringObjectClassNextFactory() {
-        VariableResolverFactory nextFactory = createMock(VariableResolverFactory.class);
-        VariableResolver resolver = createMock(VariableResolver.class);
-
-        expect(nextFactory.createVariable("myName", "myValue", String.class)).andReturn(resolver);
-
-        replay(factory, request, applicationContext, nextFactory, resolver);
-        factory.setNextFactory(nextFactory);
-        assertEquals(resolver, factory.createVariable("myName", "myValue", String.class));
-        verify(factory, request, applicationContext, nextFactory, resolver);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#isResolveable(String)}.
-     */
-    @Test
-    public void testIsResolveable() {
-        expect(factory.isTarget("whatever")).andReturn(true);
-
-        replay(factory, request, applicationContext);
-        assertTrue(factory.isResolveable("whatever"));
-        verify(factory, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#getVariableResolver(String)}.
-     */
-    @Test
-    public void testGetVariableResolver() {
-        VariableResolverFactory nextFactory = createMock(VariableResolverFactory.class);
-        VariableResolver nextResolver = createMock(VariableResolver.class);
-        VariableResolver requestResolver = createMock(VariableResolver.class);
-        VariableResolver applicationResolver = createMock(VariableResolver.class);
-        expect(nextFactory.getVariableResolver("other")).andReturn(nextResolver);
-        expect(nextFactory.isResolveable("other")).andReturn(true);
-        expect(factory.isTarget("requestScope")).andReturn(true).anyTimes();
-        expect(factory.isTarget("applicationScope")).andReturn(true).anyTimes();
-        expect(factory.isTarget("other")).andReturn(false).anyTimes();
-        expect(factory.createVariableResolver("requestScope")).andReturn(requestResolver);
-        expect(factory.createVariableResolver("applicationScope")).andReturn(applicationResolver);
-
-        replay(factory, request, applicationContext, nextFactory, nextResolver, requestResolver, applicationResolver);
-        factory.setNextFactory(nextFactory);
-        VariableResolver resolver = factory.getVariableResolver("requestScope");
-        assertEquals(requestResolver, resolver);
-        resolver = factory.getVariableResolver("requestScope"); // again to test caching
-        assertEquals(requestResolver, resolver);
-        resolver = factory.getVariableResolver("applicationScope");
-        assertEquals(applicationResolver, resolver);
-        resolver = factory.getVariableResolver("other");
-        assertEquals(nextResolver, resolver);
-        verify(factory, request, applicationContext, nextFactory, nextResolver, requestResolver, applicationResolver);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#getVariableResolver(String)}.
-     */
-    @Test(expected = UnresolveablePropertyException.class)
-    public void testGetVariableResolverNotResolvable() {
-        VariableResolverFactory nextFactory = createMock(VariableResolverFactory.class);
-
-        expect(factory.isTarget("other")).andReturn(false).anyTimes();
-        expect(nextFactory.isResolveable("other")).andReturn(false);
-
-        replay(factory, request, applicationContext, nextFactory);
-        try {
-            factory.setNextFactory(nextFactory);
-            factory.getVariableResolver("other");
-        } finally {
-            verify(factory, request, applicationContext, nextFactory);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverTest.java
deleted file mode 100644
index 0bdb8b3..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ReadOnlyVariableResolverTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mvel;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import org.apache.tiles.mvel.ReadOnlyVariableResolverFactory.ReadOnlyVariableResolver;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ReadOnlyVariableResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class ReadOnlyVariableResolverTest {
-
-    /**
-     * The resolver to test.
-     */
-    private ReadOnlyVariableResolver resolver;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = createMockBuilder(ReadOnlyVariableResolver.class).withConstructor("name").createMock();
-    }
-
-    /**
-     * Test method for {@link ReadOnlyVariableResolverFactory.ReadOnlyVariableResolver#getFlags()}.
-     */
-    @Test
-    public void testGetFlags() {
-        replay(resolver);
-        assertEquals(0, resolver.getFlags());
-        verify(resolver);
-    }
-
-    /**
-     * Test method for {@link ReadOnlyVariableResolverFactory.ReadOnlyVariableResolver#getName()}.
-     */
-    @Test
-    public void testGetName() {
-        replay(resolver);
-        assertEquals("name", resolver.getName());
-        verify(resolver);
-    }
-
-    /**
-     * Test method for {@link ReadOnlyVariableResolverFactory.ReadOnlyVariableResolver#setStaticType(java.lang.Class)}.
-     */
-    @Test
-    public void testSetStaticType() {
-        replay(resolver);
-        resolver.setStaticType(Object.class);
-        verify(resolver);
-    }
-
-    /**
-     * Test method for {@link ReadOnlyVariableResolverFactory.ReadOnlyVariableResolver#setValue(java.lang.Object)}.
-     */
-    @Test(expected = UnsupportedOperationException.class)
-    public void testSetValue() {
-        replay(resolver);
-        resolver.setValue("whatever");
-        verify(resolver);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java
deleted file mode 100644
index bb3693c..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/ScopeVariableResolverFactoryTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.mvel;
-
-import java.util.Arrays;
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-import org.mvel2.integration.VariableResolver;
-
-
-/**
- * Tests {@link ScopeVariableResolverFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class ScopeVariableResolverFactoryTest {
-
-    /**
-     * The Tiles request.
-     */
-    private Request request;
-
-    /**
-     * The Tiles application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The object to test.
-     */
-    private ScopeVariableResolverFactory factory;
-
-    /**
-     * Sets up the object.
-     */
-    @Before
-    public void setUp() {
-        request = createMock(Request.class);
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[]{"request", "session", "application"})).anyTimes();
-        TilesRequestContextHolder holder = new TilesRequestContextHolder();
-        holder.setTilesRequestContext(request);
-        applicationContext = createMock(ApplicationContext.class);
-        factory = new ScopeVariableResolverFactory(holder);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#isTarget(String)}.
-     */
-    @Test
-    public void testIsTarget() {
-        replay(request, applicationContext);
-        assertFalse(factory.isTarget("header"));
-        assertTrue(factory.isTarget("requestScope"));
-        assertTrue(factory.isTarget("applicationScope"));
-        assertFalse(factory.isTarget("blah"));
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link ScopeVariableResolverFactory#createVariableResolver(String)}.
-     */
-    @Test
-    public void testCreateVariableResolver() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put("one", 1);
-        expect(request.getContext("request")).andReturn(requestScope).times(2);
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("two", 2);
-        expect(request.getContext("application")).andReturn(applicationScope);
-
-        replay(request, applicationContext);
-        VariableResolver resolver = factory.createVariableResolver("requestScope");
-        assertEquals(0, resolver.getFlags());
-        assertEquals("requestScope", resolver.getName());
-        assertEquals(Map.class, resolver.getType());
-        assertEquals(requestScope, resolver.getValue());
-        resolver.setStaticType(Object.class); // To complete coverage
-        assertEquals(Map.class, resolver.getType());
-        resolver = factory.createVariableResolver("requestScope"); // again to test caching
-        assertEquals(requestScope, resolver.getValue());
-        resolver = factory.createVariableResolver("applicationScope");
-        assertEquals(applicationScope, resolver.getValue());
-        verify(request, applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java
deleted file mode 100644
index 290125e..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextBeanVariableResolverFactoryTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import java.util.Arrays;
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-import org.mvel2.integration.VariableResolver;
-
-/**
- * Tests {@link TilesContextBeanVariableResolverFactory}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesContextBeanVariableResolverFactoryTest {
-
-    /**
-     * The expected session scope calls.
-     */
-    private static final int EXPECTED_SESSION_CALLS = 3;
-
-    /**
-     * The expected request scope calls.
-     */
-    private static final int EXPECTED_REQUEST_CALLS = 4;
-
-    /**
-     * The Tiles request.
-     */
-    private Request request;
-
-    /**
-     * The Tiles application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The object to test.
-     */
-    private TilesContextBeanVariableResolverFactory factory;
-
-    /**
-     * Sets up the object.
-     */
-    @Before
-    public void setUp() {
-        request = createMock(Request.class);
-        TilesRequestContextHolder holder = new TilesRequestContextHolder();
-        holder.setTilesRequestContext(request);
-        applicationContext = createMock(ApplicationContext.class);
-        factory = new TilesContextBeanVariableResolverFactory(holder);
-    }
-
-    /**
-     * Test method for {@link TilesContextBeanVariableResolverFactory#createVariableResolver(String)}.
-     */
-    @Test
-    public void testCreateVariableResolver() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put("one", 1);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("two", 2);
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        sessionScope.put("three", "three");
-        expect(request.getContext("session")).andReturn(sessionScope).anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        expect(request.getContext("application")).andReturn(applicationScope).anyTimes();
-        replay(request, applicationContext);
-
-        VariableResolver resolver = factory.createVariableResolver("one");
-        assertEquals(1, resolver.getValue());
-        assertEquals(Integer.class, resolver.getType());
-        resolver = factory.createVariableResolver("two");
-        assertEquals(2, resolver.getValue());
-        resolver = factory.createVariableResolver("three");
-        assertEquals("three", resolver.getValue());
-        resolver = factory.createVariableResolver("four");
-        assertEquals(Object.class, resolver.getType());
-        assertNull(resolver.getValue());
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link TilesContextBeanVariableResolverFactory#isTarget(String)}.
-     */
-    @Test
-    public void testIsTarget() {
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put("one", 1);
-        expect(request.getContext("request")).andReturn(requestScope).times(
-                EXPECTED_REQUEST_CALLS);
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("two", 2);
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        sessionScope.put("three", "three");
-        expect(request.getContext("session")).andReturn(sessionScope).times(
-                EXPECTED_SESSION_CALLS);
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" }))
-                .anyTimes();
-        expect(request.getContext("application")).andReturn(applicationScope).anyTimes();
-        replay(request, applicationContext);
-
-        assertTrue(factory.isTarget("one"));
-        assertTrue(factory.isTarget("two"));
-        assertTrue(factory.isTarget("three"));
-        assertFalse(factory.isTarget("four"));
-        verify(request, applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextVariableResolverFactoryTest.java b/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextVariableResolverFactoryTest.java
deleted file mode 100644
index 0c2219d..0000000
--- a/TILES_3_0_X/tiles-mvel/src/test/java/org/apache/tiles/mvel/TilesContextVariableResolverFactoryTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.mvel;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.context.TilesRequestContextHolder;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mvel2.integration.VariableResolver;
-
-/**
- * Tests {@link TilesContextVariableResolverFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContextVariableResolverFactoryTest {
-
-    /**
-     * The Tiles request.
-     */
-    private Request request;
-
-    /**
-     * The Tiles application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * The object to test.
-     */
-    private TilesContextVariableResolverFactory factory;
-
-    /**
-     * Sets up the object.
-     */
-    @Before
-    public void setUp() {
-        request = createMock(Request.class);
-        TilesRequestContextHolder holder = new TilesRequestContextHolder();
-        holder.setTilesRequestContext(request);
-        applicationContext = createMock(ApplicationContext.class);
-        factory = new TilesContextVariableResolverFactory(holder);
-    }
-
-    /**
-     * Tears down the object.
-     */
-    @After
-    public void tearDown() {
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link TilesContextVariableResolverFactory#isTarget(String)}.
-     */
-    @Test
-    public void testIsTarget() {
-        replay(request, applicationContext);
-        assertTrue(factory.isTarget("header"));
-        assertFalse(factory.isTarget("requestScope"));
-        assertTrue(factory.isTarget("applicationScope"));
-        assertFalse(factory.isTarget("blah"));
-    }
-
-    /**
-     * Test method for {@link TilesContextVariableResolverFactory#createVariableResolver(String)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testCreateVariableResolver() {
-        Map<String, String> header = createMock(Map.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put("one", 1);
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("two", 2);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(request.getHeader()).andReturn(header);
-
-        replay(request, applicationContext, header);
-
-        VariableResolver resolver = factory.createVariableResolver("header");
-        assertEquals(Map.class, resolver.getType());
-        assertEquals(header, resolver.getValue());
-        resolver = factory.createVariableResolver("applicationScope");
-        assertEquals(applicationScope, resolver.getValue());
-        assertEquals(Map.class, resolver.getType());
-        verify(header);
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/pom.xml b/TILES_3_0_X/tiles-ognl/pom.xml
deleted file mode 100644
index 4cef897..0000000
--- a/TILES_3_0_X/tiles-ognl/pom.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-ognl</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - OGNL support</name>
-  <description>Tiles OGNL support: Classes and tag libraries to use OGNL as an expression language in attribute expressions.</description>
-
-  <properties>
-  	<tiles.osgi.symbolicName>org.apache.tiles.ognl</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifest>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>ognl</groupId>
-      <artifactId>ognl</artifactId>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java
deleted file mode 100644
index e572f6a..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/AnyScopePropertyAccessor.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.ognl;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Accesses attributes in any scope.
- *
- * @version $Rev$ $Date$
- */
-public class AnyScopePropertyAccessor implements PropertyAccessor {
-
-    @Override
-    public Object getProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name) {
-        Request request = (Request) target;
-        String attributeName = (String) name;
-        for (String scopeName : request.getAvailableScopes()) {
-            Map<String, Object> scope = request.getContext(scopeName);
-            if (scope.containsKey(attributeName)) {
-                return scope.get(attributeName);
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getSourceAccessor(OgnlContext context, Object target,
-            Object index) {
-        Request request = (Request) target;
-        String attributeName = (String) index;
-        for (String scopeName : request.getAvailableScopes()) {
-            Map<String, Object> scope = request.getContext(scopeName);
-            if (scope.containsKey(attributeName)) {
-                return ".getContext(\"" + scopeName + "\").get(index)";
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public String getSourceSetter(OgnlContext context, Object target,
-            Object index) {
-        Request request = (Request) target;
-        String attributeName = (String) index;
-        String[] availableScopes = request.getAvailableScopes().toArray(new String[0]);
-        for (String scopeName : availableScopes) {
-            Map<String, Object> scope = request.getContext(scopeName);
-            if (scope.containsKey(attributeName)) {
-                return ".getContext(\"" + scopeName + "\").put(index, target)";
-            }
-        }
-        return ".getContext(\"" + availableScopes[0] + "\").put(index, target)";
-    }
-
-    @Override
-    public void setProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name,
-            Object value) {
-        Request request = (Request) target;
-        String attributeName = (String) name;
-        String[] availableScopes = request.getAvailableScopes().toArray(new String[0]);
-        for (String scopeName : availableScopes) {
-            Map<String, Object> scope = request.getContext(scopeName);
-            if (scope.containsKey(attributeName)) {
-                scope.put(attributeName, value);
-                return;
-            }
-        }
-        if (availableScopes.length > 0) {
-            request.getContext(availableScopes[0]).put(attributeName, value);
-        }
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/DelegatePropertyAccessor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/DelegatePropertyAccessor.java
deleted file mode 100644
index 60175e0..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/DelegatePropertyAccessor.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.OgnlException;
-import ognl.PropertyAccessor;
-
-/**
- * Uses a {@link PropertyAccessorDelegateFactory} to delegate the methods to
- * another {@link PropertyAccessor}.
- *
- * @param <T> The type of the accessed root object.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class DelegatePropertyAccessor<T> implements PropertyAccessor {
-
-    /**
-     * The property accessor factory.
-     *
-     * @since 2.2.0
-     */
-    private PropertyAccessorDelegateFactory<T> factory;
-
-    /**
-     * Constructor.
-     *
-     * @param factory The property accessor factory.
-     * @since 2.2.0
-     */
-    public DelegatePropertyAccessor(PropertyAccessorDelegateFactory<T> factory) {
-        this.factory = factory;
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public Object getProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name)
-            throws OgnlException {
-        return factory.getPropertyAccessor((String) name, (T) target).getProperty(
-                context, target, name);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public void setProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name,
-            Object value) throws OgnlException {
-        factory.getPropertyAccessor((String) name, (T) target).setProperty(context,
-                target, name, value);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public String getSourceAccessor(OgnlContext context, Object target,
-            Object index) {
-        return factory.getPropertyAccessor((String) index, (T) target)
-                .getSourceAccessor(context, target, index);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public String getSourceSetter(OgnlContext context, Object target,
-            Object index) {
-        return factory.getPropertyAccessor((String) index, (T) target)
-                .getSourceSetter(context, target, index);
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessor.java
deleted file mode 100644
index 2d9b50c..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessor.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.OgnlException;
-import ognl.PropertyAccessor;
-
-/**
- * Uses a {@link PropertyAccessor} as a delegate, but passing a nested object as
- * target.
- *
- * @param <T> The root object type from which the target object will be
- * extracted.
- * @since 2.2.0
- * @version $Rev$ $Date$
- */
-public class NestedObjectDelegatePropertyAccessor<T> implements
-        PropertyAccessor {
-
-    /**
-     * The extractor of the nested object.
-     *
-     * @since 2.2.0
-     */
-    private NestedObjectExtractor<T> nestedObjectExtractor;
-
-    /**
-     * The delegated property accessor.
-     *
-     * @since 2.2.0
-     */
-    private PropertyAccessor propertyAccessor;
-
-    /**
-     * Constructor.
-     *
-     * @param nestedObjectExtractor The extractor of the nested object.
-     * @param propertyAccessor The delegated property accessor.
-     * @since 2.2.0
-     */
-    public NestedObjectDelegatePropertyAccessor(
-            NestedObjectExtractor<T> nestedObjectExtractor,
-            PropertyAccessor propertyAccessor) {
-        this.nestedObjectExtractor = nestedObjectExtractor;
-        this.propertyAccessor = propertyAccessor;
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public Object getProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name)
-            throws OgnlException {
-        return propertyAccessor.getProperty(context, nestedObjectExtractor
-                .getNestedObject((T) target), name);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public void setProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name,
-            Object value) throws OgnlException {
-        propertyAccessor.setProperty(context, nestedObjectExtractor
-                .getNestedObject((T) target), name, value);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public String getSourceAccessor(OgnlContext context, Object target,
-            Object index) {
-        return propertyAccessor.getSourceAccessor(context,
-                nestedObjectExtractor.getNestedObject((T) target), index);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public String getSourceSetter(OgnlContext context, Object target,
-            Object index) {
-        return propertyAccessor.getSourceSetter(context, nestedObjectExtractor
-                .getNestedObject((T) target), index);
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectExtractor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectExtractor.java
deleted file mode 100644
index c6888f4..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/NestedObjectExtractor.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-/**
- * Extracts an object using another object as a basis.
- *
- * @param <T> The type of the root object.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface NestedObjectExtractor<T> {
-
-    /**
-     * Extracts the nested object.
-     *
-     * @param obj The root object.
-     * @return The extracted nested object.
-     * @since 2.2.0
-     */
-    Object getNestedObject(T obj);
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/OGNLAttributeEvaluator.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/OGNLAttributeEvaluator.java
deleted file mode 100644
index ee4d896..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/OGNLAttributeEvaluator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import ognl.Ognl;
-import ognl.OgnlException;
-
-import org.apache.tiles.evaluator.AbstractAttributeEvaluator;
-import org.apache.tiles.evaluator.EvaluationException;
-import org.apache.tiles.request.Request;
-
-/**
- * Evaluates attribute expressions and expressions with OGNL language.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class OGNLAttributeEvaluator extends AbstractAttributeEvaluator {
-
-    /** {@inheritDoc} */
-    public Object evaluate(String expression, Request request) {
-        if (expression == null) {
-            throw new IllegalArgumentException("The expression parameter cannot be null");
-        }
-        try {
-            return Ognl.getValue(expression, request);
-        } catch (OgnlException e) {
-            throw new EvaluationException("Cannot evaluate OGNL expression '"
-                    + expression + "'", e);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/PropertyAccessorDelegateFactory.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/PropertyAccessorDelegateFactory.java
deleted file mode 100644
index 7c619ca..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/PropertyAccessorDelegateFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import ognl.PropertyAccessor;
-
-/**
- * Decides a {@link PropertyAccessor} depending on the property name and the
- * object to evaluate.
- *
- * @param <T> The type of the root object to evaluate.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface PropertyAccessorDelegateFactory<T> {
-
-    /**
-     * Returns a prooerty accessor appropriate for the property name and the
-     * object passed.
-     *
-     * @param propertyName The name of the property.
-     * @param obj The root object to evaluate.
-     * @return The appropriate property accessor.
-     * @since 2.2.0
-     */
-    PropertyAccessor getPropertyAccessor(String propertyName, T obj);
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/ScopePropertyAccessor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/ScopePropertyAccessor.java
deleted file mode 100644
index 35f47fe..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/ScopePropertyAccessor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.ognl;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Accesses a scope.
- *
- * @version $Rev$ $Date$
- */
-public class ScopePropertyAccessor implements PropertyAccessor {
-
-    /**
-     * The length of the scope suffix: "Scope".
-     */
-    static final int SCOPE_SUFFIX_LENGTH = 5;
-
-    @Override
-    public Object getProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name) {
-        Request request = (Request) target;
-        String scope = (String) name;
-        if (scope.endsWith("Scope")) {
-            String scopeName = scope.substring(0, scope.length() - SCOPE_SUFFIX_LENGTH);
-            return request.getContext(scopeName);
-        }
-        return null;
-    }
-
-    @Override
-    public String getSourceAccessor(OgnlContext context, Object target,
-            Object index) {
-        String scope = (String) index;
-        if (scope.endsWith("Scope")) {
-            String scopeName = scope.substring(0, scope.length() - SCOPE_SUFFIX_LENGTH);
-            return ".getContext(\"" + scopeName + "\")";
-        }
-        return null;
-    }
-
-    @Override
-    public String getSourceSetter(OgnlContext context, Object target,
-            Object index) {
-        return null;
-    }
-
-    @Override
-    public void setProperty(@SuppressWarnings("rawtypes") Map context, Object target, Object name,
-            Object value) {
-        // Does nothing.
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractor.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractor.java
deleted file mode 100644
index 7642fa8..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-
-/**
- * Extracts the application context from a Tiles request.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesApplicationContextNestedObjectExtractor implements
-        NestedObjectExtractor<Request> {
-
-    /** {@inheritDoc} */
-    public ApplicationContext getNestedObject(Request obj) {
-        return obj.getApplicationContext();
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactory.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactory.java
deleted file mode 100644
index a253f44..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactory.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.util.CombinedBeanInfo;
-
-/**
- * Decides the appropriate {@link PropertyAccessor} for the given property name
- * and {@link Request}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesContextPropertyAccessorDelegateFactory implements
-        PropertyAccessorDelegateFactory<Request> {
-
-    /**
-     * The plain object property accessor, to be used directly for
-     * {@link Request}.
-     */
-    private PropertyAccessor objectPropertyAccessor;
-
-    /**
-     * The application context property accessor.
-     */
-    private PropertyAccessor applicationContextPropertyAccessor;
-
-    /**
-     * The request scope property accessor.
-     */
-    private PropertyAccessor anyScopePropertyAccessor;
-
-    /**
-     * The session scope property accessor.
-     */
-    private PropertyAccessor scopePropertyAccessor;
-
-    /**
-     * The bean info of {@link Request} and
-     * {@link org.apache.tiles.request.ApplicationContext}.
-     */
-    private CombinedBeanInfo beanInfo;
-
-    /**
-     * Constructor.
-     *
-     * @param objectPropertyAccessor The plain object property accessor, to be
-     * used directly for {@link Request}.
-     * @param applicationContextPropertyAccessor The application context
-     * property accessor.
-     * @param anyScopePropertyAccessor The request scope property accessor.
-     * @param scopePropertyAccessor The session scope property accessor.
-     * @since 2.2.0
-     */
-    public TilesContextPropertyAccessorDelegateFactory(
-            PropertyAccessor objectPropertyAccessor,
-            PropertyAccessor applicationContextPropertyAccessor,
-            PropertyAccessor anyScopePropertyAccessor,
-            PropertyAccessor scopePropertyAccessor) {
-        beanInfo = new CombinedBeanInfo(Request.class, ApplicationContext.class);
-        this.objectPropertyAccessor = objectPropertyAccessor;
-        this.applicationContextPropertyAccessor = applicationContextPropertyAccessor;
-        this.anyScopePropertyAccessor = anyScopePropertyAccessor;
-        this.scopePropertyAccessor = scopePropertyAccessor;
-    }
-
-    /** {@inheritDoc} */
-    public PropertyAccessor getPropertyAccessor(String propertyName,
-            Request request) {
-        PropertyAccessor retValue;
-        if (propertyName.endsWith("Scope")) {
-            String scopeName = propertyName.substring(0, propertyName.length()
-                    - ScopePropertyAccessor.SCOPE_SUFFIX_LENGTH);
-            if (request.getContext(scopeName) != null) {
-                return scopePropertyAccessor;
-            }
-        }
-        if (beanInfo.getMappedDescriptors(Request.class)
-                .containsKey(propertyName)) {
-            retValue = objectPropertyAccessor;
-        } else if (beanInfo.getMappedDescriptors(ApplicationContext.class)
-                .containsKey(propertyName)) {
-            retValue = applicationContextPropertyAccessor;
-        } else {
-            return anyScopePropertyAccessor;
-        }
-        return retValue;
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/package-info.java b/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/package-info.java
deleted file mode 100644
index 116082c..0000000
--- a/TILES_3_0_X/tiles-ognl/src/main/java/org/apache/tiles/ognl/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-/**
- * Attribute evaluator classes that can perform OGNL evaluation for attributes.
- */
-package org.apache.tiles.ognl;
diff --git a/TILES_3_0_X/tiles-ognl/src/site/site.xml b/TILES_3_0_X/tiles-ognl/src/site/site.xml
deleted file mode 100644
index dae4c3f..0000000
--- a/TILES_3_0_X/tiles-ognl/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - OGNL Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
deleted file mode 100644
index fb60fac..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/AnyScopePropertyAccessorTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.ognl;
-
-import java.util.Arrays;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link AnyScopePropertyAccessor}.
- *
- * @version $Rev$ $Date$
- */
-public class AnyScopePropertyAccessorTest {
-
-    /**
-     * The accessor to test.
-     */
-    private AnyScopePropertyAccessor accessor;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        accessor = new AnyScopePropertyAccessor();
-    }
-
-    /**
-     * Test method for {@link AnyScopePropertyAccessor#getProperty(java.util.Map, java.lang.Object, java.lang.Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetProperty() {
-        Request request = createMock(Request.class);
-        Map<String, Object> oneScope = createMock(Map.class);
-        Map<String, Object> twoScope = createMock(Map.class);
-
-        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
-        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
-        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
-        expect(oneScope.containsKey("name1")).andReturn(true);
-        expect(oneScope.get("name1")).andReturn("value1");
-        expect(oneScope.containsKey("name2")).andReturn(false);
-        expect(oneScope.containsKey("name3")).andReturn(false);
-        expect(twoScope.containsKey("name2")).andReturn(true);
-        expect(twoScope.get("name2")).andReturn("value2");
-        expect(twoScope.containsKey("name3")).andReturn(false);
-
-        replay(request, oneScope, twoScope);
-        assertEquals("value1", accessor.getProperty(null, request, "name1"));
-        assertEquals("value2", accessor.getProperty(null, request, "name2"));
-        assertNull(accessor.getProperty(null, request, "name3"));
-        verify(request, oneScope, twoScope);
-    }
-
-    /**
-     * Test method for {@link AnyScopePropertyAccessor#getSourceAccessor(OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceAccessor() {
-        Request request = createMock(Request.class);
-        Map<String, Object> oneScope = createMock(Map.class);
-        Map<String, Object> twoScope = createMock(Map.class);
-
-        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
-        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
-        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
-        expect(oneScope.containsKey("name1")).andReturn(true);
-        expect(oneScope.containsKey("name2")).andReturn(false);
-        expect(oneScope.containsKey("name3")).andReturn(false);
-        expect(twoScope.containsKey("name2")).andReturn(true);
-        expect(twoScope.containsKey("name3")).andReturn(false);
-
-        replay(request, oneScope, twoScope);
-        assertEquals(".getContext(\"one\").get(index)", accessor.getSourceAccessor(null, request, "name1"));
-        assertEquals(".getContext(\"two\").get(index)", accessor.getSourceAccessor(null, request, "name2"));
-        assertNull(accessor.getSourceAccessor(null, request, "name3"));
-        verify(request, oneScope, twoScope);
-    }
-
-    /**
-     * Test method for {@link AnyScopePropertyAccessor#getSourceSetter(OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceSetter() {
-        Request request = createMock(Request.class);
-        Map<String, Object> oneScope = createMock(Map.class);
-        Map<String, Object> twoScope = createMock(Map.class);
-
-        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
-        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
-        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
-        expect(oneScope.containsKey("name1")).andReturn(true);
-        expect(oneScope.containsKey("name2")).andReturn(false);
-        expect(oneScope.containsKey("name3")).andReturn(false);
-        expect(twoScope.containsKey("name2")).andReturn(true);
-        expect(twoScope.containsKey("name3")).andReturn(false);
-
-        replay(request, oneScope, twoScope);
-        assertEquals(".getContext(\"one\").put(index, target)", accessor.getSourceSetter(null, request, "name1"));
-        assertEquals(".getContext(\"two\").put(index, target)", accessor.getSourceSetter(null, request, "name2"));
-        assertEquals(".getContext(\"one\").put(index, target)", accessor.getSourceSetter(null, request, "name3"));
-        verify(request, oneScope, twoScope);
-    }
-
-    /**
-     * Test method for {@link AnyScopePropertyAccessor#setProperty(Map, Object, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testSetProperty() {
-        Request request = createMock(Request.class);
-        Map<String, Object> oneScope = createMock(Map.class);
-        Map<String, Object> twoScope = createMock(Map.class);
-
-        expect(request.getAvailableScopes()).andReturn(Arrays.asList(new String[] {"one", "two"})).anyTimes();
-        expect(request.getContext("one")).andReturn(oneScope).anyTimes();
-        expect(request.getContext("two")).andReturn(twoScope).anyTimes();
-        expect(oneScope.containsKey("name1")).andReturn(true);
-        expect(oneScope.put("name1", "otherValue1")).andReturn("value1");
-        expect(oneScope.containsKey("name2")).andReturn(false);
-        expect(oneScope.containsKey("name3")).andReturn(false);
-        expect(twoScope.containsKey("name2")).andReturn(true);
-        expect(twoScope.put("name2", "otherValue2")).andReturn("value2");
-        expect(twoScope.containsKey("name3")).andReturn(false);
-        expect(oneScope.put("name3", "otherValue3")).andReturn(null);
-
-        replay(request, oneScope, twoScope);
-        accessor.setProperty(null, request, "name1", "otherValue1");
-        accessor.setProperty(null, request, "name2", "otherValue2");
-        accessor.setProperty(null, request, "name3", "otherValue3");
-        verify(request, oneScope, twoScope);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java
deleted file mode 100644
index bcf9a74..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/DelegatePropertyAccessorTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import static org.junit.Assert.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.OgnlException;
-import ognl.PropertyAccessor;
-
-import org.junit.Test;
-
-/**
- * Tests {@link DelegatePropertyAccessor}.
- *
- * @version $Rev$ $Date$
- */
-public class DelegatePropertyAccessorTest {
-
-    /**
-     * Test method for {@link DelegatePropertyAccessor#getProperty(java.util.Map, Object, Object)}.
-     * @throws OgnlException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetProperty() throws OgnlException {
-        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
-        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
-        Map<String, Object> context = createMock(Map.class);
-        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
-        expect(mockAccessor.getProperty(context, 1, "property")).andReturn("value");
-
-        replay(factory, mockAccessor, context);
-        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
-        assertEquals("value", accessor.getProperty(context, 1, "property"));
-        verify(factory, mockAccessor, context);
-    }
-
-    /**
-     * Test method for {@link DelegatePropertyAccessor#setProperty(java.util.Map, Object, Object, Object)}.
-     * @throws OgnlException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testSetProperty() throws OgnlException {
-        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
-        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
-        Map<String, Object> context = createMock(Map.class);
-        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
-        mockAccessor.setProperty(context, 1, "property", "value");
-
-        replay(factory, mockAccessor, context);
-        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
-        accessor.setProperty(context, 1, "property", "value");
-        verify(factory, mockAccessor, context);
-    }
-
-    /**
-     * Test method for {@link DelegatePropertyAccessor#getSourceAccessor(ognl.OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceAccessor() {
-        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
-        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
-        OgnlContext context = createMock(OgnlContext.class);
-        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
-        expect(mockAccessor.getSourceAccessor(context, 1, "property")).andReturn("method");
-
-        replay(factory, mockAccessor, context);
-        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
-        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
-        verify(factory, mockAccessor, context);
-    }
-
-    /**
-     * Test method for {@link DelegatePropertyAccessor#getSourceSetter(ognl.OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceSetter() {
-        PropertyAccessorDelegateFactory<Integer> factory = createMock(PropertyAccessorDelegateFactory.class);
-        PropertyAccessor mockAccessor = createMock(PropertyAccessor.class);
-        OgnlContext context = createMock(OgnlContext.class);
-        expect(factory.getPropertyAccessor("property", 1)).andReturn(mockAccessor);
-        expect(mockAccessor.getSourceSetter(context, 1, "property")).andReturn("method");
-
-        replay(factory, mockAccessor, context);
-        PropertyAccessor accessor = new DelegatePropertyAccessor<Integer>(factory);
-        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
-        verify(factory, mockAccessor, context);
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java
deleted file mode 100644
index 2931716..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/NestedObjectDelegatePropertyAccessorTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import static org.junit.Assert.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.util.Map;
-
-import ognl.OgnlContext;
-import ognl.OgnlException;
-import ognl.PropertyAccessor;
-
-import org.junit.Test;
-
-/**
- * Tests {@link NestedObjectDelegatePropertyAccessor}.
- *
- * @version $Rev$ $Date$
- */
-public class NestedObjectDelegatePropertyAccessorTest {
-
-    /**
-     * Test method for {@link NestedObjectDelegatePropertyAccessor#getProperty(java.util.Map, Object, Object)}.
-     * @throws OgnlException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetProperty() throws OgnlException {
-        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
-        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
-        Map<String, Object> context = createMock(Map.class);
-        expect(propertyAccessor.getProperty(context, "nested", "property")).andReturn("value");
-        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
-
-        replay(nestedObjectExtractor, propertyAccessor, context);
-        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
-                nestedObjectExtractor, propertyAccessor);
-        assertEquals("value", accessor.getProperty(context, 1, "property"));
-        verify(nestedObjectExtractor, propertyAccessor, context);
-    }
-
-    /**
-     * Test method for {@link NestedObjectDelegatePropertyAccessor#setProperty(java.util.Map, Object, Object, Object)}.
-     * @throws OgnlException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testSetProperty() throws OgnlException {
-        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
-        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
-        Map<String, Object> context = createMock(Map.class);
-        propertyAccessor.setProperty(context, "nested", "property", "value");
-        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
-
-        replay(nestedObjectExtractor, propertyAccessor, context);
-        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
-                nestedObjectExtractor, propertyAccessor);
-        accessor.setProperty(context, 1, "property", "value");
-        verify(nestedObjectExtractor, propertyAccessor, context);
-    }
-
-    /**
-     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceAccessor(ognl.OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceAccessor() {
-        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
-        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
-        OgnlContext context = createMock(OgnlContext.class);
-        expect(propertyAccessor.getSourceAccessor(context, "nested", "property")).andReturn("method");
-        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
-
-        replay(nestedObjectExtractor, propertyAccessor, context);
-        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
-                nestedObjectExtractor, propertyAccessor);
-        assertEquals("method", accessor.getSourceAccessor(context, 1, "property"));
-        verify(nestedObjectExtractor, propertyAccessor, context);
-    }
-
-    /**
-     * Test method for {@link NestedObjectDelegatePropertyAccessor#getSourceSetter(ognl.OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceSetter() {
-        NestedObjectExtractor<Integer> nestedObjectExtractor = createMock(NestedObjectExtractor.class);
-        PropertyAccessor propertyAccessor = createMock(PropertyAccessor.class);
-        OgnlContext context = createMock(OgnlContext.class);
-        expect(propertyAccessor.getSourceSetter(context, "nested", "property")).andReturn("method");
-        expect(nestedObjectExtractor.getNestedObject(1)).andReturn("nested");
-
-        replay(nestedObjectExtractor, propertyAccessor, context);
-        PropertyAccessor accessor = new NestedObjectDelegatePropertyAccessor<Integer>(
-                nestedObjectExtractor, propertyAccessor);
-        assertEquals("method", accessor.getSourceSetter(context, 1, "property"));
-        verify(nestedObjectExtractor, propertyAccessor, context);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
deleted file mode 100644
index 520b9c4..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/OGNLAttributeEvaluatorTest.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.ognl;
-
-import java.util.Arrays;
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import ognl.OgnlException;
-import ognl.OgnlRuntime;
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.apache.tiles.evaluator.EvaluationException;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link OGNLAttributeEvaluator}.
- *
- * @version $Rev$ $Date$$
- */
-public class OGNLAttributeEvaluatorTest {
-
-    /**
-     * The evaluator to test.
-     */
-    private OGNLAttributeEvaluator evaluator;
-
-    /**
-     * The request object to use.
-     */
-    private Request request;
-
-    /**
-     * The application context.
-     */
-    private ApplicationContext applicationContext;
-
-    /**
-     * Sets up the test.
-     *
-     * @throws OgnlException If something goes wrong.
-     */
-    @Before
-    public void setUp() throws OgnlException {
-        PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);
-        PropertyAccessor applicationContextPropertyAccessor =
-            new NestedObjectDelegatePropertyAccessor<Request>(
-                new TilesApplicationContextNestedObjectExtractor(),
-                objectPropertyAccessor);
-        PropertyAccessor anyScopePropertyAccessor = new AnyScopePropertyAccessor();
-        PropertyAccessor scopePropertyAccessor = new ScopePropertyAccessor();
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                anyScopePropertyAccessor, scopePropertyAccessor);
-        PropertyAccessor tilesRequestAccessor = new DelegatePropertyAccessor<Request>(factory);
-        OgnlRuntime.setPropertyAccessor(Request.class, tilesRequestAccessor);
-        evaluator = new OGNLAttributeEvaluator();
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> sessionScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put("object1", "value");
-        sessionScope.put("object2", new Integer(1));
-        applicationScope.put("object3", new Float(2.0));
-        requestScope.put("paulaBean", new PaulaBean());
-        request = createMock(Request.class);
-        expect(request.getContext("request")).andReturn(requestScope)
-                .anyTimes();
-        expect(request.getContext("session")).andReturn(sessionScope)
-                .anyTimes();
-        expect(request.getContext("application")).andReturn(applicationScope)
-                .anyTimes();
-        expect(request.getAvailableScopes()).andReturn(
-                Arrays.asList(new String[] { "request", "session", "application" })).anyTimes();
-        applicationContext = createMock(ApplicationContext.class);
-        expect(request.getApplicationContext()).andReturn(
-                applicationContext).anyTimes();
-        expect(applicationContext.getApplicationScope()).andReturn(
-                applicationScope).anyTimes();
-        replay(request, applicationContext);
-    }
-
-    /**
-     * Tears down the test.
-     */
-    @After
-    public void tearDown() {
-        verify(request, applicationContext);
-    }
-
-    /**
-     * Tests
-     * {@link OGNLAttributeEvaluator#evaluate(Attribute, Request)}.
-     */
-    @Test
-    public void testEvaluate() {
-        Attribute attribute = new Attribute();
-        attribute.setExpressionObject(new Expression("requestScope.object1"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("sessionScope.object2"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("applicationScope.object3"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("object1"));
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                attribute, request));
-        attribute.setExpressionObject(new Expression("object2"));
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("object3"));
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("paulaBean.paula"));
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(attribute, request));
-        attribute.setExpressionObject(new Expression("'String literal'"));
-        assertEquals("The value is not correct", "String literal", evaluator
-                .evaluate(attribute, request));
-        attribute.setValue(new Integer(2));
-        assertEquals("The value is not correct", new Integer(2), evaluator
-                .evaluate(attribute, request));
-        attribute.setValue("object1");
-        assertEquals("The value has been evaluated", "object1", evaluator
-                .evaluate(attribute, request));
-    }
-
-    /**
-     * Tests {@link OGNLAttributeEvaluator#evaluate(String, Request)}.
-     */
-    @Test
-    public void testEvaluateString() {
-        String expression = "requestScope.object1";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "sessionScope.object2";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "applicationScope.object3";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "object1";
-        assertEquals("The value is not correct", "value", evaluator.evaluate(
-                expression, request));
-        expression = "object2";
-        assertEquals("The value is not correct", new Integer(1), evaluator
-                .evaluate(expression, request));
-        expression = "object3";
-        assertEquals("The value is not correct", new Float(2.0), evaluator
-                .evaluate(expression, request));
-        expression = "paulaBean.paula";
-        assertEquals("The value is not correct", "Brillant", evaluator
-                .evaluate(expression, request));
-        expression = "'String literal'";
-        assertEquals("The value is not correct", "String literal", evaluator
-                .evaluate(expression, request));
-    }
-
-    /**
-     * Tests {@link OGNLAttributeEvaluator#evaluate(String, Request)}.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testEvaluateNull() {
-        evaluator.evaluate((String) null, request);
-    }
-
-    /**
-     * Tests {@link OGNLAttributeEvaluator#evaluate(String, Request)}.
-     */
-    @Test(expected = EvaluationException.class)
-    public void testEvaluateOgnlException() {
-        evaluator.evaluate("wrong|||!!!!yes###", request);
-    }
-
-    /**
-     * This is The Brillant Paula Bean (sic) just like it was posted to:
-     * http://thedailywtf.com/Articles/The_Brillant_Paula_Bean.aspx I hope that
-     * there is no copyright on it.
-     */
-    public static class PaulaBean {
-
-        /**
-         * Paula is brillant, really.
-         */
-        private String paula = "Brillant";
-
-        /**
-         * Returns brillant.
-         *
-         * @return "Brillant".
-         */
-        public String getPaula() {
-            return paula;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/ScopePropertyAccessorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/ScopePropertyAccessorTest.java
deleted file mode 100644
index 3bbc58c..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/ScopePropertyAccessorTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.ognl;
-
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ScopePropertyAccessor}.
- *
- * @version $Rev$ $Date$
- */
-public class ScopePropertyAccessorTest {
-
-    /**
-     * The accessor to test.
-     */
-    private ScopePropertyAccessor accessor;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        accessor = new ScopePropertyAccessor();
-    }
-
-    /**
-     * Test method for {@link ScopePropertyAccessor#getProperty(Map, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetProperty() {
-        Request request = createMock(Request.class);
-        Map<String, Object> oneScope = createMock(Map.class);
-
-        expect(request.getContext("one")).andReturn(oneScope);
-
-        replay(request);
-        assertEquals(oneScope, accessor.getProperty(null, request, "oneScope"));
-        assertNull(accessor.getProperty(null, request, "whatever"));
-        verify(request);
-    }
-
-    /**
-     * Test method for {@link ScopePropertyAccessor#getSourceAccessor(OgnlContext, Object, Object)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetSourceAccessor() {
-        Request request = createMock(Request.class);
-        @SuppressWarnings("unused")
-        Map<String, Object> oneScope = createMock(Map.class);
-
-        replay(request);
-        assertEquals(".getContext(\"one\")", accessor.getSourceAccessor(null, request, "oneScope"));
-        assertNull(accessor.getSourceAccessor(null, request, "whatever"));
-        verify(request);
-    }
-
-    /**
-     * Test method for {@link ScopePropertyAccessor#getSourceSetter(OgnlContext, Object, Object)}.
-     */
-    @Test
-    public void testGetSourceSetter() {
-        assertNull(accessor.getSourceSetter(null, null, "whatever"));
-    }
-
-    /**
-     * Test method for {@link ScopePropertyAccessor#setProperty(Map, Object, Object, Object)}.
-     */
-    @Test
-    public void testSetProperty() {
-        accessor.setProperty(null, null, "whatever", "whateverValue");
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java
deleted file mode 100644
index 6fc1bb3..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesApplicationContextNestedObjectExtractorTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesApplicationContextNestedObjectExtractor}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesApplicationContextNestedObjectExtractorTest {
-
-    /**
-     * Tests {@link TilesApplicationContextNestedObjectExtractor#getNestedObject(Request)}.
-     */
-    @Test
-    public void testGetNestedObject() {
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-
-        replay(request, applicationContext);
-        NestedObjectExtractor<Request> extractor = new TilesApplicationContextNestedObjectExtractor();
-        assertEquals(applicationContext, extractor.getNestedObject(request));
-        verify(request, applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java b/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java
deleted file mode 100644
index 66bfff0..0000000
--- a/TILES_3_0_X/tiles-ognl/src/test/java/org/apache/tiles/ognl/TilesContextPropertyAccessorDelegateFactoryTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.ognl;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import ognl.PropertyAccessor;
-
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesContextPropertyAccessorDelegateFactory}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesContextPropertyAccessorDelegateFactoryTest {
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorRequest() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(objectPropertyAccessor, factory.getPropertyAccessor("writer", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorApplication() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(applicationContextPropertyAccessor, factory.getPropertyAccessor("initParams", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorRequestScope() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("attribute", 1);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorSessionScope() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("attribute", 1);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorApplicationScope() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("attribute", 1);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
-    }
-
-    /**
-     * Test method for
-     * {@link TilesContextPropertyAccessorDelegateFactory#getPropertyAccessor(String, Request)}
-     * .
-     */
-    @Test
-    public void testGetPropertyAccessorRequestScopeDefault() {
-        PropertyAccessor objectPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationContextPropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor requestScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor sessionScopePropertyAccessor = createMock(PropertyAccessor.class);
-        PropertyAccessor applicationScopePropertyAccessor = createMock(PropertyAccessor.class);
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("anotherAttribute", 1);
-
-        replay(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
-        PropertyAccessorDelegateFactory<Request> factory = new TilesContextPropertyAccessorDelegateFactory(
-                objectPropertyAccessor, applicationContextPropertyAccessor,
-                requestScopePropertyAccessor, sessionScopePropertyAccessor);
-        assertEquals(requestScopePropertyAccessor, factory.getPropertyAccessor("attribute", request));
-
-        verify(objectPropertyAccessor, applicationContextPropertyAccessor, requestScopePropertyAccessor,
-                sessionScopePropertyAccessor, applicationScopePropertyAccessor, request, applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/pom.xml b/TILES_3_0_X/tiles-servlet/pom.xml
deleted file mode 100644
index 37e77eb..0000000
--- a/TILES_3_0_X/tiles-servlet/pom.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-  <parent>
-    <groupId>org.apache.tiles</groupId>
-    <artifactId>tiles-parent</artifactId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-servlet</artifactId>
-  <packaging>jar</packaging>
-  <name>Tiles - Servlet support</name>
-  <description>Tiles servlet support, to enable use of Tiles inside a Servlet environment.
-  </description>
-
-  <properties>
-      <tiles.osgi.symbolicName>org.apache.tiles.servlet</tiles.osgi.symbolicName>
-  </properties>
-
-  <build>
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <excludes>
-          <exclude>LICENSE.txt</exclude>
-          <exclude>NOTICE.txt</exclude>
-        </excludes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <includes>
-          <include>LICENSE.txt</include>
-          <include>NOTICE.txt</include>
-        </includes>
-        <targetPath>META-INF</targetPath>
-      </resource>
-    </resources>
-
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifest>
-            </manifest>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>net.sf.dtddoc</groupId>
-        <artifactId>dtddoc-maven-plugin</artifactId>
-        <version>1.1</version>
-        <configuration>
-          <docTitle>Tiles Definition File</docTitle>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-core</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.shale</groupId>
-      <artifactId>shale-test</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-request-servlet</artifactId>
-        <version>${tiles.request.version}</version>
-    </dependency>
-  </dependencies>
-
-</project>
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesInitializerServlet.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesInitializerServlet.java
deleted file mode 100644
index b4d2558..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesInitializerServlet.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServlet;
-
-import org.apache.tiles.request.servlet.ServletApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-import org.apache.tiles.web.util.ServletContextAdapter;
-
-/**
- * Abstract Initialization Servlet. Uses a {@link TilesInitializer}, created by
- * {@link #createTilesInitializer()} to initialize Tiles.
- *
- * @deprecated use {@link AbstractTilesListener} instead.
- * @see org.apache.tiles.web.startup.TilesListener
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-@Deprecated
-public abstract class AbstractTilesInitializerServlet extends HttpServlet {
-
-    /**
-     * The private listener instance, that is used to initialize Tiles
-     * container.
-     */
-    private TilesInitializer initializer;
-
-    /** {@inheritDoc} */
-    @Override
-    public void destroy() {
-        initializer.destroy();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void init() {
-        initializer = createTilesInitializer();
-        ServletContext adaptedContext = new ServletContextAdapter(
-                getServletConfig());
-        ServletApplicationContext preliminaryContext = new ServletApplicationContext(
-                adaptedContext);
-        initializer.initialize(preliminaryContext);
-    }
-
-    /**
-     * Creates a new instance of {@link TilesInitializer}. Implement it to use
-     * your custom initializer.
-     *
-     * @return The Tiles servlet-based initializer.
-     * @since 2.2.0
-     */
-    protected abstract TilesInitializer createTilesInitializer();
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesListener.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesListener.java
deleted file mode 100644
index 40a8b24..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/AbstractTilesListener.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-
-import org.apache.tiles.request.servlet.ServletApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-
-/**
- * Listener for the initialization of the Tiles container.
- *
- * @version $Rev$ $Date$
- */
-public abstract class AbstractTilesListener implements ServletContextListener {
-
-    /**
-     * The initializer object.
-     *
-     * @since 2.1.2
-     */
-    protected TilesInitializer initializer;
-
-    /**
-     * Initialize the TilesContainer and place it
-     * into service.
-     *
-     * @param event The intercepted event.
-     */
-    public void contextInitialized(ServletContextEvent event) {
-        ServletContext servletContext = event.getServletContext();
-        initializer = createTilesInitializer();
-        initializer.initialize(new ServletApplicationContext(
-                servletContext));
-    }
-
-    /**
-     * Destroys the initializer.
-     *
-     * @param event The intercepted event.
-     */
-    public void contextDestroyed(ServletContextEvent event) {
-        initializer.destroy();
-    }
-
-    /**
-     * Creates a new instance of {@link TilesInitializer}. Implement it to use a
-     * different initializer.
-     *
-     * @return The Tiles servlet-based initializer.
-     * @since 2.2.0
-     */
-    protected abstract TilesInitializer createTilesInitializer();
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/package-info.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/package-info.java
deleted file mode 100644
index 6dc2fd3..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Classes to start the Tiles engine up in a web environment.
- */
-package org.apache.tiles.web.startup;
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServlet.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServlet.java
deleted file mode 100644
index 0159db3..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServlet.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.web.startup.simple;
-
-import org.apache.tiles.startup.DefaultTilesInitializer;
-import org.apache.tiles.startup.TilesInitializer;
-import org.apache.tiles.web.startup.AbstractTilesInitializerServlet;
-
-/**
- * A Tiles listener that loads Tiles in the default way.
- *
- * @deprecated use {@link SimpleTilesListener} instead.
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-@Deprecated
-public class SimpleTilesInitializerServlet extends AbstractTilesInitializerServlet {
-
-    /** {@inheritDoc} */
-    @Override
-    protected TilesInitializer createTilesInitializer() {
-        return new DefaultTilesInitializer();
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesListener.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesListener.java
deleted file mode 100644
index 6474b8e..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/SimpleTilesListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.web.startup.simple;
-
-import org.apache.tiles.startup.DefaultTilesInitializer;
-import org.apache.tiles.startup.TilesInitializer;
-import org.apache.tiles.web.startup.AbstractTilesListener;
-
-/**
- * A Tiles listener that loads Tiles in the default way.
- *
- * @version $Rev$ $Date$ù
- * @since 2.2.0
- */
-public class SimpleTilesListener extends AbstractTilesListener {
-
-    /** {@inheritDoc} */
-    @Override
-    protected TilesInitializer createTilesInitializer() {
-        return new DefaultTilesInitializer();
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/package-info.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/package-info.java
deleted file mode 100644
index 68f96c2..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/startup/simple/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Classes to start the Tiles engine up in a web environment using the default settings.
- */
-package org.apache.tiles.web.startup.simple;
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/AttributeContextMutator.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/AttributeContextMutator.java
deleted file mode 100644
index 2e96a71..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/AttributeContextMutator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import org.apache.tiles.AttributeContext;
-
-import javax.servlet.ServletRequest;
-
-/**
- * It represents an object able to manipulate a <code>AttributeContext</code>.
- * In other words, it is able to add, replace and remove attributes from the
- * <code>AttributeContext</code>.
- *
- * @since Tiles 2.0
- * @version $Rev$ $Date$
- */
-public interface AttributeContextMutator {
-
-    /**
-     * Mutate a <code>AttributeContext</code>.
-     *
-     * @param context The attribute context to mutate.
-     * @param request The current servlet request.
-     */
-    void mutate(AttributeContext context, ServletRequest request);
-
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/ServletContextAdapter.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/ServletContextAdapter.java
deleted file mode 100644
index 4d8fe91..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/ServletContextAdapter.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Set;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-/**
- * Adapts a servlet config and a servlet context to become a unique servlet
- * context.
- *
- * @version $Rev$ $Date$
- */
-@SuppressWarnings("deprecation")
-public class ServletContextAdapter implements ServletContext {
-
-    /**
-     * The root context to use.
-     */
-    private ServletContext rootContext;
-
-    /**
-     * The union of init parameters of {@link ServletConfig} and
-     * {@link ServletContext}.
-     */
-    private Hashtable<String, String> initParameters;
-
-
-    /**
-     * Constructor.
-     *
-     * @param config The servlet configuration object.
-     */
-    @SuppressWarnings("unchecked")
-    public ServletContextAdapter(ServletConfig config) {
-        this.rootContext = config.getServletContext();
-        initParameters = new Hashtable<String, String>();
-        Enumeration<String> enumeration = rootContext
-                .getInitParameterNames();
-        while (enumeration.hasMoreElements()) {
-            String paramName = enumeration.nextElement();
-            initParameters.put(paramName, rootContext
-                    .getInitParameter(paramName));
-        }
-        enumeration = config.getInitParameterNames();
-        while (enumeration.hasMoreElements()) {
-            String paramName = enumeration.nextElement();
-            initParameters.put(paramName, config.getInitParameter(paramName));
-        }
-    }
-
-    /** {@inheritDoc} */
-    public ServletContext getContext(String string) {
-        return rootContext.getContext(string);
-    }
-
-    /** {@inheritDoc} */
-    public int getMajorVersion() {
-        return rootContext.getMajorVersion();
-    }
-
-    /** {@inheritDoc} */
-    public int getMinorVersion() {
-        return rootContext.getMinorVersion();
-    }
-
-    /** {@inheritDoc} */
-    public String getMimeType(String string) {
-        return rootContext.getMimeType(string);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings({ "rawtypes" })
-    public Set getResourcePaths(String string) {
-        return rootContext.getResourcePaths(string);
-    }
-
-    /** {@inheritDoc} */
-    public URL getResource(String string) throws MalformedURLException {
-        return rootContext.getResource(string);
-    }
-
-    /** {@inheritDoc} */
-    public InputStream getResourceAsStream(String string) {
-        return rootContext.getResourceAsStream(string);
-    }
-
-    /** {@inheritDoc} */
-    public RequestDispatcher getRequestDispatcher(String string) {
-        return rootContext.getRequestDispatcher(string);
-    }
-
-    /** {@inheritDoc} */
-    public RequestDispatcher getNamedDispatcher(String string) {
-        return rootContext.getNamedDispatcher(string);
-    }
-
-    /** {@inheritDoc} */
-    public Servlet getServlet(String string) throws ServletException {
-        return rootContext.getServlet(string);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("rawtypes")
-    public Enumeration getServlets() {
-        return rootContext.getServlets();  //To change body of implemented methods use File | Settings | File Templates.
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("rawtypes")
-    public Enumeration getServletNames() {
-        return rootContext.getServletNames();
-    }
-
-    /** {@inheritDoc} */
-    public void log(String string) {
-        rootContext.log(string);
-    }
-
-    /** {@inheritDoc} */
-    public void log(Exception exception, String string) {
-        rootContext.log(exception, string);
-    }
-
-    /** {@inheritDoc} */
-    public void log(String string, Throwable throwable) {
-        rootContext.log(string, throwable);
-    }
-
-    /** {@inheritDoc} */
-    public String getRealPath(String string) {
-        return rootContext.getRealPath(string);
-    }
-
-    /** {@inheritDoc} */
-    public String getServerInfo() {
-        return rootContext.getServerInfo();
-    }
-
-    /** {@inheritDoc} */
-    public String getInitParameter(String string) {
-        return initParameters.get(string);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("rawtypes")
-    public Enumeration getInitParameterNames() {
-        return initParameters.keys();
-    }
-
-    /** {@inheritDoc} */
-    public Object getAttribute(String string) {
-        return rootContext.getAttribute(string);
-    }
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("rawtypes")
-    public Enumeration getAttributeNames() {
-        return rootContext.getAttributeNames();
-    }
-
-    /** {@inheritDoc} */
-    public void setAttribute(String string, Object object) {
-        rootContext.setAttribute(string, object);
-    }
-
-    /** {@inheritDoc} */
-    public void removeAttribute(String string) {
-        rootContext.removeAttribute(string);
-    }
-
-    /** {@inheritDoc} */
-    public String getServletContextName() {
-        return rootContext.getServletContextName();
-    }
-
-    /** {@inheritDoc} */
-    public String getContextPath() {
-        return rootContext.getContextPath();
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
deleted file mode 100644
index 35cbbfb..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.CannotInstantiateObjectException;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.apache.tiles.request.servlet.ServletRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Decoration Filter.  Intercepts all requests and decorates them
- * with the configured definition.
- * <p/>
- * For example, given the following config:
- * &lt;xmp&gt;
- * &lt;filter&gt;
- * &lt;filter-name&gt;Tiles Decoration Filter&lt;/filter-name&gt;
- * &lt;filter-class&gt;org.apache.tiles.web.TilesDecorationFilter&lt;/filter-class&gt;
- * &lt;init-param&gt;
- * &lt;param-name&gt;definition&lt;/param-name&gt;
- * &lt;param-value&gt;test.definition&lt;/param-value&gt;
- * &lt;/init-param&gt;
- * &lt;init-param&gt;
- * &lt;param-name&gt;attribute-name&lt;/param-name&gt;
- * &lt;param-value&gt;body&lt;/param-value&gt;
- * &lt;/init-param&gt;
- * &lt;init-param&gt;
- * &lt;param-name&gt;prevent-token&lt;/param-name&gt;
- * &lt;param-value&gt;layout&lt;/param-value&gt;
- * &lt;/init-param&gt;
- * &lt;/filter&gt;
- * <p/>
- * &lt;filter-mapping&gt;
- * &lt;filter-name&gt;Tiles Decoration Filter&lt;/filter-name&gt;
- * &lt;url-pattern&gt;/testdecorationfilter.jsp&lt;/url-pattern&gt;
- * &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
- * &lt;/filter-mapping&gt;
- * &lt;/xmp&gt;
- * The filter will intercept all requests to the indicated url pattern
- * store the initial request path as the "body"  attribute and then render the
- * "test.definition" definition.  The filter will only redecorate those requests
- * which do not contain the request attribute associated with the prevent token
- * "layout".
- */
-public class TilesDecorationFilter implements Filter {
-
-    /**
-     * Init parameter to define the key of the container to use.
-     *
-     * @since 2.1.2
-     */
-    public static final String CONTAINER_KEY_INIT_PARAMETER =
-        "org.apache.tiles.web.util.TilesDecorationFilter.CONTAINER_KEY";
-
-    /**
-     * The logging object.
-     */
-    private Logger log = LoggerFactory.getLogger(TilesDecorationFilter.class);
-
-    /**
-     * Filter configuration.
-     */
-    private FilterConfig filterConfig;
-
-    /**
-     * The key under which the container is stored.
-     */
-    private String containerKey;
-
-    /**
-     * The name of the definition attribute used to
-     * pass on the request.
-     */
-    private String definitionAttributeName = "content";
-
-    /**
-     * The definition name to use.
-     */
-    private String definitionName = "layout";
-
-    /**
-     * Token used to prevent re-decoration of requests.
-     * This token is used to prevent infinate loops on
-     * filters configured to match wildcards.
-     */
-    private String preventDecorationToken;
-
-    /**
-     * Stores a map of the type "mask -> definition": when a definition name
-     * mask is identified, it is substituted with the configured definition.
-     */
-    private Map<String, String> alternateDefinitions;
-
-    /**
-     * The object that will mutate the attribute context so that it uses
-     * different attributes.
-     */
-    private AttributeContextMutator mutator = null;
-
-    /**
-     * The servlet context.
-     */
-    private ServletContext servletContext;
-
-    /** {@inheritDoc} */
-    public void init(FilterConfig config) throws ServletException {
-        filterConfig = config;
-        servletContext = filterConfig.getServletContext();
-
-        containerKey = filterConfig
-                .getInitParameter(CONTAINER_KEY_INIT_PARAMETER);
-
-        String temp = config.getInitParameter("attribute-name");
-        if (temp != null) {
-            definitionAttributeName = temp;
-        }
-
-        temp = config.getInitParameter("definition");
-        if (temp != null) {
-            definitionName = temp;
-        }
-
-        temp = config.getInitParameter("prevent-token");
-        preventDecorationToken = "org.apache.tiles.decoration.PREVENT:"
-                + (temp == null ? definitionName : temp);
-
-        alternateDefinitions = parseAlternateDefinitions();
-
-        temp = config.getInitParameter("mutator");
-        if (temp != null) {
-            try {
-                mutator = (AttributeContextMutator) ClassUtil.instantiate(temp);
-            } catch (CannotInstantiateObjectException e) {
-                throw new ServletException("Unable to instantiate specified context mutator.", e);
-            }
-        } else {
-            mutator = new DefaultMutator();
-        }
-    }
-
-    /**
-     * Creates the alternate definitions map, to map a mask of definition names
-     * to a configured definition.
-     *
-     * @return The alternate definitions map.
-     */
-    @SuppressWarnings("unchecked")
-    protected Map<String, String> parseAlternateDefinitions() {
-        Map<String, String> map = new HashMap<String, String>();
-        Enumeration<String> e = filterConfig.getInitParameterNames();
-        while (e.hasMoreElements()) {
-            String parm = e.nextElement();
-            if (parm.startsWith("definition(") && parm.endsWith("*)")) {
-                String value = filterConfig.getInitParameter(parm);
-                String mask = parm.substring("definition(".length());
-                mask = mask.substring(0, mask.lastIndexOf("*)"));
-                map.put(mask, value);
-                log.info("Mapping all requests matching '" + mask
-                        + "*' to definition '" + value + "'");
-            }
-        }
-        return map;
-    }
-
-    /** {@inheritDoc} */
-    public void destroy() {
-        filterConfig = null;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    public void doFilter(javax.servlet.ServletRequest req, ServletResponse res, FilterChain filterChain)
-            throws IOException, ServletException {
-        // If the request contains the prevent token, we must not reapply the definition.
-        // This is used to ensure that filters mapped to wild cards do not infinately
-        // loop.
-        if (!isPreventTokenPresent(req)) {
-            ApplicationContext applicationContext = org.apache.tiles.request.servlet.ServletUtil
-                    .getApplicationContext(servletContext);
-            Request request = new ServletRequest(applicationContext,
-                    (HttpServletRequest) req, (HttpServletResponse) res);
-            TilesContainer container = TilesAccess.getContainer(applicationContext,
-                    containerKey);
-            mutator.mutate(container.getAttributeContext(request), req);
-            if (preventDecorationToken != null) {
-                req.setAttribute(preventDecorationToken, Boolean.TRUE);
-            }
-            String definitionName = getDefinitionForRequest(req);
-            container.render(definitionName, request);
-        }
-        filterChain.doFilter(req, res);
-    }
-
-    /**
-     * Returns the final definition to render for the given request.
-     *
-     * @param request The request object.
-     * @return The final definition name.
-     */
-    private String getDefinitionForRequest(javax.servlet.ServletRequest request) {
-        if (alternateDefinitions.size() < 1) {
-            return definitionName;
-        }
-        String base = getRequestBase(request);
-        for (Map.Entry<String, String> pair : alternateDefinitions.entrySet()) {
-            if (base.startsWith(pair.getKey())) {
-                return pair.getValue();
-            }
-        }
-        return definitionName;
-    }
-
-    /**
-     * Returns the request base, i.e. the the URL to calculate all the relative
-     * paths.
-     *
-     * @param request The request object to use.
-     * @return The request base.
-     */
-    private String getRequestBase(javax.servlet.ServletRequest request) {
-        // Included Path
-        String include = (String) request.getAttribute("javax.servlet.include.servlet_path");
-        if (include != null) {
-            return include;
-        }
-
-        // As opposed to includes, if a forward occurs, it will update the servletPath property
-        // and include the original as the request attribute.
-        return ((HttpServletRequest) request).getServletPath();
-    }
-
-    /**
-     * The default attribute context mutator to use.
-     */
-    class DefaultMutator implements AttributeContextMutator {
-
-        /** {@inheritDoc} */
-        public void mutate(AttributeContext ctx, javax.servlet.ServletRequest req) {
-            Attribute attr = new Attribute();
-            attr.setRenderer("template");
-            attr.setValue(getRequestBase(req));
-            ctx.putAttribute(definitionAttributeName, attr);
-        }
-    }
-
-    /**
-     * Checks if the prevent evaluation token is present.
-     *
-     * @param request The HTTP request object.
-     * @return <code>true</code> if the token is present.
-     */
-    private boolean isPreventTokenPresent(javax.servlet.ServletRequest request) {
-        return preventDecorationToken != null && request.getAttribute(preventDecorationToken) != null;
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
deleted file mode 100644
index 0e63551..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.reflect.ClassUtil;
-import org.apache.tiles.request.servlet.ServletRequest;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Tiles dispatching servlet.  Used to invoke
- * a definition directly.
- */
-public class TilesDispatchServlet extends HttpServlet {
-
-    /**
-     * Init parameter to define the key of the container to use.
-     *
-     * @since 2.1.2
-     */
-    public static final String CONTAINER_KEY_INIT_PARAMETER =
-        "org.apache.tiles.web.util.TilesDispatchServlet.CONTAINER_KEY";
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(TilesDispatchServlet.class);
-
-    /**
-     * The key under which the container is stored.
-     */
-    private String containerKey;
-
-    /**
-     * The object that will mutate the attribute context so that it uses
-     * different attributes.
-     */
-    private AttributeContextMutator mutator;
-
-
-    /** {@inheritDoc} */
-    @Override
-    public void init() throws ServletException {
-        super.init();
-
-        containerKey = getServletConfig().getInitParameter(
-                CONTAINER_KEY_INIT_PARAMETER);
-
-        String temp = getInitParameter("mutator");
-        if (temp != null) {
-            try {
-                mutator = (AttributeContextMutator) ClassUtil.instantiate(temp);
-            } catch (Exception e) {
-                throw new ServletException("Unable to instantiate specified context mutator.", e);
-            }
-        } else {
-            mutator = new DefaultMutator();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doGet(HttpServletRequest req, HttpServletResponse res) {
-
-        ApplicationContext applicationContext = org.apache.tiles.request.servlet.ServletUtil
-                .getApplicationContext(getServletContext());
-        Request request = new ServletRequest(applicationContext,
-                req, res);
-        TilesContainer container = TilesAccess.getContainer(applicationContext,
-                containerKey);
-        mutator.mutate(container.getAttributeContext(request), req);
-        String definition = getDefinitionName(req);
-        if (log.isDebugEnabled()) {
-            log.info("Dispatching to tile '" + definition + "'");
-        }
-        container.render(definition, request);
-    }
-
-    /**
-     * Returns the called definition name for the given request.
-     *
-     * @param request The request to parse.
-     * @return The definition name to render.
-     */
-    protected String getDefinitionName(HttpServletRequest request) {
-        String path = (String) request.getAttribute("javax.servlet.include.servlet_path");
-        if (path == null) {
-            path = request.getServletPath();
-        }
-
-        int start = path.startsWith("/") ? 1 : 0;
-        int end = path.endsWith(".tiles") ? path.indexOf(".tiles") : path.length();
-
-        return path.substring(start, end);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doPost(HttpServletRequest req, HttpServletResponse res) {
-        log.info("Tiles dispatch request received. Redirecting POST to GET.");
-        doGet(req, res);
-    }
-
-    /**
-     * Default no-op mutator.
-     */
-    class DefaultMutator implements AttributeContextMutator {
-
-        /** {@inheritDoc} */
-        public void mutate(AttributeContext context, javax.servlet.ServletRequest request) {
-            // noop;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/package-info.java b/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/package-info.java
deleted file mode 100644
index 4a373d9..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Utility classes to use Tiles in a servlet environment.
- */
-package org.apache.tiles.web.util;
diff --git a/TILES_3_0_X/tiles-servlet/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-servlet/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-servlet/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-servlet/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-servlet/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-servlet/src/site/site.xml b/TILES_3_0_X/tiles-servlet/src/site/site.xml
deleted file mode 100644
index 3645b30..0000000
--- a/TILES_3_0_X/tiles-servlet/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Servlet Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesInitializerServletTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesInitializerServletTest.java
deleted file mode 100644
index d2de305..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesInitializerServletTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup;
-
-import static org.easymock.classextension.EasyMock.*;
-
-import java.util.Enumeration;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-import org.apache.tiles.request.servlet.ServletApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-import org.junit.Test;
-
-/**
- * Tests {@link AbstractTilesInitializerServlet}.
- *
- * @version $Rev$ $Date$
- */
-public class AbstractTilesInitializerServletTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.web.startup.AbstractTilesInitializerServlet#init()}.
-     * @throws ServletException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testInit() throws ServletException {
-        AbstractTilesInitializerServlet servlet = createMockBuilder(AbstractTilesInitializerServlet.class).createMock();
-        TilesInitializer initializer = createMock(TilesInitializer.class);
-        ServletConfig config = createMock(ServletConfig.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        Enumeration<String> names = createMock(Enumeration.class);
-
-        expect(servlet.createTilesInitializer()).andReturn(initializer);
-        expect(config.getServletContext()).andReturn(servletContext);
-        expect(servletContext.getInitParameterNames()).andReturn(names);
-        expect(config.getInitParameterNames()).andReturn(names);
-        expect(names.hasMoreElements()).andReturn(false).times(2);
-        initializer.initialize(isA(ServletApplicationContext.class));
-        initializer.destroy();
-
-        replay(servlet, initializer, config, servletContext, names);
-        servlet.init(config);
-        servlet.destroy();
-        verify(servlet, initializer, config, servletContext, names);
-    }
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesListenerTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesListenerTest.java
deleted file mode 100644
index ca6f4ab..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/AbstractTilesListenerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-
-import org.apache.tiles.request.servlet.ServletApplicationContext;
-import org.apache.tiles.startup.TilesInitializer;
-import org.junit.Test;
-
-/**
- * Tests {@link AbstractTilesListener}.
- *
- * @version $Rev$ $Date$
- */
-public class AbstractTilesListenerTest {
-
-    /**
-     * Test method for {@link AbstractTilesListener#contextInitialized(ServletContextEvent)}.
-     */
-    @Test
-    public void testContextInitialized() {
-        AbstractTilesListener listener = createMockBuilder(AbstractTilesListener.class).createMock();
-        ServletContextEvent event = createMock(ServletContextEvent.class);
-        ServletContext servletContext = createMock(ServletContext.class);
-        TilesInitializer initializer = createMock(TilesInitializer.class);
-
-        expect(event.getServletContext()).andReturn(servletContext);
-        expect(listener.createTilesInitializer()).andReturn(initializer);
-        initializer.initialize(isA(ServletApplicationContext.class));
-        initializer.destroy();
-
-        replay(listener, event, servletContext, initializer);
-        listener.contextInitialized(event);
-        listener.contextDestroyed(event);
-        verify(listener, event, servletContext, initializer);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServletTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServletTest.java
deleted file mode 100644
index 45d4cef..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesInitializerServletTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup.simple;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.startup.DefaultTilesInitializer;
-import org.junit.Test;
-
-/**
- * Tests {@link SimpleTilesInitializerServlet}.
- *
- * @version $Rev$ $Date$
- */
-public class SimpleTilesInitializerServletTest {
-
-    /**
-     * Test method for {@link SimpleTilesInitializerServlet#createTilesInitializer()}.
-     */
-    @Test
-    public void testCreateTilesInitializer() {
-        SimpleTilesInitializerServlet servlet = new SimpleTilesInitializerServlet();
-        assertTrue(servlet.createTilesInitializer() instanceof DefaultTilesInitializer);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesListenerTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesListenerTest.java
deleted file mode 100644
index 599a77a..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/startup/simple/SimpleTilesListenerTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.startup.simple;
-
-import static org.junit.Assert.*;
-
-import org.apache.tiles.startup.DefaultTilesInitializer;
-import org.junit.Test;
-
-/**
- * Tests {@link SimpleTilesListener}.
- *
- * @version $Rev$ $Date$
- */
-public class SimpleTilesListenerTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.web.startup.simple.SimpleTilesListener#createTilesInitializer()}.
-     */
-    @Test
-    public void testCreateTilesInitializer() {
-        SimpleTilesListener servlet = new SimpleTilesListener();
-        assertTrue(servlet.createTilesInitializer() instanceof DefaultTilesInitializer);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/ServletContextAdapterTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/ServletContextAdapterTest.java
deleted file mode 100644
index d9109b8..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/ServletContextAdapterTest.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ServletContextAdapter}.
- *
- * @version $Rev$ $Date$
- */
-public class ServletContextAdapterTest {
-
-    /**
-     * The servlet configuration.
-     */
-    private ServletConfig config;
-
-    /**
-     * The servlet context.
-     */
-    private ServletContext servletContext;
-
-    /**
-     * First set of param names.
-     */
-    private Enumeration<String> names1;
-
-    /**
-     * Second set of param names.
-     */
-    private Enumeration<String> names2;
-
-    /**
-     * Sets up the test.
-     */
-    @SuppressWarnings("unchecked")
-    @Before
-    public void setUp() {
-        config = createMock(ServletConfig.class);
-        servletContext = createMock(ServletContext.class);
-        names1 = createMock(Enumeration.class);
-        names2 = createMock(Enumeration.class);
-
-        expect(config.getServletContext()).andReturn(servletContext);
-        expect(names1.hasMoreElements()).andReturn(true);
-        expect(names1.nextElement()).andReturn("one");
-        expect(names1.hasMoreElements()).andReturn(true);
-        expect(names1.nextElement()).andReturn("two");
-        expect(names1.hasMoreElements()).andReturn(false);
-        expect(names2.hasMoreElements()).andReturn(true);
-        expect(names2.nextElement()).andReturn("two");
-        expect(names2.hasMoreElements()).andReturn(true);
-        expect(names2.nextElement()).andReturn("three");
-        expect(names2.hasMoreElements()).andReturn(false);
-        expect(servletContext.getInitParameterNames()).andReturn(names1);
-        expect(servletContext.getInitParameter("one")).andReturn("value1");
-        expect(servletContext.getInitParameter("two")).andReturn("value2");
-        expect(config.getInitParameterNames()).andReturn(names2);
-        expect(config.getInitParameter("two")).andReturn("otherValue2");
-        expect(config.getInitParameter("three")).andReturn("otherValue3");
-
-        replay(names1, names2);
-    }
-
-    /**
-     * Tears down the test.
-     */
-    @After
-    public void tearDown() {
-        verify(config, servletContext, names1, names2);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getContext(java.lang.String)}.
-     */
-    @Test
-    public void testGetContext() {
-        ServletContext otherContext = createMock(ServletContext.class);
-        expect(servletContext.getContext("whatever")).andReturn(otherContext);
-
-        replay(servletContext, config, otherContext);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(otherContext, adapter.getContext("whatever"));
-        verify(otherContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getMajorVersion()}.
-     */
-    @Test
-    public void testGetMajorVersion() {
-        expect(servletContext.getMajorVersion()).andReturn(2);
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(2, adapter.getMajorVersion());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getMinorVersion()}.
-     */
-    @Test
-    public void testGetMinorVersion() {
-        expect(servletContext.getMinorVersion()).andReturn(5);
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(5, adapter.getMinorVersion());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getMimeType(java.lang.String)}.
-     */
-    @Test
-    public void testGetMimeType() {
-        expect(servletContext.getMimeType("whatever")).andReturn("mymime");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("mymime", adapter.getMimeType("whatever"));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getResourcePaths(java.lang.String)}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetResourcePaths() {
-        Set<URL> urls = createMock(Set.class);
-
-        expect(servletContext.getResourcePaths("whatever")).andReturn(urls);
-
-        replay(servletContext, config, urls);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(urls, adapter.getResourcePaths("whatever"));
-        verify(urls);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getResource(java.lang.String)}.
-     * @throws MalformedURLException If something goes wrong.
-     */
-    @Test
-    public void testGetResource() throws MalformedURLException {
-        URL url = new URL("file:///temporary");
-
-        expect(servletContext.getResource("whatever")).andReturn(url);
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(url, adapter.getResource("whatever"));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getResourceAsStream(java.lang.String)}.
-     */
-    @Test
-    public void testGetResourceAsStream() {
-        InputStream is = createMock(InputStream.class);
-
-        expect(servletContext.getResourceAsStream("whatever")).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getResourceAsStream("whatever"));
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getRequestDispatcher(java.lang.String)}.
-     */
-    @Test
-    public void testGetRequestDispatcher() {
-        RequestDispatcher is = createMock(RequestDispatcher.class);
-
-        expect(servletContext.getRequestDispatcher("whatever")).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getRequestDispatcher("whatever"));
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getNamedDispatcher(java.lang.String)}.
-     */
-    @Test
-    public void testGetNamedDispatcher() {
-        RequestDispatcher is = createMock(RequestDispatcher.class);
-
-        expect(servletContext.getNamedDispatcher("whatever")).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getNamedDispatcher("whatever"));
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getServlet(java.lang.String)}.
-     * @throws ServletException If something goes wrong.
-     */
-    @SuppressWarnings("deprecation")
-    @Test
-    public void testGetServlet() throws ServletException {
-        Servlet is = createMock(Servlet.class);
-
-        expect(servletContext.getServlet("whatever")).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getServlet("whatever"));
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getServlets()}.
-     */
-    @SuppressWarnings({ "deprecation", "unchecked" })
-    @Test
-    public void testGetServlets() {
-        Enumeration<Servlet> is = createMock(Enumeration.class);
-
-        expect(servletContext.getServlets()).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getServlets());
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getServletNames()}.
-     */
-    @SuppressWarnings({ "deprecation", "unchecked" })
-    @Test
-    public void testGetServletNames() {
-        Enumeration<String> is = createMock(Enumeration.class);
-
-        expect(servletContext.getServletNames()).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getServletNames());
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#log(java.lang.String)}.
-     */
-    @Test
-    public void testLogString() {
-        servletContext.log("whatever");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        adapter.log("whatever");
-    }
-
-    /**
-     * Test method for {@link ServletContextAdapter#log(java.lang.Exception, java.lang.String)}.
-     */
-    @SuppressWarnings("deprecation")
-    @Test
-    public void testLogExceptionString() {
-        Exception e = new Exception("It does not matter");
-        servletContext.log(e, "whatever");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        adapter.log(e, "whatever");
-    }
-
-    /**
-     * Test method for {@link ServletContextAdapter#log(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testLogStringThrowable() {
-        Throwable e = new Throwable("It does not matter");
-        servletContext.log("whatever", e);
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        adapter.log("whatever", e);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getRealPath(java.lang.String)}.
-     */
-    @Test
-    public void testGetRealPath() {
-        expect(servletContext.getRealPath("whatever")).andReturn("mypath");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("mypath", adapter.getRealPath("whatever"));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getServerInfo()}.
-     */
-    @Test
-    public void testGetServerInfo() {
-        expect(servletContext.getServerInfo()).andReturn("info");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("info", adapter.getServerInfo());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getInitParameter(java.lang.String)}.
-     */
-    @Test
-    public void testGetInitParameter() {
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("value1", adapter.getInitParameter("one"));
-        assertEquals("otherValue2", adapter.getInitParameter("two"));
-        assertEquals("otherValue3", adapter.getInitParameter("three"));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getInitParameterNames()}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetInitParameterNames() {
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        Set<String> names = new HashSet<String>();
-        names.add("one");
-        names.add("two");
-        names.add("three");
-        for (Enumeration<String> enumeration = adapter.getInitParameterNames(); enumeration.hasMoreElements();) {
-            String name = enumeration.nextElement();
-            assertTrue(names.remove(name));
-        }
-        assertTrue(names.isEmpty());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getAttribute(java.lang.String)}.
-     */
-    @Test
-    public void testGetAttribute() {
-        expect(servletContext.getAttribute("whatever")).andReturn("value");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("value", adapter.getAttribute("whatever"));
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getAttributeNames()}.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testGetAttributeNames() {
-        Enumeration<String> is = createMock(Enumeration.class);
-
-        expect(servletContext.getAttributeNames()).andReturn(is);
-
-        replay(servletContext, config, is);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals(is, adapter.getAttributeNames());
-        verify(is);
-    }
-
-    /**
-     * Test method for {@link ServletContextAdapter#setAttribute(java.lang.String, java.lang.Object)}.
-     */
-    @Test
-    public void testSetAttribute() {
-        servletContext.setAttribute("whatever", "value");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        adapter.setAttribute("whatever", "value");
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#removeAttribute(java.lang.String)}.
-     */
-    @Test
-    public void testRemoveAttribute() {
-        servletContext.removeAttribute("whatever");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        adapter.removeAttribute("whatever");
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getServletContextName()}.
-     */
-    @Test
-    public void testGetServletContextName() {
-        expect(servletContext.getServletContextName()).andReturn("value");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("value", adapter.getServletContextName());
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.web.util.ServletContextAdapter#getContextPath()}.
-     */
-    @Test
-    public void testGetContextPath() {
-        expect(servletContext.getContextPath()).andReturn("value");
-
-        replay(servletContext, config);
-        ServletContextAdapter adapter = new ServletContextAdapter(config);
-        assertEquals("value", adapter.getContextPath());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/TilesDecorationFilterTest.java b/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/TilesDecorationFilterTest.java
deleted file mode 100644
index 6b1e411..0000000
--- a/TILES_3_0_X/tiles-servlet/src/test/java/org/apache/tiles/web/util/TilesDecorationFilterTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.web.util;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.io.IOException;
-import java.util.Enumeration;
-import java.util.Map;
-
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.servlet.ServletRequest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link TilesDecorationFilter}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesDecorationFilterTest {
-
-    /**
-     * The filter configuration.
-     */
-    private FilterConfig config;
-
-    /**
-     * The servlet context.
-     */
-    private ServletContext servletContext;
-
-    /**
-     * The filter to test.
-     */
-    private TilesDecorationFilter filter;
-
-    /**
-     * Sets up the test.
-     * @throws ServletException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Before
-    public void setUp() throws ServletException {
-        config = createMock(FilterConfig.class);
-        servletContext = createMock(ServletContext.class);
-        Enumeration<String> names = createMock(Enumeration.class);
-
-        expect(config.getServletContext()).andReturn(servletContext);
-        expect(config.getInitParameter(TilesDecorationFilter.CONTAINER_KEY_INIT_PARAMETER)).andReturn("key");
-        expect(config.getInitParameter("attribute-name")).andReturn("attributeKey");
-        expect(config.getInitParameter("definition")).andReturn("definitionKey");
-        expect(config.getInitParameter("prevent-token")).andReturn("tokenKey");
-        expect(names.hasMoreElements()).andReturn(true);
-        expect(names.nextElement()).andReturn("definition(hello*)");
-        expect(names.hasMoreElements()).andReturn(false);
-        expect(config.getInitParameterNames()).andReturn(names);
-        expect(config.getInitParameter("definition(hello*)")).andReturn("alternateDef");
-        expect(config.getInitParameter("mutator")).andReturn(CustomAttributeMutator.class.getName());
-
-        replay(config, names);
-        filter = new TilesDecorationFilter();
-        filter.init(config);
-        verify(names);
-    }
-
-    /**
-     * Tears down the test.
-     */
-    @After
-    public void tearDown() {
-        verify(config, servletContext);
-    }
-
-    /**
-     * Test method for {@link TilesDecorationFilter#doFilter(ServletRequest, ServletResponse, FilterChain)}.
-     * @throws ServletException If something goes wrong
-     * @throws IOException If something goes wrong.
-     */
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testDoFilter() throws IOException, ServletException {
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        FilterChain chain = createMock(FilterChain.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> applicationScope = createMock(Map.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(request.getAttribute("org.apache.tiles.decoration.PREVENT:tokenKey")).andReturn(null);
-        expect(servletContext.getAttribute(ApplicationAccess.APPLICATION_CONTEXT_ATTRIBUTE))
-                .andReturn(applicationContext);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope);
-        expect(applicationScope.get("key")).andReturn(container);
-        expect(container.getAttributeContext(isA(ServletRequest.class))).andReturn(attributeContext);
-        request.setAttribute("org.apache.tiles.decoration.PREVENT:tokenKey", true);
-        expect(request.getAttribute("javax.servlet.include.servlet_path")).andReturn(null);
-        expect(request.getServletPath()).andReturn("/tiles");
-        container.render(eq("definitionKey"), isA(ServletRequest.class));
-        chain.doFilter(request, response);
-
-        replay(servletContext, request, response, chain, applicationContext,
-                applicationScope, container, attributeContext);
-        filter.doFilter(request, response, chain);
-        verify(request, response, chain, applicationContext, applicationScope, container, attributeContext);
-    }
-
-    /**
-     * Internal mutator for testing.
-     *
-     */
-    public static class CustomAttributeMutator implements AttributeContextMutator {
-
-        @Override
-        public void mutate(AttributeContext context,
-                javax.servlet.ServletRequest request) {
-            // Does nothing.
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/pom.xml b/TILES_3_0_X/tiles-template/pom.xml
deleted file mode 100644
index 5150e4f..0000000
--- a/TILES_3_0_X/tiles-template/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache.tiles</groupId>
-  <artifactId>tiles-template</artifactId>
-  <name>Tiles - Template Technologies Support</name>
-  <description>Common code for integration of Tiles for different templating technologies.</description>
-  <parent>
-    <artifactId>tiles-parent</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.tiles.autotag.plugin</groupId>
-        <artifactId>maven-autotag-plugin</artifactId>
-        <version>${tiles.autotag.version}</version>
-        <executions>
-            <execution>
-                <goals>
-                    <goal>create-descriptor</goal>
-                </goals>
-                <configuration>
-                    <name>tiles</name>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-api</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-autotag-core-runtime</artifactId>
-        <version>${tiles.autotag.version}</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java
deleted file mode 100644
index 7fc3a65..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddAttributeModel.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Expression;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Add an element to the surrounding list. Equivalent to 'putAttribute',
- * but for list element.</strong>
- * </p>
- *
- * <p>
- * Add an element to the surrounding list. This tag can only be used inside
- * 'putListAttribute' or 'addListAttribute' tags. Value can come from a direct
- * assignment (value="aValue")
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class AddAttributeModel {
-
-    /**
-     * Executes the operation.
-     * @param value The value of the attribute. Use this parameter, or
-     * expression, or body.
-     * @param expression The expression to calculate the value from. Use this
-     * parameter, or value, or body.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param type The type (renderer) of the attribute.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If the body cannot be correctly evaluated.
-     * @since 2.2.0
-     */
-    public void execute(Object value, String expression, String role,
-            String type, Request request, ModelBody modelBody)
-            throws IOException {
-        Attribute attribute = new Attribute();
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        composeStack.push(attribute);
-        String body = modelBody.evaluateAsString();
-        attribute = (Attribute) composeStack.pop();
-        addAttributeToList(attribute, composeStack, value, expression, body,
-                role, type);
-    }
-
-    /**
-     * Adds the attribute to the containing list attribute.
-     *
-     * @param attribute The attribute to add to the list attribute.
-     * @param composeStack The composing stack.
-     * @param value The value of the attribute. Use this parameter, or
-     * expression, or body.
-     * @param expression The expression to calculate the value from. Use this
-     * parameter, or value, or body.
-     * @param body The body of the tag. Use this parameter, or value, or
-     * expression.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param type The type (renderer) of the attribute.
-     * @since 2.2.0
-     */
-    private void addAttributeToList(Attribute attribute,
-            Deque<Object> composeStack, Object value, String expression,
-            String body, String role, String type) {
-        ListAttribute listAttribute = (ListAttribute) ComposeStackUtil
-                .findAncestorWithClass(composeStack, ListAttribute.class);
-
-        if (listAttribute == null) {
-            throw new NullPointerException("There is no ListAttribute in the stack");
-        }
-        if (value != null) {
-            attribute.setValue(value);
-        } else if (attribute.getValue() == null && body != null) {
-            attribute.setValue(body);
-        }
-        if (expression != null) {
-            attribute.setExpressionObject(Expression
-                    .createExpressionFromDescribedExpression(expression));
-        }
-        if (role != null) {
-            attribute.setRole(role);
-        }
-        if (type != null) {
-            attribute.setRenderer(type);
-        }
-        listAttribute.add(attribute);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddListAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddListAttributeModel.java
deleted file mode 100644
index 12cb1be..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AddListAttributeModel.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Declare a list that will be pass as an attribute. </strong>
- * </p>
- * <p>
- * Declare a list that will be pass as an attribute . List elements are added
- * using the tag 'addAttribute' or 'addListAttribute'. This tag can only be used
- * inside 'insertTemplate', 'insertDefinition' or 'definition' tag.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class AddListAttributeModel {
-
-    /**
-     * Executes the model.
-     *
-     * @param role The comma-separated list of roles that can use the list attribute.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If the body cannot be evaluated.
-     */
-    public void execute(String role, Request request, ModelBody modelBody) throws IOException {
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        ListAttribute listAttribute = new ListAttribute();
-        listAttribute.setRole(role);
-        composeStack.push(listAttribute);
-        modelBody.evaluateWithoutWriting();
-        listAttribute = (ListAttribute) composeStack.pop();
-        ListAttribute parent = (ListAttribute) composeStack.peek();
-        parent.add(listAttribute);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AttributeResolver.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AttributeResolver.java
deleted file mode 100644
index 3815ddc..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/AttributeResolver.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-
-/**
- * Resolves an attribute, depending on the given parameters.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public interface AttributeResolver {
-
-    /**
-     * Computes the attribute.
-     *
-     * @param container The Tiles container to use.
-     * @param attribute The attribute to return immediately, if not null.
-     * @param name The name of the attribute.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param ignore If <code>true</code> if the computed attribute is null, this problem will be ignored.
-     * @param defaultValue The default value of the attribute. To use only if the attribute was not computed.
-     * @param defaultValueRole The default comma-separated list of roles. To use only if the attribute was not computed.
-     * @param defaultValueType The default type of the attribute. To use only if the attribute was not computed.
-     * @param request TODO
-     * @return The computed attribute.
-     * @since 2.2.0
-     */
-    Attribute computeAttribute(TilesContainer container, Attribute attribute,
-            String name, String role, boolean ignore,
-            Object defaultValue, String defaultValueRole, String defaultValueType, Request request);
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ComposeStackUtil.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ComposeStackUtil.java
deleted file mode 100644
index 00e472c..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ComposeStackUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-
-/**
- * Utilities to work with compose stacks.
- *
- * @version $Rev$ $Date$
- * @since 3.0.0
- */
-public final class ComposeStackUtil {
-
-    /**
-     * The name of the attribute that holds the compose stack.
-     */
-    public static final String COMPOSE_STACK_ATTRIBUTE_NAME = "org.apache.tiles.template.COMPOSE_STACK";
-
-    /**
-     * Private constructor to avoid instantiation.
-     */
-    private ComposeStackUtil() {
-
-    }
-
-    /**
-     * Finds the first ancestor in the stack, that is assignable to the given class.
-     *
-     * @param composeStack The compose stack to evaluate.
-     * @param clazz The class to check.
-     * @return The first ancestor that is assignable to the class, or null if not found.
-     * @since 3.0.0
-     */
-    public static Object findAncestorWithClass(Deque<Object> composeStack, Class<?> clazz) {
-        for (Object obj : composeStack) {
-            if (clazz.isAssignableFrom(obj.getClass())) {
-                return obj;
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns the current compose stack, or creates a new one if not present.
-     *
-     * @param request The request.
-     * @return The compose stack.
-     * @since 3.0.0
-     */
-    @SuppressWarnings("unchecked")
-    public static Deque<Object> getComposeStack(Request request) {
-        Map<String, Object> requestScope = request.getContext("request");
-        Deque<Object> composeStack = (Deque<Object>) requestScope
-                .get(COMPOSE_STACK_ATTRIBUTE_NAME);
-        if (composeStack == null) {
-            composeStack = new LinkedList<Object>();
-            requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        }
-        return composeStack;
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefaultAttributeResolver.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefaultAttributeResolver.java
deleted file mode 100644
index c35ca59..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefaultAttributeResolver.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Expression;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-
-/**
- * The default implementation of AttributeResolver.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class DefaultAttributeResolver implements AttributeResolver {
-
-    /** {@inheritDoc} */
-    public Attribute computeAttribute(TilesContainer container, Attribute attribute,
-            String name, String role, boolean ignore,
-            Object defaultValue, String defaultValueRole, String defaultValueType, Request request) {
-        if (attribute == null) {
-            AttributeContext evaluatingContext = container
-                    .getAttributeContext(request);
-            attribute = evaluatingContext.getAttribute(name);
-            if (attribute == null) {
-                attribute = computeDefaultAttribute(defaultValue,
-                        defaultValueRole, defaultValueType);
-                if (attribute == null && !ignore) {
-                    throw new NoSuchAttributeException("Attribute '" + name
-                            + "' not found.");
-                }
-            }
-        }
-        if (attribute != null && role != null && !"".equals(role.trim())) {
-            attribute = new Attribute(attribute);
-            attribute.setRole(role);
-        }
-        return attribute;
-    }
-
-    /**
-     * Computes the default attribute.
-     *
-     * @param defaultValue The default value of the attribute.
-     * @param defaultValueRole The default role of tha attribute.
-     * @param defaultValueType The default type of the attribute.
-     * @return The default attribute.
-     */
-    private Attribute computeDefaultAttribute(Object defaultValue,
-            String defaultValueRole, String defaultValueType) {
-        Attribute attribute = null;
-        if (defaultValue != null) {
-            if (defaultValue instanceof Attribute) {
-                attribute = (Attribute) defaultValue;
-            } else if (defaultValue instanceof String) {
-                attribute = new Attribute(defaultValue, (Expression) null,
-                        defaultValueRole, defaultValueType);
-            }
-        }
-        return attribute;
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefinitionModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefinitionModel.java
deleted file mode 100644
index 0953dbc..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/DefinitionModel.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.mgmt.MutableTilesContainer;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Create a definition at runtime. </strong>
- * </p>
- * <p>
- * Create a new definition at runtime. Newly created definition will be
- * available across the entire request.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class DefinitionModel {
-
-    /**
-     * Executes the operation.
-     *
-     * @param name The name of the definition to create. If not specified, an
-     * anonymous definition will be created.
-     * @param template The template of this definition.
-     * @param role A comma-separated list of roles. If present, the definition
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param extendsParam The definition name that this definition extends.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If something goes wrong.
-     * @since 2.2.0
-     */
-    public void execute(String name, String template, String role,
-            @Parameter(name = "extends") String extendsParam, String preparer,
-            Request request, ModelBody modelBody) throws IOException {
-        Deque<Object> composeStack = ComposeStackUtil
-                .getComposeStack(request);
-        Definition definition = createDefinition(name, template, role,
-                extendsParam, preparer);
-        composeStack.push(definition);
-        modelBody.evaluateWithoutWriting();
-        MutableTilesContainer container = (MutableTilesContainer) TilesAccess
-                .getCurrentContainer(request);
-        definition = (Definition) composeStack.pop();
-        registerDefinition(definition, container, composeStack, request);
-    }
-
-    /**
-     * Creates the definition to store.
-     *
-     * @param name The name of the definition to create. If not specified, an
-     * anonymous definition will be created.
-     * @param template The template of this definition.
-     * @param role A comma-separated list of roles. If present, the definition
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param extendsParam The definition name that this definition extends.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered.
-     * @return The created definition.
-     */
-    private Definition createDefinition(String name, String template,
-            String role, String extendsParam, String preparer) {
-        Definition definition = new Definition();
-        definition.setName(name);
-        Attribute templateAttribute = Attribute
-                .createTemplateAttribute(template);
-        templateAttribute.setRole(role);
-        definition.setTemplateAttribute(templateAttribute);
-        definition.setExtends(extendsParam);
-        definition.setPreparer(preparer);
-        return definition;
-    }
-
-    /**
-     * Registers a definition in the container.
-     *
-     * @param definition The definition to register.
-     * @param container The container into which the definition will be
-     * registered.
-     * @param composeStack The compose stack,
-     * @param request The request.
-     */
-    private void registerDefinition(Definition definition,
-            MutableTilesContainer container, Deque<Object> composeStack,
-            Request request) {
-        container.register(definition, request);
-
-        if (composeStack.isEmpty()) {
-            return;
-        }
-
-        Object obj = composeStack.peek();
-        if (obj instanceof Attribute) {
-            Attribute attribute = (Attribute) obj;
-            attribute.setValue(definition.getName());
-            if (attribute.getRenderer() == null) {
-                attribute.setRenderer("definition");
-            }
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/GetAsStringModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/GetAsStringModel.java
deleted file mode 100644
index aae0538..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/GetAsStringModel.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Deque;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.request.Request;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * <strong> Render the value of the specified template attribute to the current
- * Writer</strong>
- * </p>
- *
- * <p>
- * Retrieve the value of the specified template attribute property, and render
- * it to the current Writer as a String. The usual toString() conversions is
- * applied on found value.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class GetAsStringModel {
-
-    /**
-     * The logging object.
-     */
-    private Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * The attribute resolver to use.
-     */
-    private AttributeResolver attributeResolver;
-
-    /**
-     * Constructor that uses the defaut attribute resolver.
-     *
-     * @since 3.0.0
-     */
-    public GetAsStringModel() {
-        this(new DefaultAttributeResolver());
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param attributeResolver The attribute resolver to use.
-     * @since 2.2.0
-     */
-    public GetAsStringModel(AttributeResolver attributeResolver) {
-        this.attributeResolver = attributeResolver;
-    }
-
-    /**
-     * Executes the operation.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param preparer The preparer to invoke before rendering the attribute.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param defaultValue The default value of the attribute. To use only if
-     * the attribute was not computed.
-     * @param defaultValueRole The default comma-separated list of roles. To use
-     * only if the attribute was not computed.
-     * @param defaultValueType The default type of the attribute. To use only if
-     * the attribute was not computed.
-     * @param name The name of the attribute.
-     * @param value The attribute to use immediately, if not null.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If an I/O error happens during rendering.
-     * @since 2.2.0
-     */
-    public void execute(boolean ignore, String preparer, String role,
-            Object defaultValue, String defaultValueRole,
-            String defaultValueType, @Parameter(required = true) String name,
-            Attribute value, Request request, ModelBody modelBody)
-            throws IOException {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        Attribute attribute = resolveAttribute(container, ignore, preparer,
-                role, defaultValue, defaultValueRole, defaultValueType, name,
-                value, request);
-        if (attribute != null) {
-            composeStack.push(attribute);
-        }
-        modelBody.evaluateWithoutWriting();
-        container = TilesAccess.getCurrentContainer(request);
-        Writer writer = request.getWriter();
-        if (attribute != null) {
-            attribute = (Attribute) composeStack.pop();
-        }
-        renderAttribute(attribute, container, writer, ignore, request);
-    }
-
-    /**
-     * Resolves the attribute. and starts the context.
-     *
-     * @param container The Tiles container to use.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param preparer The preparer to invoke before rendering the attribute.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param defaultValue The default value of the attribute. To use only if
-     * the attribute was not computed.
-     * @param defaultValueRole The default comma-separated list of roles. To use
-     * only if the attribute was not computed.
-     * @param defaultValueType The default type of the attribute. To use only if
-     * the attribute was not computed.
-     * @param name The name of the attribute.
-     * @param value The attribute to use immediately, if not null.
-     * @param request The request.
-     * @return The resolved attribute.
-     */
-    private Attribute resolveAttribute(TilesContainer container,
-            boolean ignore, String preparer, String role, Object defaultValue,
-            String defaultValueRole, String defaultValueType, String name,
-            Attribute value, Request request) {
-        if (preparer != null) {
-            container.prepare(preparer, request);
-        }
-        Attribute attribute = attributeResolver.computeAttribute(container,
-                value, name, role, ignore, defaultValue, defaultValueRole,
-                defaultValueType, request);
-        container.startContext(request);
-        return attribute;
-    }
-
-    /**
-     * Renders the attribute as a string.
-     *
-     * @param attribute The attribute to use, previously resolved.
-     * @param container The Tiles container to use.
-     * @param writer The writer into which the attribute will be written.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param request The request.
-     * @throws IOException If an I/O error happens during rendering.
-     */
-    private void renderAttribute(Attribute attribute, TilesContainer container,
-            Writer writer, boolean ignore, Request request)
-            throws IOException {
-        try {
-            if (attribute == null && ignore) {
-                return;
-            }
-            writer.write(attribute.getValue().toString());
-        } catch (IOException e) {
-            if (!ignore) {
-                throw e;
-            } else if (log.isDebugEnabled()) {
-                log.debug("Ignoring exception", e);
-            }
-        } catch (RuntimeException e) {
-            if (!ignore) {
-                throw e;
-            } else if (log.isDebugEnabled()) {
-                log.debug("Ignoring exception", e);
-            }
-        } finally {
-            container.endContext(request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java
deleted file mode 100644
index eec6405..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/ImportAttributeModel.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.Request;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * <strong>Import attribute(s) in specified context.</strong>
- * </p>
- * <p>
- * Import attribute(s) to requested scope. Attribute name and scope are
- * optional. If not specified, all attributes are imported in page scope. Once
- * imported, an attribute can be used as any other beans from jsp contexts.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class ImportAttributeModel {
-
-    /**
-     * The logging object.
-     */
-    private Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Executes the model.
-     *
-     * @param name The name of the attribute to import. If it is
-     * <code>null</code>, all the attributes will be imported.
-     * @param scope The scope into which the attribute(s) will be imported. If
-     * <code>null</code>, the import will go in page scope.
-     * @param toName The name of the attribute into which the attribute will be
-     * imported. To be used in conjunction to <code>name</code>. If
-     * <code>null</code>, the value of <code>name</code> will be used.
-     * @param ignore If <code>true</code>, if the attribute is not present, the
-     * problem will be ignored.
-     * @param request The request.
-     */
-    public void execute(String name, String scope, String toName, boolean ignore, Request request) {
-        Map<String, Object> attributes = getImportedAttributes(
-                name, toName, ignore, request);
-        if (scope == null) {
-            scope = request.getAvailableScopes().get(0);
-        }
-        request.getContext(scope).putAll(attributes);
-    }
-
-    /**
-     * Retuns a Map that contains the attributes to be imported. The importing
-     * code must be done by the caller.
-     * @param name The attribute to import. If null, all the attributes will be
-     * imported.
-     * @param toName The destination name of the attribute to import. Valid only
-     * if <code>name</code> is specified.
-     * @param ignore If <code>true</code> and the attribute is not found, or an
-     * exception happens, the problem will be ignored.
-     * @param request The request.
-     *
-     * @return A Map of the attributes to be imported: the key is the name of an
-     * attribute, the value is the value of that attribute.
-     * @since 2.2.0
-     */
-    private Map<String, Object> getImportedAttributes(String name,
-            String toName, boolean ignore, Request request) {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        Map<String, Object> retValue = new HashMap<String, Object>();
-        AttributeContext attributeContext = container
-                .getAttributeContext(request);
-        // Some tags allow for unspecified attributes. This
-        // implies that the tag should use all of the attributes.
-        if (name != null) {
-            importSingleAttribute(container, attributeContext, name, toName,
-                    ignore, retValue, request);
-        } else {
-            importAttributes(attributeContext.getCascadedAttributeNames(),
-                    container, attributeContext, retValue, ignore, request);
-            importAttributes(attributeContext.getLocalAttributeNames(),
-                    container, attributeContext, retValue, ignore, request);
-        }
-        return retValue;
-    }
-
-    /**
-     * Imports a single attribute.
-     *
-     * @param container The Tiles container to use.
-     * @param attributeContext The context from which the attributes will be
-     * got.
-     * @param name The name of the attribute.
-     * @param toName The name of the destination attribute. If null,
-     * <code>name</code> will be used.
-     * @param ignore If <code>true</code> and the attribute is not found, or an
-     * exception happens, the problem will be ignored.
-     * @param attributes The map of the attributes to fill.
-     * @param request The request.
-     */
-    private void importSingleAttribute(TilesContainer container,
-            AttributeContext attributeContext, String name, String toName,
-            boolean ignore, Map<String, Object> attributes,
-            Request request) {
-        Attribute attr = attributeContext.getAttribute(name);
-        if (attr != null) {
-            try {
-                Object attributeValue = container.evaluate(attr,
-                        request);
-                if (attributeValue == null) {
-                    if (!ignore) {
-                        throw new NoSuchAttributeException(
-                                "Error importing attributes. " + "Attribute '"
-                                        + name + "' has a null value ");
-                    }
-                } else {
-                    if (toName != null) {
-                        attributes.put(toName, attributeValue);
-                    } else {
-                        attributes.put(name, attributeValue);
-                    }
-                }
-            } catch (RuntimeException e) {
-                if (!ignore) {
-                    throw e;
-                } else if (log.isDebugEnabled()) {
-                    log.debug("Ignoring Tiles Exception", e);
-                }
-            }
-        } else if (!ignore) {
-            throw new NoSuchAttributeException(
-                    "Error importing attributes. " + "Attribute '" + name
-                            + "' is null");
-        }
-    }
-
-    /**
-     * Imports all the attributes.
-     *
-     * @param names The names of the attributes to be imported.
-     * @param container The Tiles container to use.
-     * @param attributeContext The context from which the attributes will be
-     * got.
-     * @param attributes The map of the attributes to fill.
-     * @param ignore If <code>true</code> and the attribute is not found, or an
-     * exception happens, the problem will be ignored.
-     * @param request The request.
-     */
-    private void importAttributes(Collection<String> names,
-            TilesContainer container, AttributeContext attributeContext,
-            Map<String, Object> attributes, boolean ignore,
-            Request request) {
-        if (names == null || names.isEmpty()) {
-            return;
-        }
-
-        for (String name : names) {
-            if (name == null && !ignore) {
-                throw new NoSuchAttributeException(
-                        "Error importing attributes. "
-                                + "Attribute with null key found.");
-            } else if (name == null) {
-                continue;
-            }
-
-            importSingleAttribute(container, attributeContext, name, name,
-                    ignore, attributes, request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertAttributeModel.java
deleted file mode 100644
index 708e81a..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertAttributeModel.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.Request;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * <strong>Inserts the value of an attribute into the page.</strong>
- * </p>
- * <p>
- * This tag can be flexibly used to insert the value of an attribute into a
- * page. As in other usages in Tiles, every attribute can be determined to have
- * a "type", either set explicitly when it was defined, or "computed". If the
- * type is not explicit, then if the attribute value is a valid definition, it
- * will be inserted as such. Otherwise, if it begins with a "/" character, it
- * will be treated as a "template". Finally, if it has not otherwise been
- * assigned a type, it will be treated as a String and included without any
- * special handling.
- * </p>
- *
- * <p>
- * <strong>Example : </strong>
- * </p>
- *
- * <pre>
- * &lt;code&gt;
- *           &lt;tiles:insertAttribute name=&quot;body&quot; /&gt;
- *         &lt;/code&gt;
- * </pre>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class InsertAttributeModel {
-
-    /**
-     * The logging object.
-     */
-    private Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * The attribute resolver to use.
-     */
-    private AttributeResolver attributeResolver;
-
-    /**
-     * Constructor that uses the defaut attribute resolver.
-     *
-     * @since 3.0.0
-     */
-    public InsertAttributeModel() {
-        this(new DefaultAttributeResolver());
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param attributeResolver The attribute resolver to use.
-     * @since 2.2.0
-     */
-    public InsertAttributeModel(AttributeResolver attributeResolver) {
-        this.attributeResolver = attributeResolver;
-    }
-
-    /**
-     * Executes the operation.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param preparer The preparer to invoke before rendering the attribute.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param defaultValue The default value of the attribute. To use only if
-     * the attribute was not computed.
-     * @param defaultValueRole The default comma-separated list of roles. To use
-     * only if the attribute was not computed.
-     * @param defaultValueType The default type of the attribute. To use only if
-     * the attribute was not computed.
-     * @param name The name of the attribute.
-     * @param value The attribute to use immediately, if not null.
-     * @param flush If <code>true</code>, the response will be flushed after the insert.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If an I/O error happens during rendering.
-     * @since 2.2.0
-     */
-    public void execute(boolean ignore, String preparer,
-            String role, Object defaultValue, String defaultValueRole,
-            String defaultValueType, String name, Attribute value,
-            boolean flush, Request request, ModelBody modelBody) throws IOException {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        Attribute attribute = resolveAttribute(container, ignore, preparer,
-                role, defaultValue, defaultValueRole, defaultValueType, name,
-                value, request);
-        if (attribute != null) {
-            composeStack.push(attribute);
-        }
-        modelBody.evaluateWithoutWriting();
-        container = TilesAccess.getCurrentContainer(request);
-        if (attribute != null) {
-            attribute = (Attribute) composeStack.pop();
-        }
-        renderAttribute(container, ignore, attribute, request);
-        if (flush) {
-            request.getWriter().flush();
-        }
-    }
-
-    /**
-     * Resolves the attribute. and starts the context.
-     *
-     * @param container The Tiles container to use.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param preparer The preparer to invoke before rendering the attribute.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param defaultValue The default value of the attribute. To use only if
-     * the attribute was not computed.
-     * @param defaultValueRole The default comma-separated list of roles. To use
-     * only if the attribute was not computed.
-     * @param defaultValueType The default type of the attribute. To use only if
-     * the attribute was not computed.
-     * @param name The name of the attribute.
-     * @param value The attribute to use immediately, if not null.
-     * @param request The request.
-     * @return The resolved attribute.
-     */
-    private Attribute resolveAttribute(TilesContainer container,
-            boolean ignore, String preparer, String role, Object defaultValue,
-            String defaultValueRole, String defaultValueType, String name,
-            Attribute value, Request request) {
-        if (preparer != null) {
-            container.prepare(preparer, request);
-        }
-        Attribute attribute = attributeResolver.computeAttribute(container,
-                value, name, role, ignore, defaultValue, defaultValueRole,
-                defaultValueType, request);
-        container.startContext(request);
-        return attribute;
-    }
-
-    /**
-     * Renders the attribute as a string.
-     * @param container The Tiles container to use.
-     * @param ignore If <code>true</code>, if an exception happens during
-     * rendering, of if the attribute is null, the problem will be ignored.
-     * @param attribute The attribute to use, previously resolved.
-     * @param request The request.
-     *
-     * @throws IOException If an I/O error happens during rendering.
-     */
-    private void renderAttribute(TilesContainer container, boolean ignore,
-            Attribute attribute, Request request) throws IOException {
-        try {
-            if (attribute == null && ignore) {
-                return;
-            }
-            container.render(attribute, request);
-        } catch (IOException e) {
-            if (!ignore) {
-                throw e;
-            } else if (log.isDebugEnabled()) {
-                log.debug("Ignoring exception", e);
-            }
-        } catch (RuntimeException e) {
-            if (!ignore) {
-                throw e;
-            } else if (log.isDebugEnabled()) {
-                log.debug("Ignoring exception", e);
-            }
-        } finally {
-            container.endContext(request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertDefinitionModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertDefinitionModel.java
deleted file mode 100644
index 1797b15..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertDefinitionModel.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Insert a definition.</strong>
- * </p>
- * <p>
- * Insert a definition with the possibility to override and specify parameters
- * (called attributes). A definition can be seen as a (partially or totally)
- * filled template that can override or complete attribute values.
- * <code>&lt;tiles:insertDefinition&gt;</code> allows to define these attributes
- * and pass them to the inserted jsp page, called template. Attributes are
- * defined using nested tag <code>&lt;tiles:putAttribute&gt;</code> or
- * <code>&lt;tiles:putListAttribute&gt;</code>.
- * </p>
- * <p>
- * You must specify <code>name</code> tag attribute, for inserting a definition
- * from definitions factory.
- * </p>
- * <p>
- * <strong>Example : </strong>
- * </p>
- *
- * <pre>
- * &lt;code&gt;
- *           &lt;tiles:insertDefinition name=&quot;.my.tiles.defininition flush=&quot;true&quot;&gt;
- *              &lt;tiles:putAttribute name=&quot;title&quot; value=&quot;My first page&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;header&quot; value=&quot;/common/header.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;footer&quot; value=&quot;/common/footer.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;menu&quot; value=&quot;/basic/menu.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;body&quot; value=&quot;/basic/helloBody.jsp&quot; /&gt;
- *           &lt;/tiles:insertDefinition&gt;
- *         &lt;/code&gt;
- * </pre>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class InsertDefinitionModel {
-
-    /**
-     * Executes the operation.
-     * @param definitionName The name of the definition to render.
-     * @param template If specified, this template will be used instead of the
-     * one used by the definition.
-     * @param templateType The type of the template attribute.
-     * @param templateExpression The expression to evaluate to get the value of the template.
-     * @param role A comma-separated list of roles. If present, the definition
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered. If specified, it overrides the preparer specified in the
-     * definition itself.
-     * @param flush If <code>true</code>, the response will be flushed after the insert.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If something goes wrong.
-     * @since 2.2.0
-     */
-    public void execute(
-            @Parameter(name = "name", required = true) String definitionName,
-            String template, String templateType, String templateExpression,
-            String role, String preparer, boolean flush, Request request, ModelBody modelBody)
-            throws IOException {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        container.startContext(request);
-        modelBody.evaluateWithoutWriting();
-        container = TilesAccess.getCurrentContainer(request);
-        renderDefinition(container, definitionName, template, templateType,
-                templateExpression, role, preparer, flush, request);
-    }
-
-    /**
-     * Renders a definition.
-     *
-     * @param container The container to use.
-     * @param definitionName The name of the definition to render.
-     * @param template If specified, this template will be used instead of the
-     * one used by the definition.
-     * @param templateType The type of the template attribute.
-     * @param templateExpression The expression to evaluate to get the value of the template.
-     * @param role A comma-separated list of roles. If present, the definition
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered. If specified, it overrides the preparer specified in the
-     * definition itself.
-     * @param flush If <code>true</code>, the response will be flushed after the insert.
-     * @param request The request.
-     * @throws IOException If something goes wrong.
-     */
-    private void renderDefinition(TilesContainer container,
-            String definitionName, String template, String templateType,
-            String templateExpression, String role, String preparer,
-            boolean flush, Request request) throws IOException {
-        try {
-            AttributeContext attributeContext = container
-                    .getAttributeContext(request);
-            Attribute templateAttribute = Attribute.createTemplateAttribute(template,
-                    templateExpression, templateType, role);
-            attributeContext.setPreparer(preparer);
-            attributeContext.setTemplateAttribute(templateAttribute);
-            container.render(definitionName, request);
-            if (flush) {
-                request.getWriter().flush();
-            }
-        } finally {
-            container.endContext(request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertTemplateModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertTemplateModel.java
deleted file mode 100644
index b17ed68..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/InsertTemplateModel.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Insert a template.</strong>
- * </p>
- * <p>
- * Insert a template with the possibility to pass parameters (called
- * attributes). A template can be seen as a procedure that can take parameters
- * or attributes. <code>&lt;tiles:insertTemplate&gt;</code> allows to define
- * these attributes and pass them to the inserted jsp page, called template.
- * Attributes are defined using nested tag
- * <code>&lt;tiles:putAttribute&gt;</code> or
- * <code>&lt;tiles:putListAttribute&gt;</code>.
- * </p>
- * <p>
- * You must specify <code>template</code> attribute, for inserting a template
- * </p>
- *
- * <p>
- * <strong>Example : </strong>
- * </p>
- *
- * <pre>
- * &lt;code&gt;
- *           &lt;tiles:insertTemplate template=&quot;/basic/myLayout.jsp&quot; flush=&quot;true&quot;&gt;
- *              &lt;tiles:putAttribute name=&quot;title&quot; value=&quot;My first page&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;header&quot; value=&quot;/common/header.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;footer&quot; value=&quot;/common/footer.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;menu&quot; value=&quot;/basic/menu.jsp&quot; /&gt;
- *              &lt;tiles:putAttribute name=&quot;body&quot; value=&quot;/basic/helloBody.jsp&quot; /&gt;
- *           &lt;/tiles:insertTemplate&gt;
- *         &lt;/code&gt;
- * </pre>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class InsertTemplateModel {
-
-    /**
-     * Executes the operation.
-     * @param template The template to render.
-     * @param templateType The type of the template attribute.
-     * @param templateExpression The expression to evaluate to get the value of the template.
-     * @param role A comma-separated list of roles. If present, the template
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered. If specified, it overrides the preparer specified in the
-     * definition itself.
-     * @param flush If <code>true</code>, the response will be flushed after the insert.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If something goes wrong.
-     * @since 2.2.0
-     */
-    public void execute(@Parameter(required = true) String template,
-            String templateType, String templateExpression, String role,
-            String preparer, boolean flush, Request request, ModelBody modelBody)
-            throws IOException {
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        container.startContext(request);
-        modelBody.evaluateWithoutWriting();
-        container = TilesAccess.getCurrentContainer(request);
-        renderTemplate(container, template, templateType, templateExpression,
-                role, preparer, flush, request);
-    }
-
-    /**
-     * Renders a template.
-     *
-     * @param container The container to use.
-     * @param template The template to render.
-     * @param templateType The type of the template attribute.
-     * @param templateExpression The expression to evaluate to get the value of the template.
-     * @param role A comma-separated list of roles. If present, the template
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param preparer The preparer to use to invoke before the definition is
-     * rendered. If specified, it overrides the preparer specified in the
-     * definition itself.
-     * @param flush If <code>true</code>, the response will be flushed after the insert.
-     * @param request The request.
-     * @throws IOException If something goes wrong.
-     */
-    private void renderTemplate(TilesContainer container, String template,
-            String templateType, String templateExpression, String role,
-            String preparer, boolean flush, Request request) throws IOException {
-        try {
-            AttributeContext attributeContext = container
-                    .getAttributeContext(request);
-            Attribute templateAttribute = Attribute.createTemplateAttribute(template,
-                    templateExpression, templateType, role);
-            attributeContext.setPreparer(preparer);
-            attributeContext.setTemplateAttribute(templateAttribute);
-            container.renderContext(request);
-            if (flush) {
-                request.getWriter().flush();
-            }
-        } finally {
-            container.endContext(request);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/NoSuchAttributeException.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/NoSuchAttributeException.java
deleted file mode 100644
index b2f6e5b..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/NoSuchAttributeException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.template;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Indicates that a named attribute has not been found.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class NoSuchAttributeException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.2.0
-     */
-    public NoSuchAttributeException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @since 2.2.0
-     */
-    public NoSuchAttributeException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The exception to be wrapped.
-     * @since 2.2.0
-     */
-    public NoSuchAttributeException(Exception e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The detail message.
-     * @param e The exception to be wrapped.
-     * @since 2.2.0
-     */
-    public NoSuchAttributeException(String message, Exception e) {
-        super(message, e);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java
deleted file mode 100644
index aa6551c..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutAttributeModel.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Expression;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Put an attribute in enclosing attribute container tag.</strong>
- * </p>
- * <p>
- * Enclosing attribute container tag can be :
- * <ul>
- * <li>&lt;initContainer&gt;</li>
- * <li>&lt;definition&gt;</li>
- * <li>&lt;insertAttribute&gt;</li>
- * <li>&lt;insertDefinition&gt;</li>
- * <li>&lt;putListAttribute&gt;</li>
- * </ul>
- * (or any other tag which implements the <code>PutAttributeTagParent</code>
- * interface. Exception is thrown if no appropriate tag can be found.
- * </p>
- * <p>
- * Put tag can have following atributes :
- * <ul>
- * <li>name : Name of the attribute</li>
- * <li>value : value to put as attribute</li>
- * <li>type : value type. Possible type are : string (value is used as direct
- * string), template (value is used as a page url to insert), definition (value
- * is used as a definition name to insert), object (value is used as it is)</li>
- * <li>role : Role to check when 'insertAttribute' will be called.</li>
- * </ul>
- * </p>
- * <p>
- * Value can also come from tag body. Tag body is taken into account only if
- * value is not set by one of the tag attributes. In this case Attribute type is
- * "string", unless tag body define another type.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class PutAttributeModel {
-
-    /**
-     * Executes the operation.
-     * @param name The name of the attribute to put.
-     * @param value The value of the attribute. Use this parameter, or
-     * expression, or body.
-     * @param expression The expression to calculate the value from. Use this
-     * parameter, or value, or body.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param type The type (renderer) of the attribute.
-     * @param cascade If <code>true</code> the attribute will be cascaded to all nested attributes.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If the body cannot be evaluated.
-     * @since 2.2.0
-     */
-    public void execute(@Parameter(required = true) String name, Object value,
-            String expression, String role, String type, boolean cascade,
-            Request request, ModelBody modelBody) throws IOException {
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        Attribute attribute = new Attribute();
-        composeStack.push(attribute);
-        String currentBody = modelBody.evaluateAsString();
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        attribute = (Attribute) composeStack.pop();
-        putAttributeInParent(attribute, container, composeStack, name,
-                value, expression, currentBody, role, type, cascade, request);
-    }
-
-    /**
-     * Determines the parent and puts the attribute inside it.
-     *
-     * @param attribute The attribute to put;
-     * @param container The Tiles container to use.
-     * @param composeStack The composing stack.
-     * @param name The name of the attribute to put.
-     * @param value The value of the attribute. Use this parameter, or
-     * expression, or body.
-     * @param expression The expression to calculate the value from. Use this
-     * parameter, or value, or body.
-     * @param body The body of the tag. Use this parameter, or value, or
-     * expression.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param type The type (renderer) of the attribute.
-     * @param cascade If <code>true</code> the attribute will be cascaded to all nested attributes.
-     * @param request The request.
-     */
-    private void putAttributeInParent(Attribute attribute,
-            TilesContainer container, Deque<Object> composeStack, String name,
-            Object value, String expression, String body, String role,
-            String type, boolean cascade, Request request) {
-        AttributeContext attributeContext = null;
-        if (!composeStack.isEmpty()) {
-            Object obj = composeStack.peek();
-            if (obj instanceof AttributeContext) {
-                attributeContext = (AttributeContext) obj;
-            }
-        }
-        if (attributeContext == null) {
-            attributeContext = container.getAttributeContext(request);
-        }
-        if (value != null) {
-            attribute.setValue(value);
-        } else if (attribute.getValue() == null && body != null) {
-            attribute.setValue(body);
-        }
-        if (expression != null) {
-            attribute.setExpressionObject(Expression
-                    .createExpressionFromDescribedExpression(expression));
-        }
-        if (role != null) {
-            attribute.setRole(role);
-        }
-        if (type != null) {
-            attribute.setRenderer(type);
-        }
-
-        attributeContext.putAttribute(name, attribute, cascade);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutListAttributeModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutListAttributeModel.java
deleted file mode 100644
index 6401443..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/PutListAttributeModel.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import java.io.IOException;
-import java.util.Deque;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Definition;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.autotag.core.runtime.annotation.Parameter;
-import org.apache.tiles.request.Request;
-
-/**
- * <p>
- * <strong>Declare a list that will be pass as attribute to tile. </strong>
- * </p>
- * <p>
- * Declare a list that will be pass as attribute to tile. List elements are
- * added using the tags 'addAttribute' or 'addListAttribute'. This tag can only
- * be used inside 'insertTemplate', 'insertDefinition', 'definition' tags.
- * </p>
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class PutListAttributeModel {
-
-    /**
-     * Executes the model.
-     *
-     * @param name The name of the attribute to put.
-     * @param role A comma-separated list of roles. If present, the attribute
-     * will be rendered only if the current user belongs to one of the roles.
-     * @param inherit If <code>true</code>, the list attribute will use, as first elements, the
-     * list contained in the list attribute, put with the same name, of the containing definition.
-     * @param cascade If <code>true</code> the attribute will be cascaded to all nested attributes.
-     * @param request The request.
-     * @param modelBody The body.
-     * @throws IOException If the body cannot be evaluated.
-     */
-    public void execute(@Parameter(required = true) String name, String role,
-            boolean inherit, boolean cascade, Request request,
-            ModelBody modelBody) throws IOException {
-        Deque<Object> composeStack = ComposeStackUtil.getComposeStack(request);
-        ListAttribute listAttribute = new ListAttribute();
-        listAttribute.setRole(role);
-        listAttribute.setInherit(inherit);
-        composeStack.push(listAttribute);
-        modelBody.evaluateWithoutWriting();
-        TilesContainer container = TilesAccess.getCurrentContainer(request);
-        listAttribute = (ListAttribute) composeStack.pop();
-        AttributeContext attributeContext = null;
-        if (!composeStack.isEmpty()) {
-            Object obj = composeStack.peek();
-            if (obj instanceof Definition) {
-                attributeContext = (AttributeContext) obj;
-            }
-        }
-        if (attributeContext == null) {
-            attributeContext = container.getAttributeContext(request);
-        }
-        attributeContext.putAttribute(name, listAttribute, cascade);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/SetCurrentContainerModel.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/SetCurrentContainerModel.java
deleted file mode 100644
index 5f7b014..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/SetCurrentContainerModel.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.template;
-
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.Request;
-
-/**
- * Selects a container to be used as the "current" container.
- *
- * @version $Rev$ $Date$
- * @since 3.0.0
- */
-public class SetCurrentContainerModel {
-
-    /**
-     * Executes the model.
-     *
-     * @param containerKey The key of the container to be used as "current". If
-     * <code>null</code>, the default one will be used.
-     * @param request The request.
-     */
-    public void execute(String containerKey, Request request) {
-        TilesAccess.setCurrentContainer(request, containerKey);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/package-info.java b/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/package-info.java
deleted file mode 100644
index 828b7ac..0000000
--- a/TILES_3_0_X/tiles-template/src/main/java/org/apache/tiles/template/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Tiles template classes, that enable to write support code for template languages (JSP, FreeMarker, Velocity).
- */
-package org.apache.tiles.template;
diff --git a/TILES_3_0_X/tiles-template/src/site/site.xml b/TILES_3_0_X/tiles-template/src/site/site.xml
deleted file mode 100644
index 5f63630..0000000
--- a/TILES_3_0_X/tiles-template/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Template Technologies Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java
deleted file mode 100644
index 17c9006..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddAttributeModelTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link AddAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class AddAttributeModelTest {
-
-    /**
-     * The model to test.
-     */
-    private AddAttributeModel model;
-
-    /** Sets up the test. */
-    @Before
-    public void setUp() {
-        model = new AddAttributeModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.AddAttributeModel
-     * #execute(java.lang.Object, java.lang.String, java.lang.String, java.lang.String,
-     * Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        Request request = createMock(Request.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        ListAttribute listAttribute = new ListAttribute();
-        Attribute attribute;
-        composeStack.push(listAttribute);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-
-        expect(request.getContext("request")).andReturn(requestScope).times(2);
-        expect(modelBody.evaluateAsString()).andReturn(null);
-        expect(modelBody.evaluateAsString()).andReturn("myBody");
-
-        replay(request, modelBody);
-        model.execute("myValue", "myExpression", "myRole", "myType",
-                request, modelBody);
-        List<Attribute> attributes = listAttribute.getValue();
-        assertEquals(1, attributes.size());
-        attribute = attributes.iterator().next();
-        assertEquals("myValue", attribute.getValue());
-        assertEquals("myExpression", attribute.getExpressionObject().getExpression());
-        assertEquals("myRole", attribute.getRole());
-        assertEquals("myType", attribute.getRenderer());
-
-        composeStack.clear();
-        listAttribute = new ListAttribute();
-        attribute = new Attribute();
-        composeStack.push(listAttribute);
-        composeStack.push(attribute);
-
-        model.execute(null, "myExpression", "myRole", "myType", request,
-                modelBody);
-        attributes = listAttribute.getValue();
-        assertEquals(1, attributes.size());
-        attribute = attributes.iterator().next();
-        assertEquals("myBody", attribute.getValue());
-        assertEquals("myExpression", attribute.getExpressionObject()
-                .getExpression());
-        assertEquals("myRole", attribute.getRole());
-        assertEquals("myType", attribute.getRenderer());
-        verify(request, modelBody);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddListAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddListAttributeModelTest.java
deleted file mode 100644
index a60e89e..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/AddListAttributeModelTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link AddListAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class AddListAttributeModelTest {
-
-    /**
-     * The model to test.
-     */
-    private AddListAttributeModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new AddListAttributeModel();
-    }
-
-    /**
-     * Test method for
-     * {@link AddListAttributeModel#execute(String, Request, ModelBody)}
-     * .
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        Request request = createMock(Request.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request, modelBody);
-        ListAttribute parent = new ListAttribute();
-        composeStack.push(parent);
-        model.execute("myRole", request, modelBody);
-        assertEquals(1, composeStack.size());
-        assertEquals(parent, composeStack.pop());
-        assertEquals(1, parent.getValue().size());
-        ListAttribute listAttribute = (ListAttribute) parent.getValue().get(0);
-        assertEquals("myRole", listAttribute.getRole());
-        verify(request, modelBody);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ComposeStackUtilTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ComposeStackUtilTest.java
deleted file mode 100644
index d857adc..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ComposeStackUtilTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.ArrayDeque;
-import java.util.Date;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.request.Request;
-import org.apache.tiles.template.ComposeStackUtil;
-import org.junit.Test;
-
-/**
- * Tests {@link ComposeStackUtil}.
- *
- * @version $Rev$ $Date$
- */
-public class ComposeStackUtilTest {
-
-    /**
-     * An integer value.
-     */
-    private static final int INT_VALUE = 3;
-
-    /**
-     * A long value.
-     */
-    private static final long LONG_VALUE = 2L;
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ComposeStackUtil
-     * #findAncestorWithClass(java.util.Stack, java.lang.Class)}.
-     */
-    @Test
-    public void testFindAncestorWithClass() {
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        Integer integerValue = new Integer(1);
-        Long longValue = new Long(LONG_VALUE);
-        String stringValue = "my value";
-        Integer integerValue2 = new Integer(INT_VALUE);
-        composeStack.push(integerValue);
-        composeStack.push(longValue);
-        composeStack.push(stringValue);
-        composeStack.push(integerValue2);
-        assertEquals(integerValue2, ComposeStackUtil.findAncestorWithClass(composeStack, Integer.class));
-        assertEquals(longValue, ComposeStackUtil.findAncestorWithClass(composeStack, Long.class));
-        assertEquals(stringValue, ComposeStackUtil.findAncestorWithClass(composeStack, String.class));
-        assertEquals(integerValue2, ComposeStackUtil.findAncestorWithClass(composeStack, Object.class));
-        assertNull(ComposeStackUtil.findAncestorWithClass(composeStack, Date.class));
-    }
-
-    /**
-     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testGetComposeStackNull() {
-        Request request = createMock(Request.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request);
-        assertSame(ComposeStackUtil.getComposeStack(request),
-                requestScope.get(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME));
-        verify(request);
-    }
-
-    /**
-     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testGetComposeStackNotNull() {
-        Request request = createMock(Request.class);
-        @SuppressWarnings("unchecked")
-        Deque<Object> composeStack = createMock(Deque.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request, composeStack);
-        assertSame(composeStack, ComposeStackUtil.getComposeStack(request));
-        verify(request, composeStack);
-    }
-
-    /**
-     * Tests {@link ComposeStackUtil#getComposeStack(org.apache.tiles.request.Request)}.
-     */
-    @Test
-    public void testGetComposeStackNoNull() {
-        Request request = createMock(Request.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        expect(request.getContext("request")).andReturn(requestScope);
-
-        replay(request);
-        assertSame(ComposeStackUtil.getComposeStack(request),
-                requestScope.get(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME));
-        verify(request);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefaultAttributeResolverTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefaultAttributeResolverTest.java
deleted file mode 100644
index 98ac3fe..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefaultAttributeResolverTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Expression;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link DefaultAttributeResolver}.
- *
- * @version $Rev$ $Date$
- */
-public class DefaultAttributeResolverTest {
-
-    /**
-     * The resolver to test.
-     */
-    private DefaultAttributeResolver resolver;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = new DefaultAttributeResolver();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefaultAttributeResolver
-     * #computeAttribute(org.apache.tiles.TilesContainer, org.apache.tiles.Attribute,
-     * java.lang.String, java.lang.String, boolean, java.lang.Object, java.lang.String,
-     * java.lang.String, Request)}.
-     */
-    @Test
-    public void testComputeAttributeInContext() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-        Attribute attribute = new Attribute("myValue", Expression
-                .createExpression("myExpression", null), "myRole", "myRenderer");
-
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-
-        replay(container, attributeContext, request);
-        assertEquals(attribute, resolver.computeAttribute(container, null,
-                "myName", null, false, null, null, null, request));
-        verify(container, attributeContext, request);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefaultAttributeResolver
-     * #computeAttribute(org.apache.tiles.TilesContainer, org.apache.tiles.Attribute,
-     * java.lang.String, java.lang.String, boolean, java.lang.Object, java.lang.String,
-     * java.lang.String, Request)}.
-     */
-    @Test
-    public void testComputeAttributeInCall() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        Attribute attribute = new Attribute("myValue", Expression
-                .createExpression("myExpression", null), "myRole", "myRenderer");
-
-        replay(container, request);
-        assertEquals(attribute, resolver.computeAttribute(container, attribute,
-                null, null, false, null, null, null, request));
-        verify(container, request);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefaultAttributeResolver
-     * #computeAttribute(org.apache.tiles.TilesContainer, org.apache.tiles.Attribute,
-     * java.lang.String, java.lang.String, boolean, java.lang.Object, java.lang.String,
-     * java.lang.String, Request)}.
-     */
-    @Test
-    public void testComputeAttributeDefault() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(null);
-
-        replay(container, attributeContext, request);
-        Attribute attribute = resolver.computeAttribute(container, null,
-                "myName", null, false, "defaultValue", "defaultRole",
-                "defaultType", request);
-        assertEquals("defaultValue", attribute.getValue());
-        assertEquals("defaultRole", attribute.getRole());
-        assertEquals("defaultType", attribute.getRenderer());
-        verify(container, attributeContext, request);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefaultAttributeResolver
-     * #computeAttribute(org.apache.tiles.TilesContainer, org.apache.tiles.Attribute,
-     * java.lang.String, java.lang.String, boolean, java.lang.Object, java.lang.String,
-     * java.lang.String, Request)}.
-     */
-    @Test(expected = NoSuchAttributeException.class)
-    public void testComputeAttributeException() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(null);
-
-        replay(container, attributeContext, request);
-        resolver.computeAttribute(container, null, "myName", null, false, null,
-                "defaultRole", "defaultType", request);
-        verify(container, attributeContext, request);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefaultAttributeResolver
-     * #computeAttribute(org.apache.tiles.TilesContainer, org.apache.tiles.Attribute,
-     * java.lang.String, java.lang.String, boolean, java.lang.Object, java.lang.String,
-     * java.lang.String, Request)}.
-     */
-    @Test
-    public void testComputeAttributeIgnore() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(null);
-
-        replay(container, attributeContext, request);
-        assertNull(resolver.computeAttribute(container, null, "myName", null, true, null,
-                "defaultRole", "defaultType", request));
-        verify(container, attributeContext, request);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefinitionModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefinitionModelTest.java
deleted file mode 100644
index 08d73e5..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/DefinitionModelTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.mgmt.MutableTilesContainer;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link DefinitionModel}.
- *
- * @version $Rev$ $Date$
- */
-public class DefinitionModelTest {
-
-    /**
-     * The model to test.
-     */
-    private DefinitionModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new DefinitionModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.DefinitionModel
-     * #execute(java.lang.String, java.lang.String,
-     * java.lang.String, java.lang.String, java.lang.String, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        MutableTilesContainer container = createMock(MutableTilesContainer.class);
-        Request request = createMock(Request.class);
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        Attribute attribute = new Attribute();
-        composeStack.push(attribute);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        container.register((Definition) notNull(), eq(request));
-
-        replay(container, request, modelBody, applicationContext);
-        model.execute("myName", "myTemplate", "myRole", "myExtends",
-                "myPreparer", request, modelBody);
-        assertEquals(1, composeStack.size());
-        attribute = (Attribute) composeStack.peek();
-        assertEquals("definition", attribute.getRenderer());
-        verify(container, request, modelBody, applicationContext);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/GetAsStringModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/GetAsStringModelTest.java
deleted file mode 100644
index 800af45..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/GetAsStringModelTest.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link GetAsStringModel}.
- *
- * @version $Rev$ $Date$
- */
-public class GetAsStringModelTest {
-
-    /**
-     * The mock resolver.
-     */
-    private AttributeResolver resolver;
-
-    /**
-     * The model to test.
-     */
-    private GetAsStringModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = createMock(AttributeResolver.class);
-        model = new GetAsStringModel(resolver);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.GetAsStringModel
-     * #execute(boolean, java.lang.String, java.lang.String,
-     * java.lang.Object, java.lang.String, java.lang.String, java.lang.String,
-     * org.apache.tiles.Attribute, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Attribute attribute = new Attribute("myValue");
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-        Writer writer = createMock(Writer.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(request.getWriter()).andReturn(writer);
-        container.prepare("myPreparer", request);
-        expect(resolver.computeAttribute(container, attribute, "myName", "myRole", false, "myDefaultValue",
-                "myDefaultValueRole", "myDefaultValueType", request)).andReturn(attribute);
-        expect(container.startContext(request)).andReturn(attributeContext);
-        writer.write("myValue");
-        container.endContext(request);
-
-        replay(resolver, container, writer, request, applicationContext, modelBody);
-        model.execute(false, "myPreparer", "myRole", "myDefaultValue", "myDefaultValueRole", "myDefaultValueType",
-                "myName", attribute, request, modelBody);
-        verify(resolver, container, writer, request, applicationContext, modelBody);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.GetAsStringModel
-     * #execute(boolean, java.lang.String, java.lang.String,
-     * java.lang.Object, java.lang.String, java.lang.String, java.lang.String,
-     * org.apache.tiles.Attribute, Request, ModelBody)} when ignore flag is set.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecuteIgnore() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-        Writer writer = createMock(Writer.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(request.getWriter()).andReturn(writer);
-        container.prepare("myPreparer", request);
-        expect(resolver.computeAttribute(container, null, "myName", "myRole", true, "myDefaultValue",
-                "myDefaultValueRole", "myDefaultValueType", request)).andReturn(null);
-        expect(container.startContext(request)).andReturn(attributeContext);
-        container.endContext(request);
-
-        replay(resolver, container, writer, request, applicationContext, modelBody);
-        model.execute(true, "myPreparer", "myRole", "myDefaultValue", "myDefaultValueRole", "myDefaultValueType",
-                "myName", null, request, modelBody);
-        verify(resolver, container, writer, request, applicationContext, modelBody);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ImportAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ImportAttributeModelTest.java
deleted file mode 100644
index b3a0beb..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/ImportAttributeModelTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link ImportAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class ImportAttributeModelTest {
-
-    /**
-     * The size of the attributes collection.
-     */
-    private static final int ATTRIBUTES_SIZE = 4;
-
-    /**
-     * The model to test.
-     */
-    private ImportAttributeModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new ImportAttributeModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteSingle() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        Request request = createMock(Request.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andReturn("myEvaluatedValue");
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "request", null, false, request);
-        Map<String, Object> attributes = requestScope;
-        assertEquals(2, attributes.size());
-        assertEquals("myEvaluatedValue", attributes.get("myName"));
-        verify(container, attributeContext, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteSingleToName() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andReturn("myEvaluatedValue");
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "request", "myToName", false, request);
-        Map<String, Object> attributes = requestScope;
-        assertEquals(2, attributes.size());
-        assertEquals("myEvaluatedValue", attributes.get("myToName"));
-        verify(container, attributeContext, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteAll() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute1 = new Attribute("myValue1");
-        Attribute attribute2 = new Attribute("myValue2");
-        Attribute attribute3 = new Attribute("myValue3");
-        Set<String> cascadedNames = new HashSet<String>();
-        cascadedNames.add("myName1");
-        cascadedNames.add("myName2");
-        Set<String> localNames = new HashSet<String>();
-        localNames.add("myName1");
-        localNames.add("myName3");
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getCascadedAttributeNames()).andReturn(cascadedNames);
-        expect(attributeContext.getLocalAttributeNames()).andReturn(localNames);
-        expect(attributeContext.getAttribute("myName1")).andReturn(attribute1).times(2);
-        expect(attributeContext.getAttribute("myName2")).andReturn(attribute2);
-        expect(attributeContext.getAttribute("myName3")).andReturn(attribute3);
-        expect(container.evaluate(attribute1, request)).andReturn("myEvaluatedValue1").times(2);
-        expect(container.evaluate(attribute2, request)).andReturn("myEvaluatedValue2");
-        expect(container.evaluate(attribute3, request)).andReturn("myEvaluatedValue3");
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute(null, "request", null, false, request);
-        Map<String, Object> attributes = requestScope;
-        assertEquals(ATTRIBUTES_SIZE, attributes.size());
-        assertEquals("myEvaluatedValue1", attributes.get("myName1"));
-        assertEquals("myEvaluatedValue2", attributes.get("myName2"));
-        assertEquals("myEvaluatedValue3", attributes.get("myName3"));
-        verify(container, attributeContext, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test(expected = NoSuchAttributeException.class)
-    public void testExecuteSingleNullAttributeException() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(null);
-
-        replay(container, attributeContext, request, applicationContext);
-        try {
-            model.execute("myName", "request", null, false, request);
-        } finally {
-            verify(container, attributeContext, request, applicationContext);
-        }
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test(expected = NoSuchAttributeException.class)
-    public void testExecuteSingleNullAttributeValueException() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andReturn(null);
-
-        replay(container, attributeContext, request, applicationContext);
-        try {
-            model.execute("myName", "request", null, false, request);
-        } finally {
-            verify(container, attributeContext, request, applicationContext);
-        }
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test(expected = RuntimeException.class)
-    public void testExecuteSingleRuntimeException() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andThrow(new RuntimeException());
-
-        replay(container, attributeContext, request, applicationContext);
-        try {
-            model.execute("myName", "request", null, false, request);
-        } finally {
-            verify(container, attributeContext, request, applicationContext);
-        }
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteSingleNullAttributeIgnore() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(null);
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "request", null, true, request);
-        verify(container, attributeContext, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteSingleNullAttributeValueIgnore() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andReturn(null);
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "request", null, true, request);
-        verify(container, attributeContext, request, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.ImportAttributeModel
-     * #execute(String, String, String, boolean, Request).
-     */
-    @Test
-    public void testExecuteSingleRuntimeIgnore() {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Attribute attribute = new Attribute();
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myName")).andReturn(attribute);
-        expect(container.evaluate(attribute, request)).andThrow(new RuntimeException());
-
-        replay(container, attributeContext, request, applicationContext);
-        model.execute("myName", "request", null, true, request);
-        verify(container, attributeContext, request, applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertAttributeModelTest.java
deleted file mode 100644
index 2a717f8..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertAttributeModelTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link InsertAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class InsertAttributeModelTest {
-
-    /**
-     * The mock resolver.
-     */
-    private AttributeResolver resolver;
-
-    /**
-     * The model to test.
-     */
-    private InsertAttributeModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        resolver = createMock(AttributeResolver.class);
-        model = new InsertAttributeModel(resolver);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.InsertAttributeModel
-     * #execute(boolean, String, String, Object, String, String, String,
-     * Attribute, boolean, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        Attribute attribute = new Attribute("myValue");
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-
-        container.prepare("myPreparer", request);
-        expect(resolver.computeAttribute(container, attribute, "myName", "myRole", false, "myDefaultValue",
-                "myDefaultValueRole", "myDefaultValueType", request)).andReturn(attribute);
-        expect(container.startContext(request)).andReturn(attributeContext);
-        container.endContext(request);
-        container.render(attribute, request);
-
-        replay(resolver, container, request, applicationContext, modelBody);
-        model.execute(false, "myPreparer", "myRole", "myDefaultValue", "myDefaultValueRole",
-                "myDefaultValueType", "myName", attribute, false, request, modelBody);
-        verify(resolver, container, request, applicationContext, modelBody);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.InsertAttributeModel
-     * #execute(boolean, String, String, Object, String, String, String,
-     * Attribute, boolean, Request, ModelBody)} when ignore flag is set.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecuteIgnore() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-
-        container.prepare("myPreparer", request);
-        expect(resolver.computeAttribute(container, null, "myName", "myRole", true, "myDefaultValue",
-                "myDefaultValueRole", "myDefaultValueType", request)).andReturn(null);
-        expect(container.startContext(request)).andReturn(attributeContext);
-        container.endContext(request);
-
-        replay(resolver, container, request, applicationContext, modelBody);
-        model.execute(true, "myPreparer", "myRole", "myDefaultValue", "myDefaultValueRole",
-                "myDefaultValueType", "myName", null, false, request, modelBody);
-        verify(resolver, container, request, applicationContext, modelBody);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertDefinitionModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertDefinitionModelTest.java
deleted file mode 100644
index 692b934..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertDefinitionModelTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link InsertDefinitionModel}.
- *
- * @version $Rev$ $Date$
- */
-public class InsertDefinitionModelTest {
-
-    /**
-     * The model to test.
-     */
-    private InsertDefinitionModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new InsertDefinitionModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.InsertDefinitionModel
-     * #execute(java.lang.String, java.lang.String, String,
-     * String, java.lang.String, java.lang.String, boolean, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.startContext(request)).andReturn(attributeContext);
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        container.endContext(request);
-        attributeContext.setPreparer("myPreparer");
-        attributeContext.setTemplateAttribute((Attribute) notNull());
-        container.render("myDefinitionName", request);
-
-        replay(container, attributeContext, request, applicationContext, modelBody);
-        model.execute("myDefinitionName", "myTemplate", "myTemplateType",
-                "myTemplateExpression", "myRole", "myPreparer",
-                false, request, modelBody);
-        verify(container, attributeContext, request, applicationContext, modelBody);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertTemplateModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertTemplateModelTest.java
deleted file mode 100644
index 99b4fc1..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/InsertTemplateModelTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link InsertTemplateModel}.
- *
- * @version $Rev$ $Date$
- */
-public class InsertTemplateModelTest {
-
-    /**
-     * The model to test.
-     */
-    private InsertTemplateModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new InsertTemplateModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.InsertTemplateModel
-     * #execute(String, String, String, String, String, boolean, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext).times(2);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.startContext(request)).andReturn(attributeContext);
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        container.endContext(request);
-        attributeContext.setPreparer("myPreparer");
-        attributeContext.setTemplateAttribute((Attribute) notNull());
-        container.renderContext(request);
-
-        replay(container, attributeContext, request, applicationContext, modelBody);
-        model.execute("myTemplate", "myTemplateType", "myTemplateExpression",
-                "myRole", "myPreparer", false, request, modelBody);
-        verify(container, attributeContext, request, applicationContext, modelBody);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java
deleted file mode 100644
index dafdf76..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutAttributeModelTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link PutAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class PutAttributeModelTest {
-
-    /**
-     * The model to test.
-     */
-    private PutAttributeModel model;
-
-    /** Sets up the test. */
-    @Before
-    public void setUp() {
-        model = new PutAttributeModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.PutAttributeModel
-     * #execute(String, Object, String, String, String,
-     * boolean, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecuteListAttribute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        Request request = createMock(Request.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        ListAttribute listAttribute = new ListAttribute();
-        composeStack.push(listAttribute);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        attributeContext.putAttribute(eq("myName"), (Attribute) notNull(), eq(false));
-        expect(modelBody.evaluateAsString()).andReturn(null);
-
-        replay(container, attributeContext, request, applicationContext, modelBody);
-        model.execute("myName", "myValue", "myExpression", "myRole",
-                "myType", false, request, modelBody);
-        verify(container, attributeContext, request, applicationContext, modelBody);
-    }
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutListAttributeModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutListAttributeModelTest.java
deleted file mode 100644
index c147a6b..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/PutListAttributeModelTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.easymock.classextension.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.ListAttribute;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.autotag.core.runtime.ModelBody;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link PutListAttributeModel}.
- *
- * @version $Rev$ $Date$
- */
-public class PutListAttributeModelTest {
-
-    /**
-     * The model to test.
-     */
-    private PutListAttributeModel model;
-
-    /**
-     * Sets up the test.
-     */
-    @Before
-    public void setUp() {
-        model = new PutListAttributeModel();
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.template.PutListAttributeModel
-     * #execute(String, String, boolean, boolean, Request, ModelBody)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testExecute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        Request request = createMock(Request.class);
-        Deque<Object> composeStack = new ArrayDeque<Object>();
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(ComposeStackUtil.COMPOSE_STACK_ATTRIBUTE_NAME, composeStack);
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        ModelBody modelBody = createMock(ModelBody.class);
-
-        modelBody.evaluateWithoutWriting();
-        expect(request.getApplicationContext()).andReturn(applicationContext);
-        expect(request.getContext("request")).andReturn(requestScope).anyTimes();
-        expect(container.getAttributeContext(request)).andReturn(attributeContext);
-        attributeContext.putAttribute(eq("myName"), isA(ListAttribute.class), eq(false));
-
-        replay(container, attributeContext, request, modelBody);
-        model.execute("myName", "myRole", false, false, request, modelBody);
-        assertEquals(0, composeStack.size());
-        verify(container, attributeContext, request, modelBody);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/SetCurrentContainerModelTest.java b/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/SetCurrentContainerModelTest.java
deleted file mode 100644
index efacd43..0000000
--- a/TILES_3_0_X/tiles-template/src/test/java/org/apache/tiles/template/SetCurrentContainerModelTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.template;
-
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tiles.NoSuchContainerException;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.junit.Test;
-
-/**
- * Tests {@link SetCurrentContainerModel}.
- *
- * @version $Rev$ $Date$
- */
-public class SetCurrentContainerModelTest {
-
-    /**
-     * Test method for {@link SetCurrentContainerModel#execute(String, Request)}.
-     */
-    @Test
-    public void testSetCurrentContainer() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        TilesContainer container = createMock(TilesContainer.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-        attribs.put("myKey", container);
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        expect(request.getContext("request")).andReturn(requestScope);
-        expect(request.getApplicationContext()).andReturn(context);
-        replay(request, context, container);
-        SetCurrentContainerModel model = new SetCurrentContainerModel();
-        model.execute("myKey", request);
-        assertEquals(container, requestScope.get(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME));
-        verify(request, context, container);
-    }
-
-    /**
-     * Test method for {@link SetCurrentContainerModel#execute(String, Request)}.
-     */
-    @Test(expected = NoSuchContainerException.class)
-    public void testSetCurrentContainerException() {
-        Request request = createMock(Request.class);
-        ApplicationContext context = createMock(ApplicationContext.class);
-        Map<String, Object> attribs = new HashMap<String, Object>();
-
-        expect(request.getApplicationContext()).andReturn(context);
-        expect(context.getApplicationScope()).andReturn(attribs).anyTimes();
-        replay(request, context);
-        try {
-            SetCurrentContainerModel model = new SetCurrentContainerModel();
-            model.execute("myKey", request);
-        } finally {
-            verify(request, context);
-        }
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-test-pom/pom.xml b/TILES_3_0_X/tiles-test-pom/pom.xml
deleted file mode 100644
index d35f727..0000000
--- a/TILES_3_0_X/tiles-test-pom/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>tiles-parent</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-  <artifactId>tiles-test-pom</artifactId>
-  <packaging>pom</packaging>
-  <name>Tiles test webapp module collector</name>
-  <description>Collects all the modules of the Tiles test web application.</description>
-  <modules>
-    <module>tiles-test-common</module>
-    <module>tiles-test-alt</module>
-    <module>tiles-test-db</module>
-  	<module>tiles-test</module>
-  </modules>
-</project>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/src/site/site.xml b/TILES_3_0_X/tiles-test-pom/src/site/site.xml
deleted file mode 100644
index ac9f5cc..0000000
--- a/TILES_3_0_X/tiles-test-pom/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Test Webapp Module Collector">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/pom.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/pom.xml
deleted file mode 100644
index c387670..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>tiles-test-pom</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-  <artifactId>tiles-test-alt</artifactId>
-  <name>Tiles - Test webapp alternate configuration</name>
-  <description>Alternate configuration for the test webapp.</description>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${tiles.manifestfile}</manifestFile>
-            <manifest>
-              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-            </manifest>
-            <manifestEntries>
-              <Tiles-Initializer>org.apache.tiles.test.alt.TestAlternateTilesInitializer</Tiles-Initializer>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <dependencies>
-    <dependency>
-       <groupId>org.apache.tiles</groupId>
-       <artifactId>tiles-test-common</artifactId>
-       <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <version>2.5</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesContainerFactory.java b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesContainerFactory.java
deleted file mode 100644
index b164b4d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesContainerFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.alt;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tiles.definition.dao.BaseLocaleUrlDefinitionDAO;
-import org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.test.factory.TestTilesContainerFactory;
-
-/**
- * Test alternate Tiles container factory to customize Tiles behaviour.
- *
- * @version $Rev$ $Date$
- */
-public class TestAlternateTilesContainerFactory extends TestTilesContainerFactory {
-
-    /**
-     * The number of URLs to load..
-     */
-    private static final int URL_COUNT = 3;
-
-    /** {@inheritDoc} */
-    @Override
-    protected List<ApplicationResource> getSources(ApplicationContext applicationContext) {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>(URL_COUNT);
-        urls.add(applicationContext.getResource("classpath:/org/apache/tiles/test/alt/defs/tiles-alt-defs.xml"));
-        urls.add(applicationContext.getResource("classpath:/org/apache/tiles/test/alt/defs/tiles-alt-freemarker-defs.xml"));
-        urls.add(applicationContext.getResource("classpath:/org/apache/tiles/test/alt/defs/tiles-alt-velocity-defs.xml"));
-        return urls;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected BaseLocaleUrlDefinitionDAO instantiateLocaleDefinitionDao(
-            ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        return new CachingLocaleUrlDefinitionDAO(applicationContext);
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesInitializer.java b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesInitializer.java
deleted file mode 100644
index 291b639..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/TestAlternateTilesInitializer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.alt;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.servlet.wildcard.WildcardServletApplicationContext;
-import org.apache.tiles.startup.AbstractTilesInitializer;
-
-/**
- * Test Tiles initializer for Tiles initialization of the alternate container.
- *
- * @version $Rev$ $Date$
- */
-public class TestAlternateTilesInitializer extends AbstractTilesInitializer {
-
-    /** {@inheritDoc} */
-    @Override
-    protected AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context) {
-        return new TestAlternateTilesContainerFactory();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected String getContainerKey(
-            ApplicationContext applicationContext) {
-        return "alternate";
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected ApplicationContext createTilesApplicationContext(
-            ApplicationContext preliminaryContext) {
-        return new WildcardServletApplicationContext(
-                (ServletContext) preliminaryContext.getContext());
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/package.html
deleted file mode 100644
index 1a1be20..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/java/org/apache/tiles/test/alt/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Alternate configuration for Tiles test webapp</title>
-</head>
-<body>
-An alternate configuration of the Tiles test webapp.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/META-INF/MANIFEST.MF b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/META-INF/MANIFEST.MF
deleted file mode 100644
index 2c37250..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Archiver-Version: Plexus Archiver
-Created-By: 1.6.0_16 (Sun Microsystems Inc.)
-Built-By: antonio
-Build-Jdk: 1.6.0_16
-Specification-Title: Tiles - Test webapp alternate configuration
-Specification-Version: 2.2.1-SNAPSHOT
-Specification-Vendor: Apache Software Foundation
-Implementation-Title: Tiles - Test webapp alternate configuration
-Implementation-Version: 2.2.1-SNAPSHOT
-Implementation-Vendor-Id: org.apache
-Implementation-Vendor: Apache Software Foundation
-Tiles-Initializer: org.apache.tiles.test.alt.TestAlternateTilesInitial
- izer
-Export-Package: org.apache.tiles.test.alt;version="2.2.1.SNAPSHOT"
-Tool: Bnd-0.0.311
-Bundle-Name: Tiles - Test webapp alternate configuration
-Bundle-Vendor: Apache Software Foundation
-Bundle-Version: 2.2.1.SNAPSHOT
-Bnd-LastModified: 1254151613654
-Bundle-ManifestVersion: 2
-Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
-Bundle-Description: Alternate configuration for the test webapp.
-Import-Package: org.apache.tiles,org.apache.tiles.context,org.apache.t
- iles.definition,org.apache.tiles.definition.dao,org.apache.tiles.fact
- ory,org.apache.tiles.locale,org.apache.tiles.startup,org.apache.tiles
- .test.alt;version="2.2",org.apache.tiles.test.factory
-Bundle-SymbolicName: org.apache.tiles-test-alt
-Bundle-DocURL: http://tiles.apache.org/framework/tiles-test-pom/tiles-
- test-alt
-
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-defs.xml
deleted file mode 100644
index b75fe3c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-defs.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<tiles-definitions>
-  <definition name="test.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This definition is from an alternate container."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-  <definition name="WILDCARD:test.definition*.message*" template="/layout{1}.jsp">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-  <definition name="REGEXP:test\.regexp\.definition(.*)\.message(.*)" template="/layout{1}.jsp">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-freemarker-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-freemarker-defs.xml
deleted file mode 100644
index e230658..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-freemarker-defs.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<tiles-definitions>
-  <definition name="freemarker.test.definition" template="/freemarker/layout.ftl">
-      <put-attribute name="title"  value="This definition is from an alternate container."/>
-      <put-attribute name="header" value="/freemarker/header.ftl"/>
-      <put-attribute name="body"   value="/freemarker/body.ftl"/>
-  </definition>
-  <definition name="freemarker.test.definition.alt" template="/freemarker/layout.ftl">
-      <put-attribute name="title"  value="This definition is from an alternate container."/>
-      <put-attribute name="header" value="/freemarker/header.ftl"/>
-      <put-attribute name="body"   value="/org/apache/tiles/test/alt/freemarker/body.ftl"/>
-  </definition>
-  <definition name="WILDCARD:freemarker.test.definition*.message*" template="/freemarker/layout{1}.ftl">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/freemarker/header.ftl"/>
-      <put-attribute name="body"   value="/freemarker/body.ftl"/>
-  </definition>
-  <definition name="REGEXP:freemarker\.test\.regexp\.definition(.*)\.message(.*)" template="/freemarker/layout{1}.ftl">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/freemarker/header.ftl"/>
-      <put-attribute name="body"   value="/freemarker/body.ftl"/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-velocity-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-velocity-defs.xml
deleted file mode 100644
index f26dffe..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/defs/tiles-alt-velocity-defs.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<tiles-definitions>
-  <definition name="velocity.test.definition" template="/velocity/layout.vm">
-      <put-attribute name="title"  value="This definition is from an alternate container."/>
-      <put-attribute name="header" value="/velocity/header.vm"/>
-      <put-attribute name="body"   value="/velocity/body.vm"/>
-  </definition>
-  <definition name="velocity.test.definition.alt" template="/velocity/layout.vm">
-      <put-attribute name="title"  value="This definition is from an alternate container."/>
-      <put-attribute name="header" value="/velocity/header.vm"/>
-      <put-attribute name="body"   value="/org/apache/tiles/test/alt/velocity/body.vm"/>
-  </definition>
-  <definition name="WILDCARD:velocity.test.definition*.message*" template="/velocity/layout{1}.vm">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/velocity/header.vm"/>
-      <put-attribute name="body"   value="/velocity/body.vm"/>
-  </definition>
-  <definition name="REGEXP:velocity\.test\.regexp\.definition(.*)\.message(.*)" template="/velocity/layout{1}.vm">
-      <put-attribute name="title"  value="This definition has a message: {2}."/>
-      <put-attribute name="header" value="/velocity/header.vm"/>
-      <put-attribute name="body"   value="/velocity/body.vm"/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/body.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/body.ftl
deleted file mode 100644
index 584a864..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/body.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>This body is loaded from the "alt" module.</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/testinsertdefinition_alt.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/testinsertdefinition_alt.ftl
deleted file mode 100644
index f822296..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/freemarker/testinsertdefinition_alt.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="alternate" />
-<@tiles.insertDefinition name="freemarker.test.definition.alt" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/body.vm b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/body.vm
deleted file mode 100644
index abcd51b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/body.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id: body.vm 782137 2009-06-05 21:18:52Z apetrelli $
- *
- * 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.
- *
- *#
-<div align="center"><b><i>This body is loaded from the "alt" module.</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/testinsertdefinition_alt.vm b/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/testinsertdefinition_alt.vm
deleted file mode 100644
index 648bc01..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-alt/src/main/resources/org/apache/tiles/test/alt/velocity/testinsertdefinition_alt.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id: testinsertdefinition.vm 782137 2009-06-05 21:18:52Z apetrelli $
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("alternate")
-#tiles_insertDefinition({"name" : "velocity.test.definition.alt"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-common/pom.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-common/pom.xml
deleted file mode 100644
index be9ae32..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-common/pom.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>tiles-test-pom</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-  <groupId>org.apache.tiles</groupId>
-  <artifactId>tiles-test-common</artifactId>
-  <version>3.0.1</version>
-  <name>Tiles - Test webapp common classes</name>
-  <description>Common classes between modules of the test webapp.</description>
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>tiles-extras</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/factory/TestTilesContainerFactory.java b/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/factory/TestTilesContainerFactory.java
deleted file mode 100644
index 1e057bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/factory/TestTilesContainerFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.factory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.evaluator.AttributeEvaluatorFactory;
-import org.apache.tiles.extras.complete.CompleteAutoloadTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.ApplicationResource;
-import org.apache.tiles.request.render.BasicRendererFactory;
-import org.apache.tiles.test.renderer.ReverseStringRenderer;
-
-
-/**
- * Test Tiles container factory to customize Tiles behaviour.
- *
- * @version $Rev$ $Date$
- */
-public class TestTilesContainerFactory extends CompleteAutoloadTilesContainerFactory {
-
-    /** {@inheritDoc} */
-    @Override
-    protected void registerAttributeRenderers(
-            BasicRendererFactory rendererFactory,
-            ApplicationContext applicationContext,
-            TilesContainer container,
-            AttributeEvaluatorFactory attributeEvaluatorFactory) {
-        super.registerAttributeRenderers(rendererFactory, applicationContext, container,
-                attributeEvaluatorFactory);
-        ReverseStringRenderer renderer = new ReverseStringRenderer();
-        rendererFactory.registerRenderer("reversed", renderer);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected List<ApplicationResource> getSources(ApplicationContext applicationContext) {
-        List<ApplicationResource> urls = new ArrayList<ApplicationResource>();
-        urls.addAll(applicationContext
-                .getResources("/WEB-INF/**/tiles-defs*.xml"));
-        urls.add(applicationContext.getResource(
-                "classpath:/org/apache/tiles/classpath-defs.xml"));
-        urls.add(applicationContext.getResource(
-                "classpath:/org/apache/tiles/freemarker-classpath-defs.xml"));
-        urls.add(applicationContext.getResource(
-            "classpath:/org/apache/tiles/velocity-classpath-defs.xml"));
-        return urls;
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/ReverseStringRenderer.java b/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/ReverseStringRenderer.java
deleted file mode 100644
index 67a699b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/ReverseStringRenderer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.renderer;
-
-import java.io.IOException;
-
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.render.Renderer;
-
-/**
- * A simple test <code>AttributeRenderer</code>.
- *
- * @version $Rev$ $Date$
- */
-public class ReverseStringRenderer implements Renderer {
-
-    /** {@inheritDoc} */
-    @Override
-    public void render(String value, Request request) throws IOException {
-        char[] array = value.toCharArray();
-        char[] newArray = new char[array.length];
-        for (int i = 0; i < array.length; i++) {
-            newArray[array.length - i - 1] = array[i];
-        }
-        request.getWriter().write(String.valueOf(newArray));
-    }
-
-    @Override
-    public boolean isRenderable(String path, Request request) {
-        return true;
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/package.html
deleted file mode 100644
index 810bb9b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-common/src/main/java/org/apache/tiles/test/renderer/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles renderer test package</title>
-</head>
-<body>
-Test classes to check renderer functionality.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/pom.xml b/TILES_3_0_X/tiles-test-pom/tiles-test-db/pom.xml
deleted file mode 100644
index ea0e593..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/pom.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <artifactId>tiles-test-pom</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-  <artifactId>tiles-test-db</artifactId>
-  <name>Tiles - Test webapp database configuration</name>
-  <description>Tiles configuration that uses a database.</description>
-  <dependencies>
-    <dependency>
-       <groupId>org.apache.tiles</groupId>
-       <artifactId>tiles-test-common</artifactId>
-       <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-jdbc</artifactId>
-      <version>2.5.6</version>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-jar-plugin</artifactId>
-        <configuration>
-          <archive>
-            <manifestFile>${tiles.manifestfile}</manifestFile>
-            <manifest>
-              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-            </manifest>
-            <manifestEntries>
-              <Tiles-Initializer>org.apache.tiles.test.db.TestDbTilesInitializer</Tiles-Initializer>
-            </manifestEntries>
-          </archive>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/LocaleDbDefinitionDAO.java b/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/LocaleDbDefinitionDAO.java
deleted file mode 100644
index 5ad76f4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/LocaleDbDefinitionDAO.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.db;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.Definition;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.request.locale.LocaleUtil;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.core.support.JdbcDaoSupport;
-
-/**
- * Stub definition DAO to demonstrate that Tiles definitions can be stored in a
- * Database.
- *
- * @version $Rev$ $Date$
- */
-public class LocaleDbDefinitionDAO extends JdbcDaoSupport implements
-        DefinitionDAO<Locale> {
-
-    /**
-     * Selects a customization by its name.
-     */
-    private static final String SELECT_CUSTOMIZATION_BY_NAME_SQL =
-        "select ID, PARENT_ID, NAME from CUSTOMIZATION "
-            + "where NAME = ? ";
-
-    /**
-     * Selects a customization by its Id.
-     */
-    private static final String SELECT_CUSTOMIZATION_BY_ID_SQL =
-        "select ID, PARENT_ID, NAME from CUSTOMIZATION "
-            + "where ID = ? ";
-
-    /**
-     * Selects a definition by its name and a customization Id.
-     */
-    private static final String SELECT_DEFINITION_SQL =
-        "select ID, PARENT_NAME, NAME, PREPARER, TEMPLATE from DEFINITION "
-            + "where NAME = ? and CUSTOMIZATION_ID = ? ";
-
-    /**
-     * Selects attributes of a definition, given the definition Id.
-     */
-    private static final String SELECT_ATTRIBUTES_SQL =
-        "select ID, NAME, TYPE, VALUE, CASCADE_ATTRIBUTE from ATTRIBUTE "
-            + "where DEFINITION_ID = ? ";
-
-    /**
-     * Maps a row of a {@link ResultSet} to a {@link Definition}.
-     */
-    private final DefinitionRowMapper definitionRowMapper = new DefinitionRowMapper();
-
-    /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
-    public Definition getDefinition(String name, Locale locale) {
-        List<Map<String, Object>> customizations = null;
-        Long customizationId = null, parentCustomizationId = null;
-        do {
-            customizations = getJdbcTemplate().queryForList(
-                    SELECT_CUSTOMIZATION_BY_NAME_SQL,
-                    new Object[] { locale.toString() });
-            if (!customizations.isEmpty()) {
-                Map<String, Object> customization = customizations.get(0);
-                customizationId = ((Number) customization.get("ID")).longValue();
-                parentCustomizationId = numberToLong((Number) customization.get("PARENT_ID"));
-            } else {
-                locale = LocaleUtil.getParentLocale(locale);
-            }
-        } while (customizations.isEmpty());
-
-        return getDefinition(name, customizationId, parentCustomizationId,
-                locale);
-    }
-
-    /** {@inheritDoc} */
-    public Map<String, Definition> getDefinitions(Locale locale) {
-        throw new UnsupportedOperationException(
-                "Currently the 'getDefinitions' method is not supported");
-    }
-
-    /**
-     * Loads a definition from the DB.
-     *
-     * @param name The name of the definition.
-     * @param baseCustomizationId The id of the customization item.
-     * @param baseParentCustomizationId The id of the parent customization item.
-     * @param locale The locale.
-     * @return The definition.
-     */
-    @SuppressWarnings("unchecked")
-    protected DbDefinition getDefinition(String name, Long baseCustomizationId,
-            Long baseParentCustomizationId, @SuppressWarnings("unused") Locale locale) {
-        DbDefinition definition = null;
-        Long customizationId = baseCustomizationId;
-        Long parentCustomizationId = baseParentCustomizationId;
-        List<DbDefinition> definitions = null;
-        boolean finished = false;
-        do {
-            definitions = getJdbcTemplate()
-                    .query(SELECT_DEFINITION_SQL,
-                            new Object[] { name, customizationId },
-                            definitionRowMapper);
-            if (definitions.isEmpty()) {
-                if (parentCustomizationId != null) {
-                    Map<String, Object> customization = getJdbcTemplate().queryForMap(
-                            SELECT_CUSTOMIZATION_BY_ID_SQL,
-                            new Object[] { parentCustomizationId });
-                    customizationId = ((Number) customization.get("ID")).longValue();
-                    parentCustomizationId = numberToLong((Number) customization.get("PARENT_ID"));
-                } else {
-                    finished = true;
-                }
-            } else {
-                definition = definitions.get(0);
-                finished = true;
-            }
-        } while (!finished);
-
-        if (definition != null) {
-            AttributeRowMapper attributeRowMapper = new AttributeRowMapper(definition);
-            getJdbcTemplate().query(SELECT_ATTRIBUTES_SQL,
-                    new Object[] { definition.getId() }, attributeRowMapper);
-        }
-        return definition;
-    }
-
-    /**
-     * Returns a {@link Long} object only if the number is not null.
-     *
-     * @param number The number to convert.
-     * @return The number converted into {@link Long} if not null,
-     * <code>null</code> otherwise.
-     */
-    private static Long numberToLong(Number number) {
-        Long retValue = null;
-        if (number != null) {
-            retValue = number.longValue();
-        }
-        return retValue;
-    }
-
-    /**
-     * A definition with the new property "id".
-     */
-    private static class DbDefinition extends Definition {
-
-        /**
-         * The id of the definition.
-         */
-        private Long id;
-
-        /**
-         * The default constructor.
-         */
-        public DbDefinition() {
-            super();
-        }
-
-        /**
-         * Returns the Id of the definition.
-         *
-         * @return The id.
-         */
-        public Long getId() {
-            return id;
-        }
-
-        /**
-         * Sets the id of the definition.
-         *
-         * @param id The id to set
-         */
-        public void setId(Long id) {
-            this.id = id;
-        }
-
-    }
-
-    /**
-     * Maps a row of a {@link ResultSet} to a {@link Definition}.
-     */
-    private static final class DefinitionRowMapper implements RowMapper {
-
-        /** {@inheritDoc} */
-        public Object mapRow(ResultSet rs, int row) throws SQLException {
-            DbDefinition definition = new DbDefinition();
-            definition.setId(numberToLong((Number) rs.getObject("ID")));
-            definition.setName(rs.getString("NAME"));
-            definition.setTemplateAttribute(Attribute
-                    .createTemplateAttribute(rs.getString("TEMPLATE")));
-            definition.setPreparer(rs.getString("PREPARER"));
-            definition.setExtends(rs.getString("PARENT_NAME"));
-            return definition;
-        }
-
-    }
-
-    /**
-     * Maps a row of a {@link ResultSet} to an {@link Attribute}. It stores the
-     * attributes directly in their definition.
-     */
-    private static final class AttributeRowMapper implements RowMapper {
-
-        /**
-         * The definition in which the attributes will be stored.
-         */
-        private Definition definition;
-
-        /**
-         * Constructor.
-         *
-         * @param definition The definition in which the attributes will be
-         * stored.
-         */
-        private AttributeRowMapper(Definition definition) {
-            this.definition = definition;
-        }
-
-        /** {@inheritDoc} */
-        public Object mapRow(ResultSet rs, int row) throws SQLException {
-            Attribute attribute = new Attribute();
-            attribute.setRenderer(rs.getString("TYPE"));
-            attribute.setValue(rs.getString("VALUE"));
-            definition.putAttribute(rs.getString("NAME"), attribute, rs
-                    .getBoolean("CASCADE_ATTRIBUTE"));
-            return attribute;
-        }
-
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesContainerFactory.java b/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesContainerFactory.java
deleted file mode 100644
index 6cb63c4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesContainerFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.db;
-
-import java.util.Locale;
-
-import javax.sql.DataSource;
-
-import org.apache.tiles.definition.LocaleDefinitionsFactory;
-import org.apache.tiles.definition.dao.DefinitionDAO;
-import org.apache.tiles.factory.BasicTilesContainerFactory;
-import org.apache.tiles.locale.LocaleResolver;
-import org.apache.tiles.request.ApplicationContext;
-
-
-/**
- * Test alternate Tiles container factory that uses a DB to store definitions.
- *
- * @version $Rev$ $Date$
- */
-public class TestDbTilesContainerFactory extends BasicTilesContainerFactory {
-
-    /** {@inheritDoc} */
-    @Override
-    protected DefinitionDAO<Locale> createLocaleDefinitionDao(ApplicationContext applicationContext,
-            LocaleResolver resolver) {
-        LocaleDbDefinitionDAO definitionDao = new LocaleDbDefinitionDAO();
-        definitionDao.setDataSource((DataSource) applicationContext
-                .getApplicationScope().get("dataSource"));
-        return definitionDao;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected LocaleDefinitionsFactory instantiateDefinitionsFactory(
-            ApplicationContext applicationContext, LocaleResolver resolver) {
-        return new LocaleDefinitionsFactory();
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesInitializer.java b/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesInitializer.java
deleted file mode 100644
index fa2b0bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/TestDbTilesInitializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.db;
-
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.startup.AbstractTilesInitializer;
-
-/**
- * Test Tiles initializer for Tiles initialization of the db-based container.
- *
- * @version $Rev$ $Date$
- */
-public class TestDbTilesInitializer extends AbstractTilesInitializer {
-
-    /** {@inheritDoc} */
-    @Override
-    protected AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context) {
-        return new TestDbTilesContainerFactory();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected String getContainerKey(
-            ApplicationContext applicationContext) {
-        return "db";
-    }
-}
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/package.html
deleted file mode 100644
index eab996d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/java/org/apache/tiles/test/db/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>DB configuration for Tiles test webapp</title>
-</head>
-<body>
-A configuration based on a DBMS of the Tiles test webapp.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/resources/META-INF/MANIFEST.MF b/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/resources/META-INF/MANIFEST.MF
deleted file mode 100644
index 039fba1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test-db/src/main/resources/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,32 +0,0 @@
-Manifest-Version: 1.0
-Archiver-Version: Plexus Archiver
-Created-By: 1.6.0_16 (Sun Microsystems Inc.)
-Built-By: antonio
-Build-Jdk: 1.6.0_16
-Specification-Title: Tiles - Test webapp database configuration
-Specification-Version: 2.2.1-SNAPSHOT
-Specification-Vendor: Apache Software Foundation
-Implementation-Title: Tiles - Test webapp database configuration
-Implementation-Version: 2.2.1-SNAPSHOT
-Implementation-Vendor-Id: org.apache
-Implementation-Vendor: Apache Software Foundation
-Tiles-Initializer: org.apache.tiles.test.db.TestDbTilesInitializer
-Export-Package: org.apache.tiles.test.db;version="2.2.1.SNAPSHOT"
-Tool: Bnd-0.0.311
-Bundle-Name: Tiles - Test webapp database configuration
-Bundle-Vendor: Apache Software Foundation
-Bundle-Version: 2.2.1.SNAPSHOT
-Bnd-LastModified: 1254151614318
-Bundle-ManifestVersion: 2
-Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
-Bundle-Description: Tiles configuration that uses a database.
-Import-Package: javax.sql,org.apache.tiles,org.apache.tiles.context,or
- g.apache.tiles.definition,org.apache.tiles.definition.dao,org.apache.
- tiles.factory,org.apache.tiles.freemarker.context,org.apache.tiles.lo
- cale,org.apache.tiles.test.db;version="2.2",org.apache.tiles.util,org
- .apache.tiles.velocity.context,org.springframework.jdbc.core,org.spri
- ngframework.jdbc.core.support
-Bundle-SymbolicName: org.apache.tiles-test-db
-Bundle-DocURL: http://tiles.apache.org/framework/tiles-test-pom/tiles-
- test-db
-
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/pom.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/pom.xml
deleted file mode 100644
index a7a483f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/pom.xml
+++ /dev/null
@@ -1,465 +0,0 @@
-<?xml version="1.0"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-   <parent>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-test-pom</artifactId>
-      <version>3.0.1</version>
-   </parent>
-
-   <modelVersion>4.0.0</modelVersion>
-   <artifactId>tiles-test</artifactId>
-   <packaging>war</packaging>
-   <name>Tiles - Apps - Test</name>
-   <description>Tiles Test web application: tests Tiles functionality.
-   </description>
-
-   <dependencies>
-      <dependency>
-         <groupId>org.apache.tiles</groupId>
-         <artifactId>tiles-test-common</artifactId>
-         <version>${project.version}</version>
-      </dependency>
-      <dependency>
-         <groupId>org.apache.tiles</groupId>
-         <artifactId>tiles-test-alt</artifactId>
-         <version>${project.version}</version>
-      </dependency>
-      <dependency>
-         <groupId>org.apache.tiles</groupId>
-         <artifactId>tiles-test-db</artifactId>
-         <version>${project.version}</version>
-      </dependency>
-      <dependency>
-         <groupId>org.apache.tiles</groupId>
-         <artifactId>tiles-extras</artifactId>
-         <version>${project.version}</version>
-      </dependency>
-      <dependency>
-         <groupId>org.apache.tiles</groupId>
-         <artifactId>tiles-request-portlet</artifactId>
-         <version>${tiles.request.version}</version>
-      </dependency>
-
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-jdk14</artifactId>
-        <version>1.5.8</version>
-      </dependency>
-
-      <dependency>
-         <groupId>javax.servlet</groupId>
-         <artifactId>servlet-api</artifactId>
-         <version>2.5</version>
-         <scope>provided</scope>
-      </dependency>
-      <dependency>
-         <groupId>javax.servlet.jsp</groupId>
-         <artifactId>jsp-api</artifactId>
-         <version>2.1</version>
-         <scope>provided</scope>
-      </dependency>
-      <dependency>
-         <groupId>javax.portlet</groupId>
-         <artifactId>portlet-api</artifactId>
-         <version>2.0</version>
-         <scope>provided</scope>
-      </dependency>
-      <dependency>
-         <groupId>javax.servlet</groupId>
-         <artifactId>jstl</artifactId>
-         <version>1.2</version>
-         <scope>runtime</scope>
-      </dependency>
-      <dependency>
-        <groupId>hsqldb</groupId>
-        <artifactId>hsqldb</artifactId>
-        <version>1.8.0.10</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>1.4</version>
-      </dependency>
-      <dependency>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-jdbc</artifactId>
-        <version>2.5.6</version>
-        <exclusions>
-          <exclusion>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-          <groupId>org.apache.portals.pluto</groupId>
-          <artifactId>pluto-taglib</artifactId>
-          <version>2.0.0</version>
-          <scope>provided</scope>
-      </dependency>
-   </dependencies>
-
-   <build>
-       <plugins>
-          <plugin>
-              <groupId>org.apache.maven.plugins</groupId>
-              <artifactId>maven-war-plugin</artifactId>
-              <version>2.1-beta-1</version>
-              <configuration>
-                  <webResources>
-                      <resource>
-                          <directory>.</directory>
-                          <targetPath>META-INF</targetPath>
-                          <includes>
-                              <include>LICENSE.txt</include>
-                              <include>NOTICE.txt</include>
-                          </includes>
-                      </resource>
-                  </webResources>
-                  <archive>
-                      <manifest>
-                          <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-                          <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                      </manifest>
-                      <manifestEntries>
-                          <Tiles-Initializer>org.apache.tiles.test.init.TestTilesInitializer</Tiles-Initializer>
-                      </manifestEntries>
-                  </archive>
-               </configuration>
-           </plugin>
-           <plugin>
-               <groupId>org.codehaus.cargo</groupId>
-               <artifactId>cargo-maven2-plugin</artifactId>
-               <version>1.0.5</version>
-               <configuration>
-                   <container>
-                       <containerId>jetty7x</containerId>
-                       <type>embedded</type>
-                   </container>
-               </configuration>
-           </plugin>
-       </plugins>
-     <finalName>${project.artifactId}</finalName>
-    <extensions>
-      <extension>
-        <groupId>org.apache.maven.wagon</groupId>
-        <artifactId>wagon-ssh</artifactId>
-        <version>1.0</version>
-      </extension>
-    </extensions>
-   </build>
-
-    <profiles>
-        <profile>
-            <id>selenium</id>
-            <activation>
-                <property>
-                    <name>selenium</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>dependency-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>unpack-selenium</id>
-                                <phase>generate-resources</phase>
-                                <goals>
-                                    <goal>unpack</goal>
-                                </goals>
-                                <configuration>
-                                    <artifactItems>
-                                        <artifactItem>
-                                            <groupId>org.openqa.selenium.core</groupId>
-                                            <artifactId>selenium-core</artifactId>
-                                            <version>1.0-beta-1</version>
-                                        </artifactItem>
-                                    </artifactItems>
-                                    <outputDirectory>${project.build.directory}/selenium</outputDirectory>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>copy-selenium</id>
-                                <phase>process-resources</phase>
-                                <configuration>
-                                    <tasks>
-                                        <copy todir="${project.build.directory}/${project.artifactId}/selenium/core">
-                                            <fileset dir="${project.build.directory}/selenium/core" />
-                                        </copy>
-                                        <copy todir="${project.build.directory}/${project.artifactId}/selenium/tests">
-                                            <fileset dir="src/test/selenium" />
-                                        </copy>
-                                    </tasks>
-                                </configuration>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-            <repositories>
-                <repository>
-                    <id>OpenQA</id>
-                    <url>http://nexus.openqa.org/content/repositories/releases/</url>
-                </repository>
-            </repositories>
-        </profile>
-
-        <profile>
-            <id>run-selenium</id>
-            <activation>
-                <property>
-                    <name>run-selenium</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.cargo</groupId>
-                        <artifactId>cargo-maven2-plugin</artifactId>
-                         <configuration>
-                            <container>
-                                <containerId>jetty7x</containerId>
-                                <type>embedded</type>
-                            </container>
-                            <wait>false</wait>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>start-container</id>
-                                <phase>pre-integration-test</phase>
-                                <goals>
-                                    <goal>start</goal>
-                                </goals>
-                            </execution>
-                            <execution>
-                                <id>stop-container</id>
-                                <phase>post-integration-test</phase>
-                                <goals>
-                                    <goal>stop</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                   </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>selenium-maven-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <id>run-tests</id>
-                                <phase>integration-test</phase>
-                                <goals>
-                                    <goal>selenese</goal>
-                                </goals>
-                                <configuration>
-                                    <background>true</background>
-                                    <browser>*firefox</browser>
-                                    <startURL>http://localhost:8080/tiles-test/</startURL>
-                                    <suite>src/test/selenium/TestSuite.html</suite>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <!-- Skip the normal tests, we'll run them in the integration-test phase -->
-                            <skip>true</skip>
-                        </configuration>
-
-                        <executions>
-                            <execution>
-                                <phase>integration-test</phase>
-                                <goals>
-                                    <goal>test</goal>
-                                </goals>
-                                <configuration>
-                                    <skip>false</skip>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-
-        <profile>
-            <id>hostedqa</id>
-            <dependencies>
-                <dependency>
-                    <groupId>com.hostedqa</groupId>
-                    <artifactId>hostedqa-remote-ant</artifactId>
-                    <version>1.6.2</version>
-                    <scope>test</scope>
-                </dependency>
-            </dependencies>
-            <repositories>
-                <repository>
-                    <id>codehaus</id>
-                    <name>codehaus</name>
-                    <url>http://repository.codehaus.org</url>
-                </repository>
-                <repository>
-                    <id>maven-hostedqa</id>
-                    <name>maven-hostedqa</name>
-                    <snapshots>
-                        <enabled>true</enabled>
-                        <updatePolicy>always</updatePolicy>
-                        <checksumPolicy>ignore</checksumPolicy>
-                    </snapshots>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <url>http://maven.hostedqa.com</url>
-                </repository>
-            </repositories>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-antrun-plugin</artifactId>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <executions>
-                            <execution>
-                                <phase>package</phase>
-                                <goals>
-                                    <goal>run</goal>
-                                </goals>
-                                <configuration>
-                                    <tasks>
-                                        <taskdef resource="hostedqatasks" classpathref="maven.plugin.classpath" />
-                                        <upload file="${project.build.directory}/${project.build.finalName}.war" account="tiles" email="${tiles.hostedqa.email}" password="${tiles.hostedqa.password}" resourceId="${hostedqa.resourceId}" />
-
-                                        <playsuite clientConfigs="${hostedqa.clientConfigs}" appConfigs="${hostedqa.appConfigs}" account="tiles" email="${tiles.hostedqa.email}" password="${tiles.hostedqa.password}">
-                                            <fileSet dir="${basedir}/src/test/selenium" excludes="TestSuite.html" />
-                                        </playsuite>
-                                    </tasks>
-                                </configuration>
-                            </execution>
-                        </executions>
-                        <dependencies>
-                            <dependency>
-                                <groupId>com.hostedqa</groupId>
-                                <artifactId>hostedqa-remote-ant</artifactId>
-                                <version>1.6.2</version>
-                            </dependency>
-                        </dependencies>
-                    </plugin>
-                </plugins>
-            </build>
-            <properties>
-                <hostedqa.resourceId>53</hostedqa.resourceId>
-                <hostedqa.clientConfigs>303</hostedqa.clientConfigs>
-                <hostedqa.appConfigs>121</hostedqa.appConfigs>
-            </properties>
-        </profile>
-        <profile>
-            <id>apache-release</id>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>rat-maven-plugin</artifactId>
-                        <version>1.0-alpha-3</version>
-                        <executions>
-                            <execution>
-                                <phase>verify</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                </goals>
-                                <configuration>
-                                    <addDefaultLicenseMatchers>false</addDefaultLicenseMatchers>
-                                    <licenseMatchers>
-                                        <classNames>
-                                            <className>rat.analysis.license.ApacheSoftwareLicense20</className>
-                                        </classNames>
-                                    </licenseMatchers>
-                                    <includes>
-                                        <include>pom.xml</include>
-                                        <include>src/**</include>
-                                    </includes>
-                                    <excludes>
-                                        <exclude>**/*.sql</exclude>
-                                        <exclude>**/*MANIFEST.MF</exclude>
-                                    </excludes>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                    <plugin>
-                        <groupId>org.codehaus.mojo</groupId>
-                        <artifactId>wagon-maven-plugin</artifactId>
-                        <version>1.0-beta-4</version>
-                        <executions>
-                            <execution>
-                                <phase>deploy</phase>
-                                <goals>
-                                    <goal>upload</goal>
-                                </goals>
-                                <configuration>
-                                    <fromDir>${settings.localRepository}/org/apache/tiles/tiles-test/${project.version}</fromDir>
-                                    <includes>tiles-test-${project.version}.war*</includes>
-                                    <toDir>${project.version}</toDir>
-                                    <serverId>tiles.build</serverId>
-                                    <url>scp://people.apache.org/www/people.apache.org/builds/tiles</url>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
-    </profiles>
-    <repositories>
-        <repository>
-            <id>codehaus</id>
-            <name>codehaus</name>
-            <url>http://repository.codehaus.org</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-        </repository>
-    </repositories>
-    <pluginRepositories>
-        <pluginRepository>
-            <id>codehaus</id>
-            <name>codehaus</name>
-            <url>http://repository.codehaus.org</url>
-            <releases>
-                <enabled>true</enabled>
-            </releases>
-        </pluginRepository>
-    </pluginRepositories>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/etc/db/project/tiles.architect b/TILES_3_0_X/tiles-test-pom/tiles-test/src/etc/db/project/tiles.architect
deleted file mode 100644
index 4a68575..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/etc/db/project/tiles.architect
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<architect-project version="1.0" appversion="0.9.10">
- <project-name>tiles</project-name>
- <project-data-sources>
-  <data-source id="DS0">
-   <property key="Logical" value="Not Configured" />
-  </data-source>
-  <data-source id="DS2">
-   <property key="Connection Type" value="HSQLDB" />
-   <property key="Logical" value="Tiles in file" />
-   <property key="JDBC URL" value="jdbc:hsqldb:file:/home/antonio/javadev/db/tiles;shutdown=true" />
-   <property key="UID" value="sa" />
-   <property key="PWD" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.database" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.port" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.hostname" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.repos.login" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.repos.password" value="" />
-  </data-source>
-  <data-source id="DS2">
-   <property key="Connection Type" value="HSQLDB" />
-   <property key="Logical" value="Tiles in file" />
-   <property key="JDBC URL" value="jdbc:hsqldb:file:/home/antonio/javadev/db/tiles;shutdown=true" />
-   <property key="UID" value="sa" />
-   <property key="PWD" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.database" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.port" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.hostname" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.repos.login" value="" />
-   <property key="ca.sqlpower.architect.etl.kettle.repos.password" value="" />
-  </data-source>
- </project-data-sources>
- <source-databases>
-  <database id="DB0" populated="true" dbcs-ref="DS2" name="Tiles in file" physicalName="Tiles in memory" >
-   <schema id="SCH1" populated="false" name="INFORMATION_SCHEMA" nativeTerm="schema" physicalName="INFORMATION_SCHEMA" />
-   <schema id="SCH2" populated="true" name="PUBLIC" nativeTerm="schema" physicalName="PUBLIC" >
-    <table id="TAB3" populated="true" name="ATTRIBUTE" objectType="TABLE" physicalName="ATTRIBUTE" >
-     <folder id="FOL4" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL5" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL6" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL7" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-    <table id="TAB8" populated="true" name="ATTRIBUTE_VISIBLE_FOR" objectType="TABLE" physicalName="ATTRIBUTE_VISIBLE_FOR" >
-     <folder id="FOL9" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL10" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL11" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL12" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-    <table id="TAB13" populated="true" name="CUSTOMIZATION" objectType="TABLE" physicalName="CUSTOMIZATION" >
-     <folder id="FOL14" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL15" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL16" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL17" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-    <table id="TAB18" populated="true" name="DEFINITION" objectType="TABLE" physicalName="DEFINITION" >
-     <folder id="FOL19" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL20" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL21" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL22" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-    <table id="TAB23" populated="true" name="ROLE" objectType="TABLE" physicalName="ROLE" >
-     <folder id="FOL24" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL25" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL26" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL27" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-    <table id="TAB28" populated="true" name="VISIBLE_FOR" objectType="TABLE" physicalName="VISIBLE_FOR" >
-     <folder id="FOL29" populated="false" name="Columns" physicalName="Columns" type="1" />
-     <folder id="FOL30" populated="false" name="Exported Keys" physicalName="Exported Keys" type="3" />
-     <folder id="FOL31" populated="false" name="Imported Keys" physicalName="Imported Keys" type="2" />
-     <folder id="FOL32" populated="false" name="Indices" physicalName="Indices" type="4" />
-    </table>
-   </schema>
-   <relationships>
-   </relationships>
-  </database>
-  <database id="DB33" populated="true" dbcs-ref="DS2" name="Tiles in file" physicalName="Tiles in file" >
-   <schema id="SCH34" populated="true" name="INFORMATION_SCHEMA" nativeTerm="schema" physicalName="INFORMATION_SCHEMA" >
-   </schema>
-   <schema id="SCH35" populated="true" name="PUBLIC" nativeTerm="schema" physicalName="PUBLIC" >
-   </schema>
-   <relationships>
-   </relationships>
-  </database>
- </source-databases>
- <target-database dbcs-ref="DS0">
-  <table id="TAB36" populated="true" name="Definition" objectType="TABLE" physicalName="Definition" remarks="" >
-   <folder id="FOL37" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL38" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_seq" name="id" nullable="0" physicalName="id" precision="12" primaryKeySeq="0" referenceCount="2" remarks="" scale="0" type="2" />
-    <column id="COL39" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_name_seq" name="name" nullable="0" physicalName="name" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL40" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_preparer_seq" name="preparer" nullable="1" physicalName="preparer" precision="1000" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL41" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_template_seq" name="template" nullable="1" physicalName="template" precision="1000" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL42" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_Customization_id_seq" name="Customization_id" nullable="0" physicalName="Customization_id" precision="12" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL43" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_parent_name_seq" name="parent_name" nullable="1" physicalName="parent_name" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-   </folder>
-   <folder id="FOL44" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL45" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL46" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX47" populated="true" clustered="false" name="Definition_pk" physicalName="Definition_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC48" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL38" name="id" physicalName="id" />
-    </index>
-    <index id="IDX49" populated="true" clustered="false" name="Definition_idx" physicalName="Definition_idx" primaryKeyIndex="false" unique="false" >
-     <index-column id="IDC50" populated="true" ascendingOrDescending="ASCENDING" column-ref="COL39" name="name" physicalName="name" />
-    </index>
-   </folder>
-  </table>
-  <table id="TAB51" populated="true" name="Attribute" objectType="TABLE" physicalName="Attribute" remarks="" >
-   <folder id="FOL52" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL53" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_seq" name="id" nullable="0" physicalName="id" precision="12" primaryKeySeq="0" referenceCount="2" remarks="" scale="0" type="2" />
-    <column id="COL54" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_name_seq" name="name" nullable="0" physicalName="name" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL55" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_type_seq" name="type" nullable="1" physicalName="type" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL56" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_value_seq" name="value" nullable="0" physicalName="value" precision="1000" referenceCount="1" remarks="" scale="0" type="12" />
-    <column id="COL57" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_cascade_attribute_seq" name="cascade_attribute" nullable="0" physicalName="cascade_attribute" precision="10" referenceCount="1" remarks="" scale="0" type="16" />
-    <column id="COL58" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_Definition_id_seq" name="Definition_id" nullable="1" physicalName="Definition_id" precision="12" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL59" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_seq" name="Parent_id" nullable="1" physicalName="Parent_id" precision="12" referenceCount="1" remarks="" scale="0" type="2" />
-   </folder>
-   <folder id="FOL60" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL61" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL62" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX63" populated="true" clustered="false" name="Attribute_pk" physicalName="Attribute_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC64" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL53" name="id" physicalName="id" />
-    </index>
-   </folder>
-  </table>
-  <table id="TAB65" populated="true" name="Role" objectType="TABLE" physicalName="Role" remarks="" >
-   <folder id="FOL66" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL67" populated="true" autoIncrement="false" autoIncrementSequenceName="Role_seq" name="id" nullable="0" physicalName="id" precision="12" primaryKeySeq="0" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL68" populated="true" autoIncrement="false" autoIncrementSequenceName="Role_name_seq" name="name" nullable="0" physicalName="name" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-   </folder>
-   <folder id="FOL69" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL70" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL71" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX72" populated="true" clustered="false" name="Role_pk" physicalName="Role_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC73" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL67" name="id" physicalName="id" />
-    </index>
-    <index id="IDX74" populated="true" clustered="false" name="Role_idx" physicalName="Role_idx" primaryKeyIndex="false" unique="false" >
-     <index-column id="IDC75" populated="true" ascendingOrDescending="ASCENDING" column-ref="COL68" name="name" physicalName="name" />
-    </index>
-   </folder>
-  </table>
-  <table id="TAB76" populated="true" name="Customization" objectType="TABLE" physicalName="Customization" remarks="" >
-   <folder id="FOL77" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL78" populated="true" autoIncrement="false" autoIncrementSequenceName="Customization_seq" name="id" nullable="0" physicalName="id" precision="12" primaryKeySeq="0" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL79" populated="true" autoIncrement="false" autoIncrementSequenceName="Customization_seq" name="Parent_id" nullable="1" physicalName="Parent_id" precision="12" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL80" populated="true" autoIncrement="false" autoIncrementSequenceName="Customization_name_seq" name="name" nullable="0" physicalName="name" precision="255" referenceCount="1" remarks="" scale="0" type="12" />
-   </folder>
-   <folder id="FOL81" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL82" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL83" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX84" populated="true" clustered="false" name="Customization_pk" physicalName="Customization_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC85" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL78" name="id" physicalName="id" />
-    </index>
-    <index id="IDX86" populated="true" clustered="false" name="Customization_idx" physicalName="Customization_idx" primaryKeyIndex="false" unique="false" >
-     <index-column id="IDC87" populated="true" ascendingOrDescending="ASCENDING" column-ref="COL80" name="name" physicalName="name" />
-    </index>
-    <index id="IDX88" populated="true" clustered="false" name="Customization_idx1" physicalName="Customization_idx1" primaryKeyIndex="false" unique="false" >
-     <index-column id="IDC89" populated="true" ascendingOrDescending="ASCENDING" column-ref="COL80" name="name" physicalName="name" />
-    </index>
-   </folder>
-  </table>
-  <table id="TAB90" populated="true" name="Visible_for" objectType="TABLE" physicalName="Visible_for" remarks="" >
-   <folder id="FOL91" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL92" populated="true" autoIncrement="false" autoIncrementSequenceName="Definition_seq" name="Definition_id" nullable="0" physicalName="Definition_id" precision="12" primaryKeySeq="0" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL93" populated="true" autoIncrement="false" autoIncrementSequenceName="Role_seq" name="Role_id" nullable="0" physicalName="Role_id" precision="12" primaryKeySeq="1" referenceCount="1" remarks="" scale="0" type="2" />
-   </folder>
-   <folder id="FOL94" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL95" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL96" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX97" populated="true" clustered="false" name="Visible_for_pk" physicalName="Visible_for_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC98" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL92" name="Definition_id" physicalName="Definition_id" />
-     <index-column id="IDC99" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL93" name="Role_id" physicalName="Role_id" />
-    </index>
-   </folder>
-  </table>
-  <table id="TAB100" populated="true" name="Attribute_visible_for" objectType="TABLE" physicalName="Attribute_visible_for" remarks="" >
-   <folder id="FOL101" populated="true" name="Columns" physicalName="Columns" type="1" >
-    <column id="COL102" populated="true" autoIncrement="false" autoIncrementSequenceName="Attribute_seq" name="Attribute_id" nullable="0" physicalName="Attribute_id" precision="12" primaryKeySeq="0" referenceCount="1" remarks="" scale="0" type="2" />
-    <column id="COL103" populated="true" autoIncrement="false" autoIncrementSequenceName="Role_seq" name="Role_id" nullable="0" physicalName="Role_id" precision="12" primaryKeySeq="1" referenceCount="1" remarks="" scale="0" type="2" />
-   </folder>
-   <folder id="FOL104" populated="true" name="Exported Keys" physicalName="Exported Keys" type="3" >
-   </folder>
-   <folder id="FOL105" populated="true" name="Imported Keys" physicalName="Imported Keys" type="2" >
-   </folder>
-   <folder id="FOL106" populated="true" name="Indices" physicalName="Indices" type="4" >
-    <index id="IDX107" populated="true" clustered="false" name="Attribute_visible_for_pk" physicalName="Attribute_visible_for_pk" primaryKeyIndex="true" unique="true" >
-     <index-column id="IDC108" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL102" name="Attribute_id" physicalName="Attribute_id" />
-     <index-column id="IDC109" populated="true" ascendingOrDescending="UNSPECIFIED" column-ref="COL103" name="Role_id" physicalName="Role_id" />
-    </index>
-   </folder>
-  </table>
-  <relationships>
-   <relationship id="REL110" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB51" fkCardinality="7" identifying="false" name="Definition_Attribute_fk" physicalName="Definition_Attribute_fk" pk-table-ref="TAB36" pkCardinality="3" updateRule="0" >
-    <column-mapping id="CMP111" populated="true" fk-column-ref="COL58" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL38" />
-   </relationship>
-   <relationship id="REL112" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB90" fkCardinality="7" identifying="true" name="Definition_Visible_for_fk" physicalName="Definition_Visible_for_fk" pk-table-ref="TAB36" pkCardinality="2" updateRule="0" >
-    <column-mapping id="CMP113" populated="true" fk-column-ref="COL92" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL38" />
-   </relationship>
-   <relationship id="REL114" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB36" fkCardinality="7" identifying="true" name="Customization_Definition_fk" physicalName="Customization_Definition_fk" pk-table-ref="TAB76" pkCardinality="2" updateRule="0" >
-    <column-mapping id="CMP115" populated="true" fk-column-ref="COL42" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL78" />
-   </relationship>
-   <relationship id="REL116" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB51" fkCardinality="7" identifying="false" name="Attribute_Attribute_fk" physicalName="Attribute_Attribute_fk" pk-table-ref="TAB51" pkCardinality="3" updateRule="0" >
-    <column-mapping id="CMP117" populated="true" fk-column-ref="COL59" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL53" />
-   </relationship>
-   <relationship id="REL118" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB100" fkCardinality="7" identifying="true" name="Attribute_Attribute_visible_for_fk" physicalName="Attribute_Attribute_visible_for_fk" pk-table-ref="TAB51" pkCardinality="2" updateRule="0" >
-    <column-mapping id="CMP119" populated="true" fk-column-ref="COL102" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL53" />
-   </relationship>
-   <reference ref-id="REL110" />
-   <reference ref-id="REL116" />
-   <relationship id="REL120" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB90" fkCardinality="7" identifying="true" name="Role_Visible_for_fk" physicalName="Role_Visible_for_fk" pk-table-ref="TAB65" pkCardinality="2" updateRule="0" >
-    <column-mapping id="CMP121" populated="true" fk-column-ref="COL93" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL67" />
-   </relationship>
-   <relationship id="REL122" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB100" fkCardinality="7" identifying="true" name="Role_Attribute_visible_for_fk" physicalName="Role_Attribute_visible_for_fk" pk-table-ref="TAB65" pkCardinality="2" updateRule="0" >
-    <column-mapping id="CMP123" populated="true" fk-column-ref="COL103" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL67" />
-   </relationship>
-   <reference ref-id="REL114" />
-   <relationship id="REL124" populated="true" deferrability="7" deleteRule="0" fk-table-ref="TAB76" fkCardinality="7" identifying="false" name="Customization_Customization_fk" physicalName="Customization_Customization_fk" pk-table-ref="TAB76" pkCardinality="3" updateRule="0" >
-    <column-mapping id="CMP125" populated="true" fk-column-ref="COL79" name="Column Mapping" physicalName="Column Mapping" pk-column-ref="COL78" />
-   </relationship>
-   <reference ref-id="REL124" />
-   <reference ref-id="REL112" />
-   <reference ref-id="REL120" />
-   <reference ref-id="REL118" />
-   <reference ref-id="REL122" />
-  </relationships>
- </target-database>
- <ddl-generator type="ca.sqlpower.architect.ddl.HSQLDBDDLGenerator" allow-connection="false" target-schema="public"> </ddl-generator>
- <create-kettle-job-settings filePath="" jobName="" schemaName="" kettleJoinType="0" savingToFile="true" />
- <play-pen zoom="1.0" viewportX="0" viewportY="0" relationship-style="rectilinear">
-  <table-pane table-ref="TAB36" x="234" y="51" />
-  <table-pane table-ref="TAB51" x="700" y="53" />
-  <table-pane table-ref="TAB65" x="729" y="488" />
-  <table-pane table-ref="TAB76" x="217" y="457" />
-  <table-pane table-ref="TAB90" x="481" y="321" />
-  <table-pane table-ref="TAB100" x="748" y="319" />
-  <table-link relationship-ref="REL110" pk-x="187" pk-y="45" fk-x="0" fk-y="43" orientation="33" />
-  <table-link relationship-ref="REL116" pk-x="33" pk-y="143" fk-x="0" fk-y="82" orientation="36" />
-  <table-link relationship-ref="REL114" pk-x="56" pk-y="0" fk-x="39" fk-y="120" orientation="72" />
-  <table-link relationship-ref="REL124" pk-x="70" pk-y="79" fk-x="0" fk-y="39" orientation="36" />
-  <table-link relationship-ref="REL112" pk-x="95" pk-y="120" fk-x="0" fk-y="28" orientation="36" />
-  <table-link relationship-ref="REL120" pk-x="0" pk-y="33" fk-x="44" fk-y="63" orientation="66" />
-  <table-link relationship-ref="REL118" pk-x="70" pk-y="143" fk-x="84" fk-y="0" orientation="132" />
-  <table-link relationship-ref="REL122" pk-x="64" pk-y="0" fk-x="45" fk-y="63" orientation="72" />
- </play-pen>
- <profiles topNCount="10">
-  </profiles>
-</architect-project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/TilesTestRuntimeException.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/TilesTestRuntimeException.java
deleted file mode 100644
index adabdee..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/TilesTestRuntimeException.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.exception;
-
-/**
- * Runtime exception used during the execution of the test web application.
- *
- * @version $Rev$ $Date$
- */
-public class TilesTestRuntimeException extends RuntimeException {
-
-    /**
-     * Constructor.
-     */
-    public TilesTestRuntimeException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     */
-    public TilesTestRuntimeException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param cause The cause of the exception.
-     */
-    public TilesTestRuntimeException(Throwable cause) {
-        super(cause);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     * @param cause The cause of the exception.
-     */
-    public TilesTestRuntimeException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/package.html
deleted file mode 100644
index 54446b8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/exception/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles test exceptions</title>
-</head>
-<body>
-Exceptions raised during the execution of the test web application.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/SecurityWrappingFilter.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/SecurityWrappingFilter.java
deleted file mode 100644
index 8eb4cab..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/SecurityWrappingFilter.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.filter;
-
-import java.io.IOException;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-
-/**
- * Filter that wraps an HttpServletRequest to override "isUserInRole".
- *
- * @version $Rev$ $Date$
- */
-public class SecurityWrappingFilter implements Filter {
-
-    /**
-     * The role that the current user is supposed to use.
-     */
-    public static final String GOOD_ROLE = "goodrole";
-
-    /** {@inheritDoc} */
-    public void init(FilterConfig filterConfig) throws ServletException {
-        // No operation
-    }
-
-    /** {@inheritDoc} */
-    public void doFilter(ServletRequest servletRequest,
-            ServletResponse servletResponse, FilterChain filterChain)
-            throws IOException, ServletException {
-        HttpServletRequest wrappedRequest = new SecurityWrapperHttpServletRequest(
-                (HttpServletRequest) servletRequest);
-        filterChain.doFilter(wrappedRequest, servletResponse);
-    }
-
-    /** {@inheritDoc} */
-    public void destroy() {
-        // No operation
-    }
-
-    /**
-     * Request wrapper that overrides "isUserInRole" method.
-     *
-     * @version $Rev$ $Date$
-     */
-    private static class SecurityWrapperHttpServletRequest extends
-            HttpServletRequestWrapper {
-        /**
-         * Constructor.
-         *
-         * @param request The HTTP servlet request.
-         */
-        public SecurityWrapperHttpServletRequest(HttpServletRequest request) {
-            super(request);
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public boolean isUserInRole(String role) {
-            return GOOD_ROLE.equals(role);
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/package.html
deleted file mode 100644
index 8104a78..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/filter/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles filter test package</title>
-</head>
-<body>
-Contains filter to be used in the test web application.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/InitContextListener.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/InitContextListener.java
deleted file mode 100644
index 41efda0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/InitContextListener.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.init;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.sql.DataSource;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.tiles.test.exception.TilesTestRuntimeException;
-import org.hsqldb.jdbc.jdbcDataSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Initializes the data source of the DB.
- *
- * @version $Rev$ $Date$
- */
-public class InitContextListener implements ServletContextListener {
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory
-            .getLogger(InitContextListener.class);
-
-    /** {@inheritDoc} */
-    public void contextInitialized(ServletContextEvent event) {
-        DataSource dataSource = createDataSource();
-        event.getServletContext().setAttribute("dataSource", dataSource);
-        String[] commands = getSQLCommands();
-        executeCommands(dataSource, commands);
-    }
-
-    /** {@inheritDoc} */
-    public void contextDestroyed(ServletContextEvent event) {
-        // Do nothing
-    }
-
-    /**
-     * Creates the data source to use.
-     *
-     * @return The data source.
-     */
-    private DataSource createDataSource() {
-        jdbcDataSource dataSource = new jdbcDataSource();
-        dataSource.setDatabase("jdbc:hsqldb:mem:tiles");
-        dataSource.setUser("sa");
-        dataSource.setPassword("");
-        return dataSource;
-    }
-
-    /**
-     * Loads and returns the SQL commands to initialize the DB.
-     *
-     * @return The SQL commands to execute.
-     */
-    private String[] getSQLCommands() {
-        InputStream stream = getClass().getResourceAsStream(
-                "/org/apache/tiles/test/db/schema.sql");
-        String text;
-        try {
-            text = IOUtils.toString(stream);
-        } catch (IOException e) {
-            throw new TilesTestRuntimeException("Cannot read schema SQL text", e);
-        } finally {
-            try {
-                stream.close();
-            } catch (IOException e) {
-                log.error("Error during close of the stream containing the SQL schema", e);
-            }
-        }
-        return text.split(";");
-    }
-
-    /**
-     * Execute SQL commands.
-     *
-     * @param dataSource The data source to use.
-     * @param commands The commands to execute.
-     */
-    private void executeCommands(DataSource dataSource, String[] commands) {
-        Connection conn = null;
-        Statement stmt = null;
-        try {
-            conn = dataSource.getConnection();
-            for (int i = 0; i < commands.length; i++) {
-                stmt = conn.createStatement();
-                stmt.executeUpdate(commands[i]);
-            }
-            conn.commit();
-        } catch (SQLException e) {
-            try {
-                conn.rollback();
-            } catch (SQLException e1) {
-                log.error("Error during rollback", e);
-            }
-            throw new TilesTestRuntimeException("Error during execution of SQL commands", e);
-        } finally {
-            try {
-                if (conn != null) {
-                    conn.close();
-                }
-                if (stmt != null) {
-                    stmt.close();
-                }
-            } catch (SQLException e) {
-                log.error("Error during closing resources", e);
-            }
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/TestTilesInitializer.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/TestTilesInitializer.java
deleted file mode 100644
index 3e5b0d5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/TestTilesInitializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.test.init;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.factory.AbstractTilesContainerFactory;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.servlet.wildcard.WildcardServletApplicationContext;
-import org.apache.tiles.startup.AbstractTilesInitializer;
-import org.apache.tiles.test.factory.TestTilesContainerFactory;
-
-/**
- * Test Tiles initializer for Tiles initialization of the default container.
- *
- * @version $Rev$ $Date$
- */
-public class TestTilesInitializer extends AbstractTilesInitializer {
-
-    /** {@inheritDoc} */
-    @Override
-    protected AbstractTilesContainerFactory createContainerFactory(
-            ApplicationContext context) {
-        return new TestTilesContainerFactory();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected ApplicationContext createTilesApplicationContext(
-            ApplicationContext preliminaryContext) {
-        return new WildcardServletApplicationContext(
-                (ServletContext) preliminaryContext.getContext());
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/package.html
deleted file mode 100644
index 3617584..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/init/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles test initialization.</title>
-</head>
-<body>
-Initialization classes used in the test web application.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/TestPortlet.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/TestPortlet.java
deleted file mode 100644
index 431b61c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/TestPortlet.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.portlet;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.GenericPortlet;
-import javax.portlet.PortletContext;
-import javax.portlet.PortletException;
-import javax.portlet.PortletRequestDispatcher;
-import javax.portlet.PortletSession;
-import javax.portlet.PortletURL;
-import javax.portlet.ProcessAction;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.portlet.RenderPortletRequest;
-
-/**
- * Test Portlet.
- *
- * @version $Rev$ $Date$
- */
-public class TestPortlet extends GenericPortlet {
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doView(RenderRequest request, RenderResponse response)
-            throws PortletException, IOException {
-        PortletSession portletSession = request.getPortletSession();
-        String definition = (String) portletSession.getAttribute("definition");
-        if (definition != null) {
-            portletSession.removeAttribute("definition");
-            TilesContainer container = getCurrentContainer(request,
-                    getPortletContext());
-            Request currentRequest = new RenderPortletRequest(container
-                    .getApplicationContext(), getPortletContext(), request,
-                    response);
-            if (container.isValidDefinition(definition, currentRequest)) {
-                container.render(definition, currentRequest);
-                addBackLink(response);
-            } else {
-                PortletRequestDispatcher dispatcher = getPortletContext()
-                        .getRequestDispatcher(
-                                "/WEB-INF/jsp/nosuchdefinition.jsp");
-                dispatcher.forward(request, response);
-                addBackLink(response);
-            }
-        } else {
-            PortletRequestDispatcher dispatcher = getPortletContext()
-                    .getRequestDispatcher("/WEB-INF/jsp/index.jsp");
-            dispatcher.forward(request, response);
-        }
-    }
-
-
-    /**
-     * Puts the definition name in a session attribue.
-     *
-     * @param request The portlet request.
-     * @param response The portlet response.
-     */
-    @ProcessAction(name = "showDefinition")
-    public void showDefinition(ActionRequest request, ActionResponse response) {
-        request.getPortletSession().setAttribute("definition",
-                request.getParameter("definition"));
-    }
-
-    /**
-     * Adds a link to the response to go back.
-     *
-     * @param response The portlet response.
-     * @throws IOException If something goes wrong.
-     */
-    private void addBackLink(RenderResponse response) throws IOException {
-        PrintWriter writer = response.getWriter();
-        writer.append("<a href=\"");
-        PortletURL url = response.createRenderURL();
-        writer.append(url.toString());
-        writer.append("\"> Back to definition selection</a>");
-    }
-
-    /**
-     * Returns the current container that has been set, or the default one.
-     *
-     * @param request The request to use.
-     * @param context The portlet context to use.
-     * @return The current Tiles container to use in web pages.
-     * @since 2.1.0
-     */
-    private static TilesContainer getCurrentContainer(
-            javax.portlet.PortletRequest request, PortletContext context) {
-        TilesContainer container = (TilesContainer) request
-                .getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME);
-        if (container == null) {
-            container = getContainer(context);
-            request.setAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME,
-                    container);
-        }
-
-        return container;
-    }
-
-    /**
-     * Returns a specific Tiles container.
-     *
-     * @param context The portlet context to use.
-     * @param key The key under which the container is stored. If null, the
-     * default container will be returned.
-     * @return The requested Tiles container.
-     * @since 2.1.2
-     */
-    private static TilesContainer getContainer(PortletContext context, String key) {
-        if (key == null) {
-            key = TilesAccess.CONTAINER_ATTRIBUTE;
-        }
-        return (TilesContainer) context.getAttribute(key);
-    }
-
-    /**
-     * Returns the default Tiles container.
-     *
-     * @param context The portlet context to use.
-     * @return The default Tiles container.
-     * @since 2.1.2
-     */
-    private static TilesContainer getContainer(PortletContext context) {
-        return getContainer(context, TilesAccess.CONTAINER_ATTRIBUTE);
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/package.html
deleted file mode 100644
index dad1908..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/portlet/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Test portlets.</title>
-</head>
-<body>
-Test portlets for Tiles evaluation.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/AttributeViewPreparer.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/AttributeViewPreparer.java
deleted file mode 100644
index 01304ce..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/AttributeViewPreparer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.preparer;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-/**
- * A <code>ViewPreparer</code> that stores an attribute.
- *
- * @version $Rev$ $Date$
- */
-public class AttributeViewPreparer implements ViewPreparer {
-
-    /** {@inheritDoc} */
-    public void execute(Request tilesContext,
-            AttributeContext attributeContext) {
-        attributeContext.putAttribute(
-            "body",
-            new Attribute("This is the value added by the AttributeViewPreparer"));
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/RequestSettingViewPreparer.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/RequestSettingViewPreparer.java
deleted file mode 100644
index 9f9f198..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/RequestSettingViewPreparer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.preparer;
-
-import java.util.Map;
-
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-/**
- * A simple test <code>ViewPreparer</code> to put a request attribute, that
- * will be used with the EL evaluator.
- *
- * @version $Rev$ $Date$
- */
-public class RequestSettingViewPreparer implements ViewPreparer {
-
-    /** {@inheritDoc} */
-    public void execute(Request tilesContext,
-            AttributeContext attributeContext) {
-        Map<String, Object> requestScope = tilesContext.getContext("request");
-        requestScope.put("body", "test.inner.definition");
-        requestScope.put("layout", "/layout.jsp");
-        requestScope.put("doNotShow", "DO NOT SHOW!!!");
-        requestScope.put("doNotShowBody", "${requestScope.doNotShow}");
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/TestViewPreparer.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/TestViewPreparer.java
deleted file mode 100644
index 23f4f60..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/TestViewPreparer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.preparer;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.preparer.ViewPreparer;
-import org.apache.tiles.request.Request;
-
-/**
- * A simple test <code>ViewPreparer</code>.
- *
- * @version $Rev$ $Date$
- */
-public class TestViewPreparer implements ViewPreparer {
-
-    /** {@inheritDoc} */
-    public void execute(Request tilesContext,
-            AttributeContext attributeContext) {
-        attributeContext.putAttribute(
-            "body",
-            new Attribute("This is the value added by the ViewPreparer"));
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/package.html
deleted file mode 100644
index 2732073..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/preparer/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles preparer test package</title>
-</head>
-<body>
-Test classes to check preparer functionality.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/IncludingServlet.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/IncludingServlet.java
deleted file mode 100644
index 9dbdbb5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/IncludingServlet.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.servlet;
-
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Sample servlet that includes a page specified by the <code>include</code>
- * init parameter.
- *
- * @version $Rev$ $Date$
- */
-public class IncludingServlet extends HttpServlet {
-
-    /**
-     * Init parameter value, that indicates the path to include.
-     */
-    private String include;
-
-    /**
-     * Initializes the servlet, reading the <code>include</code> init
-     * parameter.
-     *
-     * @param config The servlet configuration object to use.
-     * @throws ServletException Thrown by
-     * {@link HttpServlet#init(ServletConfig)}
-     */
-    @Override
-    public void init(ServletConfig config) throws ServletException {
-        super.init(config);
-
-        include = config.getInitParameter("include");
-    }
-
-    /**
-     * Processes the request, including the specified page.
-     *
-     * @param request The request object.
-     * @param response The response object.
-     * @throws ServletException Thrown by the {@link #include} method.
-     * @throws IOException Thrown by the {@link #include} method.
-     */
-    @Override
-    protected void doGet(HttpServletRequest request,
-            HttpServletResponse response) throws ServletException, IOException {
-        request.getRequestDispatcher(include).include(request, response);
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/SelectLocaleServlet.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/SelectLocaleServlet.java
deleted file mode 100644
index ed98c3f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/SelectLocaleServlet.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.servlet;
-
-import java.util.Locale;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.locale.impl.DefaultLocaleResolver;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.servlet.ServletRequest;
-
-/**
- * Servlet able to let a user choose a locale.
- *
- * @version $Rev$ $Date$
- */
-public class SelectLocaleServlet extends HttpServlet {
-
-    /**
-     * The key of the container to use.
-     */
-    private String containerKey;
-
-    /**
-     * The name of the definition to render.
-     */
-    private String definitionName;
-
-    /** {@inheritDoc} */
-    @Override
-    public void init(ServletConfig config) throws ServletException {
-        super.init(config);
-        containerKey = config
-                .getInitParameter("org.apache.tiles.test.servlet.ServletConfig.CONTAINER_KEY");
-        definitionName = config
-                .getInitParameter("org.apache.tiles.test.servlet.ServletConfig.DEFINITION_NAME");
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doGet(HttpServletRequest request,
-            HttpServletResponse response) {
-        process(request, response);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    protected void doPost(HttpServletRequest request,
-            HttpServletResponse response) {
-        process(request, response);
-    }
-
-    /**
-     * Processes the request.
-     *
-     * @param request The request object.
-     * @param response The response object.
-     */
-    private void process(HttpServletRequest request,
-            HttpServletResponse response) {
-        String localeParameter = request.getParameter("locale");
-        HttpSession session = request.getSession();
-        Locale locale = null;
-        if (localeParameter != null && localeParameter.trim().length() > 0) {
-            String[] localeStrings = localeParameter.split("_");
-            if (localeStrings.length == 1) {
-                locale = new Locale(localeStrings[0]);
-            } else if (localeStrings.length == 2) {
-                locale = new Locale(localeStrings[0], localeStrings[1]);
-            } else if (localeStrings.length > 2) {
-                locale = new Locale(localeStrings[0], localeStrings[1], localeStrings[2]);
-            }
-        }
-        session.setAttribute(DefaultLocaleResolver.LOCALE_KEY, locale);
-        ApplicationContext applicationContext = org.apache.tiles.request.servlet.ServletUtil
-                .getApplicationContext(getServletContext());
-        Request currentRequest = new ServletRequest(applicationContext, request, response);
-        TilesAccess.setCurrentContainer(currentRequest, containerKey);
-        TilesContainer container = TilesAccess.getCurrentContainer(currentRequest);
-        container.render(definitionName, currentRequest);
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/package.html
deleted file mode 100644
index ecdf30f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/servlet/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles servlet test package</title>
-</head>
-<body>
-Test servlet classes.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/ExceptionTool.java b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/ExceptionTool.java
deleted file mode 100644
index 5434cf8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/ExceptionTool.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-package org.apache.tiles.test.velocity;
-
-/**
- * Tool to generate exceptions.
- *
- * @version $Rev$ $Date$
- */
-public class ExceptionTool {
-
-    /**
-     * Throws an exception.
-     *
-     * @return Nothing.
-     */
-    public String throwRuntimeException() {
-        throw new RuntimeException("It is an exception!");
-    }
-}
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/package.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/package.html
deleted file mode 100644
index b0de056..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/java/org/apache/tiles/test/velocity/package.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-    <title>Tiles Velocity test package</title>
-</head>
-<body>
-Velocity tools and utilities.
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/META-INF/MANIFEST.MF b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/META-INF/MANIFEST.MF
deleted file mode 100644
index b479d32..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Archiver-Version: Plexus Archiver
-Created-By: Apache Maven
-Built-By: antonio
-Build-Jdk: 1.6.0_16
-Specification-Title: Tiles - Apps - Test
-Specification-Version: 2.2.1-SNAPSHOT
-Specification-Vendor: Apache Software Foundation
-Implementation-Title: Tiles - Apps - Test
-Implementation-Version: 2.2.1-SNAPSHOT
-Implementation-Vendor-Id: org.apache.tiles
-Implementation-Vendor: Apache Software Foundation
-Tiles-Initializer: org.apache.tiles.test.init.TestTilesInitializer
-
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/NOTICE.txt
deleted file mode 100644
index aef6d99..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-   Spring (http://www.springframework.org/).
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/classpath-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/classpath-defs.xml
deleted file mode 100644
index 459aa39..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/classpath-defs.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
-<!DOCTYPE tiles-definitions PUBLIC
-    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-    <definition name="classpath.definition" template="/layout.jsp">
-        <put-attribute name="title" value="This is the title."/>
-        <put-attribute name="header" value="/header.jsp"/>
-        <put-attribute name="body" value="/classpath.jsp"/>
-    </definition>
-</tiles-definitions>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/freemarker-classpath-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/freemarker-classpath-defs.xml
deleted file mode 100644
index f63b910..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/freemarker-classpath-defs.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
-<!DOCTYPE tiles-definitions PUBLIC
-    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-    <definition name="freemarker.classpath.definition" template="/freemarker/layout.ftl">
-        <put-attribute name="title" value="This is the title."/>
-        <put-attribute name="header" value="/freemarker/header.ftl"/>
-        <put-attribute name="body" value="/freemarker/classpath.ftl"/>
-    </definition>
-</tiles-definitions>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/test/db/schema.sql b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/test/db/schema.sql
deleted file mode 100644
index d79143e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/test/db/schema.sql
+++ /dev/null
@@ -1,146 +0,0 @@
-
-CREATE TABLE public.Definition (
-                id NUMERIC(12,0) NOT NULL,
-                name VARCHAR(255) NOT NULL,
-                preparer VARCHAR(1000) NULL,
-                template VARCHAR(1000) NULL,
-                Customization_id NUMERIC(12,0) NOT NULL,
-                parent_name VARCHAR(255) NULL,
-                CONSTRAINT Definition_pk PRIMARY KEY (id)
-);
-
-CREATE INDEX public.Definition_idx
- ON public.Definition
- ( name ASC );
-
-CREATE TABLE public.Attribute (
-                id NUMERIC(12,0) NOT NULL,
-                name VARCHAR(255) NOT NULL,
-                type VARCHAR(255) NULL,
-                value VARCHAR(1000) NOT NULL,
-                cascade_attribute BOOLEAN NOT NULL,
-                Definition_id NUMERIC(12,0) NULL,
-                Parent_id NUMERIC(12,0) NULL,
-                CONSTRAINT Attribute_pk PRIMARY KEY (id)
-);
-
-CREATE TABLE public.Role (
-                id NUMERIC(12,0) NOT NULL,
-                name VARCHAR(255) NOT NULL,
-                CONSTRAINT Role_pk PRIMARY KEY (id)
-);
-
-CREATE INDEX public.Role_idx
- ON public.Role
- ( name ASC );
-
-CREATE TABLE public.Customization (
-                id NUMERIC(12,0) NOT NULL,
-                Parent_id NUMERIC(12,0) NULL,
-                name VARCHAR(255) NOT NULL,
-                CONSTRAINT Customization_pk PRIMARY KEY (id)
-);
-
-CREATE INDEX public.Customization_idx
- ON public.Customization
- ( name ASC );
-
-CREATE INDEX public.Customization_idx1
- ON public.Customization
- ( name ASC );
-
-CREATE TABLE public.Visible_for (
-                Definition_id NUMERIC(12,0) NOT NULL,
-                Role_id NUMERIC(12,0) NOT NULL,
-                CONSTRAINT Visible_for_pk PRIMARY KEY (Definition_id, Role_id)
-);
-
-CREATE TABLE public.Attribute_visible_for (
-                Attribute_id NUMERIC(12,0) NOT NULL,
-                Role_id NUMERIC(12,0) NOT NULL,
-                CONSTRAINT Attribute_visible_for_pk PRIMARY KEY (Attribute_id, Role_id)
-);
-
-
-ALTER TABLE public.Attribute ADD CONSTRAINT Definition_Attribute_fk
-FOREIGN KEY (Definition_id)
-REFERENCES public.Definition (id)
-;
-
-
-ALTER TABLE public.Visible_for ADD CONSTRAINT Definition_Visible_for_fk
-FOREIGN KEY (Definition_id)
-REFERENCES public.Definition (id)
-;
-
-
-ALTER TABLE public.Attribute ADD CONSTRAINT Attribute_Attribute_fk
-FOREIGN KEY (Parent_id)
-REFERENCES public.Attribute (id)
-;
-
-
-ALTER TABLE public.Attribute_visible_for ADD CONSTRAINT Attribute_Attribute_visible_for_fk
-FOREIGN KEY (Attribute_id)
-REFERENCES public.Attribute (id)
-;
-
-
-ALTER TABLE public.Visible_for ADD CONSTRAINT Role_Visible_for_fk
-FOREIGN KEY (Role_id)
-REFERENCES public.Role (id)
-;
-
-
-ALTER TABLE public.Attribute_visible_for ADD CONSTRAINT Role_Attribute_visible_for_fk
-FOREIGN KEY (Role_id)
-REFERENCES public.Role (id)
-;
-
-
-ALTER TABLE public.Definition ADD CONSTRAINT Customization_Definition_fk
-FOREIGN KEY (Customization_id)
-REFERENCES public.Customization (id)
-;
-
-
-ALTER TABLE public.Customization ADD CONSTRAINT Customization_Customization_fk
-FOREIGN KEY (Parent_id)
-REFERENCES public.Customization (id)
-;
-
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (0,null,'');
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (1,0,'en');
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (2,1,'en_GB');
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (3,1,'en_US');
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (4,0,'fr');
-INSERT INTO "PUBLIC"."CUSTOMIZATION" (ID,PARENT_ID,NAME) VALUES (5,0,'it');
-
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (0,null,'test.localized.definition',null,'/layout.jsp',0);
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (2,null,'test.localized.definition',null,'/layout.jsp',2);
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (3,null,'test.localized.definition',null,'/layout.jsp',3);
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (4,null,'test.localized.definition',null,'/layout.jsp',4);
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (5,null,'test.localized.definition',null,'/layout.jsp',5);
-
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (0,'title',null,'Default locale',0,0,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (1,'header',null,'/header.jsp',0,0,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (2,'body',null,'/defaultlocale_db.jsp',0,0,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (3,'title',null,'British English locale',0,2,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (4,'header',null,'/header.jsp',0,2,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (5,'body',null,'/defaultlocale_db.jsp',0,2,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (6,'title',null,'American English locale',0,3,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (7,'header',null,'/header.jsp',0,3,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (8,'body',null,'/defaultlocale_db.jsp',0,3,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (9,'title',null,'French locale',0,4,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (10,'header',null,'/header.jsp',0,4,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (11,'body',null,'/defaultlocale_db.jsp',0,4,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (12,'title',null,'Italian locale',0,5,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (13,'header',null,'/header.jsp',0,5,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (14,'body',null,'/defaultlocale_db.jsp',0,5,null);
-
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (6,null,'test.definition',null,'/layout.jsp',0);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (15,'title',null,'This is the title.',0,6,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (16,'header',null,'/header.jsp',0,6,null);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (17,'body',null,'/body.jsp',0,6,null);
-INSERT INTO "PUBLIC"."DEFINITION" (ID,PARENT_NAME,NAME,PREPARER,TEMPLATE,CUSTOMIZATION_ID) VALUES (7,'test.definition','test.definition.extended',null,null,0);
-INSERT INTO "PUBLIC"."ATTRIBUTE" (ID,NAME,TYPE,VALUE,CASCADE_ATTRIBUTE,DEFINITION_ID,PARENT_ID) VALUES (18,'title',null,'This is an extended definition.',0,7,null);
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/velocity-classpath-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/velocity-classpath-defs.xml
deleted file mode 100644
index aba67d5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/resources/org/apache/tiles/velocity-classpath-defs.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
-<!DOCTYPE tiles-definitions PUBLIC
-    "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-    "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-    <definition name="velocity.classpath.definition" template="/velocity/layout.vm">
-        <put-attribute name="title" value="This is the title."/>
-        <put-attribute name="header" value="/velocity/header.vm"/>
-        <put-attribute name="body" value="/velocity/classpath.vm"/>
-    </definition>
-</tiles-definitions>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/VM_global_library.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/VM_global_library.vm
deleted file mode 100644
index 7e8277d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/VM_global_library.vm
+++ /dev/null
@@ -1,60 +0,0 @@
-## 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.
-
-## Display all queued Struts errors
-#macro (errorMarkup)
-    #if ($errors.exist() )
-        <ul>
-        #foreach ($e in $errors.all )
-            $e
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts errors for a particular property
-#macro (errorMarkupForProperty $property)
-    #if ($errors.exist($property) )
-        <ul>
-        #foreach ($er in $errors.get($property))
-            $er
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts errors
-#macro (messageMarkup)
-    #if ($messages.exist() )
-        <ul>
-        #foreach ($m in $messages.all )
-            $m
-        #end
-        </ul>
-    #end
-#end
-
-## Display all queued Struts action messages for a particular property
-#macro (messageMarkupForProperty $property)
-    #if ($messages.exist($property) )
-        <ul>
-        #foreach ($m in $messages.get($property))
-            $m
-        #end
-        </ul>
-    #end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs-1.1.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs-1.1.xml
deleted file mode 100644
index d32c6f1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs-1.1.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <definition name="freemarker.test.definition.old_format" template="/freemarker/layout.ftl">
-      <put name="title"  value="This is a definition configured in 1.1 format."/>
-      <put name="header" value="/freemarker/header.ftl"/>
-      <put name="body"   value="/freemarker/body.ftl"/>
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs.xml
deleted file mode 100644
index 6aa3095..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs.xml
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="freemarker.test.inner.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is a configured inner definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition.ignore" template="/freemarker/layout_ignore.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition.freemarker" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition.flush" template="/freemarker/layout_flush.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition.exception" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/exception.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.composite.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="freemarker.test.putAttributes" template="/freemarker/putattributeslayout.ftl" templateType="freemarker">
-    <put-attribute name="stringTest" value="This is a string" type="string" />
-    <put-list-attribute name="list">
-      <add-attribute value="valueOne" type="string" />
-      <add-attribute value="valueTwo" type="string" />
-      <add-attribute value="valueThree" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="freemarker.test.putAttributes.inherit" extends="freemarker.test.putAttributes">
-    <put-list-attribute name="list" inherit="true">
-      <add-attribute value="valueFour" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="freemarker.test.putAllAttributes" template="/freemarker/putallattributeslayout.ftl" templateType="freemarker">
-    <put-attribute name="one" value="There should be three more strings" type="string" />
-    <put-attribute name="two" value="One" type="string" />
-    <put-attribute name="three" value="Two" type="string" />
-    <put-attribute name="four" value="Three" type="string" />
-  </definition>
-
-  <definition name="freemarker.preparer.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-  </definition>
-
-    <definition name="freemarker.testdispatchservlet" extends="test.definition"/>
-
-  <definition name="freemarker.preparer.definition.configured" extends="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer" />
-
-  <definition name="freemarker.test.localized.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title" value="Default locale" />
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body" value="/freemarker/defaultlocale.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.definition.appears" extends="test.definition">
-      <put-attribute name="title"  value="This definition appears."/>
-  </definition>
-
-  <definition name="freemarker.test.definition.does_not_appear" extends="test.definition">
-      <put-attribute name="title"  value="This definition does
-       not appear."/>
-  </definition>
-
-  <definition name="freemarker.test.definition.appears.configured"
-    extends="test.definition.appears" role="goodrole" />
-
-  <definition name="freemarker.test.definition.does_not_appear.configured"
-    extends="test.definition.does_not_appear" role="badrole" />
-
-  <definition name="freemarker.test.definition.roles" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" role="goodrole" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" role="badrole" />
-  </definition>
-
-  <definition name="freemarker.test.definition.roles.tags" template="/freemarker/layout_roles.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <!-- Tests for cascaded attributes -->
-  <definition name="freemarker.test.overridden.cascaded.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/freemarker/alternate-header.ftl" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="freemarker.test.inner.cascadable.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.cascaded.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/freemarker/header.ftl" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.cascadable.definition"/>
-  </definition>
-
-  <definition name="freemarker.test.cascaded.template.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/freemarker/header.ftl" cascade="true"/>
-      <put-attribute name="body"   value="/freemarker/layout_nobody.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.cascaded.list.definition" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/freemarker/header.ftl" cascade="true"/>
-      <put-attribute name="body"   value="/freemarker/putattributeslayout.ftl" type="freemarker" />
-      <put-attribute name="stringTest" value="This is a string" type="string" cascade="true" />
-      <put-list-attribute name="list" cascade="true">
-        <add-attribute value="valueOne" type="string" />
-        <add-attribute value="valueTwo" type="string" />
-        <add-attribute value="valueThree" type="string" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="freemarker.test.reversed.definition" template="/freemarker/layout_alt_title.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title." type="reversed"/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.nesting.definitions" template="/freemarker/layout.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body">
-          <definition template="/freemarker/layout.ftl" templateType="freemarker">
-              <put-attribute name="title"  value="This is a nested definition."/>
-              <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-              <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-          </definition>
-      </put-attribute>
-  </definition>
-
-  <definition name="freemarker.test.nesting.list.definitions" template="/freemarker/layout_list.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-list-attribute name="list">
-          <add-attribute>
-              <definition template="/freemarker/layout.ftl" templateType="freemarker">
-                  <put-attribute name="title"  value="This is a nested definition."/>
-                  <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-                  <put-attribute name="body"   value="/freemarker/body.ftl" type="freemarker" />
-              </definition>
-          </add-attribute>
-      </put-list-attribute>
-  </definition>
-
-  <definition name="freemarker.test.composite.el.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   expression="${requestScope.body}"/>
-  </definition>
-
-  <definition name="freemarker.test.composite.mvel.definition" templateExpression="MVEL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   expression="MVEL:requestScope.body"/>
-  </definition>
-
-  <definition name="freemarker.test.composite.ognl.definition" templateExpression="OGNL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   expression="OGNL:requestScope.body"/>
-  </definition>
-
-  <definition name="freemarker.test.composite.el.doNotShow.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured definition."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   expression="${requestScope.doNotShowBody}"/>
-  </definition>
-
-  <definition name="freemarker.test.definition.attribute.preparer" template="/freemarker/layout_preparer.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.openbody.definition" template="/freemarker/layout_closebody.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/freemarker/header.ftl" type="freemarker" />
-      <put-attribute name="body"   value="/freemarker/layout.ftl" type="freemarker" />
-  </definition>
-
-  <definition name="freemarker.test.defaultvalues.definition" template="/freemarker/layout_default.ftl" templateType="freemarker">
-      <put-attribute name="title"  value="This is the title."/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_GB.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_GB.xml
deleted file mode 100644
index 7f9543c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_GB.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="freemarker.test.localized.definition" template="/freemarker/layout.ftl">
-      <put-attribute name="title" value="British English locale" />
-      <put-attribute name="header" value="/freemarker/header.ftl" />
-      <put-attribute name="body" value="/freemarker/defaultlocale.ftl" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_US.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_US.xml
deleted file mode 100644
index aa15c32..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_en_US.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="freemarker.test.localized.definition" template="/freemarker/layout.ftl">
-      <put-attribute name="title" value="American English locale" />
-      <put-attribute name="header" value="/freemarker/header.ftl" />
-      <put-attribute name="body" value="/freemarker/defaultlocale.ftl" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_fr.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_fr.xml
deleted file mode 100644
index 5eb394e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_fr.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="freemarker.test.localized.definition" template="/freemarker/layout.ftl">
-      <put-attribute name="title" value="French locale" />
-      <put-attribute name="header" value="/freemarker/header.ftl" />
-      <put-attribute name="body" value="/freemarker/defaultlocale.ftl" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_it.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_it.xml
deleted file mode 100644
index 79b0c69..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/freemarker/tiles-defs_it.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="freemarker.test.localized.definition" template="/freemarker/layout.ftl">
-      <put-attribute name="title" value="Italian locale" />
-      <put-attribute name="header" value="/freemarker/header.ftl" />
-      <put-attribute name="body" value="/freemarker/defaultlocale.ftl" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/index.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/index.jsp
deleted file mode 100644
index 3f3f0ae..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/index.jsp
+++ /dev/null
@@ -1,43 +0,0 @@
-<%@ page language="java" contentType="text/html; charset=UTF-8"
-    pageEncoding="UTF-8"%>
-<%@taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<portlet:defineObjects/>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Insert title here</title>
-</head>
-<body>
-<p>Type a definition name to render it.</p>
-<form action="<portlet:actionURL name='showDefinition' />" method="post">
-	<label for="definitionName">Definition name:</label><input id="definitionName" type="text" name="definition" />
-	<input type="submit" value="Render" />
-</form>
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/nosuchdefinition.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/nosuchdefinition.jsp
deleted file mode 100644
index 8f6490f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/jsp/nosuchdefinition.jsp
+++ /dev/null
@@ -1,35 +0,0 @@
-<%@ page language="java" contentType="text/html; charset=UTF-8"
-    pageEncoding="UTF-8"%>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Insert title here</title>
-</head>
-<body>
-No definition here!
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/portlet.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/portlet.xml
deleted file mode 100644
index cfc28d8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/portlet.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<portlet-app
-  xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
-  version="2.0">
-
-  <portlet>
-    <portlet-name>TestPortlet</portlet-name>
-    <display-name>TestPortlet</display-name>
-    <portlet-class>
-      org.apache.tiles.test.portlet.TestPortlet
-    </portlet-class>
-    <supports>
-      <mime-type>text/html</mime-type>
-      <portlet-mode>VIEW</portlet-mode>
-    </supports>
-    <portlet-info>
-      <title>TestPortlet</title>
-    </portlet-info>
-  </portlet>
-</portlet-app>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs-1.1.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs-1.1.xml
deleted file mode 100644
index 71f49fd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs-1.1.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <definition name="test.definition.old_format" template="/layout.jsp">
-      <put name="title"  value="This is a definition configured in 1.1 format."/>
-      <put name="header" value="/header.jsp"/>
-      <put name="body"   value="/body.jsp"/>
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs.xml
deleted file mode 100644
index 32411b7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs.xml
+++ /dev/null
@@ -1,264 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="test.inner.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is a configured inner definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.definition.ignore" template="/layout_ignore.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.definition.freemarker" template="/layout.ftl">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.definition.flush" template="/layout_flush.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.definition.exception" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/exception.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.composite.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="test.putAttributes" template="/putattributeslayout.jsp">
-    <put-attribute name="stringTest" value="This is a string" type="string" />
-    <put-list-attribute name="list">
-      <add-attribute value="valueOne" type="string" />
-      <add-attribute value="valueTwo" type="string" />
-      <add-attribute value="valueThree" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="test.putAttributes.inherit" extends="test.putAttributes">
-    <put-list-attribute name="list" inherit="true">
-      <add-attribute value="valueFour" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="test.putAttributes.inherit" extends="test.putAttributes">
-    <put-list-attribute name="list" inherit="true">
-      <add-attribute value="valueFour" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="test.putAttributes.inherit" extends="test.putAttributes">
-    <put-list-attribute name="list" inherit="true">
-      <add-attribute value="valueFour" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="test.putAllAttributes" template="/putallattributeslayout.jsp">
-    <put-attribute name="one" value="There should be three more strings" type="string" />
-    <put-attribute name="two" value="One" type="string" />
-    <put-attribute name="three" value="Two" type="string" />
-    <put-attribute name="four" value="Three" type="string" />
-  </definition>
-
-  <definition name="preparer.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-  </definition>
-
-    <definition name="testdispatchservlet" extends="test.definition"/>
-
-  <definition name="preparer.definition.configured" extends="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer" />
-
-  <definition name="test.localized.definition" template="/layout.jsp">
-      <put-attribute name="title" value="Default locale" />
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body" value="/defaultlocale.jsp" />
-  </definition>
-
-  <definition name="test.definition.appears" extends="test.definition">
-      <put-attribute name="title"  value="This definition appears."/>
-  </definition>
-
-  <definition name="test.definition.does_not_appear" extends="test.definition">
-      <put-attribute name="title"  value="This definition does
-       not appear."/>
-  </definition>
-
-  <definition name="test.definition.appears.configured"
-    extends="test.definition.appears" role="goodrole" />
-
-  <definition name="test.definition.does_not_appear.configured"
-    extends="test.definition.does_not_appear" role="badrole" />
-
-  <definition name="test.definition.roles" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp" role="goodrole" />
-      <put-attribute name="body"   value="/body.jsp" role="badrole" />
-  </definition>
-
-  <definition name="test.definition.roles.tags" template="/layout_roles.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body"   value="/body.jsp" />
-  </definition>
-
-  <!-- Tests for cascaded attributes -->
-  <definition name="test.overridden.cascaded.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/alternate-header.jsp" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="test.inner.cascadable.definition" template="/layout.jsp">
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.cascaded.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/header.jsp" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.cascadable.definition"/>
-  </definition>
-
-  <definition name="test.cascaded.template.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/header.jsp" cascade="true"/>
-      <put-attribute name="body"   value="/layout_nobody.jsp"/>
-  </definition>
-
-  <definition name="test.cascaded.list.definition" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/header.jsp" cascade="true"/>
-      <put-attribute name="body"   value="/putattributeslayout.jsp"/>
-      <put-attribute name="stringTest" value="This is a string" type="string" cascade="true" />
-      <put-list-attribute name="list" cascade="true">
-        <add-attribute value="valueOne" type="string" />
-        <add-attribute value="valueTwo" type="string" />
-        <add-attribute value="valueThree" type="string" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.reversed.definition" template="/layout_alt_title.jsp">
-      <put-attribute name="title"  value="This is the title." type="reversed"/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/body.jsp"/>
-  </definition>
-
-  <definition name="test.nesting.definitions" template="/layout.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body">
-          <definition template="/layout.jsp">
-              <put-attribute name="title"  value="This is a nested definition."/>
-              <put-attribute name="header" value="/header.jsp"/>
-              <put-attribute name="body"   value="/body.jsp"/>
-          </definition>
-      </put-attribute>
-  </definition>
-
-  <definition name="test.nesting.list.definitions" template="/layout_list.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-list-attribute name="list">
-          <add-attribute>
-              <definition template="/layout.jsp">
-                  <put-attribute name="title"  value="This is a nested definition."/>
-                  <put-attribute name="header" value="/header.jsp"/>
-                  <put-attribute name="body"   value="/body.jsp"/>
-              </definition>
-          </add-attribute>
-      </put-list-attribute>
-  </definition>
-
-  <definition name="test.composite.el.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="${requestScope.body}"/>
-  </definition>
-
-  <definition name="test.composite.mvel.definition" templateExpression="MVEL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="MVEL:requestScope.body"/>
-  </definition>
-
-  <definition name="test.composite.ognl.definition" templateExpression="OGNL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="OGNL:requestScope.body"/>
-  </definition>
-
-  <definition name="test.composite.el.doNotShow.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured definition."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   expression="${requestScope.doNotShowBody}"/>
-  </definition>
-
-  <definition name="test.definition.attribute.preparer" template="/layout_preparer.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-  </definition>
-
-  <definition name="test.openbody.definition" template="/layout_closebody.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/header.jsp"/>
-      <put-attribute name="body"   value="/layout.jsp" />
-  </definition>
-
-  <definition name="test.defaultvalues.definition" template="/layout_default.jsp">
-      <put-attribute name="title"  value="This is the title."/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_GB.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_GB.xml
deleted file mode 100644
index ccac30a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_GB.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.localized.definition" template="/layout.jsp">
-      <put-attribute name="title" value="British English locale" />
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body" value="/defaultlocale.jsp" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_US.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_US.xml
deleted file mode 100644
index 8c5090f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_en_US.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.localized.definition" template="/layout.jsp">
-      <put-attribute name="title" value="American English locale" />
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body" value="/defaultlocale.jsp" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_fr.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_fr.xml
deleted file mode 100644
index 2a4e83d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_fr.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.localized.definition" template="/layout.jsp">
-      <put-attribute name="title" value="French locale" />
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body" value="/defaultlocale.jsp" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_it.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_it.xml
deleted file mode 100644
index bc8db02..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tiles-defs_it.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="test.localized.definition" template="/layout.jsp">
-      <put-attribute name="title" value="Italian locale" />
-      <put-attribute name="header" value="/header.jsp" />
-      <put-attribute name="body" value="/defaultlocale.jsp" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml
deleted file mode 100644
index 3a07bf4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/tools.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0"?>
-<!--
- 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.
--->
-<tools>
-  <toolbox scope="request">
-    <tool key="exc" class="org.apache.tiles.test.velocity.ExceptionTool"/>
-    <tool class="org.apache.velocity.tools.generic.ContextTool"/>
-  </toolbox>
-  <toolbox scope="application">
-     <tool class="org.apache.velocity.tools.generic.EscapeTool"/>
-   </toolbox>
-</tools>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity.properties b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity.properties
deleted file mode 100644
index 805a9e4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity.properties
+++ /dev/null
@@ -1,129 +0,0 @@
-# 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.
-
-# ----------------------------------------------------------------------------
-# These are the default properties for the
-# Velocity Runtime. These values are used when
-# Runtime.init() is called, and when Runtime.init(properties)
-# fails to find the specificed properties file.
-# ----------------------------------------------------------------------------
-
-
-# ----------------------------------------------------------------------------
-# R U N T I M E  L O G
-# ----------------------------------------------------------------------------
-# Velocity uses the Servlet APIs logging facilites.
-
-# ----------------------------------------------------------------------------
-# This controls if Runtime.error(), info() and warn() messages include the
-# whole stack trace. The last property controls whether invalid references
-# are logged.
-# ----------------------------------------------------------------------------
-
-runtime.log.invalid.reference = true
-
-
-# ----------------------------------------------------------------------------
-# T E M P L A T E  E N C O D I N G
-# ----------------------------------------------------------------------------
-
-input.encoding=ISO-8859-1
-output.encoding=ISO-8859-1
-
-
-# ----------------------------------------------------------------------------
-# F O R E A C H  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-# These properties control how the counter is accessed in the #foreach
-# directive. By default the reference $velocityCount will be available
-# in the body of the #foreach directive. The default starting value
-# for this reference is 1.
-# ----------------------------------------------------------------------------
-
-directive.foreach.counter.name = velocityCount
-directive.foreach.counter.initial.value = 1
-
-
-# ----------------------------------------------------------------------------
-# I N C L U D E  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-# These are the properties that governed the way #include'd content
-# is governed.
-# ----------------------------------------------------------------------------
-
-directive.include.output.errormsg.start = <!-- include error :
-directive.include.output.errormsg.end   =  see error log -->
-
-
-# ----------------------------------------------------------------------------
-# P A R S E  P R O P E R T I E S
-# ----------------------------------------------------------------------------
-
-directive.parse.max.depth = 10
-
-
-# ----------------------------------------------------------------------------
-# VELOCIMACRO PROPERTIES
-# ----------------------------------------------------------------------------
-# global : name of default global library.  It is expected to be in the regular
-# template path.  You may remove it (either the file or this property) if
-# you wish with no harm.
-# ----------------------------------------------------------------------------
-# dev-changes by Marino
-resource.loader=class, webapp, string
-
-class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
-
-webapp.resource.loader.cache = true
-webapp.resource.loader.modificationCheckInterval = 5
-velocimacro.library.autoreload = false
-velocimacro.library = /WEB-INF/VM_global_library.vm
-
-velocimacro.permissions.allow.inline = true
-velocimacro.permissions.allow.inline.to.replace.global = false
-velocimacro.permissions.allow.inline.local.scope = false
-
-velocimacro.context.localscope = false
-
-# ----------------------------------------------------------------------------
-# INTERPOLATION
-# ----------------------------------------------------------------------------
-# turn off and on interpolation of references and directives in string
-# literals.  ON by default :)
-# ----------------------------------------------------------------------------
-runtime.interpolate.string.literals = true
-
-
-# ----------------------------------------------------------------------------
-# RESOURCE MANAGEMENT
-# ----------------------------------------------------------------------------
-# Allows alternative ResourceManager and ResourceCache implementations
-# to be plugged in.
-# ----------------------------------------------------------------------------
-resource.manager.class = org.apache.velocity.runtime.resource.ResourceManagerImpl
-resource.manager.cache.class = org.apache.velocity.runtime.resource.ResourceCacheImpl
-
-userdirective=org.apache.tiles.velocity.template.AddAttributeDirective,\
-  org.apache.tiles.velocity.template.AddListAttributeDirective,\
-  org.apache.tiles.velocity.template.DefinitionDirective,\
-  org.apache.tiles.velocity.template.GetAsStringDirective,\
-  org.apache.tiles.velocity.template.ImportAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertDefinitionDirective,\
-  org.apache.tiles.velocity.template.InsertTemplateDirective,\
-  org.apache.tiles.velocity.template.PutAttributeDirective,\
-  org.apache.tiles.velocity.template.PutListAttributeDirective
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs-1.1.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs-1.1.xml
deleted file mode 100644
index 32b5b3d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs-1.1.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
-       "http://struts.apache.org/dtds/tiles-config_1_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <definition name="velocity.test.definition.old_format" template="/velocity/layout.vm">
-      <put name="title"  value="This is a definition configured in 1.1 format."/>
-      <put name="header" value="/velocity/header.vm"/>
-      <put name="body"   value="/velocity/body.vm"/>
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs.xml
deleted file mode 100644
index c2b974c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs.xml
+++ /dev/null
@@ -1,252 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-
-  <!-- =======================================================  -->
-  <!-- Master definition  									-->
-  <!-- =======================================================  -->
-
-  <!-- Doc index page description  -->
-  <definition name="velocity.test.inner.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is a configured inner definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition.ignore" template="/velocity/layout_ignore.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition.velocity" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition.flush" template="/velocity/layout_flush.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition.exception" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/exception.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.composite.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="velocity.test.putAttributes" template="/velocity/putattributeslayout.vm" templateType="velocity">
-    <put-attribute name="stringTest" value="This is a string" type="string" />
-    <put-list-attribute name="list">
-      <add-attribute value="valueOne" type="string" />
-      <add-attribute value="valueTwo" type="string" />
-      <add-attribute value="valueThree" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="velocity.test.putAttributes.inherit" extends="velocity.test.putAttributes">
-    <put-list-attribute name="list" inherit="true">
-      <add-attribute value="valueFour" type="string" />
-    </put-list-attribute>
-  </definition>
-
-  <definition name="velocity.test.putAllAttributes" template="/velocity/putallattributeslayout.vm" templateType="velocity">
-    <put-attribute name="one" value="There should be three more strings" type="string" />
-    <put-attribute name="two" value="One" type="string" />
-    <put-attribute name="three" value="Two" type="string" />
-    <put-attribute name="four" value="Three" type="string" />
-  </definition>
-
-  <definition name="velocity.preparer.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-  </definition>
-
-    <definition name="velocity.testdispatchservlet" extends="test.definition"/>
-
-  <definition name="velocity.preparer.definition.configured" extends="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer" />
-
-  <definition name="velocity.test.localized.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title" value="Default locale" />
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body" value="/velocity/defaultlocale.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.definition.appears" extends="test.definition">
-      <put-attribute name="title"  value="This definition appears."/>
-  </definition>
-
-  <definition name="velocity.test.definition.does_not_appear" extends="test.definition">
-      <put-attribute name="title"  value="This definition does
-       not appear."/>
-  </definition>
-
-  <definition name="velocity.test.definition.appears.configured"
-    extends="test.definition.appears" role="goodrole" />
-
-  <definition name="velocity.test.definition.does_not_appear.configured"
-    extends="test.definition.does_not_appear" role="badrole" />
-
-  <definition name="velocity.test.definition.roles" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" role="goodrole" />
-      <put-attribute name="body"   value="/velocity/body.vm" role="badrole" />
-  </definition>
-
-  <definition name="velocity.test.definition.roles.tags" template="/velocity/layout_roles.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <!-- Tests for cascaded attributes -->
-  <definition name="velocity.test.overridden.cascaded.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/velocity/alternate-header.vm" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.definition"/>
-  </definition>
-
-  <definition name="velocity.test.inner.cascadable.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.cascaded.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/velocity/header.vm" cascade="true"/>
-      <put-attribute name="body"   value="test.inner.cascadable.definition"/>
-  </definition>
-
-  <definition name="velocity.test.cascaded.template.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/velocity/header.vm" cascade="true"/>
-      <put-attribute name="body"   value="/velocity/layout_nobody.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.cascaded.list.definition" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title." cascade="true" />
-      <put-attribute name="header" value="/velocity/header.vm" cascade="true"/>
-      <put-attribute name="body"   value="/velocity/putattributeslayout.vm" type="velocity" />
-      <put-attribute name="stringTest" value="This is a string" type="string" cascade="true" />
-      <put-list-attribute name="list" cascade="true">
-        <add-attribute value="valueOne" type="string" />
-        <add-attribute value="valueTwo" type="string" />
-        <add-attribute value="valueThree" type="string" />
-      </put-list-attribute>
-  </definition>
-
-  <definition name="velocity.test.reversed.definition" template="/velocity/layout_alt_title.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title." type="reversed"/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.nesting.definitions" template="/velocity/layout.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body">
-          <definition template="/velocity/layout.vm" templateType="velocity">
-              <put-attribute name="title"  value="This is a nested definition."/>
-              <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-              <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-          </definition>
-      </put-attribute>
-  </definition>
-
-  <definition name="velocity.test.nesting.list.definitions" template="/velocity/layout_list.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-list-attribute name="list">
-          <add-attribute>
-              <definition template="/velocity/layout.vm" templateType="velocity">
-                  <put-attribute name="title"  value="This is a nested definition."/>
-                  <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-                  <put-attribute name="body"   value="/velocity/body.vm" type="velocity" />
-              </definition>
-          </add-attribute>
-      </put-list-attribute>
-  </definition>
-
-  <definition name="velocity.test.composite.el.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   expression="${requestScope.body}"/>
-  </definition>
-
-  <definition name="velocity.test.composite.mvel.definition" templateExpression="MVEL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   expression="MVEL:requestScope.body"/>
-  </definition>
-
-  <definition name="velocity.test.composite.ognl.definition" templateExpression="OGNL:layout"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured composite definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   expression="OGNL:requestScope.body"/>
-  </definition>
-
-  <definition name="velocity.test.composite.el.doNotShow.definition" templateExpression="${layout}"
-        preparer="org.apache.tiles.test.preparer.RequestSettingViewPreparer">
-      <put-attribute name="title"  value="This is a configured definition."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   expression="${requestScope.doNotShowBody}"/>
-  </definition>
-
-  <definition name="velocity.test.definition.attribute.preparer" template="/velocity/layout_preparer.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.openbody.definition" template="/velocity/layout_closebody.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-      <put-attribute name="header" value="/velocity/header.vm" type="velocity" />
-      <put-attribute name="body"   value="/velocity/layout.vm" type="velocity" />
-  </definition>
-
-  <definition name="velocity.test.defaultvalues.definition" template="/velocity/layout_default.vm" templateType="velocity">
-      <put-attribute name="title"  value="This is the title."/>
-  </definition>
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_GB.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_GB.xml
deleted file mode 100644
index c274737..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_GB.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="velocity.test.localized.definition" template="/velocity/layout.vm">
-      <put-attribute name="title" value="British English locale" />
-      <put-attribute name="header" value="/velocity/header.vm" />
-      <put-attribute name="body" value="/velocity/defaultlocale.vm" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_US.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_US.xml
deleted file mode 100644
index b43699f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_en_US.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="velocity.test.localized.definition" template="/velocity/layout.vm">
-      <put-attribute name="title" value="American English locale" />
-      <put-attribute name="header" value="/velocity/header.vm" />
-      <put-attribute name="body" value="/velocity/defaultlocale.vm" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_fr.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_fr.xml
deleted file mode 100644
index 5a64c76..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_fr.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="velocity.test.localized.definition" template="/velocity/layout.vm">
-      <put-attribute name="title" value="French locale" />
-      <put-attribute name="header" value="/velocity/header.vm" />
-      <put-attribute name="body" value="/velocity/defaultlocale.vm" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_it.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_it.xml
deleted file mode 100644
index 0280c33..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/velocity/tiles-defs_it.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
- <!DOCTYPE tiles-definitions PUBLIC
-       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
-       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
-
-<!-- Definitions for Tiles documentation   -->
-
-<tiles-definitions>
-  <definition name="velocity.test.localized.definition" template="/velocity/layout.vm">
-      <put-attribute name="title" value="Italian locale" />
-      <put-attribute name="header" value="/velocity/header.vm" />
-      <put-attribute name="body" value="/velocity/defaultlocale.vm" />
-  </definition>
-
-</tiles-definitions>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/web.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index efb53c1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-         version="2.5">
-
-    <display-name>Tiles Test Application</display-name>
-    <distributable/>
-
-    <listener>
-      <listener-class>org.apache.tiles.test.init.InitContextListener</listener-class>
-    </listener>
-    <listener>
-      <listener-class>org.apache.tiles.extras.module.ModularTilesListener</listener-class>
-    </listener>
-    <filter>
-        <filter-name>Tiles Decoration Filter</filter-name>
-        <filter-class>org.apache.tiles.web.util.TilesDecorationFilter</filter-class>
-        <init-param>
-            <param-name>definition</param-name>
-            <param-value>test.definition</param-value>
-        </init-param>
-        <init-param>
-            <param-name>attribute-name</param-name>
-            <param-value>body</param-value>
-        </init-param>
-    </filter>
-
-    <filter>
-        <filter-name>Security Wrapping Filter</filter-name>
-        <filter-class>org.apache.tiles.test.filter.SecurityWrappingFilter</filter-class>
-    </filter>
-
-    <filter-mapping>
-        <filter-name>Tiles Decoration Filter</filter-name>
-        <url-pattern>/testdecorationfilter.jsp</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>Tiles Decoration Filter</filter-name>
-        <url-pattern>/freemarker/testdecorationfilter.ftl</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>Tiles Decoration Filter</filter-name>
-        <url-pattern>/velocity/testdecorationfilter.vm</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <filter-mapping>
-        <filter-name>Security Wrapping Filter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-    </filter-mapping>
-
-    <!-- Standard Action Servlet Configuration -->
-    <servlet>
-        <servlet-name>freemarker</servlet-name>
-        <servlet-class>org.apache.tiles.request.freemarker.servlet.SharedVariableLoaderFreemarkerServlet</servlet-class>
-
-        <!-- FreemarkerServlet settings: -->
-        <init-param>
-            <param-name>TemplatePath</param-name>
-            <param-value>/</param-value>
-        </init-param>
-        <init-param>
-            <param-name>NoCache</param-name>
-            <param-value>true</param-value>
-        </init-param>
-        <init-param>
-            <param-name>ContentType</param-name>
-            <param-value>text/html</param-value>
-        </init-param>
-
-        <!-- FreeMarker settings: -->
-        <init-param>
-            <param-name>template_update_delay</param-name>
-            <param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
-        </init-param>
-        <init-param>
-            <param-name>default_encoding</param-name>
-            <param-value>ISO-8859-1</param-value>
-        </init-param>
-        <init-param>
-            <param-name>number_format</param-name>
-            <param-value>0.##########</param-value>
-        </init-param>
-        <init-param>
-            <param-name>org.apache.tiles.request.freemarker.CUSTOM_SHARED_VARIABLE_FACTORIES</param-name>
-            <param-value>tiles,org.apache.tiles.freemarker.TilesSharedVariableFactory</param-value>
-        </init-param>
-
-        <load-on-startup>5</load-on-startup>
-    </servlet>
-
-    <servlet>
-      <servlet-name>velocity</servlet-name>
-      <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-class>
-
-      <!--
-        Unless you plan to put your tools.xml and velocity.properties under
-        different folders or give them different names, then these two
-        init-params are unnecessary. The VelocityViewServlet will
-        automatically look for these files in the following locations.
-      -->
-      <init-param>
-        <param-name>org.apache.velocity.toolbox</param-name>
-        <param-value>/WEB-INF/tools.xml</param-value>
-      </init-param>
-
-      <init-param>
-        <param-name>org.apache.velocity.properties</param-name>
-        <param-value>/WEB-INF/velocity.properties</param-value>
-      </init-param>
-    </servlet>
-
-
-    <servlet>
-        <servlet-name>Tiles Dispatch Servlet</servlet-name>
-        <servlet-class>org.apache.tiles.web.util.TilesDispatchServlet</servlet-class>
-    </servlet>
-
-    <!-- Standard Action Servlet Configuration -->
-    <servlet>
-        <servlet-name>layoutServlet</servlet-name>
-        <servlet-class>org.apache.tiles.test.servlet.IncludingServlet</servlet-class>
-        <init-param>
-            <param-name>include</param-name>
-            <param-value>/layout.jsp</param-value>
-        </init-param>
-        <init-param>
-            <param-name>errorInclude</param-name>
-            <param-value>/errorInclude.jsp</param-value>
-        </init-param>
-    </servlet>
-    <servlet>
-        <servlet-name>selectLocaleServlet</servlet-name>
-        <servlet-class>org.apache.tiles.test.servlet.SelectLocaleServlet</servlet-class>
-        <init-param>
-            <param-name>org.apache.tiles.test.servlet.ServletConfig.DEFINITION_NAME</param-name>
-            <param-value>test.localized.definition</param-value>
-        </init-param>
-    </servlet>
-    <servlet>
-        <servlet-name>selectLocaleServletDb</servlet-name>
-        <servlet-class>org.apache.tiles.test.servlet.SelectLocaleServlet</servlet-class>
-        <init-param>
-            <param-name>org.apache.tiles.test.servlet.ServletConfig.DEFINITION_NAME</param-name>
-            <param-value>test.localized.definition</param-value>
-        </init-param>
-        <init-param>
-            <param-name>org.apache.tiles.test.servlet.ServletConfig.CONTAINER_KEY</param-name>
-            <param-value>db</param-value>
-        </init-param>
-    </servlet>
-    <servlet>
-        <servlet-name>selectLocaleServletFreemarker</servlet-name>
-        <servlet-class>org.apache.tiles.test.servlet.SelectLocaleServlet</servlet-class>
-        <init-param>
-            <param-name>org.apache.tiles.test.servlet.ServletConfig.DEFINITION_NAME</param-name>
-            <param-value>freemarker.test.localized.definition</param-value>
-        </init-param>
-    </servlet>
-    <servlet>
-        <servlet-name>selectLocaleServletVelocity</servlet-name>
-        <servlet-class>org.apache.tiles.test.servlet.SelectLocaleServlet</servlet-class>
-        <init-param>
-            <param-name>org.apache.tiles.test.servlet.ServletConfig.DEFINITION_NAME</param-name>
-            <param-value>velocity.test.localized.definition</param-value>
-        </init-param>
-    </servlet>
-
-    <welcome-file-list>
-        <welcome-file>index.jsp</welcome-file>
-    </welcome-file-list>
-
-    <servlet-mapping>
-        <servlet-name>freemarker</servlet-name>
-        <url-pattern>*.ftl</url-pattern>
-    </servlet-mapping>
-    <servlet-mapping>
-        <servlet-name>layoutServlet</servlet-name>
-        <url-pattern>/servlets/layoutServlet</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>selectLocaleServlet</servlet-name>
-        <url-pattern>/servlets/selectLocaleServlet</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>selectLocaleServletDb</servlet-name>
-        <url-pattern>/servlets/selectLocaleServletDb</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>selectLocaleServletFreemarker</servlet-name>
-        <url-pattern>/freemarker/servlets/selectLocaleServlet</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>selectLocaleServletVelocity</servlet-name>
-        <url-pattern>/velocity/servlets/selectLocaleServlet</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>velocity</servlet-name>
-        <url-pattern>*.vm</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>Tiles Dispatch Servlet</servlet-name>
-        <url-pattern>*.tiles</url-pattern>
-    </servlet-mapping>
-</web-app>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/alternate-header.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/alternate-header.jsp
deleted file mode 100644
index f03f1b7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/alternate-header.jsp
+++ /dev/null
@@ -1,26 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<strong>This is the alternate header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/body.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/body.jsp
deleted file mode 100644
index a99227c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/body.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<div align="center"><b><i>This is a body</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/classpath.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/classpath.jsp
deleted file mode 100644
index 01f9463..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/classpath.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<div align="center"><b><i>This tile was loaded from the classpath</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale.jsp
deleted file mode 100644
index b74fd94..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<div align="center"><b><i>
-<div id="defaultLocaleMessage">Your default Locale is <%=request.getLocale().toString() %></div>
-</i></b></div>
-<a href="../selectlocale.jsp">Select another locale</a>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale_db.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale_db.jsp
deleted file mode 100644
index bd1b73c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/defaultlocale_db.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<div align="center"><b><i>
-<div id="defaultLocaleMessage">Your default Locale is <%=request.getLocale().toString() %></div>
-</i></b></div>
-<a href="../selectlocale_db.jsp">Select another locale</a>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/errorInclude.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/errorInclude.jsp
deleted file mode 100644
index 4a2deb3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/errorInclude.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-The "force include" attribute has not been set.
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/exception.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/exception.jsp
deleted file mode 100644
index 2672be2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/exception.jsp
+++ /dev/null
@@ -1,26 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<strong>This throws an exception</strong>
-<% throw new Exception("This is a test exception"); %>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/alternate-header.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/alternate-header.ftl
deleted file mode 100644
index abd9e7c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/alternate-header.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<strong>This is the alternate header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/body.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/body.ftl
deleted file mode 100644
index fed2a6a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/body.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>This is a body</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/classpath.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/classpath.ftl
deleted file mode 100644
index 20f3e88..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/classpath.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>This tile was loaded from the classpath</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale.ftl
deleted file mode 100644
index b7f795c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale.ftl
+++ /dev/null
@@ -1,27 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>
-<div id="defaultLocaleMessage">Your default Locale is ${.locale}</div>
-</i></b></div>
-<a href="../selectlocale.ftl">Select another locale</a>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale_db.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale_db.ftl
deleted file mode 100644
index 0fd285d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/defaultlocale_db.ftl
+++ /dev/null
@@ -1,27 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>
-<div id="defaultLocaleMessage">Your default Locale is <%=request.getLocale().toString() %></div>
-</i></b></div>
-<a href="../selectlocale_db.ftl">Select another locale</a>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/errorInclude.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/errorInclude.ftl
deleted file mode 100644
index 393fc72..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/errorInclude.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-The "force include" attribute has not been set.
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/exception.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/exception.ftl
deleted file mode 100644
index 4b8fba9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/exception.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<strong>This throws an exception</strong>
-<#assign testValue=1/0 />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/header.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/header.ftl
deleted file mode 100644
index c17e62d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/header.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<strong>This is the header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout.ftl
deleted file mode 100644
index 403c96b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutOne.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutOne.ftl
deleted file mode 100644
index 60208d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutOne.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout one.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutTwo.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutTwo.ftl
deleted file mode 100644
index 1e17428..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layoutTwo.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout two.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_alt_title.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_alt_title.ftl
deleted file mode 100644
index 4b485de..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_alt_title.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.insertAttribute name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_closebody.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_closebody.ftl
deleted file mode 100644
index 71e9133..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_closebody.ftl
+++ /dev/null
@@ -1,40 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td>
-    <@tiles.insertAttribute name="body">
-        <@tiles.putAttribute name="title"  value="This is a customized context" />
-        <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-        <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-    </@tiles.insertAttribute>
-    </td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_default.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_default.ftl
deleted file mode 100644
index 54b806a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_default.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.insertAttribute name="title" defaultValue="This is the default title."/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header" defaultValue="alternate-header.ftl" defaultValueType="template"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body" defaultValue="This is the default body in the tag."/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_flush.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_flush.ftl
deleted file mode 100644
index 129b778..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_flush.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header" flush=true/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body" flush=true/></td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_ignore.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_ignore.ftl
deleted file mode 100644
index e6b39d7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_ignore.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header" ignore=true /></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_list.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_list.ftl
deleted file mode 100644
index 09e434b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_list.ftl
+++ /dev/null
@@ -1,39 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td>
-        <@tiles.importAttribute name="list"/>
-        <#list list as attribute>
-            <@tiles.insertAttribute value=attribute />
-        </#list>
-    </td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_nobody.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_nobody.ftl
deleted file mode 100644
index a1e1cc9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_nobody.ftl
+++ /dev/null
@@ -1,31 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_override.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_override.ftl
deleted file mode 100644
index 7f16827..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_override.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Green"><strong>This is the overridden template.</strong></td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_preparer.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_preparer.ftl
deleted file mode 100644
index e8c83a3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_preparer.ftl
+++ /dev/null
@@ -1,35 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"
-        preparer="org.apache.tiles.test.preparer.AttributeViewPreparer"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_roles.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_roles.ftl
deleted file mode 100644
index c72e7ba..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/layout_roles.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header" role="goodrole"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body" role="badrole"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/override.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/override.ftl
deleted file mode 100644
index 79640d7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/override.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<div align="center"><b><i>This is an overridden content</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putallattributeslayout.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putallattributeslayout.ftl
deleted file mode 100644
index 51040a8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putallattributeslayout.ftl
+++ /dev/null
@@ -1,31 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.importAttribute/>
-
-${one}
-<ul>
-  <li>${two}</li>
-  <li>${three}</li>
-  <li>${four}</li>
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putattributeslayout.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putattributeslayout.ftl
deleted file mode 100644
index 93f09d0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/putattributeslayout.ftl
+++ /dev/null
@@ -1,32 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.importAttribute name="stringTest"/>
-<@tiles.importAttribute name="list"/>
-Single attribute "stringTest" value: ${stringTest?html} <br/><br/>
-The attribute "list" contains these values:
-<ul>
-<#list list as item>
-<li><@tiles.insertAttribute value=item /></li>
-</#list>
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/selectlocale.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/selectlocale.ftl
deleted file mode 100644
index 6b515b8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/selectlocale.ftl
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Select your locale</title>
-</head>
-<body>
-<form action="servlets/selectLocaleServlet">
-Select your locale:
-<select name="locale">
-<option selected="selected" value="">Default</option>
-<option value="en_US">American English</option>
-<option value="en_GB">British English</option>
-<option value="fr_FR">French</option>
-<option value="it_IT">Italian</option>
-</select>
-<input type="submit" value="Submit" />
-</form>
-<div id="defaultLocaleMessage">Your default Locale is ${.locale}</div>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdecorationfilter.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdecorationfilter.ftl
deleted file mode 100644
index d502e68..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdecorationfilter.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<i>This Content should be wrapped with the standard layout.</i>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef.ftl
deleted file mode 100644
index fd4eb07..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef.ftl
+++ /dev/null
@@ -1,29 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="templateDefinition" template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.definition>
-<@tiles.insertDefinition name="templateDefinition" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_extend.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_extend.ftl
deleted file mode 100644
index d00921c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_extend.ftl
+++ /dev/null
@@ -1,30 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.definition.override.one" extends="freemarker.test.definition">
-  <@tiles.putAttribute name="body"   value="/freemarker/override.ftl" />
-</@tiles.definition>
-<@tiles.definition name="test.definition.override.two" extends="test.definition.override.one">
-  <@tiles.putAttribute name="title"   value="This is an overridden title" />
-</@tiles.definition>
-<@tiles.insertDefinition name="test.definition.override.two" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_list_inherit.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_list_inherit.ftl
deleted file mode 100644
index fbb0c9d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_list_inherit.ftl
+++ /dev/null
@@ -1,30 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="templateDefinition" extends="test.putAttributes">
-  <@tiles.putAttribute name="stringTest" value="This is a string" type="string"/>
-  <@tiles.putListAttribute name="list" inherit=true>
-    <@tiles.addAttribute value="valueFour" type="string" />
-  </@tiles.putListAttribute>
-</@tiles.definition>
-<@tiles.insertDefinition name="templateDefinition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_preparer.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_preparer.ftl
deleted file mode 100644
index 07321c0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testdef_preparer.ftl
+++ /dev/null
@@ -1,29 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="templateDefinition" template="/freemarker/layout.ftl" preparer="org.apache.tiles.test.preparer.TestViewPreparer">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.definition>
-<@tiles.insertDefinition name="templateDefinition" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute.ftl
deleted file mode 100644
index ec93cb8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.putAttributes" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_all.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_all.ftl
deleted file mode 100644
index bfa23ca..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_all.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.putAllAttributes" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_inherit.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_inherit.ftl
deleted file mode 100644
index 3b3cf9a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testimportattribute_inherit.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.putAttributes.inherit" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition.ftl
deleted file mode 100644
index 95a2ff4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_preparer.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_preparer.ftl
deleted file mode 100644
index b155697..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_preparer.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.attribute.preparer" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles.ftl
deleted file mode 100644
index 7472395..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.roles" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles_tags.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles_tags.ftl
deleted file mode 100644
index b845ad6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_attribute_roles_tags.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.roles.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded.ftl
deleted file mode 100644
index 78f0d91..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.cascaded.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_list.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_list.ftl
deleted file mode 100644
index b9604d8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_list.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.cascaded.list.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_overridden.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_overridden.ftl
deleted file mode 100644
index 43a921e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_overridden.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.overridden.cascaded.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_template.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_template.ftl
deleted file mode 100644
index 13af940..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_cascaded_template.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.cascaded.template.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_classpath.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_classpath.ftl
deleted file mode 100644
index 06deeb1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_classpath.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.classpath.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite.ftl
deleted file mode 100644
index 6b0a361..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.composite.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags.ftl
deleted file mode 100644
index a560fe3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.inner.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is an inner definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-</@tiles.definition>
-<@tiles.definition name="test.composite.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is a composite definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="test.inner.definition.tags" type="definition"/>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured.ftl
deleted file mode 100644
index b03555f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.inner.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is an inner definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-</@tiles.definition>
-<@tiles.definition name="test.composite.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is a composite definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="test.inner.definition" type="definition"/>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured_notype.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured_notype.ftl
deleted file mode 100644
index b88ac83..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_includes_configured_notype.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.inner.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is an inner definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-</@tiles.definition>
-<@tiles.definition name="test.composite.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is a composite definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="test.inner.definition"/>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_notype.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_notype.ftl
deleted file mode 100644
index ad2da7d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_composite_tags_notype.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.inner.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is an inner definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-</@tiles.definition>
-<@tiles.definition name="test.composite.definition.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is a composite definition with tags."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body"   value="test.inner.definition.tags"/>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_db.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_db.ftl
deleted file mode 100644
index 3ad4015..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_db.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="db"/>
-<@tiles.insertDefinition name="test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_defaultvalues.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_defaultvalues.ftl
deleted file mode 100644
index b8a4672..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_defaultvalues.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.defaultvalues.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el.ftl
deleted file mode 100644
index 2763ce6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.composite.el.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el_singleeval.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el_singleeval.ftl
deleted file mode 100644
index a5c7d6a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_el_singleeval.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.composite.el.doNotShow.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_exception.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_exception.ftl
deleted file mode 100644
index 9b4cfe9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_exception.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.exception" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_extended_db.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_extended_db.ftl
deleted file mode 100644
index c564614..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_extended_db.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="db"/>
-<@tiles.insertDefinition name="test.definition.extended" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_flush.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_flush.ftl
deleted file mode 100644
index 59268b3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_flush.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.flush" flush=true/>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_freemarker.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_freemarker.ftl
deleted file mode 100644
index d7c2d85..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_freemarker.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.freemarker" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ignore.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ignore.ftl
deleted file mode 100644
index 071c88a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ignore.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.ignore" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_inline.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_inline.ftl
deleted file mode 100644
index b4f0e72..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_inline.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition">
-  <@tiles.putAttribute name="body">
-  <div align="center"><b><i>This is an inline content</i></b></div>
-  </@tiles.putAttribute>
-</@tiles.insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_mvel.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_mvel.ftl
deleted file mode 100644
index 2620e79..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_mvel.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.composite.mvel.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ognl.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ognl.ftl
deleted file mode 100644
index cac46e3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_ognl.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.composite.ognl.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_old.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_old.ftl
deleted file mode 100644
index bbe599e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_old.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.old_format" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_openbody.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_openbody.ftl
deleted file mode 100644
index 1b9b8dc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_openbody.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.openbody.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override.ftl
deleted file mode 100644
index 08b8f05..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override.ftl
+++ /dev/null
@@ -1,26 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition">
-  <@tiles.putAttribute name="body"   value="/freemarker/override.ftl" />
-</@tiles.insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_and_not.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_and_not.ftl
deleted file mode 100644
index 14fa71b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_and_not.ftl
+++ /dev/null
@@ -1,30 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-Overridden content:<br/>
-<@tiles.insertDefinition name="freemarker.test.definition">
-  <@tiles.putAttribute name="body"   value="/freemarker/override.ftl" />
-</@tiles.insertDefinition>
-<br/>
-Not overridden content:<br/>
-<@tiles.insertDefinition name="freemarker.test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_template.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_template.ftl
deleted file mode 100644
index c4dddd8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_override_template.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition" template="/freemarker/layout_override.ftl" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer.ftl
deleted file mode 100644
index 1958fb7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer_configured.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer_configured.ftl
deleted file mode 100644
index afe6766..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_preparer_configured.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.preparer.definition.configured"/>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_regexp.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_regexp.ftl
deleted file mode 100644
index 622a0df..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_regexp.ftl
+++ /dev/null
@@ -1,26 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="alternate" />
-<@tiles.insertDefinition name="freemarker.test.regexp.definitionOne.messageHello" />
-<@tiles.insertDefinition name="freemarker.test.regexp.definitionTwo.messageBye" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_reversed.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_reversed.ftl
deleted file mode 100644
index 7f3cd54..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_reversed.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.reversed.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role.ftl
deleted file mode 100644
index 530a4cc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.appears.configured" />
-<@tiles.insertDefinition name="freemarker.test.definition.does_not_appear.configured" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role_tag.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role_tag.ftl
deleted file mode 100644
index 9f2feee..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_role_tag.ftl
+++ /dev/null
@@ -1,25 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.definition.appears" role="goodrole" />
-<@tiles.insertDefinition name="freemarker.test.definition.does_not_appear" role="badrole" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_wildcard.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_wildcard.ftl
deleted file mode 100644
index 4ab8a5c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertdefinition_wildcard.ftl
+++ /dev/null
@@ -1,26 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="alternate" />
-<@tiles.insertDefinition name="freemarker.test.definitionOne.messageHello" />
-<@tiles.insertDefinition name="freemarker.test.definitionTwo.messageBye" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition.ftl
deleted file mode 100644
index 60d6839..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.nesting.definitions" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition_tags.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition_tags.ftl
deleted file mode 100644
index 59b1e13..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnesteddefinition_tags.ftl
+++ /dev/null
@@ -1,35 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.nesting.definitions.tags" template="/freemarker/layout.ftl">
-    <@tiles.putAttribute name="title"  value="This is the title."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putAttribute name="body">
-        <@tiles.definition template="/freemarker/layout.ftl">
-            <@tiles.putAttribute name="title"  value="This is a nested definition."/>
-            <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-            <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-        </@tiles.definition>
-    </@tiles.putAttribute>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.nesting.definitions.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition.ftl
deleted file mode 100644
index 0e80379..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition.ftl
+++ /dev/null
@@ -1,24 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.nesting.list.definitions" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition_tags.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition_tags.ftl
deleted file mode 100644
index aa47d12..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testinsertnestedlistdefinition_tags.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.definition name="test.nesting.definitions.tags" template="/freemarker/layout_list.ftl">
-    <@tiles.putAttribute name="title"  value="This is the title."/>
-    <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-    <@tiles.putListAttribute name="list">
-        <@tiles.addAttribute>
-	        <@tiles.definition template="/freemarker/layout.ftl">
-	            <@tiles.putAttribute name="title"  value="This is a nested definition."/>
-	            <@tiles.putAttribute name="header" value="/freemarker/header.ftl"/>
-	            <@tiles.putAttribute name="body"   value="/freemarker/body.ftl"/>
-	        </@tiles.definition>
-        </@tiles.addAttribute>
-    </@tiles.putListAttribute>
-</@tiles.definition>
-<@tiles.insertDefinition name="test.nesting.definitions.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput.ftl
deleted file mode 100644
index 5219ca8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded.ftl
deleted file mode 100644
index 0d97ee6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." cascade=true />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" cascade=true />
-  <@tiles.putAttribute name="body"   value="test.inner.cascadable.definition" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_overridden.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_overridden.ftl
deleted file mode 100644
index 172d392..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_overridden.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." cascade=true />
-  <@tiles.putAttribute name="header" value="/freemarker/alternate-header.ftl" cascade=true />
-  <@tiles.putAttribute name="body"   value="test.inner.definition" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_template.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_template.ftl
deleted file mode 100644
index 4649333..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_cascaded_template.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." cascade=true />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" cascade=true />
-  <@tiles.putAttribute name="body"   value="/freemarker/layout_nobody.ftl" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el.ftl
deleted file mode 100644
index c8b7bb0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el.ftl
+++ /dev/null
@@ -1,30 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<#assign bodyContent="Body Content defined by and el" />
-
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value=bodyContent />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el_singleeval.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el_singleeval.ftl
deleted file mode 100644
index 9992db3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_el_singleeval.ftl
+++ /dev/null
@@ -1,31 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<#assign doNotShowBody="$" + "{" + "requestScope.doNotShow}" />
-<#assign doNotShow="DO NOT SHOW!!!" />
-
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value=doNotShowBody />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_flush.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_flush.ftl
deleted file mode 100644
index 180156c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_flush.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl" flush=true>
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.insertTemplate>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_reversed.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_reversed.ftl
deleted file mode 100644
index c2c6f36..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_reversed.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout_alt_title.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." type="reversed" />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_servlet.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_servlet.ftl
deleted file mode 100644
index 2bb373d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testput_servlet.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/servlets/layoutServlet">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/body.ftl" />
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist.ftl
deleted file mode 100644
index 737bcc8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist.ftl
+++ /dev/null
@@ -1,31 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/putattributeslayout.ftl">
-  <@tiles.putAttribute name="stringTest" value="This is a string" type="string" />
-  <@tiles.putListAttribute name="list">
-    <@tiles.addAttribute value="valueOne" type="string" />
-    <@tiles.addAttribute value="valueTwo" type="string" />
-    <@tiles.addAttribute value="valueThree" type="string" />
-  </@tiles.putListAttribute>
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_cascaded.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_cascaded.ftl
deleted file mode 100644
index 8bf974f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_cascaded.ftl
+++ /dev/null
@@ -1,34 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertTemplate template="/freemarker/layout.ftl">
-  <@tiles.putAttribute name="title"  value="This is the title." />
-  <@tiles.putAttribute name="header" value="/freemarker/header.ftl" />
-  <@tiles.putAttribute name="body"   value="/freemarker/putattributeslayout.ftl" />
-  <@tiles.putAttribute name="stringTest" value="This is a string" type="string" cascade=true />
-  <@tiles.putListAttribute name="list" cascade=true>
-    <@tiles.addAttribute value="valueOne" type="string" />
-    <@tiles.addAttribute value="valueTwo" type="string" />
-    <@tiles.addAttribute value="valueThree" type="string" />
-  </@tiles.putListAttribute>
-</@tiles.insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_inherit.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_inherit.ftl
deleted file mode 100644
index fec8e78..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testputlist_inherit.ftl
+++ /dev/null
@@ -1,28 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.insertDefinition name="freemarker.test.putAttributes">
-  <@tiles.putListAttribute name="list" inherit=true>
-    <@tiles.addAttribute value="valueFour" type="string" />
-  </@tiles.putListAttribute>
-</@tiles.insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testsetcurrentcontainer.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testsetcurrentcontainer.ftl
deleted file mode 100644
index eb00701..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/freemarker/testsetcurrentcontainer.ftl
+++ /dev/null
@@ -1,27 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<@tiles.setCurrentContainer containerKey="alternate" />
-<@tiles.insertDefinition name="freemarker.test.definition" />
-<@tiles.setCurrentContainer />
-<@tiles.insertDefinition name="freemarker.test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/header.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/header.jsp
deleted file mode 100644
index 78dd414..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/header.jsp
+++ /dev/null
@@ -1,26 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<strong>This is the header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/index.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/index.jsp
deleted file mode 100644
index 7621660..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,295 +0,0 @@
-<%@ page session="false" %>
-<!--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<html>
-<head>
-    <title>Tiles 2 Test Application</title>
-</head>
-
-<body>
-    <h1>Tiles 2 Test Application</h1>
-
-    <h1>JSP-based tests</h1>
-
-    <h2>Features in Tiles 2.0.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="testinsertdefinition.jsp">Test Insert Configured Definition</a><br/>
-    <a href="testinsertdefinition_ignore.jsp">Test Insert Configured Definition with Ignore</a><br/>
-    <a href="testinsertdefinition_flush.jsp">Test Insert Configured Definition with Flush</a><br/>
-    <a href="testinsertdefinition_preparer.jsp">Test Insert Configured Definition with Preparer</a><br/>
-    <a href="testinsertdefinition_preparer_configured.jsp">Test Insert Configured Definition with Preparer configured in the definition itself</a><br/>
-    <a href="testinsertdefinition_classpath.jsp">Test Insert Configured Classpath Definition</a><br/>
-    <a href="testinsertdefinition_override.jsp">Test Insert Configured Definition with an overridden content</a><br/>
-    <a href="testinsertdefinition_override_and_not.jsp">Test Insert Configured Definition with an overridden content and one with original content</a><br/>
-    <a href="testinsertdefinition_inline.jsp">Test Insert Configured Definition with an inline content</a><br/>
-    <a href="testinsertdefinition_composite.jsp">Test Insert Configured Definition that contains another definition inside</a><br/>
-    <a href="testinsertdefinition_exception.jsp">Test Insert Configured Definition with an exception in an attribute page</a><br/>
-    <a href="testinsertdefinition_freemarker.jsp">Test Insert Configured Definition with FreeMarker</a><br/>
-    <a href="testinsertdefinition_openbody.jsp">Test Insert Configured Definition with Open Body</a><br/>
-    <a href="testput.jsp">Test Put Tag</a><br/>
-    <a href="testput_flush.jsp">Test Put Tag with Flush</a><br/>
-    <a href="testput_el.jsp">Test Put Tag using EL</a><br/>
-    <a href="testput_servlet.jsp">Test Put Tag using a servlet mapping as a template</a><br/>
-    <a href="testputlist.jsp">Test Put List Tag</a><br/>
-    <a href="testimportattribute.jsp">Test importAttribute Tag</a><br/>
-    <a href="testimportattribute_all.jsp">Test importAttribute Tag with no name</a><br/>
-    <a href="testdecorationfilter.jsp">Test Tiles Definition Filter</a><br/>
-    <a href="testdispatchservlet.tiles">Test Tiles Dispatch Servlet</a><br/>
-    <a href="selectlocale.jsp">Test Localization</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="testdef.jsp">Test Definition Tag</a><br/>
-    <a href="testdef_extend.jsp">Test Definition Tag extending configured and custom definitions</a><br/>
-    <a href="testdef_preparer.jsp">Test Definition Tag with Preparer</a><br/>
-    <a href="testinsertdefinition_composite_tags_includes_configured.jsp">Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</a><br/>
-    <a href="testinsertdefinition_composite_tags.jsp">Test Insert Definition that contains another definition inside using JSP tags</a><br/>
-    <a href="testinsertdefinition_composite_tags_includes_configured_notype.jsp">Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</a><br/>
-    <a href="testinsertdefinition_composite_tags_notype.jsp">Test Insert Definition that contains another definition inside using JSP tags without types</a><br/></body>
-
-    <h3>Roles Verification tests</h3>
-    <a href="testinsertdefinition_role.jsp">Test Insert Configured Definition with Specified Role</a><br/>
-    <a href="testinsertdefinition_role_tag.jsp">Test Insert Configured Definition with Specified Role in Tag</a><br/>
-    <a href="testinsertdefinition_attribute_roles.jsp">Test Insert Configured Definition with Attribute that have Roles</a><br/>
-    <a href="testinsertdefinition_attribute_roles_tags.jsp">Test Insert Configured Definition with Attribute that have Roles in Tags</a><br/>
-
-    <h2>Features in Tiles 2.1.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="testinsertdefinition_override_template.jsp">Test Insert Configured Definition with an overridden template</a><br/>
-    <a href="testinsertdefinition_old.jsp">Test Insert Configured Definition in Old Format</a><br/>
-    <a href="testinsertdefinition_cascaded.jsp">Test Insert Configured Cascaded Definition</a><br/>
-    <a href="testinsertdefinition_cascaded_overridden.jsp">Test Insert Configured Cascaded Definition with Override</a><br/>
-    <a href="testinsertdefinition_cascaded_template.jsp">Test Insert Configured Cascaded Definition with Template</a><br/>
-    <a href="testinsertdefinition_cascaded_list.jsp">Test Insert Configured Cascaded Definition with List</a><br/>
-    <a href="testinsertdefinition_reversed.jsp">Test Insert Configured Definition with Reversed Attribute</a><br/>
-    <a href="testinsertdefinition_attribute_preparer.jsp">Test Insert Configured Definition with Attribute Preparer</a><br/>
-    <a href="testinsertnesteddefinition.jsp">Test Insert Nested Definition</a><br/>
-    <a href="testinsertnesteddefinition_tags.jsp">Test Insert Nested Definition only using JSP tags</a><br/>
-    <a href="testinsertnestedlistdefinition.jsp">Test Insert Nested List Definition</a><br/>
-    <a href="testinsertnestedlistdefinition_tags.jsp">Test Insert Nested List Definition only using JSP tags</a><br/>
-    <a href="testinsertdefinition_el.jsp">Test Insert Configured Definition with EL</a><br/>
-    <a href="testinsertdefinition_el_singleeval.jsp">Test Insert Configured Definition with EL to test Single Evaluation</a><br/>
-    <a href="testinsertdefinition_wildcard.jsp">Test Insert Configured Definition with Wildcards</a><br/>
-    <a href="testinsertdefinition_defaultvalues.jsp">Test Insert Configured Definition with Default Values</a><br/>
-    <a href="testput_cascaded.jsp">Test Put Tag with Cascaded Attributes</a><br/>
-    <a href="testput_cascaded_overridden.jsp">Test Put Tag with Overridden Cascaded Attributes</a><br/>
-    <a href="testput_cascaded_template.jsp">Test Put Tag with Cascaded Attributes and Template</a><br/>
-    <a href="testput_el_singleeval.jsp">Test Put Tag using EL to test Single Evaluation</a><br/>
-    <a href="testput_reversed.jsp">Test Put Tag with Reversed Attribute</a><br/>
-    <a href="testputlist_cascaded.jsp">Test Put List Cascaded Tag</a><br/>
-    <a href="testputlist_inherit.jsp">Test Put List Tag with Inherit</a><br/>
-    <a href="testimportattribute_inherit.jsp">Test importAttribute Tag with List Inherit</a><br/>
-    <a href="testsetcurrentcontainer.jsp">Test setCurrentContainer Tag</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="testdef_list_inherit.jsp">Test Definition Tag with a List Inherit</a><br/>
-
-    <h3>Database Verification tests</h3>
-    <a href="testinsertdefinition_db.jsp">Test Insert Configured Definition from DB</a><br/>
-    <a href="testinsertdefinition_extended_db.jsp">Test Insert Extended Configured Definition from DB</a><br/>
-    <a href="selectlocale_db.jsp">Test Localization from DB</a><br/>
-
-    <h2>Features in Tiles 2.2.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="testinsertdefinition_mvel.jsp">Test Insert Configured Definition with MVEL</a><br/>
-    <a href="testinsertdefinition_ognl.jsp">Test Insert Configured Definition with OGNL</a><br/>
-    <a href="testinsertdefinition_regexp.jsp">Test Insert Configured Definition with Regular Expression</a><br/>
-
-	<h1>FreeMarker-based tests</h1>
-
-    <h2>Features in Tiles 2.0.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="freemarker/testinsertdefinition.ftl">FreeMarker: Test Insert Configured Definition</a><br/>
-    <a href="freemarker/testinsertdefinition_ignore.ftl">FreeMarker: Test Insert Configured Definition with Ignore</a><br/>
-    <a href="freemarker/testinsertdefinition_flush.ftl">FreeMarker: Test Insert Configured Definition with Flush</a><br/>
-    <a href="freemarker/testinsertdefinition_preparer.ftl">FreeMarker: Test Insert Configured Definition with Preparer</a><br/>
-    <a href="freemarker/testinsertdefinition_preparer_configured.ftl">FreeMarker: Test Insert Configured Definition with Preparer configured in the definition itself</a><br/>
-    <a href="freemarker/testinsertdefinition_classpath.ftl">FreeMarker: Test Insert Configured Classpath Definition</a><br/>
-    <a href="freemarker/testinsertdefinition_override.ftl">FreeMarker: Test Insert Configured Definition with an overridden content</a><br/>
-    <a href="freemarker/testinsertdefinition_override_and_not.ftl">FreeMarker: Test Insert Configured Definition with an overridden content and one with original content</a><br/>
-    <a href="freemarker/testinsertdefinition_inline.ftl">FreeMarker: Test Insert Configured Definition with an inline content</a><br/>
-    <a href="freemarker/testinsertdefinition_composite.ftl">FreeMarker: Test Insert Configured Definition that contains another definition inside</a><br/>
-    <a href="freemarker/testinsertdefinition_exception.ftl">FreeMarker: Test Insert Configured Definition with an exception in an attribute page</a><br/>
-    <a href="freemarker/testinsertdefinition_openbody.ftl">FreeMarker: Test Insert Configured Definition with Open Body</a><br/>
-    <a href="freemarker/testput.ftl">FreeMarker: Test Put Tag</a><br/>
-    <a href="freemarker/testput_flush.ftl">FreeMarker: Test Put Tag with Flush</a><br/>
-    <a href="freemarker/testput_el.ftl">FreeMarker: Test Put Tag using EL</a><br/>
-    <a href="freemarker/testput_servlet.ftl">FreeMarker: Test Put Tag using a servlet mapping as a template</a><br/>
-    <a href="freemarker/testputlist.ftl">FreeMarker: Test Put List Tag</a><br/>
-    <a href="freemarker/testimportattribute.ftl">FreeMarker: Test importAttribute Tag</a><br/>
-    <a href="freemarker/testimportattribute_all.ftl">FreeMarker: Test importAttribute Tag with no name</a><br/>
-    <a href="freemarker/testdecorationfilter.ftl">FreeMarker: Test Tiles Definition Filter</a><br/>
-    <a href="freemarker.testdispatchservlet.tiles">FreeMarker: Test Tiles Dispatch Servlet</a><br/>
-    <a href="freemarker/selectlocale.ftl">FreeMarker: Test Localization</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="freemarker/testdef.ftl">FreeMarker: Test Definition Tag</a><br/>
-    <a href="freemarker/testdef_extend.ftl">FreeMarker: Test Definition Tag extending configured and custom definitions</a><br/>
-    <a href="freemarker/testdef_preparer.ftl">FreeMarker: Test Definition Tag with Preparer</a><br/>
-    <a href="freemarker/testinsertdefinition_composite_tags_includes_configured.ftl">FreeMarker: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</a><br/>
-    <a href="freemarker/testinsertdefinition_composite_tags.ftl">FreeMarker: Test Insert Definition that contains another definition inside using JSP tags</a><br/>
-    <a href="freemarker/testinsertdefinition_composite_tags_includes_configured_notype.ftl">FreeMarker: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</a><br/>
-    <a href="freemarker/testinsertdefinition_composite_tags_notype.ftl">FreeMarker: Test Insert Definition that contains another definition inside using JSP tags without types</a><br/>
-
-    <h3>Roles Verification tests</h3>
-    <a href="freemarker/testinsertdefinition_role.ftl">FreeMarker: Test Insert Configured Definition with Specified Role</a><br/>
-    <a href="freemarker/testinsertdefinition_role_tag.ftl">FreeMarker: Test Insert Configured Definition with Specified Role in Tag</a><br/>
-    <a href="freemarker/testinsertdefinition_attribute_roles.ftl">FreeMarker: Test Insert Configured Definition with Attribute that have Roles</a><br/>
-    <a href="freemarker/testinsertdefinition_attribute_roles_tags.ftl">FreeMarker: Test Insert Configured Definition with Attribute that have Roles in Tags</a><br/>
-
-    <h2>Features in Tiles 2.1.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="freemarker/testinsertdefinition_override_template.ftl">FreeMarker: Test Insert Configured Definition with an overridden template</a><br/>
-    <a href="freemarker/testinsertdefinition_old.ftl">FreeMarker: Test Insert Configured Definition in Old Format</a><br/>
-    <a href="freemarker/testinsertdefinition_cascaded.ftl">FreeMarker: Test Insert Configured Cascaded Definition</a><br/>
-    <a href="freemarker/testinsertdefinition_cascaded_overridden.ftl">FreeMarker: Test Insert Configured Cascaded Definition with Override</a><br/>
-    <a href="freemarker/testinsertdefinition_cascaded_template.ftl">FreeMarker: Test Insert Configured Cascaded Definition with Template</a><br/>
-    <a href="freemarker/testinsertdefinition_cascaded_list.ftl">FreeMarker: Test Insert Configured Cascaded Definition with List</a><br/>
-    <a href="freemarker/testinsertdefinition_reversed.ftl">FreeMarker: Test Insert Configured Definition with Reversed Attribute</a><br/>
-    <a href="freemarker/testinsertdefinition_attribute_preparer.ftl">FreeMarker: Test Insert Configured Definition with Attribute Preparer</a><br/>
-    <a href="freemarker/testinsertnesteddefinition.ftl">FreeMarker: Test Insert Nested Definition</a><br/>
-    <a href="freemarker/testinsertnesteddefinition_tags.ftl">FreeMarker: Test Insert Nested Definition only using JSP tags</a><br/>
-    <a href="freemarker/testinsertnestedlistdefinition.ftl">FreeMarker: Test Insert Nested List Definition</a><br/>
-    <a href="freemarker/testinsertnestedlistdefinition_tags.ftl">FreeMarker: Test Insert Nested List Definition only using JSP tags</a><br/>
-    <a href="freemarker/testinsertdefinition_el.ftl">FreeMarker: Test Insert Configured Definition with EL</a><br/>
-    <a href="freemarker/testinsertdefinition_el_singleeval.ftl">FreeMarker: Test Insert Configured Definition with EL to test Single Evaluation</a><br/>
-    <a href="freemarker/testinsertdefinition_wildcard.ftl">FreeMarker: Test Insert Configured Definition with Wildcards</a><br/>
-    <a href="freemarker/testinsertdefinition_defaultvalues.ftl">FreeMarker: Test Insert Configured Definition with Default Values</a><br/>
-    <a href="freemarker/testput_cascaded.ftl">FreeMarker: Test Put Tag with Cascaded Attributes</a><br/>
-    <a href="freemarker/testput_cascaded_overridden.ftl">FreeMarker: Test Put Tag with Overridden Cascaded Attributes</a><br/>
-    <a href="freemarker/testput_cascaded_template.ftl">FreeMarker: Test Put Tag with Cascaded Attributes and Template</a><br/>
-    <a href="freemarker/testput_el_singleeval.ftl">FreeMarker: Test Put Tag using EL to test Single Evaluation</a><br/>
-    <a href="freemarker/testput_reversed.ftl">FreeMarker: Test Put Tag with Reversed Attribute</a><br/>
-    <a href="freemarker/testputlist_cascaded.ftl">FreeMarker: Test Put List Cascaded Tag</a><br/>
-    <a href="freemarker/testputlist_inherit.ftl">FreeMarker: Test Put List Tag with Inherit</a><br/>
-    <a href="freemarker/testimportattribute_inherit.ftl">FreeMarker: Test importAttribute Tag with List Inherit</a><br/>
-    <a href="freemarker/testsetcurrentcontainer.ftl">FreeMarker: Test setCurrentContainer Tag</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="freemarker/testdef_list_inherit.ftl">FreeMarker: Test Definition Tag with a List Inherit</a><br/>
-
-    <h3>Database Verification tests</h3>
-    <a href="freemarker/testinsertdefinition_db.ftl">FreeMarker: Test Insert Configured Definition from DB</a><br/>
-    <a href="freemarker/testinsertdefinition_extended_db.ftl">FreeMarker: Test Insert Extended Configured Definition from DB</a><br/>
-
-    <h2>Features in Tiles 2.2.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="freemarker/testinsertdefinition_mvel.ftl">FreeMarker: Test Insert Configured Definition with MVEL</a><br/>
-    <a href="freemarker/testinsertdefinition_ognl.ftl">FreeMarker: Test Insert Configured Definition with OGNL</a><br/>
-    <a href="freemarker/testinsertdefinition_regexp.ftl">FreeMarker: Test Insert Configured Definition with Regular Expression</a><br/>
-    <a href="org/apache/tiles/test/alt/freemarker/testinsertdefinition_alt.ftl">FreeMarker: Test Insert Configured Definition in Module</a><br/>
-
-    <h1>Velocity-based tests</h1>
-
-    <h2>Features in Tiles 2.0.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="velocity/testinsertdefinition.vm">Velocity: Test Insert Configured Definition</a><br/>
-    <a href="velocity/testinsertdefinition_ignore.vm">Velocity: Test Insert Configured Definition with Ignore</a><br/>
-    <a href="velocity/testinsertdefinition_flush.vm">Velocity: Test Insert Configured Definition with Flush</a><br/>
-    <a href="velocity/testinsertdefinition_preparer.vm">Velocity: Test Insert Configured Definition with Preparer</a><br/>
-    <a href="velocity/testinsertdefinition_preparer_configured.vm">Velocity: Test Insert Configured Definition with Preparer configured in the definition itself</a><br/>
-    <a href="velocity/testinsertdefinition_classpath.vm">Velocity: Test Insert Configured Classpath Definition</a><br/>
-    <a href="velocity/testinsertdefinition_override.vm">Velocity: Test Insert Configured Definition with an overridden content</a><br/>
-    <a href="velocity/testinsertdefinition_override_and_not.vm">Velocity: Test Insert Configured Definition with an overridden content and one with original content</a><br/>
-    <a href="velocity/testinsertdefinition_inline.vm">Velocity: Test Insert Configured Definition with an inline content</a><br/>
-    <a href="velocity/testinsertdefinition_composite.vm">Velocity: Test Insert Configured Definition that contains another definition inside</a><br/>
-    <a href="velocity/testinsertdefinition_exception.vm">Velocity: Test Insert Configured Definition with an exception in an attribute page</a><br/>
-    <a href="velocity/testinsertdefinition_openbody.vm">Velocity: Test Insert Configured Definition with Open Body</a><br/>
-    <a href="velocity/testput.vm">Velocity: Test Put Tag</a><br/>
-    <a href="velocity/testput_flush.vm">Velocity: Test Put Tag with Flush</a><br/>
-    <a href="velocity/testput_el.vm">Velocity: Test Put Tag using EL</a><br/>
-    <a href="velocity/testput_servlet.vm">Velocity: Test Put Tag using a servlet mapping as a template</a><br/>
-    <a href="velocity/testputlist.vm">Velocity: Test Put List Tag</a><br/>
-    <a href="velocity/testimportattribute.vm">Velocity: Test importAttribute Tag</a><br/>
-    <a href="velocity/testimportattribute_all.vm">Velocity: Test importAttribute Tag with no name</a><br/>
-    <a href="velocity/testdecorationfilter.vm">Velocity: Test Tiles Definition Filter</a><br/>
-    <a href="velocity.testdispatchservlet.tiles">Velocity: Test Tiles Dispatch Servlet</a><br/>
-    <a href="velocity/selectlocale.vm">Velocity: Test Localization</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="velocity/testdef.vm">Velocity: Test Definition Tag</a><br/>
-    <a href="velocity/testdef_extend.vm">Velocity: Test Definition Tag extending configured and custom definitions</a><br/>
-    <a href="velocity/testdef_preparer.vm">Velocity: Test Definition Tag with Preparer</a><br/>
-    <a href="velocity/testinsertdefinition_composite_tags_includes_configured.vm">Velocity: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</a><br/>
-    <a href="velocity/testinsertdefinition_composite_tags.vm">Velocity: Test Insert Definition that contains another definition inside using JSP tags</a><br/>
-    <a href="velocity/testinsertdefinition_composite_tags_includes_configured_notype.vm">Velocity: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</a><br/>
-    <a href="velocity/testinsertdefinition_composite_tags_notype.vm">Velocity: Test Insert Definition that contains another definition inside using JSP tags without types</a><br/>
-
-    <h3>Roles Verification tests</h3>
-    <a href="velocity/testinsertdefinition_role.vm">Velocity: Test Insert Configured Definition with Specified Role</a><br/>
-    <a href="velocity/testinsertdefinition_role_tag.vm">Velocity: Test Insert Configured Definition with Specified Role in Tag</a><br/>
-    <a href="velocity/testinsertdefinition_attribute_roles.vm">Velocity: Test Insert Configured Definition with Attribute that have Roles</a><br/>
-    <a href="velocity/testinsertdefinition_attribute_roles_tags.vm">Velocity: Test Insert Configured Definition with Attribute that have Roles in Tags</a><br/>
-
-    <h2>Features in Tiles 2.1.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="velocity/testinsertdefinition_override_template.vm">Velocity: Test Insert Configured Definition with an overridden template</a><br/>
-    <a href="velocity/testinsertdefinition_old.vm">Velocity: Test Insert Configured Definition in Old Format</a><br/>
-    <a href="velocity/testinsertdefinition_cascaded.vm">Velocity: Test Insert Configured Cascaded Definition</a><br/>
-    <a href="velocity/testinsertdefinition_cascaded_overridden.vm">Velocity: Test Insert Configured Cascaded Definition with Override</a><br/>
-    <a href="velocity/testinsertdefinition_cascaded_template.vm">Velocity: Test Insert Configured Cascaded Definition with Template</a><br/>
-    <a href="velocity/testinsertdefinition_cascaded_list.vm">Velocity: Test Insert Configured Cascaded Definition with List</a><br/>
-    <a href="velocity/testinsertdefinition_reversed.vm">Velocity: Test Insert Configured Definition with Reversed Attribute</a><br/>
-    <a href="velocity/testinsertdefinition_attribute_preparer.vm">Velocity: Test Insert Configured Definition with Attribute Preparer</a><br/>
-    <a href="velocity/testinsertnesteddefinition.vm">Velocity: Test Insert Nested Definition</a><br/>
-    <a href="velocity/testinsertnesteddefinition_tags.vm">Velocity: Test Insert Nested Definition only using JSP tags</a><br/>
-    <a href="velocity/testinsertnestedlistdefinition.vm">Velocity: Test Insert Nested List Definition</a><br/>
-    <a href="velocity/testinsertnestedlistdefinition_tags.vm">Velocity: Test Insert Nested List Definition only using JSP tags</a><br/>
-    <a href="velocity/testinsertdefinition_el.vm">Velocity: Test Insert Configured Definition with EL</a><br/>
-    <a href="velocity/testinsertdefinition_el_singleeval.vm">Velocity: Test Insert Configured Definition with EL to test Single Evaluation</a><br/>
-    <a href="velocity/testinsertdefinition_wildcard.vm">Velocity: Test Insert Configured Definition with Wildcards</a><br/>
-    <a href="velocity/testinsertdefinition_defaultvalues.vm">Velocity: Test Insert Configured Definition with Default Values</a><br/>
-    <a href="velocity/testput_cascaded.vm">Velocity: Test Put Tag with Cascaded Attributes</a><br/>
-    <a href="velocity/testput_cascaded_overridden.vm">Velocity: Test Put Tag with Overridden Cascaded Attributes</a><br/>
-    <a href="velocity/testput_cascaded_template.vm">Velocity: Test Put Tag with Cascaded Attributes and Template</a><br/>
-    <a href="velocity/testput_el_singleeval.vm">Velocity: Test Put Tag using EL to test Single Evaluation</a><br/>
-    <a href="velocity/testput_reversed.vm">Velocity: Test Put Tag with Reversed Attribute</a><br/>
-    <a href="velocity/testputlist_cascaded.vm">Velocity: Test Put List Cascaded Tag</a><br/>
-    <a href="velocity/testputlist_inherit.vm">Velocity: Test Put List Tag with Inherit</a><br/>
-    <a href="velocity/testimportattribute_inherit.vm">Velocity: Test importAttribute Tag with List Inherit</a><br/>
-    <a href="velocity/testsetcurrentcontainer.vm">Velocity: Test setCurrentContainer Tag</a><br/>
-
-    <h3>Mutable Container Tests</h3>
-    <a href="velocity/testdef_list_inherit.vm">Velocity: Test Definition Tag with a List Inherit</a><br/>
-
-    <h3>Database Verification tests</h3>
-    <a href="velocity/testinsertdefinition_db.vm">Velocity: Test Insert Configured Definition from DB</a><br/>
-    <a href="velocity/testinsertdefinition_extended_db.vm">Velocity: Test Insert Extended Configured Definition from DB</a><br/>
-
-    <h2>Features in Tiles 2.2.x</h2>
-
-    <h3>Standard Render/Attribute Tests</h3>
-    <a href="velocity/testinsertdefinition_mvel.vm">Velocity: Test Insert Configured Definition with MVEL</a><br/>
-    <a href="velocity/testinsertdefinition_ognl.vm">Velocity: Test Insert Configured Definition with OGNL</a><br/>
-    <a href="velocity/testinsertdefinition_regexp.vm">Velocity: Test Insert Configured Definition with Regular Expression</a><br/>
-    <a href="org/apache/tiles/test/alt/velocity/testinsertdefinition_alt.vm">Velocity: Test Insert Configured Definition in Module</a><br/>
-
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.ftl b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.ftl
deleted file mode 100644
index c7ba7d1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.ftl
+++ /dev/null
@@ -1,37 +0,0 @@
-<#--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><@tiles.getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><@tiles.insertAttribute name="body"/></td>
-  </tr>
-  <tr>
-    <td>This layout is made in FreeMarker.</td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.jsp
deleted file mode 100644
index 23d3cc0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutOne.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutOne.jsp
deleted file mode 100644
index 05545b5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutOne.jsp
+++ /dev/null
@@ -1,40 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout one.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutTwo.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutTwo.jsp
deleted file mode 100644
index 4d5cd25..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layoutTwo.jsp
+++ /dev/null
@@ -1,40 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout two.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_alt_title.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_alt_title.jsp
deleted file mode 100644
index e84ed4f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_alt_title.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:insertAttribute name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_closebody.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_closebody.jsp
deleted file mode 100644
index 1b4f6fb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_closebody.jsp
+++ /dev/null
@@ -1,43 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td>
-    <tiles:insertAttribute name="body">
-        <tiles:putAttribute name="title"  value="This is a customized context" />
-        <tiles:putAttribute name="header" value="/header.jsp" />
-        <tiles:putAttribute name="body"   value="/body.jsp" />
-    </tiles:insertAttribute>
-    </td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_default.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_default.jsp
deleted file mode 100644
index 4c6ccbe..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_default.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:insertAttribute name="title" defaultValue="This is the default title."/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header" defaultValue="alternate-header.jsp" defaultValueType="template"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body" defaultValue="This is the default body in the tag."/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_flush.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_flush.jsp
deleted file mode 100644
index fd3fbd5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_flush.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header" flush="true"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body" flush="true"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_ignore.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_ignore.jsp
deleted file mode 100644
index 8dc32bc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_ignore.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header" ignore="true"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_list.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_list.jsp
deleted file mode 100644
index b345690..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_list.jsp
+++ /dev/null
@@ -1,43 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td>
-        <tiles:importAttribute name="list"/>
-        <c:forEach var="attribute" items="${list}">
-            <tiles:insertAttribute value="${attribute}" />
-        </c:forEach>
-    </td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_nobody.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_nobody.jsp
deleted file mode 100644
index 42f1152..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_nobody.jsp
+++ /dev/null
@@ -1,34 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_override.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_override.jsp
deleted file mode 100644
index 074c980..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_override.jsp
+++ /dev/null
@@ -1,40 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Green"><strong>This is the overridden template.</strong></td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_preparer.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_preparer.jsp
deleted file mode 100644
index 44f24e8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_preparer.jsp
+++ /dev/null
@@ -1,38 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header"/></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body"
-        preparer="org.apache.tiles.test.preparer.AttributeViewPreparer"/></td>
-  </tr>
-</table>           
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_roles.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_roles.jsp
deleted file mode 100644
index 44f43f2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/layout_roles.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong><tiles:getAsString name="title"/></strong></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="header" role="goodrole" /></td>
-  </tr>
-  <tr>
-    <td><tiles:insertAttribute name="body" role="badrole" /></td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/override.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/override.jsp
deleted file mode 100644
index 9d7cda6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/override.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<div align="center"><b><i>This is an overridden content</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putallattributeslayout.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putallattributeslayout.jsp
deleted file mode 100644
index 3857861..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putallattributeslayout.jsp
+++ /dev/null
@@ -1,35 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
-
-<tiles:importAttribute/>
-
-<c:out value="${one}"/>
-<ul>
-  <li><c:out value="${two}"/></li>
-  <li><c:out value="${three}"/></li>
-  <li><c:out value="${four}"/> </li>
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putattributeslayout.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putattributeslayout.jsp
deleted file mode 100644
index 3c1fc7e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/putattributeslayout.jsp
+++ /dev/null
@@ -1,35 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
-<tiles:importAttribute name="stringTest"/>
-<tiles:importAttribute name="list"/>
-Single attribute "stringTest" value: <c:out value="${stringTest}" /> <br/><br/>
-The attribute "list" contains these values:
-<ul>
-<c:forEach var="item" items="${list}">
-<li><tiles:insertAttribute value="${item}" /></li>
-</c:forEach>
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale.jsp
deleted file mode 100644
index 66e9007..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale.jsp
+++ /dev/null
@@ -1,45 +0,0 @@
-<%@ page session="false" %>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Select your locale</title>
-</head>
-<body>
-<form action="servlets/selectLocaleServlet">
-Select your locale:
-<select name="locale">
-<option selected="selected" value="">Default</option>
-<option value="en_US">American English</option>
-<option value="en_GB">British English</option>
-<option value="fr_FR">French</option>
-<option value="it_IT">Italian</option>
-</select>
-<input type="submit" value="Submit" />
-</form>
-<div id="defaultLocaleMessage">Your default Locale is <%=request.getLocale().toString() %></div>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale_db.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale_db.jsp
deleted file mode 100644
index 9fbe02f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/selectlocale_db.jsp
+++ /dev/null
@@ -1,45 +0,0 @@
-<%@ page session="false" %>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Select your locale</title>
-</head>
-<body>
-<form action="servlets/selectLocaleServletDb">
-Select your locale:
-<select name="locale">
-<option selected="selected" value="">Default</option>
-<option value="en_US">American English</option>
-<option value="en_GB">British English</option>
-<option value="fr_FR">French</option>
-<option value="it_IT">Italian</option>
-</select>
-<input type="submit" value="Submit" />
-</form>
-<div id="defaultLocaleMessage">Your default Locale is <%=request.getLocale().toString() %></div>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdecorationfilter.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdecorationfilter.jsp
deleted file mode 100644
index 2672fd4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdecorationfilter.jsp
+++ /dev/null
@@ -1,25 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<i>This Content should be wrapped with the standard layout.</i>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef.jsp
deleted file mode 100644
index fb7b605..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef.jsp
+++ /dev/null
@@ -1,32 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="templateDefinition" template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:definition>
-<tiles:insertDefinition name="templateDefinition" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_extend.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_extend.jsp
deleted file mode 100644
index 4286480..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_extend.jsp
+++ /dev/null
@@ -1,33 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.definition.override.one" extends="test.definition">
-  <tiles:putAttribute name="body"   value="/override.jsp" />
-</tiles:definition>
-<tiles:definition name="test.definition.override.two" extends="test.definition.override.one">
-  <tiles:putAttribute name="title"   value="This is an overridden title" />
-</tiles:definition>
-<tiles:insertDefinition name="test.definition.override.two" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_list_inherit.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_list_inherit.jsp
deleted file mode 100644
index 84f1982..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_list_inherit.jsp
+++ /dev/null
@@ -1,33 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="templateDefinition" extends="test.putAttributes">
-  <tiles:putAttribute name="stringTest" value="This is a string" type="string"/>
-  <tiles:putListAttribute name="list" inherit="true">
-    <tiles:addAttribute value="valueFour" type="string" />
-  </tiles:putListAttribute>
-</tiles:definition>
-<tiles:insertDefinition name="templateDefinition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_preparer.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_preparer.jsp
deleted file mode 100644
index d1a5461..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testdef_preparer.jsp
+++ /dev/null
@@ -1,32 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="templateDefinition" template="/layout.jsp" preparer="org.apache.tiles.test.preparer.TestViewPreparer">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:definition>
-<tiles:insertDefinition name="templateDefinition" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute.jsp
deleted file mode 100644
index d54b37d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.putAttributes" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_all.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_all.jsp
deleted file mode 100644
index 4633fcb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_all.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.putAllAttributes" />
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_inherit.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_inherit.jsp
deleted file mode 100644
index 79f5988..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testimportattribute_inherit.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.putAttributes.inherit" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition.jsp
deleted file mode 100644
index 02cb533..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_preparer.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_preparer.jsp
deleted file mode 100644
index 4d31a4c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_preparer.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.attribute.preparer" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles.jsp
deleted file mode 100644
index 6f3064e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.roles" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles_tags.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles_tags.jsp
deleted file mode 100644
index 8c5c58c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_attribute_roles_tags.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.roles.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded.jsp
deleted file mode 100644
index 0137435..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.cascaded.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_list.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_list.jsp
deleted file mode 100644
index 8018fb4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_list.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.cascaded.list.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_overridden.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_overridden.jsp
deleted file mode 100644
index 192f99e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_overridden.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.overridden.cascaded.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_template.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_template.jsp
deleted file mode 100644
index 9e579df..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_cascaded_template.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.cascaded.template.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_classpath.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_classpath.jsp
deleted file mode 100644
index 7ba5720..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_classpath.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="classpath.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite.jsp
deleted file mode 100644
index a89b0e6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.composite.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags.jsp
deleted file mode 100644
index ade9330..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.inner.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is an inner definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="/body.jsp"/>
-</tiles:definition>
-<tiles:definition name="test.composite.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is a composite definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="test.inner.definition.tags" type="definition"/>
-</tiles:definition>
-<tiles:insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured.jsp
deleted file mode 100644
index 3ad4fbe..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.inner.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is an inner definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="/body.jsp"/>
-</tiles:definition>
-<tiles:definition name="test.composite.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is a composite definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="test.inner.definition" type="definition"/>
-</tiles:definition>
-<tiles:insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured_notype.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured_notype.jsp
deleted file mode 100644
index 804143d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_includes_configured_notype.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.inner.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is an inner definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="/body.jsp"/>
-</tiles:definition>
-<tiles:definition name="test.composite.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is a composite definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="test.inner.definition"/>
-</tiles:definition>
-<tiles:insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_notype.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_notype.jsp
deleted file mode 100644
index b2fbb0f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_composite_tags_notype.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.inner.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is an inner definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="/body.jsp"/>
-</tiles:definition>
-<tiles:definition name="test.composite.definition.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is a composite definition with tags."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body"   value="test.inner.definition.tags"/>
-</tiles:definition>
-<tiles:insertDefinition name="test.composite.definition.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_db.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_db.jsp
deleted file mode 100644
index 41f96ed..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_db.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:setCurrentContainer containerKey="db"/>
-<tiles:insertDefinition name="test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_defaultvalues.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_defaultvalues.jsp
deleted file mode 100644
index 6514aef..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_defaultvalues.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.defaultvalues.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el.jsp
deleted file mode 100644
index 0779791..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.composite.el.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el_singleeval.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el_singleeval.jsp
deleted file mode 100644
index 476ca17..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_el_singleeval.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.composite.el.doNotShow.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_exception.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_exception.jsp
deleted file mode 100644
index 12fd4b6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_exception.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.exception" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_extended_db.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_extended_db.jsp
deleted file mode 100644
index e20a754..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_extended_db.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:setCurrentContainer containerKey="db"/>
-<tiles:insertDefinition name="test.definition.extended" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_flush.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_flush.jsp
deleted file mode 100644
index 91d851f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_flush.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.flush" flush="true"/>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_freemarker.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_freemarker.jsp
deleted file mode 100644
index 0243922..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_freemarker.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.freemarker" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ignore.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ignore.jsp
deleted file mode 100644
index 8304d69..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ignore.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.ignore" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_inline.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_inline.jsp
deleted file mode 100644
index c3fe96f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_inline.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition">
-  <tiles:putAttribute name="body">
-  <div align="center"><b><i>This is an inline content</i></b></div>
-  </tiles:putAttribute>
-</tiles:insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_mvel.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_mvel.jsp
deleted file mode 100644
index 2451ace..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_mvel.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.composite.mvel.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ognl.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ognl.jsp
deleted file mode 100644
index 8d335be..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_ognl.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.composite.ognl.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_old.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_old.jsp
deleted file mode 100644
index 2ae85f8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_old.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.old_format" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_openbody.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_openbody.jsp
deleted file mode 100644
index c8d45ab..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_openbody.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.openbody.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override.jsp
deleted file mode 100644
index f414617..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override.jsp
+++ /dev/null
@@ -1,29 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition">
-  <tiles:putAttribute name="body"   value="/override.jsp" />
-</tiles:insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_and_not.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_and_not.jsp
deleted file mode 100644
index af51da3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_and_not.jsp
+++ /dev/null
@@ -1,32 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-Overridden content:<br/>
-<tiles:insertDefinition name="test.definition">
-  <tiles:putAttribute name="body"   value="/override.jsp" />
-</tiles:insertDefinition>
-<br/>
-Not overridden content:<br/>
-<tiles:insertDefinition name="test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_template.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_template.jsp
deleted file mode 100644
index 7a9b71b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_override_template.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition" template="/layout_override.jsp" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer.jsp
deleted file mode 100644
index 8d1300f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer_configured.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer_configured.jsp
deleted file mode 100644
index 67ab55a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_preparer_configured.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="preparer.definition.configured"/>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_regexp.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_regexp.jsp
deleted file mode 100644
index 66ca851..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_regexp.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<tiles:setCurrentContainer containerKey="alternate" />
-<tiles:insertDefinition name="test.regexp.definitionOne.messageHello" />
-<tiles:insertDefinition name="test.regexp.definitionTwo.messageBye" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_reversed.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_reversed.jsp
deleted file mode 100644
index 362a363..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_reversed.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.reversed.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role.jsp
deleted file mode 100644
index 2551f85..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.appears.configured" />
-<tiles:insertDefinition name="test.definition.does_not_appear.configured" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role_tag.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role_tag.jsp
deleted file mode 100644
index 6b632aa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_role_tag.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.definition.appears" role="goodrole" />
-<tiles:insertDefinition name="test.definition.does_not_appear" role="badrole" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_wildcard.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_wildcard.jsp
deleted file mode 100644
index 9128c3a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertdefinition_wildcard.jsp
+++ /dev/null
@@ -1,28 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<tiles:setCurrentContainer containerKey="alternate" />
-<tiles:insertDefinition name="test.definitionOne.messageHello" />
-<tiles:insertDefinition name="test.definitionTwo.messageBye" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition.jsp
deleted file mode 100644
index eef3bb3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.nesting.definitions" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition_tags.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition_tags.jsp
deleted file mode 100644
index 1727d39..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnesteddefinition_tags.jsp
+++ /dev/null
@@ -1,38 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.nesting.definitions.tags" template="/layout.jsp">
-    <tiles:putAttribute name="title"  value="This is the title."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putAttribute name="body">
-        <tiles:definition template="/layout.jsp">
-            <tiles:putAttribute name="title"  value="This is a nested definition."/>
-            <tiles:putAttribute name="header" value="/header.jsp"/>
-            <tiles:putAttribute name="body"   value="/body.jsp"/>
-        </tiles:definition>
-    </tiles:putAttribute>
-</tiles:definition>
-<tiles:insertDefinition name="test.nesting.definitions.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition.jsp
deleted file mode 100644
index cebe125..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition.jsp
+++ /dev/null
@@ -1,27 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.nesting.list.definitions" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition_tags.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition_tags.jsp
deleted file mode 100644
index ef5f1be..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testinsertnestedlistdefinition_tags.jsp
+++ /dev/null
@@ -1,40 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:definition name="test.nesting.definitions.tags" template="/layout_list.jsp">
-    <tiles:putAttribute name="title"  value="This is the title."/>
-    <tiles:putAttribute name="header" value="/header.jsp"/>
-    <tiles:putListAttribute name="list">
-        <tiles:addAttribute>
-	        <tiles:definition template="/layout.jsp">
-	            <tiles:putAttribute name="title"  value="This is a nested definition."/>
-	            <tiles:putAttribute name="header" value="/header.jsp"/>
-	            <tiles:putAttribute name="body"   value="/body.jsp"/>
-	        </tiles:definition>
-        </tiles:addAttribute>
-    </tiles:putListAttribute>
-</tiles:definition>
-<tiles:insertDefinition name="test.nesting.definitions.tags" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput.jsp
deleted file mode 100644
index 8f158fc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded.jsp
deleted file mode 100644
index fca4dc3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." cascade="true" />
-  <tiles:putAttribute name="header" value="/header.jsp" cascade="true" />
-  <tiles:putAttribute name="body"   value="test.inner.cascadable.definition" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_overridden.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_overridden.jsp
deleted file mode 100644
index ce4fe37..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_overridden.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." cascade="true" />
-  <tiles:putAttribute name="header" value="/alternate-header.jsp" cascade="true" />
-  <tiles:putAttribute name="body"   value="test.inner.definition" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_template.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_template.jsp
deleted file mode 100644
index d92fc72..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_cascaded_template.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." cascade="true" />
-  <tiles:putAttribute name="header" value="/header.jsp" cascade="true" />
-  <tiles:putAttribute name="body"   value="/layout_nobody.jsp" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el.jsp
deleted file mode 100644
index 21bf428..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el.jsp
+++ /dev/null
@@ -1,34 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<c:set var="bodyContent" value="Body Content defined by and el" />
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="${bodyContent}" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el_singleeval.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el_singleeval.jsp
deleted file mode 100644
index 6fc19a5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_el_singleeval.jsp
+++ /dev/null
@@ -1,35 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<c:set var="doNotShowBody" value="${'${'}requestScope.doNotShow}" />
-<c:set var="doNotShow" scope="request" value="DO NOT SHOW!!!" />
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="${doNotShowBody}" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_flush.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_flush.jsp
deleted file mode 100644
index 2cdca88..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_flush.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp" flush="true">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_reversed.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_reversed.jsp
deleted file mode 100644
index 4680497..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_reversed.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout_alt_title.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." type="reversed" />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_servlet.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_servlet.jsp
deleted file mode 100644
index 0f02634..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testput_servlet.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/servlets/layoutServlet">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/body.jsp" />
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist.jsp
deleted file mode 100644
index 0e0239c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist.jsp
+++ /dev/null
@@ -1,34 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/putattributeslayout.jsp">
-  <tiles:putAttribute name="stringTest" value="This is a string" type="string" />
-  <tiles:putListAttribute name="list">
-    <tiles:addAttribute value="valueOne" type="string" />
-    <tiles:addAttribute value="valueTwo" type="string" />
-    <tiles:addAttribute value="valueThree" type="string" />
-  </tiles:putListAttribute>
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_cascaded.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_cascaded.jsp
deleted file mode 100644
index eb1ed98..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_cascaded.jsp
+++ /dev/null
@@ -1,37 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertTemplate template="/layout.jsp">
-  <tiles:putAttribute name="title"  value="This is the title." />
-  <tiles:putAttribute name="header" value="/header.jsp" />
-  <tiles:putAttribute name="body"   value="/putattributeslayout.jsp" />
-  <tiles:putAttribute name="stringTest" value="This is a string" type="string" cascade="true" />
-  <tiles:putListAttribute name="list" cascade="true">
-    <tiles:addAttribute value="valueOne" type="string" />
-    <tiles:addAttribute value="valueTwo" type="string" />
-    <tiles:addAttribute value="valueThree" type="string" />
-  </tiles:putListAttribute>
-</tiles:insertTemplate>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_inherit.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_inherit.jsp
deleted file mode 100644
index 9fe2fcc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testputlist_inherit.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-
-<tiles:insertDefinition name="test.putAttributes">
-  <tiles:putListAttribute name="list" inherit="true">
-    <tiles:addAttribute value="valueFour" type="string" />
-  </tiles:putListAttribute>
-</tiles:insertDefinition>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testsetcurrentcontainer.jsp b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testsetcurrentcontainer.jsp
deleted file mode 100644
index 83b554e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/testsetcurrentcontainer.jsp
+++ /dev/null
@@ -1,29 +0,0 @@
-<%@ page session="false" %>
-<%--
-/*
- * $Id$
- *
- * 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.
- *
- */
---%>
-<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
-<tiles:setCurrentContainer containerKey="alternate" />
-<tiles:insertDefinition name="test.definition" />
-<tiles:setCurrentContainer />
-<tiles:insertDefinition name="test.definition" />
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/alternate-header.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/alternate-header.vm
deleted file mode 100644
index d96bf14..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/alternate-header.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<strong>This is the alternate header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/body.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/body.vm
deleted file mode 100644
index d15a75c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/body.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<div align="center"><b><i>This is a body</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/classpath.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/classpath.vm
deleted file mode 100644
index 9aa751e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/classpath.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<div align="center"><b><i>This tile was loaded from the classpath</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/defaultlocale.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/defaultlocale.vm
deleted file mode 100644
index 9ce82fe..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/defaultlocale.vm
+++ /dev/null
@@ -1,25 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<div align="center"><b><i>
-<div id="defaultLocaleMessage">Your default Locale is $request.locale</div>
-</i></b></div>
-<a href="../selectlocale.vm">Select another locale</a>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/errorInclude.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/errorInclude.vm
deleted file mode 100644
index d835982..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/errorInclude.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-The "force include" attribute has not been set.
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/exception.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/exception.vm
deleted file mode 100644
index 8b63979..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/exception.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<strong>This throws an exception</strong>
-$exc.throwRuntimeException()
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/header.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/header.vm
deleted file mode 100644
index fecafaa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/header.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<strong>This is the header</strong>
-    
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout.vm
deleted file mode 100644
index fe39277..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutOne.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutOne.vm
deleted file mode 100644
index 25b6a3a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutOne.vm
+++ /dev/null
@@ -1,35 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout one.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutTwo.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutTwo.vm
deleted file mode 100644
index cd09410..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layoutTwo.vm
+++ /dev/null
@@ -1,35 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="yellow">This is layout two.</td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_alt_title.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_alt_title.vm
deleted file mode 100644
index 13b7958..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_alt_title.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_insertAttribute({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_closebody.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_closebody.vm
deleted file mode 100644
index 25974d9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_closebody.vm
+++ /dev/null
@@ -1,38 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>
-    #tiles_insertAttribute({"name":"body"})
-        #tiles_putAttribute({"name":"title", "value":"This is a customized context"})#end
-        #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-        #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-    #end
-    </td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_default.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_default.vm
deleted file mode 100644
index 69e5cbc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_default.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_insertAttribute({"name":"title", "defaultValue":"This is the default title."})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header", "defaultValue":"alternate-header.vm", "defaultValueType":"template"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body", "defaultValue":"This is the default body in the tag."})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_flush.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_flush.vm
deleted file mode 100644
index 7cb8795..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_flush.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header", "flush":true})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body", "flush":true})#end</td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_ignore.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_ignore.vm
deleted file mode 100644
index 4a5f2ef..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_ignore.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header", "ignore":true})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_list.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_list.vm
deleted file mode 100644
index fa73b27..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_list.vm
+++ /dev/null
@@ -1,37 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>
-        #tiles_importAttribute({"name":"list"})
-        #foreach($attribute in $list)
-            #tiles_insertAttribute({"value":$attribute})#end
-        #end
-    </td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_nobody.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_nobody.vm
deleted file mode 100644
index d3b5dc0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_nobody.vm
+++ /dev/null
@@ -1,29 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_override.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_override.vm
deleted file mode 100644
index 4bdcac1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_override.vm
+++ /dev/null
@@ -1,35 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Green"><strong>This is the overridden template.</strong></td>
-  </tr>
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_preparer.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_preparer.vm
deleted file mode 100644
index 45a93d7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_preparer.vm
+++ /dev/null
@@ -1,33 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body",
-        "preparer":"org.apache.tiles.test.preparer.AttributeViewPreparer"})#end</td>
-  </tr>
-</table>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_roles.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_roles.vm
deleted file mode 100644
index 76e7aa2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/layout_roles.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<table  border="2"  width="300"  bordercolor="Gray">
-  <tr>
-    <td  bgcolor="Blue"><strong>#tiles_getAsString({"name":"title"})#end</strong></td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"header", "role":"goodrole"})#end</td>
-  </tr>
-  <tr>
-    <td>#tiles_insertAttribute({"name":"body", "role":"badrole"})#end</td>
-  </tr>
-</table>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/override.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/override.vm
deleted file mode 100644
index b936e87..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/override.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<div align="center"><b><i>This is an overridden content</i></b></div>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putallattributeslayout.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putallattributeslayout.vm
deleted file mode 100644
index 461d008..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putallattributeslayout.vm
+++ /dev/null
@@ -1,29 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_importAttribute({})
-
-${one}
-<ul>
-  <li>${two}</li>
-  <li>${three}</li>
-  <li>${four}</li>
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putattributeslayout.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putattributeslayout.vm
deleted file mode 100644
index fe563bf..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/putattributeslayout.vm
+++ /dev/null
@@ -1,30 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_importAttribute({"name":"stringTest"})
-#tiles_importAttribute({"name":"list"})
-Single attribute "stringTest" value: $esc.html($stringTest) <br/><br/>
-The attribute "list" contains these values:
-<ul>
-#foreach($item in $list)
-<li>#tiles_insertAttribute({"value":$item})#end</li>
-#end
-</ul>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/selectlocale.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/selectlocale.vm
deleted file mode 100644
index f98aaae..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/selectlocale.vm
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>Select your locale</title>
-</head>
-<body>
-<form action="servlets/selectLocaleServlet">
-Select your locale:
-<select name="locale">
-<option selected="selected" value="">Default</option>
-<option value="en_US">American English</option>
-<option value="en_GB">British English</option>
-<option value="fr_FR">French</option>
-<option value="it_IT">Italian</option>
-</select>
-<input type="submit" value="Submit" />
-</form>
-<div id="defaultLocaleMessage">Your default Locale is ${request.locale}</div>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdecorationfilter.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdecorationfilter.vm
deleted file mode 100644
index d10c438..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdecorationfilter.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-<i>This Content should be wrapped with the standard layout.</i>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef.vm
deleted file mode 100644
index 00bc5d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef.vm
+++ /dev/null
@@ -1,27 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"templateDefinition", "template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_insertDefinition({"name":"templateDefinition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_extend.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_extend.vm
deleted file mode 100644
index c21cc01..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_extend.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.definition.override.one", "extends":"velocity.test.definition"})
-  #tiles_putAttribute({"name":"body", "value":"/velocity/override.vm", "type":"velocity"})#end
-#end
-#tiles_definition({"name":"test.definition.override.two", "extends":"test.definition.override.one"})
-  #tiles_putAttribute({"name":"title", "value":"This is an overridden title"})#end
-#end
-#tiles_insertDefinition({"name":"test.definition.override.two"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_list_inherit.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_list_inherit.vm
deleted file mode 100644
index 59705fa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_list_inherit.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"templateDefinition", "extends":"test.putAttributes"})
-  #tiles_putAttribute({"name":"stringTest", "value":"This is a string", "type":"string"})#end
-  #tiles_putListAttribute({"name":"list", "inherit":true})
-    #tiles_addAttribute({"value":"valueFour", "type":"string"})#end
-  #end
-#end
-#tiles_insertDefinition({"name":"templateDefinition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_preparer.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_preparer.vm
deleted file mode 100644
index 987628e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testdef_preparer.vm
+++ /dev/null
@@ -1,27 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"templateDefinition", "template":"/velocity/layout.vm", "preparer":"org.apache.tiles.test.preparer.TestViewPreparer"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_insertDefinition({"name":"templateDefinition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute.vm
deleted file mode 100644
index 48dc8a5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.putAttributes"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_all.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_all.vm
deleted file mode 100644
index 008a3d7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_all.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.putAllAttributes"})#end
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_inherit.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_inherit.vm
deleted file mode 100644
index 163c1dd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testimportattribute_inherit.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.putAttributes.inherit"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition.vm
deleted file mode 100644
index c974ce9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name" : "velocity.test.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_preparer.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_preparer.vm
deleted file mode 100644
index ff60d88..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_preparer.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.attribute.preparer"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles.vm
deleted file mode 100644
index 31e82e3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.roles"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles_tags.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles_tags.vm
deleted file mode 100644
index ca4f4fc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_attribute_roles_tags.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.roles.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded.vm
deleted file mode 100644
index 81aec16..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.cascaded.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_list.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_list.vm
deleted file mode 100644
index 4e45bad..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_list.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.cascaded.list.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_overridden.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_overridden.vm
deleted file mode 100644
index ce1c8de..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_overridden.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.overridden.cascaded.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_template.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_template.vm
deleted file mode 100644
index 3148b51..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_cascaded_template.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.cascaded.template.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_classpath.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_classpath.vm
deleted file mode 100644
index 8bb0594..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_classpath.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.classpath.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite.vm
deleted file mode 100644
index 1e86d7d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.composite.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags.vm
deleted file mode 100644
index 43a3120..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.inner.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is an inner definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_definition({"name":"test.composite.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is a composite definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"test.inner.definition.tags", "type":"definition"})#end
-#end
-#tiles_insertDefinition({"name":"test.composite.definition.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured.vm
deleted file mode 100644
index e2c0d69..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.inner.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is an inner definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_definition({"name":"test.composite.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is a composite definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"test.inner.definition", "type":"definition"})#end
-#end
-#tiles_insertDefinition({"name":"test.composite.definition.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured_notype.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured_notype.vm
deleted file mode 100644
index bc147e6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_includes_configured_notype.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.inner.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is an inner definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_definition({"name":"test.composite.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is a composite definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"test.inner.definition"})#end
-#end
-#tiles_insertDefinition({"name":"test.composite.definition.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_notype.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_notype.vm
deleted file mode 100644
index ecb5419..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_composite_tags_notype.vm
+++ /dev/null
@@ -1,31 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.inner.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is an inner definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
-#tiles_definition({"name":"test.composite.definition.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is a composite definition with tags."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body", "value":"test.inner.definition.tags"})#end
-#end
-#tiles_insertDefinition({"name":"test.composite.definition.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_db.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_db.vm
deleted file mode 100644
index 83806c3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_db.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("db")
-#tiles_insertDefinition({"name":"test.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_defaultvalues.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_defaultvalues.vm
deleted file mode 100644
index 3872fb2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_defaultvalues.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.defaultvalues.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el.vm
deleted file mode 100644
index 81aed55..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.composite.el.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el_singleeval.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el_singleeval.vm
deleted file mode 100644
index 45bf779..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_el_singleeval.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.composite.el.doNotShow.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_exception.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_exception.vm
deleted file mode 100644
index 89beea3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_exception.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.exception"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_extended_db.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_extended_db.vm
deleted file mode 100644
index b7ddf2a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_extended_db.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("db")
-#tiles_insertDefinition({"name":"test.definition.extended"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_flush.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_flush.vm
deleted file mode 100644
index 203665b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_flush.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.flush", "flush":true})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ignore.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ignore.vm
deleted file mode 100644
index d466170..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ignore.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.ignore"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_inline.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_inline.vm
deleted file mode 100644
index 52c4a1e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_inline.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition"})
-#tiles_putAttribute({"name":"body", "value":$inlineContent.toString()})
-  <div align="center"><b><i>This is an inline content</i></b></div>
-#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_mvel.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_mvel.vm
deleted file mode 100644
index ed9b32f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_mvel.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id: testinsertdefinition_el.vm 782137 2009-06-05 21:18:52Z apetrelli $
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.composite.mvel.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ognl.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ognl.vm
deleted file mode 100644
index b363247..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_ognl.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id: testinsertdefinition_el.vm 782137 2009-06-05 21:18:52Z apetrelli $
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.composite.ognl.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_old.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_old.vm
deleted file mode 100644
index 670146a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_old.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.old_format"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_openbody.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_openbody.vm
deleted file mode 100644
index 04c90e1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_openbody.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.openbody.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override.vm
deleted file mode 100644
index 7d9f2e7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override.vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition"})
-  #tiles_putAttribute({"name":"body", "value":"/velocity/override.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_and_not.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_and_not.vm
deleted file mode 100644
index b534f4a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_and_not.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-Overridden content:<br/>
-#tiles_insertDefinition({"name":"velocity.test.definition"})
-  #tiles_putAttribute({"name":"body", "value":"/velocity/override.vm", "type":"velocity"})#end
-#end
-<br/>
-Not overridden content:<br/>
-#tiles_insertDefinition({"name":"velocity.test.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_template.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_template.vm
deleted file mode 100644
index 3b0786f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_override_template.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition", "template":"/velocity/layout_override.vm"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer.vm
deleted file mode 100644
index ee13f07..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.preparer.definition", "preparer":"org.apache.tiles.test.preparer.TestViewPreparer"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer_configured.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer_configured.vm
deleted file mode 100644
index 61a162f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_preparer_configured.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.preparer.definition.configured"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_regexp.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_regexp.vm
deleted file mode 100644
index 45401b8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_regexp.vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#*
- * $Id: testinsertdefinition_wildcard.vm 782137 2009-06-05 21:18:52Z apetrelli $
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("alternate")
-#tiles_insertDefinition({"name":"velocity.test.regexp.definitionOne.messageHello"})#end
-#tiles_insertDefinition({"name":"velocity.test.regexp.definitionTwo.messageBye"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_reversed.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_reversed.vm
deleted file mode 100644
index 72053ca..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_reversed.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.reversed.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role.vm
deleted file mode 100644
index 42015d5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.appears.configured"})#end
-#tiles_insertDefinition({"name":"velocity.test.definition.does_not_appear.configured"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role_tag.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role_tag.vm
deleted file mode 100644
index e29434c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_role_tag.vm
+++ /dev/null
@@ -1,23 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.definition.appears", "role":"goodrole"})#end
-#tiles_insertDefinition({"name":"velocity.test.definition.does_not_appear", "role":"badrole"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_wildcard.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_wildcard.vm
deleted file mode 100644
index 955e7d5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertdefinition_wildcard.vm
+++ /dev/null
@@ -1,24 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("alternate")
-#tiles_insertDefinition({"name":"velocity.test.definitionOne.messageHello"})#end
-#tiles_insertDefinition({"name":"velocity.test.definitionTwo.messageBye"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition.vm
deleted file mode 100644
index 62b8d7b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.nesting.definitions"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition_tags.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition_tags.vm
deleted file mode 100644
index 4dc3b0b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnesteddefinition_tags.vm
+++ /dev/null
@@ -1,33 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.nesting.definitions.tags", "template":"/velocity/layout.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putAttribute({"name":"body"})
-        #tiles_definition({"template":"/velocity/layout.vm"})
-            #tiles_putAttribute({"name":"title", "value":"This is a nested definition."})#end
-            #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-            #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-        #end
-    #end
-#end
-#tiles_insertDefinition({"name":"test.nesting.definitions.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition.vm
deleted file mode 100644
index 1b0495b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition.vm
+++ /dev/null
@@ -1,22 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.nesting.list.definitions"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition_tags.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition_tags.vm
deleted file mode 100644
index 4a5fa97..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testinsertnestedlistdefinition_tags.vm
+++ /dev/null
@@ -1,35 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_definition({"name":"test.nesting.definitions.tags", "template":"/velocity/layout_list.vm"})
-    #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-    #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-    #tiles_putListAttribute({"name":"list"})
-        #tiles_addAttribute({})
-	        #tiles_definition({"template":"/velocity/layout.vm"})
-	            #tiles_putAttribute({"name":"title", "value":"This is a nested definition."})#end
-	            #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-	            #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-	        #end
-        #end
-    #end
-#end
-#tiles_insertDefinition({"name":"test.nesting.definitions.tags"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput.vm
deleted file mode 100644
index 5e6b957..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded.vm
deleted file mode 100644
index 67c52bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title.", "cascade":true})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity", "cascade":true})#end
-  #tiles_putAttribute({"name":"body", "value":"test.inner.cascadable.definition"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_overridden.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_overridden.vm
deleted file mode 100644
index 53f4157..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_overridden.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title.", "cascade":true})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/alternate-header.vm", "type":"velocity", "cascade":true})#end
-  #tiles_putAttribute({"name":"body", "value":"test.inner.definition"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_template.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_template.vm
deleted file mode 100644
index 0d1dcd9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_cascaded_template.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title.", "cascade":true})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity", "cascade":true})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/layout_nobody.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el.vm
deleted file mode 100644
index 9d6cf55..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el.vm
+++ /dev/null
@@ -1,28 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#set($bodyContent="Body Content defined by and el")
-
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title",  "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body",   "value":$bodyContent})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el_singleeval.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el_singleeval.vm
deleted file mode 100644
index c79d2d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_el_singleeval.vm
+++ /dev/null
@@ -1,29 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#set($doNotShowBody="$" + "{" + "requestScope.doNotShow}")
-#set($doNotShow="DO NOT SHOW!!!")
-
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":$doNotShowBody})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_flush.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_flush.vm
deleted file mode 100644
index 4d418df..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_flush.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm", "flush":true})
-  #tiles_putAttribute({"name":"title",  "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body",   "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_reversed.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_reversed.vm
deleted file mode 100644
index 2f8ea27..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_reversed.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout_alt_title.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title.", "type":"reversed"})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_servlet.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_servlet.vm
deleted file mode 100644
index 9eeef1be..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testput_servlet.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/servlets/layoutServlet"})
-  #tiles_putAttribute({"name":"title",  "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body",   "value":"/velocity/body.vm", "type":"velocity"})#end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist.vm
deleted file mode 100644
index fa8abab..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist.vm
+++ /dev/null
@@ -1,29 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/putattributeslayout.vm"})
-  #tiles_putAttribute({"name":"stringTest", "value":"This is a string", "type":"string"})#end
-  #tiles_putListAttribute({"name":"list"})
-    #tiles_addAttribute({"value":"valueOne", "type":"string"})#end
-    #tiles_addAttribute({"value":"valueTwo", "type":"string"})#end
-    #tiles_addAttribute({"value":"valueThree", "type":"string"})#end
-  #end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_cascaded.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_cascaded.vm
deleted file mode 100644
index 9810479..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_cascaded.vm
+++ /dev/null
@@ -1,32 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertTemplate({"template":"/velocity/layout.vm"})
-  #tiles_putAttribute({"name":"title", "value":"This is the title."})#end
-  #tiles_putAttribute({"name":"header", "value":"/velocity/header.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"body", "value":"/velocity/putattributeslayout.vm", "type":"velocity"})#end
-  #tiles_putAttribute({"name":"stringTest", "value":"This is a string", "type":"string", "cascade":true})#end
-  #tiles_putListAttribute({"name":"list", "cascade":true})
-    #tiles_addAttribute({"value":"valueOne", "type":"string"})#end
-    #tiles_addAttribute({"value":"valueTwo", "type":"string"})#end
-    #tiles_addAttribute({"value":"valueThree", "type":"string"})#end
-  #end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_inherit.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_inherit.vm
deleted file mode 100644
index d340d52..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testputlist_inherit.vm
+++ /dev/null
@@ -1,26 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-#tiles_insertDefinition({"name":"velocity.test.putAttributes"})
-  #tiles_putListAttribute({"name":"list", "inherit":true})
-    #tiles_addAttribute({"value":"valueFour", "type":"string"})#end
-  #end
-#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testsetcurrentcontainer.vm b/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testsetcurrentcontainer.vm
deleted file mode 100644
index 6d99a45..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/main/webapp/velocity/testsetcurrentcontainer.vm
+++ /dev/null
@@ -1,25 +0,0 @@
-#*
- * $Id$
- *
- * 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.
- *
- *#
-$tiles.setCurrentContainer("alternate")
-#tiles_insertDefinition({"name":"velocity.test.definition"})#end
-$tiles.setCurrentContainer(null)
-#tiles_insertDefinition({"name":"velocity.test.definition"})#end
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/site/site.xml b/TILES_3_0_X/tiles-test-pom/tiles-test/src/site/site.xml
deleted file mode 100644
index d78cbc1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Test web application">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
deleted file mode 100644
index 8e55425..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
deleted file mode 100644
index 14bd1ec..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
deleted file mode 100644
index 68514e9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Definition that contains another definition inside using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionTest.html
deleted file mode 100644
index 1a257b5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/CompositeDefinitionWithInnerDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Definition that contains another definition inside using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredCompositeDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredCompositeDefinitionTest.html
deleted file mode 100644
index fb58cfd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredCompositeDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Composite Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-w<tr><td rowspan="1" colspan="3">Configured Composite Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition that contains another definition inside</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributePreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributePreparerTest.html
deleted file mode 100644
index 89c60d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributePreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Attribute Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the AttributeViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTagsTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTagsTest.html
deleted file mode 100644
index 373529a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTagsTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Tags Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Tags Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Attribute that have Roles in Tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTest.html
deleted file mode 100644
index f365b11..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionAttributeRolesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Attribute that have Roles</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedListTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedListTest.html
deleted file mode 100644
index e7804f0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedListTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded List Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded List Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Cascaded Definition with List</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Single attribute "stringTest" value: This is a string </td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueOne</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueTwo</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueThree</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedOverriddenTest.html
deleted file mode 100644
index abf00c0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Cascaded Definition with Override</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTemplateTest.html
deleted file mode 100644
index c6c540e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Cascaded Definition with Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTest.html
deleted file mode 100644
index ca90ae5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Cascaded Definition</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDbTest.html
deleted file mode 100644
index 6ce38e3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDefaultValuesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDefaultValuesTest.html
deleted file mode 100644
index 6c976a1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionDefaultValuesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Default Values Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Default Values Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Default Values</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the alternate header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the default body in the tag.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELSingleEvalTest.html
deleted file mode 100644
index c2d88bf..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELTest.html
deleted file mode 100644
index f7cbbfa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExceptionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExceptionTest.html
deleted file mode 100644
index 153a1c5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExceptionTest.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Exception Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with an exception in an attribute page</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExtendedDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExtendedDbTest.html
deleted file mode 100644
index ecdc699..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionExtendedDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Extended Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Extended Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Extended Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an extended definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFlushTest.html
deleted file mode 100644
index 42d2ef6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFreeMarkerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFreeMarkerTest.html
deleted file mode 100644
index 91d31f2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFreeMarkerTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test with FreeMarker</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Test with FreeMarker</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with FreeMarker</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This layout is made in FreeMarker.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFromClasspathTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFromClasspathTest.html
deleted file mode 100644
index 57ffee9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionFromClasspathTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition from Classpath Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition from Classpath Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Classpath Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This tile was loaded from the classpath</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionIgnoreTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionIgnoreTest.html
deleted file mode 100644
index 49c45b3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionIgnoreTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Ignore Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Ignore Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Ignore</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionInlineTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionInlineTest.html
deleted file mode 100644
index 06bbe4e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionInlineTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Inline Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Inline Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with an inline content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inline content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionMVELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionMVELTest.html
deleted file mode 100644
index c0eaaeb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionMVELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition MVEL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition MVEL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with MVEL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOGNLTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOGNLTest.html
deleted file mode 100644
index ba2b2d7..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOGNLTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition OGNL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition OGNL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with OGNL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOldFormatTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOldFormatTest.html
deleted file mode 100644
index 0137c01..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOldFormatTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Old Format Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Old Format Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition in Old Format</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a definition configured in 1.1 format.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOpenBodyTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOpenBodyTest.html
deleted file mode 100644
index 7441fb6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOpenBodyTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Open BodyTest</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Open Body Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Open Body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a customized context</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideAndNotTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideAndNotTest.html
deleted file mode 100644
index 1a79c50..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideAndNotTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden and Original Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with an overridden content and one with original content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTemplateTest.html
deleted file mode 100644
index 4bd5430..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTemplateTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with an overridden template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the overridden template.</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTest.html
deleted file mode 100644
index 944d451..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionOverrideTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRegexpTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRegexpTest.html
deleted file mode 100644
index 88efc4e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRegexpTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Regular Expression Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Regular Expression Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Regular Expression</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionReversedTest.html
deleted file mode 100644
index 659bf10..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTagTest.html
deleted file mode 100644
index 3fcfbdf..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Specified Role in Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTest.html
deleted file mode 100644
index 1a2a9b0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionRoleTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Specified Role</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionTest.html
deleted file mode 100644
index 598178c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWildcardTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWildcardTest.html
deleted file mode 100644
index f6e1faa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWildcardTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Wildcard Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Wildcard Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Wildcards</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithConfiguredPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithConfiguredPreparerTest.html
deleted file mode 100644
index 2859c00..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithConfiguredPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Configured Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Configured Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Preparer configured in the definition itself</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithPreparerTest.html
deleted file mode 100644
index a637a66..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredDefinitionWithPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Configured Definition with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedDefinitionTest.html
deleted file mode 100644
index 7bad1d0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Nested Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedListDefinitionTest.html
deleted file mode 100644
index a24203b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ConfiguredNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Nested List Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagExtendTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagExtendTest.html
deleted file mode 100644
index 1fb5964..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagExtendTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Extend Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=Test Definition Tag extending configured and custom definitions</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden content</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagListInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagListInheritTest.html
deleted file mode 100644
index 3d6f0b0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagListInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag List Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag List Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Definition Tag with a List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagPreparerTest.html
deleted file mode 100644
index 21bada2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagPreparerTest.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Definition Tag with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagTest.html
deleted file mode 100644
index 916f126..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/DefinitionTagTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=Test Definition Tag</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagAllTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagAllTest.html
deleted file mode 100644
index 33be775..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagAllTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag with no Name Specified Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag with no Name Specified Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test importAttribute Tag with no name</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>One</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Two</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Three </td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagInheritTest.html
deleted file mode 100644
index dea2009..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test importAttribute Tag with List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagTest.html
deleted file mode 100644
index d93a563..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/ImportAttributeTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test importAttribute Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationDbTest.html
deleted file mode 100644
index 00e1d6f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationDbTest.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Localization Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Localization Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Localization from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>storeText</td>
-	<td>defaultLocaleMessage</td>
-	<td>localeMessage</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertText</td>
-	<td>defaultLocaleMessage</td>
-	<td>${localeMessage}</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=American English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>American English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=British English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>British English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=French</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>French locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=Italian</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Italian locale</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationTest.html
deleted file mode 100644
index ca7eda1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/LocalizationTest.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Localization Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Localization</td>
-	<td></td>
-</tr>
-<tr>
-	<td>storeText</td>
-	<td>defaultLocaleMessage</td>
-	<td>localeMessage</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertText</td>
-	<td>defaultLocaleMessage</td>
-	<td>${localeMessage}</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=American English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>American English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=British English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>British English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=French</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>French locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=Italian</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Italian locale</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListCascadedTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListCascadedTagTest.html
deleted file mode 100644
index a222e04..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListCascadedTagTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Cascaded Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Cascaded Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put List Cascaded Tag</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagInheritTest.html
deleted file mode 100644
index 2dcd63a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put List Tag with Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagTest.html
deleted file mode 100644
index b8dc086..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutListTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put List Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedOverriddenTest.html
deleted file mode 100644
index 3e8816b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag with Overridden Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTemplateTest.html
deleted file mode 100644
index b629fb9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag with Cascaded Attributes and Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTest.html
deleted file mode 100644
index ed6059e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag with Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagFlushTest.html
deleted file mode 100644
index 40857c1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedDefinitionTest.html
deleted file mode 100644
index 3318511..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Nested Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedListDefinitionTest.html
deleted file mode 100644
index 2f89f81..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Insert Nested List Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagReversedTest.html
deleted file mode 100644
index 7970044..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagTest.html
deleted file mode 100644
index dd4a2a4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELSingleEvalTest.html
deleted file mode 100644
index 845eee9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag using EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag using EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELTest.html
deleted file mode 100644
index bad3e6e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithELTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag using EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Body Content defined by and el</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithServletTest.html
deleted file mode 100644
index e5a443f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/PutTagWithServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Servlet as Template Test</title>
-</head>
-w<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Servlet as Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Put Tag using a servlet mapping as a template</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/SetCurrentContainerTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/SetCurrentContainerTagTest.html
deleted file mode 100644
index 7624163..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/SetCurrentContainerTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>setCurrentContainer Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">setCurrentContainer Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test setCurrentContainer Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition is from an alternate container.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TestSuite.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TestSuite.html
deleted file mode 100644
index 1e2acb8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TestSuite.html
+++ /dev/null
@@ -1,629 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<body>
-
-<table>
-    <tr>
-        <td>Tiles 2 Tests</td>
-    </tr>
-    <tr>
-        <td><a href="WelcomePageTest.html">Welcome Page Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionTest.html">Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionIgnoreTest.html">Configured Definition with Ignore Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionFlushTest.html">Configured Definition with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionFreeMarkerTest.html">Configured Definition with FreeMarker Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionWithPreparerTest.html">Configured Definition with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionWithConfiguredPreparerTest.html">Configured Definition with Configured Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionFromClasspathTest.html">Configured Definition from Classpath Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOverrideTest.html">Configured Definition with Overridden Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOverrideTemplateTest.html">Configured Definition with Overridden Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOverrideAndNotTest.html">Configured Definition with Overridden and Original Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionInlineTest.html">Configured Definition with Inline Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredCompositeDefinitionTest.html">Configured Composite Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionExceptionTest.html">Configured Definition with Exception Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOldFormatTest.html">Configured Definition Old Format Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionCascadedTest.html">Configured Definition Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionCascadedOverriddenTest.html">Configured Definition Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionCascadedTemplateTest.html">Configured Definition Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionCascadedListTest.html">Configured Definition Cascaded List Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionReversedTest.html">Configured Definition Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionAttributePreparerTest.html">Configured Definition Attribute Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredNestedDefinitionTest.html">Configured Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredNestedListDefinitionTest.html">Configured Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionELTest.html">Configured Definition EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionMVELTest.html">Configured Definition MVEL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOGNLTest.html">Configured Definition OGNL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionELSingleEvalTest.html">Configured Definition EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionOpenBodyTest.html">Configured Definition with Open Body Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionDefaultValuesTest.html">Configured Definition with Default Values Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionWildcardTest.html">Configured Definition Wildcard Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionRegexpTest.html">Configured Definition Regular Expression Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagTest.html">Put Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagFlushTest.html">Put Tag with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagWithELTest.html">Put Tag using EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagWithELSingleEvalTest.html">Put Tag using EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagWithServletTest.html">Put Tag with Servlet as Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagCascadedTest.html">Put Tag Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagCascadedOverriddenTest.html">Put Tag Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagCascadedTemplateTest.html">Put Tag Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagReversedTest.html">Put Tag Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagNestedDefinitionTest.html">Put Tag with Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutTagNestedListDefinitionTest.html">Put Tag with Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutListTagTest.html">Put List Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutListCascadedTagTest.html">Put List Cascaded Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="PutListTagInheritTest.html">Put List Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="LocalizationTest.html">Localization Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ImportAttributeTagTest.html">Import Attribute Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ImportAttributeTagAllTest.html">Import Attribute Tag with no Name Specified Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ImportAttributeTagInheritTest.html">Import Attribute Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="TilesDefinitionFilterTest.html">Tiles Definition Filter Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="TilesDispatchServletTest.html">Tiles Dispatch Servlet Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="SetCurrentContainerTagTest.html">setCurrentContainer Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="DefinitionTagTest.html">Definition Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="DefinitionTagExtendTest.html">Definition Tag Extend Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="DefinitionTagListInheritTest.html">Definition Tag List Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="DefinitionTagPreparerTest.html">Definition Tag with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="CompositeDefinitionWithInnerConfiguredDefinitionTest.html">Composite Definition with inner Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="CompositeDefinitionWithInnerDefinitionTest.html">Composite Definition with inner Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html">Composite Definition with inner Configured Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="CompositeDefinitionWithInnerDefinitionNoTypeTest.html">Composite Definition with inner Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionRoleTest.html">Configured Definition Role Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionRoleTagTest.html">Configured Definition Role Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionAttributeRolesTest.html">Configured Definition Attribute Roles Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionAttributeRolesTagsTest.html">Configured Definition Attribute Roles Tags Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionDbTest.html">Configured Definition Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="ConfiguredDefinitionExtendedDbTest.html">Configured Definition Extended Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="LocalizationDbTest.html">Localization Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/WelcomePageTest.html">FreeMarker: Welcome Page Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionTest.html">FreeMarker: Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionIgnoreTest.html">FreeMarker: Configured Definition with Ignore Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionFlushTest.html">FreeMarker: Configured Definition with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionWithPreparerTest.html">FreeMarker: Configured Definition with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionWithConfiguredPreparerTest.html">FreeMarker: Configured Definition with Configured Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionFromClasspathTest.html">FreeMarker: Configured Definition from Classpath Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOverrideTest.html">FreeMarker: Configured Definition with Overridden Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOverrideTemplateTest.html">FreeMarker: Configured Definition with Overridden Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOverrideAndNotTest.html">FreeMarker: Configured Definition with Overridden and Original Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionInlineTest.html">FreeMarker: Configured Definition with Inline Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredCompositeDefinitionTest.html">FreeMarker: Configured Composite Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionExceptionTest.html">FreeMarker: Configured Definition with Exception Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOldFormatTest.html">FreeMarker: Configured Definition Old Format Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionCascadedTest.html">FreeMarker: Configured Definition Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionCascadedOverriddenTest.html">FreeMarker: Configured Definition Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionCascadedTemplateTest.html">FreeMarker: Configured Definition Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionCascadedListTest.html">FreeMarker: Configured Definition Cascaded List Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionReversedTest.html">FreeMarker: Configured Definition Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionAttributePreparerTest.html">FreeMarker: Configured Definition Attribute Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredNestedDefinitionTest.html">FreeMarker: Configured Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredNestedListDefinitionTest.html">FreeMarker: Configured Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionELTest.html">FreeMarker: Configured Definition EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionMVELTest.html">FreeMarker: Configured Definition MVEL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOGNLTest.html">FreeMarker: Configured Definition OGNL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionELSingleEvalTest.html">FreeMarker: Configured Definition EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionOpenBodyTest.html">FreeMarker: Configured Definition with Open Body Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionDefaultValuesTest.html">FreeMarker: Configured Definition with Default Values Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionWildcardTest.html">FreeMarker: Configured Definition Wildcard Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionRegexpTest.html">FreeMarker: Configured Definition Regular Expression Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagTest.html">FreeMarker: Put Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagFlushTest.html">FreeMarker: Put Tag with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagWithELTest.html">FreeMarker: Put Tag using EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagWithELSingleEvalTest.html">FreeMarker: Put Tag using EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagWithServletTest.html">FreeMarker: Put Tag with Servlet as Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagCascadedTest.html">FreeMarker: Put Tag Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagCascadedOverriddenTest.html">FreeMarker: Put Tag Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagCascadedTemplateTest.html">FreeMarker: Put Tag Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagReversedTest.html">FreeMarker: Put Tag Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagNestedDefinitionTest.html">FreeMarker: Put Tag with Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutTagNestedListDefinitionTest.html">FreeMarker: Put Tag with Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutListTagTest.html">FreeMarker: Put List Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutListCascadedTagTest.html">FreeMarker: Put List Cascaded Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/PutListTagInheritTest.html">FreeMarker: Put List Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/LocalizationTest.html">FreeMarker: Localization Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ImportAttributeTagTest.html">FreeMarker: Import Attribute Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ImportAttributeTagAllTest.html">FreeMarker: Import Attribute Tag with no Name Specified Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ImportAttributeTagInheritTest.html">FreeMarker: Import Attribute Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/TilesDefinitionFilterTest.html">FreeMarker: Tiles Definition Filter Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/TilesDispatchServletTest.html">FreeMarker: Tiles Dispatch Servlet Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/SetCurrentContainerTagTest.html">FreeMarker: setCurrentContainer Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/DefinitionTagTest.html">FreeMarker: Definition Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/DefinitionTagExtendTest.html">FreeMarker: Definition Tag Extend Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/DefinitionTagListInheritTest.html">FreeMarker: Definition Tag List Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/DefinitionTagPreparerTest.html">FreeMarker: Definition Tag with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/CompositeDefinitionWithInnerConfiguredDefinitionTest.html">FreeMarker: Composite Definition with inner Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/CompositeDefinitionWithInnerDefinitionTest.html">FreeMarker: Composite Definition with inner Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html">FreeMarker: Composite Definition with inner Configured Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/CompositeDefinitionWithInnerDefinitionNoTypeTest.html">FreeMarker: Composite Definition with inner Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionRoleTest.html">FreeMarker: Configured Definition Role Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionRoleTagTest.html">FreeMarker: Configured Definition Role Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionAttributeRolesTest.html">FreeMarker: Configured Definition Attribute Roles Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionAttributeRolesTagsTest.html">FreeMarker: Configured Definition Attribute Roles Tags Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionDbTest.html">FreeMarker: Configured Definition Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionExtendedDbTest.html">FreeMarker: Configured Definition Extended Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="freemarker/ConfiguredDefinitionInModuleTest.html">FreeMarker: Configured Definition in Module Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/WelcomePageTest.html">Velocity: Welcome Page Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionTest.html">Velocity: Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionIgnoreTest.html">Velocity: Configured Definition with Ignore Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionFlushTest.html">Velocity: Configured Definition with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionWithPreparerTest.html">Velocity: Configured Definition with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionWithConfiguredPreparerTest.html">Velocity: Configured Definition with Configured Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionFromClasspathTest.html">Velocity: Configured Definition from Classpath Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOverrideTest.html">Velocity: Configured Definition with Overridden Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOverrideTemplateTest.html">Velocity: Configured Definition with Overridden Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOverrideAndNotTest.html">Velocity: Configured Definition with Overridden and Original Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionInlineTest.html">Velocity: Configured Definition with Inline Content Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredCompositeDefinitionTest.html">Velocity: Configured Composite Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionExceptionTest.html">Velocity: Configured Definition with Exception Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOldFormatTest.html">Velocity: Configured Definition Old Format Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionCascadedTest.html">Velocity: Configured Definition Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionCascadedOverriddenTest.html">Velocity: Configured Definition Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionCascadedTemplateTest.html">Velocity: Configured Definition Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionCascadedListTest.html">Velocity: Configured Definition Cascaded List Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionReversedTest.html">Velocity: Configured Definition Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionAttributePreparerTest.html">Velocity: Configured Definition Attribute Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredNestedDefinitionTest.html">Velocity: Configured Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredNestedListDefinitionTest.html">Velocity: Configured Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionELTest.html">Velocity: Configured Definition EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionMVELTest.html">Velocity: Configured Definition MVEL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOGNLTest.html">Velocity: Configured Definition OGNL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionELSingleEvalTest.html">Velocity: Configured Definition EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionOpenBodyTest.html">Velocity: Configured Definition with Open Body Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionDefaultValuesTest.html">Velocity: Configured Definition with Default Values Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionWildcardTest.html">Velocity: Configured Definition Wildcard Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionRegexpTest.html">Velocity: Configured Definition Regular Expression Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagTest.html">Velocity: Put Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagFlushTest.html">Velocity: Put Tag with Flush Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagWithELTest.html">Velocity: Put Tag using EL Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagWithELSingleEvalTest.html">Velocity: Put Tag using EL with Single Evaluation Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagWithServletTest.html">Velocity: Put Tag with Servlet as Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagCascadedTest.html">Velocity: Put Tag Cascaded Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagCascadedOverriddenTest.html">Velocity: Put Tag Cascaded Overridden Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagCascadedTemplateTest.html">Velocity: Put Tag Cascaded Template Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagReversedTest.html">Velocity: Put Tag Reversed Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagNestedDefinitionTest.html">Velocity: Put Tag with Nested Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutTagNestedListDefinitionTest.html">Velocity: Put Tag with Nested List Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutListTagTest.html">Velocity: Put List Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutListCascadedTagTest.html">Velocity: Put List Cascaded Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/PutListTagInheritTest.html">Velocity: Put List Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/LocalizationTest.html">Velocity: Localization Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ImportAttributeTagTest.html">Velocity: Import Attribute Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ImportAttributeTagAllTest.html">Velocity: Import Attribute Tag with no Name Specified Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ImportAttributeTagInheritTest.html">Velocity: Import Attribute Tag Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/TilesDefinitionFilterTest.html">Velocity: Tiles Definition Filter Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/TilesDispatchServletTest.html">Velocity: Tiles Dispatch Servlet Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/SetCurrentContainerTagTest.html">Velocity: setCurrentContainer Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/DefinitionTagTest.html">Velocity: Definition Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/DefinitionTagExtendTest.html">Velocity: Definition Tag Extend Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/DefinitionTagListInheritTest.html">Velocity: Definition Tag List Inherit Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/DefinitionTagPreparerTest.html">Velocity: Definition Tag with Preparer Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/CompositeDefinitionWithInnerConfiguredDefinitionTest.html">Velocity: Composite Definition with inner Configured Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/CompositeDefinitionWithInnerDefinitionTest.html">Velocity: Composite Definition with inner Definition Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html">Velocity: Composite Definition with inner Configured Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/CompositeDefinitionWithInnerDefinitionNoTypeTest.html">Velocity: Composite Definition with inner Definition with no Type Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionRoleTest.html">Velocity: Configured Definition Role Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionRoleTagTest.html">Velocity: Configured Definition Role Tag Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionAttributeRolesTest.html">Velocity: Configured Definition Attribute Roles Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionAttributeRolesTagsTest.html">Velocity: Configured Definition Attribute Roles Tags Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionDbTest.html">Velocity: Configured Definition Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionExtendedDbTest.html">Velocity: Configured Definition Extended Db Test</a></td>
-    </tr>
-    <tr>
-        <td><a href="velocity/ConfiguredDefinitionInModuleTest.html">Velocity: Configured Definition in Module Test</a></td>
-    </tr>
-</table>
-</body>
-</html>
\ No newline at end of file
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDefinitionFilterTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDefinitionFilterTest.html
deleted file mode 100644
index 3150826..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDefinitionFilterTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Definition Filter Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Tiles Definition Filter</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This Content should be wrapped with the standard layout.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDispatchServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDispatchServletTest.html
deleted file mode 100644
index b30ecfd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/TilesDispatchServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Dispatch Servlet Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Test Tiles Dispatch Servlet</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/WelcomePageTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/WelcomePageTest.html
deleted file mode 100644
index 3c257bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/WelcomePageTest.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Registration Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Welcome Page Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTitle</td>
-	<td>Tiles 2 Test Application</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Tiles 2 Test Application</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
deleted file mode 100644
index 544560d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
deleted file mode 100644
index 8c8c2d1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
deleted file mode 100644
index 9d2991c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Definition that contains another definition inside using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionTest.html
deleted file mode 100644
index 8658b5b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/CompositeDefinitionWithInnerDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Definition that contains another definition inside using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredCompositeDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredCompositeDefinitionTest.html
deleted file mode 100644
index 0a6f2f6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredCompositeDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Composite Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-w<tr><td rowspan="1" colspan="3">Configured Composite Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition that contains another definition inside</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributePreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributePreparerTest.html
deleted file mode 100644
index c3091a0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributePreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Attribute Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the AttributeViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTagsTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTagsTest.html
deleted file mode 100644
index 2df9c59..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTagsTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Tags Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Tags Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Attribute that have Roles in Tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTest.html
deleted file mode 100644
index 51b0478..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionAttributeRolesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Attribute that have Roles</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedListTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedListTest.html
deleted file mode 100644
index 3e5f3cd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedListTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded List Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded List Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Cascaded Definition with List</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Single attribute "stringTest" value: This is a string </td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueOne</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueTwo</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueThree</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedOverriddenTest.html
deleted file mode 100644
index 1ff01cb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Cascaded Definition with Override</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTemplateTest.html
deleted file mode 100644
index 2cc9e75..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Cascaded Definition with Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTest.html
deleted file mode 100644
index daaa243..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Cascaded Definition</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDbTest.html
deleted file mode 100644
index 0f299eb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDefaultValuesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDefaultValuesTest.html
deleted file mode 100644
index 5797df3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionDefaultValuesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Default Values Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Default Values Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Default Values</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the alternate header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the default body in the tag.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELSingleEvalTest.html
deleted file mode 100644
index b0c80f6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELTest.html
deleted file mode 100644
index 90510d2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExceptionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExceptionTest.html
deleted file mode 100644
index 2ba0e43..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExceptionTest.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Exception Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with an exception in an attribute page</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExtendedDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExtendedDbTest.html
deleted file mode 100644
index aa5ce9b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionExtendedDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Extended Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Extended Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Extended Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an extended definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFlushTest.html
deleted file mode 100644
index 6f611bc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFromClasspathTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFromClasspathTest.html
deleted file mode 100644
index f86f6d9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionFromClasspathTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition from Classpath Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition from Classpath Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Classpath Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This tile was loaded from the classpath</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionIgnoreTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionIgnoreTest.html
deleted file mode 100644
index 35e3c6d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionIgnoreTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Ignore Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Ignore Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Ignore</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInModuleTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInModuleTest.html
deleted file mode 100644
index 91079a4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInModuleTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition in Module Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition in Module Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition in Module</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition is from an alternate container.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This body is loaded from the "alt" module.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInlineTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInlineTest.html
deleted file mode 100644
index 13b8ad4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionInlineTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Inline Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Inline Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with an inline content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inline content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionMVELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionMVELTest.html
deleted file mode 100644
index 8928766..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionMVELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition MVEL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition MVEL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with MVEL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOGNLTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOGNLTest.html
deleted file mode 100644
index 809a809..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOGNLTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition OGNL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition OGNL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with OGNL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOldFormatTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOldFormatTest.html
deleted file mode 100644
index c285f75..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOldFormatTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Old Format Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Old Format Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition in Old Format</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a definition configured in 1.1 format.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOpenBodyTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOpenBodyTest.html
deleted file mode 100644
index d2ae633..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOpenBodyTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Open BodyTest</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Open Body Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Open Body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a customized context</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideAndNotTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideAndNotTest.html
deleted file mode 100644
index cc33488..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideAndNotTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden and Original Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with an overridden content and one with original content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTemplateTest.html
deleted file mode 100644
index ae3e045..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTemplateTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with an overridden template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the overridden template.</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTest.html
deleted file mode 100644
index 1894c74..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionOverrideTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRegexpTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRegexpTest.html
deleted file mode 100644
index 42757b5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRegexpTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Regular Expression Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Regular Expression Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Regular Expression</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionReversedTest.html
deleted file mode 100644
index e3783f5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTagTest.html
deleted file mode 100644
index 1eca4c9..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Specified Role in Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTest.html
deleted file mode 100644
index 0dc25d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionRoleTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Specified Role</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionTest.html
deleted file mode 100644
index ff46f29..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWildcardTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWildcardTest.html
deleted file mode 100644
index a44871b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWildcardTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Wildcard Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Wildcard Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Wildcards</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithConfiguredPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithConfiguredPreparerTest.html
deleted file mode 100644
index 11aa6ac..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithConfiguredPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Configured Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Configured Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Preparer configured in the definition itself</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithPreparerTest.html
deleted file mode 100644
index fcac653..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredDefinitionWithPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Configured Definition with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedDefinitionTest.html
deleted file mode 100644
index cef86a1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Nested Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedListDefinitionTest.html
deleted file mode 100644
index 2939c31..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ConfiguredNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Nested List Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagExtendTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagExtendTest.html
deleted file mode 100644
index 7cf6456..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagExtendTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Extend Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=FreeMarker: Test Definition Tag extending configured and custom definitions</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden content</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagListInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagListInheritTest.html
deleted file mode 100644
index aac2a3f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagListInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag List Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag List Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Definition Tag with a List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagPreparerTest.html
deleted file mode 100644
index 41b994e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagPreparerTest.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Definition Tag with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagTest.html
deleted file mode 100644
index ebf27cd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/DefinitionTagTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=FreeMarker: Test Definition Tag</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagAllTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagAllTest.html
deleted file mode 100644
index 6d7f736..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagAllTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag with no Name Specified Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag with no Name Specified Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test importAttribute Tag with no name</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>One</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Two</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Three </td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagInheritTest.html
deleted file mode 100644
index 3735b84..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test importAttribute Tag with List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagTest.html
deleted file mode 100644
index 817df6a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/ImportAttributeTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test importAttribute Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/LocalizationTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/LocalizationTest.html
deleted file mode 100644
index 558b755..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/LocalizationTest.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Localization Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Localization</td>
-	<td></td>
-</tr>
-<tr>
-	<td>storeText</td>
-	<td>defaultLocaleMessage</td>
-	<td>localeMessage</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertText</td>
-	<td>defaultLocaleMessage</td>
-	<td>${localeMessage}</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=American English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>American English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=British English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>British English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=French</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>French locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=Italian</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Italian locale</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListCascadedTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListCascadedTagTest.html
deleted file mode 100644
index 35bb4df..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListCascadedTagTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Cascaded Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Cascaded Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put List Cascaded Tag</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagInheritTest.html
deleted file mode 100644
index 59d5444..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put List Tag with Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagTest.html
deleted file mode 100644
index 696717c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutListTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put List Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedOverriddenTest.html
deleted file mode 100644
index f897957..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag with Overridden Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTemplateTest.html
deleted file mode 100644
index f176b9c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag with Cascaded Attributes and Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTest.html
deleted file mode 100644
index cfbc758..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag with Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagFlushTest.html
deleted file mode 100644
index 326b407..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedDefinitionTest.html
deleted file mode 100644
index 50880ad..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Nested Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedListDefinitionTest.html
deleted file mode 100644
index 41a73d6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Insert Nested List Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagReversedTest.html
deleted file mode 100644
index 0281527..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagTest.html
deleted file mode 100644
index 64804f0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELSingleEvalTest.html
deleted file mode 100644
index 229f04f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag using EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag using EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELTest.html
deleted file mode 100644
index 239bc70..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithELTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag using EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Body Content defined by and el</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithServletTest.html
deleted file mode 100644
index 26988b3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/PutTagWithServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Servlet as Template Test</title>
-</head>
-w<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Servlet as Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Put Tag using a servlet mapping as a template</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/SetCurrentContainerTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/SetCurrentContainerTagTest.html
deleted file mode 100644
index f34e709..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/SetCurrentContainerTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>setCurrentContainer Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">setCurrentContainer Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test setCurrentContainer Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition is from an alternate container.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDefinitionFilterTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDefinitionFilterTest.html
deleted file mode 100644
index 57f90bb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDefinitionFilterTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Definition Filter Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Tiles Definition Filter</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This Content should be wrapped with the standard layout.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDispatchServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDispatchServletTest.html
deleted file mode 100644
index c5b07cc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/TilesDispatchServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Dispatch Servlet Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=FreeMarker: Test Tiles Dispatch Servlet</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/WelcomePageTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/WelcomePageTest.html
deleted file mode 100644
index 3c257bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/freemarker/WelcomePageTest.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Registration Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Welcome Page Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTitle</td>
-	<td>Tiles 2 Test Application</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Tiles 2 Test Application</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
deleted file mode 100644
index 6c8ed08..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
deleted file mode 100644
index 59e3dc6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Definition that contains another definition inside (configured via tiles-defs.xml) using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionNoTypeTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
deleted file mode 100644
index 1542eeb..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionNoTypeTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Configured Definition with no Type Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Configured Definition with no Type Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Definition that contains another definition inside using JSP tags without types</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionTest.html
deleted file mode 100644
index 3fc1f3d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/CompositeDefinitionWithInnerDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Composite Definition with Inner Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Composite Definition with Inner Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Definition that contains another definition inside using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a composite definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inner definition with tags.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredCompositeDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredCompositeDefinitionTest.html
deleted file mode 100644
index d468819..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredCompositeDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Composite Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-w<tr><td rowspan="1" colspan="3">Configured Composite Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition that contains another definition inside</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributePreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributePreparerTest.html
deleted file mode 100644
index 2518b89..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributePreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Attribute Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the AttributeViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTagsTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTagsTest.html
deleted file mode 100644
index 50f5456..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTagsTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Tags Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Tags Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Attribute that have Roles in Tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTest.html
deleted file mode 100644
index a002826..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionAttributeRolesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Attribute Roles Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Attribute Roles Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Attribute that have Roles</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedListTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedListTest.html
deleted file mode 100644
index cf92053..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedListTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded List Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded List Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Cascaded Definition with List</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Single attribute "stringTest" value: This is a string </td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueOne</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueTwo</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>valueThree</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedOverriddenTest.html
deleted file mode 100644
index 2104bbc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Cascaded Definition with Override</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTemplateTest.html
deleted file mode 100644
index 8cfa6c6..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Cascaded Definition with Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTest.html
deleted file mode 100644
index df76a00..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Cascaded Definition</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDbTest.html
deleted file mode 100644
index 9a67094..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDefaultValuesTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDefaultValuesTest.html
deleted file mode 100644
index 086df49..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionDefaultValuesTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Default Values Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Default Values Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Default Values</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the alternate header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the default body in the tag.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELSingleEvalTest.html
deleted file mode 100644
index 7b45830..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELTest.html
deleted file mode 100644
index a6fce33..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition EL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExceptionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExceptionTest.html
deleted file mode 100644
index 87da57a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExceptionTest.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Exception Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with an exception in an attribute page</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExtendedDbTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExtendedDbTest.html
deleted file mode 100644
index 67c12c4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionExtendedDbTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Extended Db Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Extended Db Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Extended Configured Definition from DB</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an extended definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFlushTest.html
deleted file mode 100644
index 8d334d5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFromClasspathTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFromClasspathTest.html
deleted file mode 100644
index 0bf3c8c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionFromClasspathTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition from Classpath Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition from Classpath Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Classpath Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This tile was loaded from the classpath</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionIgnoreTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionIgnoreTest.html
deleted file mode 100644
index 0ad769c..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionIgnoreTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Ignore Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Ignore Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Ignore</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInModuleTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInModuleTest.html
deleted file mode 100644
index c82a53f..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInModuleTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition in Module Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition in Module Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition in Module</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition is from an alternate container.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This body is loaded from the "alt" module.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInlineTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInlineTest.html
deleted file mode 100644
index 82454b2..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionInlineTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Inline Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Inline Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with an inline content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an inline content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionMVELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionMVELTest.html
deleted file mode 100644
index fc0ddb0..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionMVELTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition MVEL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition MVEL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with MVEL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOGNLTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOGNLTest.html
deleted file mode 100644
index 0ccdee8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOGNLTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition OGNL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition OGNL Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with OGNL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured composite definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a configured inner definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOldFormatTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOldFormatTest.html
deleted file mode 100644
index 6e0cf8a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOldFormatTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Old Format Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Old Format Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition in Old Format</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a definition configured in 1.1 format.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOpenBodyTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOpenBodyTest.html
deleted file mode 100644
index 3ef469d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOpenBodyTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Open BodyTest</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Open Body Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Open Body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a customized context</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideAndNotTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideAndNotTest.html
deleted file mode 100644
index 7084c97..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideAndNotTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden and Original Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with an overridden content and one with original content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTemplateTest.html
deleted file mode 100644
index 6385866..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTemplateTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with an overridden template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the overridden template.</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTest.html
deleted file mode 100644
index 0e50fad..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionOverrideTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Overridden Content Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Overridden Content Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with an overridden content</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is an overridden content</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRegexpTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRegexpTest.html
deleted file mode 100644
index 5efe639..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRegexpTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Regular Expression Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Regular Expression Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Regular Expression</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionReversedTest.html
deleted file mode 100644
index 93cb4a8..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTagTest.html
deleted file mode 100644
index 634d560..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Specified Role in Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTest.html
deleted file mode 100644
index a908e15..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionRoleTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Role Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Role Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Specified Role</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition appears.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextNotPresent</td>
-	<td>This definition does not appear.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionTest.html
deleted file mode 100644
index 091cbc4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWildcardTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWildcardTest.html
deleted file mode 100644
index dced3f1..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWildcardTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition Wildcard Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition Wildcard Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Wildcards</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout one.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is layout two.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Hello.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition has a message: Bye.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithConfiguredPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithConfiguredPreparerTest.html
deleted file mode 100644
index aa98772..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithConfiguredPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Configured Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Configured Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Preparer configured in the definition itself</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithPreparerTest.html
deleted file mode 100644
index ca6dd76..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredDefinitionWithPreparerTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Definition with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Definition with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Configured Definition with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedDefinitionTest.html
deleted file mode 100644
index 02733dc..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Nested Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedListDefinitionTest.html
deleted file mode 100644
index c76e4ec..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ConfiguredNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Configured Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Configured Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Nested List Definition</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagExtendTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagExtendTest.html
deleted file mode 100644
index 7688ff4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagExtendTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Extend Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=Velocity: Test Definition Tag extending configured and custom definitions</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is an overridden content</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagListInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagListInheritTest.html
deleted file mode 100644
index 7a02921..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagListInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag List Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag List Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Definition Tag with a List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagPreparerTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagPreparerTest.html
deleted file mode 100644
index 779a5aa..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagPreparerTest.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- *
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag with Preparer Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag with Preparer Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Definition Tag with Preparer</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the value added by the ViewPreparer</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagTest.html
deleted file mode 100644
index 251a334..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/DefinitionTagTest.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Definition Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Definition Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-    <td>clickAndWait</td>
-    <td>link=Velocity: Test Definition Tag</td>
-    <td></td>
-    </tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagAllTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagAllTest.html
deleted file mode 100644
index 7504f47..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagAllTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag with no Name Specified Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag with no Name Specified Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test importAttribute Tag with no name</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>One</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Two</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Three </td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagInheritTest.html
deleted file mode 100644
index 66fdb6b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test importAttribute Tag with List Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagTest.html
deleted file mode 100644
index 5a96b5e..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/ImportAttributeTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Import Attribute Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Import Attribute Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test importAttribute Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/LocalizationTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/LocalizationTest.html
deleted file mode 100644
index 45c4a82..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/LocalizationTest.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Localization Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Localization</td>
-	<td></td>
-</tr>
-<tr>
-	<td>storeText</td>
-	<td>defaultLocaleMessage</td>
-	<td>localeMessage</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertText</td>
-	<td>defaultLocaleMessage</td>
-	<td>${localeMessage}</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=American English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>American English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=British English</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>British English locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=French</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>French locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Select another locale</td>
-	<td></td>
-</tr>
-<tr>
-	<td>select</td>
-	<td>locale</td>
-	<td>label=Italian</td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>//input[@value='Submit']</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Italian locale</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListCascadedTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListCascadedTagTest.html
deleted file mode 100644
index 389109d..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListCascadedTagTest.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Cascaded Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Cascaded Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put List Cascaded Tag</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagInheritTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagInheritTest.html
deleted file mode 100644
index 9a5ed43..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagInheritTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Inherit Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put List Tag Inherit Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put List Tag with Inherit</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueFour</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagTest.html
deleted file mode 100644
index 9136866..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutListTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put List Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put List Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Single attribute "stringTest" value: This is a string </td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueOne</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueTwo</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>valueThree</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedOverriddenTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedOverriddenTest.html
deleted file mode 100644
index f3bffbd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedOverriddenTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Overridden Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Overridden Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag with Overridden Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a configured inner definition.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTemplateTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTemplateTest.html
deleted file mode 100644
index 8e1b11a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTemplateTest.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Template Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag with Cascaded Attributes and Template</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTest.html
deleted file mode 100644
index c45c7b5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagCascadedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Cascaded Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Cascaded Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag with Cascaded Attributes</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the title.</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is the header</td>
-    <td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>This is a body</td>
-    <td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagFlushTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagFlushTest.html
deleted file mode 100644
index ab3dbf5..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagFlushTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Flush Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Flush Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag with Flush</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedDefinitionTest.html
deleted file mode 100644
index 36fabd3..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Nested Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedListDefinitionTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedListDefinitionTest.html
deleted file mode 100644
index abcaf90..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagNestedListDefinitionTest.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Nested List Definition Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Nested List Definition Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Insert Nested List Definition only using JSP tags</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a nested definition.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagReversedTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagReversedTest.html
deleted file mode 100644
index 0ab07d4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagReversedTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Reversed Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Reversed Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag with Reversed Attribute</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>.eltit eht si sihT</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagTest.html
deleted file mode 100644
index 2c02dc4..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELSingleEvalTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELSingleEvalTest.html
deleted file mode 100644
index 918f856..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELSingleEvalTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL with Single Evaluation Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag using EL with Single Evaluation Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag using EL to test Single Evaluation</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>${requestScope.doNotShow}</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELTest.html
deleted file mode 100644
index 323d38a..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithELTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag using EL Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag using EL</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>Body Content defined by and el</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithServletTest.html
deleted file mode 100644
index fd98087..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/PutTagWithServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Put Tag with Servlet as Template Test</title>
-</head>
-w<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag with Servlet as Template Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Put Tag using a servlet mapping as a template</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/SetCurrentContainerTagTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/SetCurrentContainerTagTest.html
deleted file mode 100644
index 0fc6840..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/SetCurrentContainerTagTest.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>setCurrentContainer Tag Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">setCurrentContainer Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test setCurrentContainer Tag</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This definition is from an alternate container.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDefinitionFilterTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDefinitionFilterTest.html
deleted file mode 100644
index a95131b..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDefinitionFilterTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Definition Filter Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Tiles Definition Filter</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This Content should be wrapped with the standard layout.</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDispatchServletTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDispatchServletTest.html
deleted file mode 100644
index 7175978..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/TilesDispatchServletTest.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Tiles Dispatch Servlet Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Put Tag Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>clickAndWait</td>
-	<td>link=Velocity: Test Tiles Dispatch Servlet</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the title.</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is the header</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTextPresent</td>
-	<td>This is a body</td>
-	<td></td>
-</tr>
-
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/WelcomePageTest.html b/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/WelcomePageTest.html
deleted file mode 100644
index 3c257bd..0000000
--- a/TILES_3_0_X/tiles-test-pom/tiles-test/src/test/selenium/velocity/WelcomePageTest.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-/*
- * $Id$
- *
- * 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.
- */
--->
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Registration Test</title>
-</head>
-<body>
-<table cellpadding="1" cellspacing="1" border="1">
-<thead>
-<tr><td rowspan="1" colspan="3">Welcome Page Test</td></tr>
-</thead><tbody>
-<tr>
-	<td>open</td>
-	<td>/tiles-test/index.jsp</td>
-	<td></td>
-</tr>
-<tr>
-	<td>assertTitle</td>
-	<td>Tiles 2 Test Application</td>
-	<td></td>
-</tr>
-<tr>
-    <td>assertTextPresent</td>
-    <td>Tiles 2 Test Application</td>
-    <td></td>
-</tr>
-</tbody></table>
-</body>
-</html>
diff --git a/TILES_3_0_X/tiles-velocity/pom.xml b/TILES_3_0_X/tiles-velocity/pom.xml
deleted file mode 100644
index 8c8794d..0000000
--- a/TILES_3_0_X/tiles-velocity/pom.xml
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-/*
- * $Id$
- *
- * 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 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>
-    <artifactId>tiles-parent</artifactId>
-    <groupId>org.apache.tiles</groupId>
-    <version>3.0.1</version>
-  </parent>
-
-  <modelVersion>4.0.0</modelVersion>
-  <artifactId>tiles-velocity</artifactId>
-  <packaging>jar</packaging>
-  <description>Velocity Support in Tiles</description>
-  <name>Tiles - Velocity Support</name>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.tiles.autotag.plugin</groupId>
-        <artifactId>maven-autotag-plugin</artifactId>
-        <version>${tiles.autotag.version}</version>
-        <executions>
-            <execution>
-                <goals>
-                    <goal>generate-velocity</goal>
-                </goals>
-                <configuration>
-                    <packageName>org.apache.tiles.velocity.template</packageName>
-                    <requestClass>org.apache.tiles.request.Request</requestClass>
-                    <velocityRuntime>org.apache.tiles.request.velocity.autotag.VelocityAutotagRuntime</velocityRuntime>
-                </configuration>
-            </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-servlet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tiles</groupId>
-      <artifactId>tiles-template</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-jdk14</artifactId>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity-tools</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-digester</groupId>
-      <artifactId>commons-digester</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymockclassextension</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-        <groupId>org.apache.tiles</groupId>
-        <artifactId>tiles-request-velocity</artifactId>
-        <version>${tiles.request.version}</version>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/TilesVelocityException.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/TilesVelocityException.java
deleted file mode 100644
index 2faa0d8..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/TilesVelocityException.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity;
-
-import org.apache.tiles.TilesException;
-
-/**
- * Exception connected to the usage of Velocity and Tiles.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class TilesVelocityException extends TilesException {
-
-    /**
-     * Constructor.
-     *
-     * @since 2.2.0
-     */
-    public TilesVelocityException() {
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     * @since 2.2.0
-     */
-    public TilesVelocityException(String message) {
-        super(message);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param e The cause of the exception.
-     * @since 2.2.0
-     */
-    public TilesVelocityException(Throwable e) {
-        super(e);
-    }
-
-    /**
-     * Constructor.
-     *
-     * @param message The message of the exception.
-     * @param e The cause of the exception.
-     * @since 2.2.0
-     */
-    public TilesVelocityException(String message, Throwable e) {
-        super(message, e);
-    }
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/package-info.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/package-info.java
deleted file mode 100644
index 318c597..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Classes to support Velocity under a servlet environment in Tiles.
- */
-package org.apache.tiles.velocity;
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderable.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderable.java
deleted file mode 100644
index 2f76d68..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderable.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity.template;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.velocity.TilesVelocityException;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.exception.MethodInvocationException;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
-import org.apache.velocity.runtime.Renderable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Renderable that provides a default implementation of {@link Renderable#toString()}
- * and allows access to parameters and context objects.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public abstract class AbstractDefaultToStringRenderable implements Renderable {
-
-
-    /**
-     * The Velocity context.
-     *
-     * @since 2.2.0
-     */
-    protected final Context velocityContext;
-
-    /**
-     * The parameters used in the current tool call.
-     *
-     * @since 2.2.0
-     */
-    protected final Map<String, Object> params;
-
-    /**
-     * The HTTP response.
-     *
-     * @since 2.2.0
-     */
-    protected final HttpServletResponse response;
-
-    /**
-     * The HTTP request.
-     *
-     * @since 2.2.0
-     */
-    protected final HttpServletRequest request;
-
-    /**
-     * The logging object.
-     */
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    /**
-     * Constructor.
-     *
-     * @param velocityContext The Velocity context.
-     * @param params The parameters used in the current tool call.
-     * @param response The HTTP response.
-     * @param request The HTTP request.
-     * @since 2.2.0
-     */
-    public AbstractDefaultToStringRenderable(Context velocityContext,
-            Map<String, Object> params, HttpServletResponse response,
-            HttpServletRequest request) {
-        this.velocityContext = velocityContext;
-        this.params = params;
-        this.response = response;
-        this.request = request;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        StringWriter writer = new StringWriter();
-        try {
-            render(null, writer);
-        } catch (MethodInvocationException e) {
-            throw new TilesVelocityException("Cannot invoke method when rendering", e);
-        } catch (ParseErrorException e) {
-            throw new TilesVelocityException("Cannot parse when rendering", e);
-        } catch (ResourceNotFoundException e) {
-            throw new TilesVelocityException("Cannot find resource when rendering", e);
-        } catch (IOException e) {
-            throw new TilesVelocityException("I/O exception when rendering", e);
-        } finally {
-            try {
-                writer.close();
-            } catch (IOException e) {
-                log.error("Error when closing a StringWriter, the impossible happened!", e);
-            }
-        }
-        return writer.toString();
-    }
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/ContextHolder.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/ContextHolder.java
deleted file mode 100644
index 80b0d3f..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/ContextHolder.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity.template;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.velocity.context.Context;
-
-/**
- * An object that holds the current state of Velocity in a Servlet environment.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class ContextHolder {
-
-    /**
-     * The Velocity context.
-     */
-    private Context velocityContext;
-
-    /**
-     * The HTTP request.
-     */
-    private HttpServletRequest request;
-
-    /**
-     * The HTTP response.
-     */
-    private HttpServletResponse response;
-
-    /**
-     * The servlet context.
-     */
-    private ServletContext application;
-
-    /**
-     * Sets the current {@link HttpServletRequest}. This is required for this
-     * tool to operate and will throw a NullPointerException if this is not set
-     * or is set to {@code null}.
-     *
-     * @param request The HTTP request.
-     * @since 2.2.0
-     */
-    public void setRequest(HttpServletRequest request) {
-        if (request == null) {
-            throw new NullPointerException("request should not be null");
-        }
-        this.request = request;
-    }
-
-    /**
-     * Sets the current {@link HttpServletResponse}. This is required for this
-     * tool to operate and will throw a NullPointerException if this is not set
-     * or is set to {@code null}.
-     *
-     * @param response The HTTP response.
-     * @since 2.2.0
-     */
-    public void setResponse(HttpServletResponse response) {
-        if (response == null) {
-            throw new NullPointerException("response should not be null");
-        }
-        this.response = response;
-    }
-
-    /**
-     * Sets the {@link ServletContext}. This is required for this tool to
-     * operate and will throw a NullPointerException if this is not set or is
-     * set to {@code null}.
-     *
-     * @param application The Servlet context.
-     * @since 2.2.0
-     */
-    public void setServletContext(ServletContext application) {
-        if (application == null) {
-            throw new NullPointerException("servlet context should not be null");
-        }
-        this.application = application;
-    }
-
-    /**
-     * Sets the Velocity {@link Context}. This is required for this tool to
-     * operate and will throw a NullPointerException if this is not set or is
-     * set to {@code null}.
-     *
-     * @param context The Velocity context.
-     * @since 2.2.0
-     */
-    public void setVelocityContext(Context context) {
-        if (context == null) {
-            throw new NullPointerException(
-                    "velocity context should not be null");
-        }
-        this.velocityContext = context;
-    }
-
-    /**
-     * Returns the HTTP request.
-     *
-     * @return The HTTP request.
-     * @since 2.2.0
-     */
-    protected HttpServletRequest getRequest() {
-        return request;
-    }
-
-    /**
-     * Returns the HTTP response.
-     *
-     * @return The HTTP response.
-     * @since 2.2.0
-     */
-    protected HttpServletResponse getResponse() {
-        return response;
-    }
-
-    /**
-     * Returns the Servlet context.
-     *
-     * @return The Servlet context..
-     * @since 2.2.0
-     */
-    protected ServletContext getServletContext() {
-        return application;
-    }
-
-    /**
-     * Returns the Velocity context..
-     *
-     * @return The Velocity context.
-     * @since 2.2.0
-     */
-    protected Context getVelocityContext() {
-        return velocityContext;
-    }
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/VelocityStyleTilesTool.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/VelocityStyleTilesTool.java
deleted file mode 100644
index e70db95..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/VelocityStyleTilesTool.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity.template;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import javax.servlet.ServletContext;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.Request;
-import org.apache.tiles.request.servlet.ServletUtil;
-import org.apache.tiles.request.velocity.VelocityRequest;
-import org.apache.velocity.context.InternalContextAdapter;
-import org.apache.velocity.runtime.Renderable;
-
-/**
- * Tiles Tool to be used "the classic way".
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class VelocityStyleTilesTool extends ContextHolder {
-
-    /**
-     * Returns an attribute.
-     *
-     * @param key The name of the attribute to get.
-     * @return The Attribute.
-     * @since 2.2.0
-     */
-    public Attribute get(String key) {
-        Request velocityRequest = createVelocityRequest(getServletContext(),
-                null);
-        TilesContainer container = TilesAccess.getCurrentContainer(velocityRequest);
-        AttributeContext attributeContext = container
-                .getAttributeContext(velocityRequest);
-        Attribute attribute = attributeContext.getAttribute(key);
-        return attribute;
-    }
-
-    /**
-     * Creates a new empty attribute.
-     *
-     * @return The created attribute.
-     * @since 2.2.0
-     */
-    public Attribute createAttribute() {
-        return new Attribute();
-    }
-
-    /**
-     * Creates an attribute that is a copy of the one passed as a parameter.
-     *
-     * @param attribute The attribute to copy.
-     * @return The copied attribute.
-     * @since 2.2.0
-     */
-    public Attribute clone(Attribute attribute) {
-        return new Attribute(attribute);
-    }
-
-    /**
-     * Creates an attribute that represents a template.
-     *
-     * @param template The template.
-     * @return The attribute.
-     * @since 2.2.0
-     */
-    public Attribute createTemplateAttribute(String template) {
-        return Attribute.createTemplateAttribute(template);
-    }
-
-    /**
-     * Renders an attribute.
-     *
-     * @param attribute The attribute to render.
-     * @return The renderable object, ready to be rendered.
-     * @since 2.2.0
-     */
-    public Renderable render(final Attribute attribute) {
-        return new AbstractDefaultToStringRenderable(getVelocityContext(),
-                null, getResponse(), getRequest()) {
-
-            public boolean render(InternalContextAdapter context, Writer writer)
-                    throws IOException {
-                Request velocityRequest = createVelocityRequest(
-                        getServletContext(), writer);
-                TilesContainer container = TilesAccess
-                        .getCurrentContainer(velocityRequest);
-                container.render(attribute, velocityRequest);
-                return true;
-            }
-
-        };
-    }
-
-    /**
-     * Renders a definition. It can be used in conjunction with
-     * {@link #startAttributeContext()} and {@link #endAttributeContext()} to
-     * customize appearance.
-     *
-     * @param definitionName The name of the definition to render.
-     * @return The renderable that renders the definition.
-     * @since 2.2.0
-     */
-    public Renderable renderDefinition(final String definitionName) {
-        return new AbstractDefaultToStringRenderable(getVelocityContext(),
-                null, getResponse(), getRequest()) {
-
-            public boolean render(InternalContextAdapter context, Writer writer) {
-                Request velocityRequest = createVelocityRequest(
-                        getServletContext(), writer);
-                TilesContainer container = TilesAccess
-                        .getCurrentContainer(velocityRequest);
-                container.render(definitionName, velocityRequest);
-                return true;
-            }
-
-        };
-    }
-
-    /**
-     * Renders the current attribute context. It can be used in conjunction with
-     * {@link #startAttributeContext()} and {@link #endAttributeContext()} to
-     * customize appearance.
-     *
-     * @return The renderable that renders the current attribute context.
-     * @since 2.2.0
-     */
-    public Renderable renderAttributeContext() {
-        return new AbstractDefaultToStringRenderable(getVelocityContext(),
-                null, getResponse(), getRequest()) {
-
-            public boolean render(InternalContextAdapter context, Writer writer) {
-                Request velocityRequest = createVelocityRequest(
-                        getServletContext(), writer);
-                TilesContainer container = TilesAccess
-                        .getCurrentContainer(velocityRequest);
-                container.renderContext(velocityRequest);
-                return true;
-            }
-
-        };
-    }
-
-    /**
-     * Starts the attribute context. Remember to call
-     * {@link #endAttributeContext()} when finished!
-     *
-     * @return The started attribute context, ready to be customized.
-     * @since 2.2.0
-     */
-    public AttributeContext startAttributeContext() {
-        Request velocityRequest = createVelocityRequest(
-                getServletContext(), null);
-        TilesContainer container = TilesAccess
-                .getCurrentContainer(velocityRequest);
-        return container.startContext(velocityRequest);
-    }
-
-    /**
-     * Ends the current attribute context. To be called after
-     * {@link #startAttributeContext()}.
-     *
-     * @return The tool itself.
-     * @since 2.2.0
-     */
-    public VelocityStyleTilesTool endAttributeContext() {
-        Request velocityRequest = createVelocityRequest(getServletContext(),
-                null);
-        TilesContainer container = TilesAccess
-                .getCurrentContainer(velocityRequest);
-        container.endContext(velocityRequest);
-        return this;
-    }
-
-    /**
-     * Returns the current attribute context.
-     *
-     * @return The current attribute context.
-     * @since 2.2.0
-     */
-    public AttributeContext getAttributeContext() {
-        Request velocityRequest = createVelocityRequest(
-                getServletContext(), null);
-        TilesContainer container = TilesAccess
-                .getCurrentContainer(velocityRequest);
-        return container.getAttributeContext(velocityRequest);
-    }
-
-    /**
-     * Sets the current container for the current request.
-     *
-     * @param containerKey The key of the container to set as "current" for the current request.
-     * @return The tool itself.
-     * @since 2.2.0
-     */
-    public VelocityStyleTilesTool setCurrentContainer(String containerKey) {
-        Request velocityRequest = createVelocityRequest(
-                getServletContext(), null);
-        TilesAccess.setCurrentContainer(velocityRequest, containerKey);
-        return this;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public String toString() {
-        return "";
-    }
-
-    /**
-     * Creates a Velocity request.
-     *
-     * @param servletContext The servlet context.
-     * @param writer The writer.
-     * @return The created request.
-     */
-    protected Request createVelocityRequest(
-            ServletContext servletContext, Writer writer) {
-        return VelocityRequest.createVelocityRequest(ServletUtil
-                .getApplicationContext(servletContext), getRequest(),
-                getResponse(), getVelocityContext(), writer);
-    }
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/package-info.java b/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/package-info.java
deleted file mode 100644
index 55f4f6f..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/java/org/apache/tiles/velocity/template/package-info.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * $Id: package-info.java 1049711 2010-12-15 21:12:00Z apetrelli $
- *
- * 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.
- */
-/**
- * Classes that allow the use of "Tiles template" as a Velocity tool.
- */
-package org.apache.tiles.velocity.template;
diff --git a/TILES_3_0_X/tiles-velocity/src/main/resources/LICENSE.txt b/TILES_3_0_X/tiles-velocity/src/main/resources/LICENSE.txt
deleted file mode 100644
index d645695..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/resources/LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/TILES_3_0_X/tiles-velocity/src/main/resources/META-INF/velocity.properties b/TILES_3_0_X/tiles-velocity/src/main/resources/META-INF/velocity.properties
deleted file mode 100644
index 0280842..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/resources/META-INF/velocity.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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.
-
-userdirective=org.apache.tiles.velocity.template.AddAttributeDirective,\
-  org.apache.tiles.velocity.template.AddListAttributeDirective,\
-  org.apache.tiles.velocity.template.DefinitionDirective,\
-  org.apache.tiles.velocity.template.GetAsStringDirective,\
-  org.apache.tiles.velocity.template.ImportAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertAttributeDirective,\
-  org.apache.tiles.velocity.template.InsertDefinitionDirective,\
-  org.apache.tiles.velocity.template.InsertTemplateDirective,\
-  org.apache.tiles.velocity.template.PutAttributeDirective,\
-  org.apache.tiles.velocity.template.PutListAttributeDirective
diff --git a/TILES_3_0_X/tiles-velocity/src/main/resources/NOTICE.txt b/TILES_3_0_X/tiles-velocity/src/main/resources/NOTICE.txt
deleted file mode 100644
index 1f13ff8..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/resources/NOTICE.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-   Apache Tiles
-   Copyright 1999-2009 The Apache Software Foundation
-
-   This product includes software developed at
-   The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/TILES_3_0_X/tiles-velocity/src/main/resources/tools.xml b/TILES_3_0_X/tiles-velocity/src/main/resources/tools.xml
deleted file mode 100644
index 65d6737..0000000
--- a/TILES_3_0_X/tiles-velocity/src/main/resources/tools.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<!--
- 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.
--->
-<tools>
-  <toolbox scope="request">
-    <tool key="tiles" class="org.apache.tiles.velocity.template.VelocityStyleTilesTool"/>
-  </toolbox>
-</tools>
diff --git a/TILES_3_0_X/tiles-velocity/src/site/site.xml b/TILES_3_0_X/tiles-velocity/src/site/site.xml
deleted file mode 100644
index 60c1475..0000000
--- a/TILES_3_0_X/tiles-velocity/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-/*
- * $Id$
- *
- * 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 name="Apache Tiles - Velocity Support">
-    <body>
-
-        <menu name="Apache Tiles&#8482;">
-            <item
-                   name="Home"
-                   href="../../index.html"/>
-            <item
-                   name="Parent module"
-                   href="../index.html"/>
-        </menu>
-
-        <menu ref="modules" />
-        <menu ref="reports" />
-
-    </body>
-</project>
diff --git a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/TilesVelocityExceptionTest.java b/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/TilesVelocityExceptionTest.java
deleted file mode 100644
index e933e15..0000000
--- a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/TilesVelocityExceptionTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity;
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests {@link TilesVelocityException}.
- *
- * @version $Rev$ $Date$
- */
-public class TilesVelocityExceptionTest {
-
-    /**
-     * Test method for {@link TilesVelocityException#TilesVelocityException()}.
-     */
-    @Test
-    public void testTilesVelocityException() {
-        TilesVelocityException exception = new TilesVelocityException();
-        assertNull(exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesVelocityException#TilesVelocityException(java.lang.String)}.
-     */
-    @Test
-    public void testTilesVelocityExceptionString() {
-        TilesVelocityException exception = new TilesVelocityException("my message");
-        assertEquals("my message", exception.getMessage());
-        assertNull(exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesVelocityException#TilesVelocityException(java.lang.Throwable)}.
-     */
-    @Test
-    public void testTilesVelocityExceptionThrowable() {
-        Throwable cause = new Throwable();
-        TilesVelocityException exception = new TilesVelocityException(cause);
-        assertEquals(cause.toString(), exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-    /**
-     * Test method for {@link TilesVelocityException#TilesVelocityException(java.lang.String, java.lang.Throwable)}.
-     */
-    @Test
-    public void testTilesVelocityExceptionStringThrowable() {
-        Throwable cause = new Throwable();
-        TilesVelocityException exception = new TilesVelocityException("my message", cause);
-        assertEquals("my message", exception.getMessage());
-        assertEquals(cause, exception.getCause());
-    }
-
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderableTest.java b/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderableTest.java
deleted file mode 100644
index 66a3639..0000000
--- a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/AbstractDefaultToStringRenderableTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity.template;
-
-import static org.junit.Assert.*;
-import static org.easymock.classextension.EasyMock.*;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.velocity.context.Context;
-import org.apache.velocity.context.InternalContextAdapter;
-import org.junit.Test;
-
-/**
- * Tests {@link AbstractDefaultToStringRenderable}.
- */
-public class AbstractDefaultToStringRenderableTest {
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.AbstractDefaultToStringRenderable
-     * #AbstractDefaultToStringRenderable(org.apache.velocity.context.Context,
-     * java.util.Map, javax.servlet.http.HttpServletResponse, javax.servlet.http.HttpServletRequest)}.
-     */
-    @Test
-    public void testAbstractDefaultToStringRenderable() {
-        Context velociContext = createMock(Context.class);
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        Map<String, Object> params = new HashMap<String, Object>();
-
-        replay(velociContext, request, response);
-        DefaultRenderable renderable = new DefaultRenderable(velociContext,
-                params, response, request);
-        assertEquals(velociContext, renderable.getVelocityContext());
-        assertEquals(request, renderable.getRequest());
-        assertEquals(response, renderable.getResponse());
-        assertEquals(params, renderable.getParams());
-        verify(velociContext, request, response);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.AbstractDefaultToStringRenderable#toString()}.
-     */
-    @Test
-    public void testToString() {
-        Context velociContext = createMock(Context.class);
-        HttpServletRequest request = createMock(HttpServletRequest.class);
-        HttpServletResponse response = createMock(HttpServletResponse.class);
-        Map<String, Object> params = new HashMap<String, Object>();
-        params.put("one", "value1");
-
-        replay(velociContext, request, response);
-        DefaultRenderable renderable = new DefaultRenderable(velociContext,
-                params, response, request);
-
-        assertEquals("Hello!", renderable.toString());
-        assertTrue(renderable.getWriter() instanceof StringWriter);
-        assertNull(renderable.getInternalContextAdapter());
-        verify(velociContext, request, response);
-    }
-
-    /**
-     * Mock class for AbstractDefaultToStringRenderable.
-     */
-    private static class DefaultRenderable extends AbstractDefaultToStringRenderable {
-
-        /**
-         * The internal context.
-         */
-        private InternalContextAdapter internalContextAdapter;
-
-        /**
-         * The writer.
-         */
-        private Writer writer;
-
-        /**
-         * Constructor.
-         *
-         * @param velocityContext The Velocity context.
-         * @param params The parameters used in the current tool call.
-         * @param response The HTTP response.
-         * @param request The HTTP request.
-         */
-        public DefaultRenderable(Context velocityContext,
-                Map<String, Object> params, HttpServletResponse response,
-                HttpServletRequest request) {
-            super(velocityContext, params, response, request);
-        }
-
-        /** {@inheritDoc} */
-        public boolean render(InternalContextAdapter context, Writer writer)
-                throws IOException {
-            this.internalContextAdapter = context;
-            this.writer = writer;
-            writer.write("Hello!");
-            return true;
-        }
-
-        /**
-         * Returns the Velocity context.
-         *
-         * @return The velocity context.
-         */
-        public Context getVelocityContext() {
-            return velocityContext;
-        }
-
-        /**
-         * Returns the parameters.
-         *
-         * @return The parameters.
-         */
-        public Map<String, Object> getParams() {
-            return params;
-        }
-
-        /**
-         * Returns the request.
-         *
-         * @return The request.
-         */
-        public HttpServletRequest getRequest() {
-            return request;
-        }
-
-        /**
-         * Returns the respnse.
-         *
-         * @return The response.
-         */
-        public HttpServletResponse getResponse() {
-            return response;
-        }
-
-        /**
-         * Returns the internal context.
-         *
-         * @return The internal context.
-         */
-        public InternalContextAdapter getInternalContextAdapter() {
-            return internalContextAdapter;
-        }
-
-        /**
-         * Returns the writer.
-         *
-         * @return The writer.
-         */
-        public Writer getWriter() {
-            return writer;
-        }
-    }
-}
diff --git a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java b/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java
deleted file mode 100644
index cfb4f53..0000000
--- a/TILES_3_0_X/tiles-velocity/src/test/java/org/apache/tiles/velocity/template/VelocityStyleTilesToolTest.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * $Id$
- *
- * 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.
- */
-
-package org.apache.tiles.velocity.template;
-
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
-import static org.easymock.classextension.EasyMock.createMock;
-import static org.easymock.classextension.EasyMock.replay;
-import static org.easymock.classextension.EasyMock.verify;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.tiles.Attribute;
-import org.apache.tiles.AttributeContext;
-import org.apache.tiles.Expression;
-import org.apache.tiles.TilesContainer;
-import org.apache.tiles.access.TilesAccess;
-import org.apache.tiles.request.ApplicationAccess;
-import org.apache.tiles.request.ApplicationContext;
-import org.apache.tiles.request.velocity.VelocityRequest;
-import org.apache.velocity.context.Context;
-import org.apache.velocity.context.InternalContextAdapter;
-import org.apache.velocity.runtime.Renderable;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests {@link VelocityStyleTilesTool}.
- *
- * @version $Rev$ $Date$
- * @since 2.2.0
- */
-public class VelocityStyleTilesToolTest {
-
-    /**
-     * The tool to test.
-     */
-    private VelocityStyleTilesTool tool;
-
-    /**
-     * The request object.
-     */
-    private HttpServletRequest request;
-
-    /**
-     * The response object.
-     */
-    private HttpServletResponse response;
-
-    /**
-     * The servlet context.
-     */
-    private ServletContext servletContext;
-
-    /**
-     * The current velocity context.
-     */
-    private Context velocityContext;
-
-    /**
-     * Sets up the tool to test.
-     *
-     * @since 2.2.0
-     */
-    @Before
-    public void setUp() {
-        tool = new VelocityStyleTilesTool();
-        request = createMock(HttpServletRequest.class);
-        response = createMock(HttpServletResponse.class);
-        velocityContext = createMock(Context.class);
-        servletContext = createMock(ServletContext.class);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#get(java.lang.String)}.
-     */
-    @Test
-    public void testGetAttribute() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Attribute attribute = new Attribute("myValue");
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        expect(container.getAttributeContext(isA(VelocityRequest.class)))
-                .andReturn(attributeContext);
-        expect(attributeContext.getAttribute("myAttribute")).andReturn(attribute);
-
-        replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-        initializeTool();
-        assertEquals(attribute, tool.get("myAttribute"));
-        verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#createAttribute()}.
-     */
-    @Test
-    public void testCreateAttribute() {
-        replay(velocityContext, request, response, servletContext);
-        initializeTool();
-        Attribute attribute =  tool.createAttribute();
-        assertNull(attribute.getValue());
-        assertNull(attribute.getRenderer());
-        assertNull(attribute.getExpressionObject());
-        verify(velocityContext, request, response, servletContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool
-     * #clone(org.apache.tiles.Attribute)}.
-     */
-    @Test
-    public void testCloneAttribute() {
-        Attribute attribute = new Attribute("myValue", Expression
-                .createExpression("myExpression", null), "myRole",
-                "myRendererName");
-
-        replay(velocityContext, request, response, servletContext);
-        initializeTool();
-        assertEquals(attribute, tool.clone(attribute));
-        verify(velocityContext, request, response, servletContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool
-     * #createTemplateAttribute(java.lang.String)}.
-     */
-    @Test
-    public void testCreateTemplateAttribute() {
-        replay(velocityContext, request, response, servletContext);
-        initializeTool();
-        Attribute attribute = tool.createTemplateAttribute("myTemplate");
-        assertEquals("myTemplate", attribute.getValue());
-        assertEquals("template", attribute.getRenderer());
-        verify(velocityContext, request, response, servletContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool
-     * #render(org.apache.tiles.Attribute)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRenderAttribute() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        InternalContextAdapter internalContextAdapter = createMock(InternalContextAdapter.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        StringWriter writer = new StringWriter();
-        Attribute attribute = new Attribute("myValue");
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        container.render(eq(attribute), isA(VelocityRequest.class));
-
-        replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-        initializeTool();
-        Renderable renderable = tool.render(attribute);
-        renderable.render(internalContextAdapter, writer);
-        verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool
-     * #renderDefinition(java.lang.String)}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRenderDefinition() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        InternalContextAdapter internalContextAdapter = createMock(InternalContextAdapter.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        StringWriter writer = new StringWriter();
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        container.render(eq("myDefinition"), isA(VelocityRequest.class));
-
-        replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-        initializeTool();
-        Renderable renderable = tool.renderDefinition("myDefinition");
-        renderable.render(internalContextAdapter, writer);
-        verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#renderAttributeContext()}.
-     * @throws IOException If something goes wrong.
-     */
-    @Test
-    public void testRenderAttributeContext() throws IOException {
-        TilesContainer container = createMock(TilesContainer.class);
-        InternalContextAdapter internalContextAdapter = createMock(InternalContextAdapter.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        StringWriter writer = new StringWriter();
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        container.renderContext(isA(VelocityRequest.class));
-
-        replay(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-        initializeTool();
-        Renderable renderable = tool.renderAttributeContext();
-        renderable.render(internalContextAdapter, writer);
-        verify(velocityContext, request, response, servletContext, container,
-                internalContextAdapter, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#startAttributeContext()}.
-     */
-    @Test
-    public void testStartAttributeContext() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        expect(container.startContext(isA(VelocityRequest.class)))
-                .andReturn(attributeContext);
-
-        replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-        initializeTool();
-        assertEquals(attributeContext, tool.startAttributeContext());
-        verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#endAttributeContext()}.
-     */
-    @Test
-    public void testEndAttributeContext() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        container.endContext(isA(VelocityRequest.class));
-
-        replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-        initializeTool();
-        tool.endAttributeContext();
-        verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#getAttributeContext()}.
-     */
-    @Test
-    public void testGetAttributeContext() {
-        TilesContainer container = createMock(TilesContainer.class);
-        AttributeContext attributeContext = createMock(AttributeContext.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-        expect(container.getAttributeContext(isA(VelocityRequest.class)))
-                .andReturn(attributeContext);
-
-        replay(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-        initializeTool();
-        assertEquals(attributeContext, tool.getAttributeContext());
-        verify(velocityContext, request, response, servletContext, container,
-                attributeContext, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool
-     * #setCurrentContainer(java.lang.String)}.
-     */
-    @Test
-    public void testSetCurrentContainer() {
-        TilesContainer container = createMock(TilesContainer.class);
-        ApplicationContext applicationContext = createMock(ApplicationContext.class);
-        Map<String, Object> applicationScope = new HashMap<String, Object>();
-        applicationScope.put("myKey", container);
-
-        Map<String, Object> requestScope = new HashMap<String, Object>();
-        requestScope.put(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        request.setAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME, container);
-        expect(request.getAttribute(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME)).andReturn(container);
-        expect(applicationContext.getApplicationScope()).andReturn(applicationScope).anyTimes();
-        expect(servletContext.getAttribute(ApplicationAccess
-                .APPLICATION_CONTEXT_ATTRIBUTE)).andReturn(applicationContext)
-                .anyTimes();
-
-        replay(velocityContext, request, response, servletContext, container, applicationContext);
-        initializeTool();
-        assertEquals(tool, tool.setCurrentContainer("myKey"));
-        assertEquals(container, requestScope.get(TilesAccess.CURRENT_CONTAINER_ATTRIBUTE_NAME));
-        verify(velocityContext, request, response, servletContext, container, applicationContext);
-    }
-
-    /**
-     * Test method for {@link org.apache.tiles.velocity.template.VelocityStyleTilesTool#toString()}.
-     */
-    @Test
-    public void testToString() {
-        assertEquals("", tool.toString());
-    }
-
-    /**
-     * Initializes the tool for the test.
-     */
-    private void initializeTool() {
-        tool.setRequest(request);
-        tool.setResponse(response);
-        tool.setServletContext(servletContext);
-        tool.setVelocityContext(velocityContext);
-    }
-}
diff --git a/tiles-test-pom/tiles-test/pom.xml b/tiles-test-pom/tiles-test/pom.xml
index fe83fcb..a7a483f 100644
--- a/tiles-test-pom/tiles-test/pom.xml
+++ b/tiles-test-pom/tiles-test/pom.xml
@@ -163,6 +163,13 @@
            </plugin>
        </plugins>
      <finalName>${project.artifactId}</finalName>
+    <extensions>
+      <extension>
+        <groupId>org.apache.maven.wagon</groupId>
+        <artifactId>wagon-ssh</artifactId>
+        <version>1.0</version>
+      </extension>
+    </extensions>
    </build>
 
     <profiles>
